gk7205v200-uboot/drivers/mtd/spi/fmc100/fmc100_spi_puya.c
2025-08-07 17:13:54 +08:00

81 lines
2.4 KiB
C
Executable File

/*
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
*/
/*****************************************************************************/
static int spi_puya_entry_4addr(struct fmc_spi *spi, int enable)
{
return 0;
}
/****************************************************************************/
/*
* enable QE bit if QUAD read write is supported by puya'a P25Q128H,it is as same as W25Q(128/256)FV
* opcode type name
* 0x35 RD SR(S15-S8)
* 0x31 WR SR(S15-S8)
*/
static int spi_puya_qe_enable(struct fmc_spi *spi)
{
unsigned char status;
unsigned char op;
unsigned int regval;
const char *str[] = {"Disable", "Enable"};
struct fmc_host *host = (struct fmc_host *)spi->host;
op = spi_is_quad(spi);
fmc_pr(QE_DBG, "\t* Start SPI Nor %s Quad.\n", str[op]);
status = spi_general_get_flash_register(spi, SPI_CMD_RDSR2);
fmc_pr(QE_DBG, "\t Read Status Register-2[%#x]%#x\n", SPI_CMD_RDSR2,
status);
if (spi_nor_get_qe_by_cr(status) == op) {
fmc_pr(QE_DBG, "\t* Quad was %s status:%#x\n", str[op], status);
goto QE_END;
}
spi->driver->write_enable(spi);
if (op)
status |= SPI_NOR_CR_QE_MASK;
else
status &= ~SPI_NOR_CR_QE_MASK;
writeb(status, host->iobase);
fmc_pr(QE_DBG, "\t Write IO[%#lx]%#x\n", (uintptr_t)host->iobase,
*(unsigned char *)host->iobase);
/* There is new cmd for Write Status Register 2 by W25Q(128/256)FV */
regval = fmc_cmd_cmd1(SPI_CMD_WRSR2);
fmc_write(host, FMC_CMD, regval);
fmc_pr(QE_DBG, "\t Set CMD[%#x]%#x\n", FMC_CMD, regval);
regval = op_cfg_fm_cs(spi->chipselect);
fmc_write(host, FMC_OP_CFG, regval);
fmc_pr(QE_DBG, "\t Set OP_CFG[%#x]%#x\n", FMC_OP_CFG, regval);
regval = fmc_data_num_cnt(SPI_NOR_SR_LEN);
fmc_write(host, FMC_DATA_NUM, regval);
fmc_pr(QE_DBG, "\t Set DATA_NUM[%#x]%#x\n", FMC_DATA_NUM, regval);
regval = fmc_op_cmd1_en(ENABLE) |
fmc_op_write_data_en(ENABLE) | FMC_OP_REG_OP_START;
fmc_write(host, FMC_OP, regval);
fmc_pr(QE_DBG, "\t Set OP[%#x]%#x\n", FMC_OP, regval);
fmc_cmd_wait_cpu_finish(host);
/* wait the flash have switched quad mode success */
spi->driver->wait_ready(spi);
status = spi_general_get_flash_register(spi, SPI_CMD_RDSR2);
fmc_pr(QE_DBG, "\t Read Status Register-2[%#x]:%#x\n",
SPI_CMD_RDSR2, status);
if (spi_nor_get_qe_by_cr(status) == op)
fmc_pr(QE_DBG, "\t %s Quad success. status:%#x\n",
str[op], status);
else
db_msg("Error: %s Quad failed! reg:%#x\n", str[op], status);
QE_END:
return op;
}