diff options
Diffstat (limited to 'drivers/mtd/spi/spi-nor-core.c')
| -rw-r--r-- | drivers/mtd/spi/spi-nor-core.c | 87 | 
1 files changed, 87 insertions, 0 deletions
| diff --git a/drivers/mtd/spi/spi-nor-core.c b/drivers/mtd/spi/spi-nor-core.c index 3a1060b04b2..8dd44c0f1e1 100644 --- a/drivers/mtd/spi/spi-nor-core.c +++ b/drivers/mtd/spi/spi-nor-core.c @@ -3148,6 +3148,88 @@ static struct spi_nor_fixups s28hs512t_fixups = {  };  #endif /* CONFIG_SPI_FLASH_S28HS512T */ +#ifdef CONFIG_SPI_FLASH_MT35XU +static int spi_nor_micron_octal_dtr_enable(struct spi_nor *nor) +{ +	struct spi_mem_op op; +	u8 buf; +	u8 addr_width = 3; +	int ret; + +	/* Set dummy cycles for Fast Read to the default of 20. */ +	ret = write_enable(nor); +	if (ret) +		return ret; + +	buf = 20; +	op = (struct spi_mem_op) +		SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_MT_WR_ANY_REG, 1), +			   SPI_MEM_OP_ADDR(addr_width, SPINOR_REG_MT_CFR1V, 1), +			   SPI_MEM_OP_NO_DUMMY, +			   SPI_MEM_OP_DATA_OUT(1, &buf, 1)); +	ret = spi_mem_exec_op(nor->spi, &op); +	if (ret) +		return ret; + +	ret = spi_nor_wait_till_ready(nor); +	if (ret) +		return ret; + +	nor->read_dummy = 20; + +	ret = write_enable(nor); +	if (ret) +		return ret; + +	buf = SPINOR_MT_OCT_DTR; +	op = (struct spi_mem_op) +		SPI_MEM_OP(SPI_MEM_OP_CMD(SPINOR_OP_MT_WR_ANY_REG, 1), +			   SPI_MEM_OP_ADDR(addr_width, SPINOR_REG_MT_CFR0V, 1), +			   SPI_MEM_OP_NO_DUMMY, +			   SPI_MEM_OP_DATA_OUT(1, &buf, 1)); +	ret = spi_mem_exec_op(nor->spi, &op); +	if (ret) { +		dev_err(nor->dev, "Failed to enable octal DTR mode\n"); +		return ret; +	} + +	return 0; +} + +static void mt35xu512aba_default_init(struct spi_nor *nor) +{ +	nor->octal_dtr_enable = spi_nor_micron_octal_dtr_enable; +} + +static void mt35xu512aba_post_sfdp_fixup(struct spi_nor *nor, +					 struct spi_nor_flash_parameter *params) +{ +	/* Set the Fast Read settings. */ +	params->hwcaps.mask |= SNOR_HWCAPS_READ_8_8_8_DTR; +	spi_nor_set_read_settings(¶ms->reads[SNOR_CMD_READ_8_8_8_DTR], +				  0, 20, SPINOR_OP_MT_DTR_RD, +				  SNOR_PROTO_8_8_8_DTR); + +	params->hwcaps.mask |= SNOR_HWCAPS_PP_8_8_8_DTR; + +	nor->cmd_ext_type = SPI_NOR_EXT_REPEAT; +	params->rdsr_dummy = 8; +	params->rdsr_addr_nbytes = 0; + +	/* +	 * The BFPT quad enable field is set to a reserved value so the quad +	 * enable function is ignored by spi_nor_parse_bfpt(). Make sure we +	 * disable it. +	 */ +	params->quad_enable = NULL; +} + +static struct spi_nor_fixups mt35xu512aba_fixups = { +	.default_init = mt35xu512aba_default_init, +	.post_sfdp = mt35xu512aba_post_sfdp_fixup, +}; +#endif /* CONFIG_SPI_FLASH_MT35XU */ +  /** spi_nor_octal_dtr_enable() - enable Octal DTR I/O if needed   * @nor:                 pointer to a 'struct spi_nor'   * @@ -3295,6 +3377,11 @@ void spi_nor_set_fixups(struct spi_nor *nor)  	if (!strcmp(nor->info->name, "s28hs512t"))  		nor->fixups = &s28hs512t_fixups;  #endif + +#ifdef CONFIG_SPI_FLASH_MT35XU +	if (!strcmp(nor->info->name, "mt35xu512aba")) +		nor->fixups = &mt35xu512aba_fixups; +#endif  }  int spi_nor_scan(struct spi_nor *nor) | 
