Lines Matching full:nor
10 #include <linux/mtd/spi-nor.h>
140 * @nor: pointer to a 'struct spi_nor'
147 static int spi_nor_read_raw(struct spi_nor *nor, u32 addr, size_t len, u8 *buf) in spi_nor_read_raw() argument
152 ret = spi_nor_read_data(nor, addr, len, buf); in spi_nor_read_raw()
167 * @nor: pointer to a 'struct spi_nor'
178 static int spi_nor_read_sfdp(struct spi_nor *nor, u32 addr, in spi_nor_read_sfdp() argument
184 read_opcode = nor->read_opcode; in spi_nor_read_sfdp()
185 addr_width = nor->addr_width; in spi_nor_read_sfdp()
186 read_dummy = nor->read_dummy; in spi_nor_read_sfdp()
188 nor->read_opcode = SPINOR_OP_RDSFDP; in spi_nor_read_sfdp()
189 nor->addr_width = 3; in spi_nor_read_sfdp()
190 nor->read_dummy = 8; in spi_nor_read_sfdp()
192 ret = spi_nor_read_raw(nor, addr, len, buf); in spi_nor_read_sfdp()
194 nor->read_opcode = read_opcode; in spi_nor_read_sfdp()
195 nor->addr_width = addr_width; in spi_nor_read_sfdp()
196 nor->read_dummy = read_dummy; in spi_nor_read_sfdp()
203 * @nor: pointer to a 'struct spi_nor'
214 static int spi_nor_read_sfdp_dma_unsafe(struct spi_nor *nor, u32 addr, in spi_nor_read_sfdp_dma_unsafe() argument
224 ret = spi_nor_read_sfdp(nor, addr, len, dma_safe_buf); in spi_nor_read_sfdp_dma_unsafe()
308 * @erase: pointer to a structure that describes a SPI NOR erase type
347 * @map: the erase map of the SPI NOR
375 * @map: the erase map of the SPI NOR
406 * @nor: pointer to a 'struct spi_nor'
432 static int spi_nor_parse_bfpt(struct spi_nor *nor, in spi_nor_parse_bfpt() argument
435 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_parse_bfpt()
454 err = spi_nor_read_sfdp_dma_unsafe(nor, addr, len, &bfpt); in spi_nor_parse_bfpt()
465 nor->addr_width = 3; in spi_nor_parse_bfpt()
469 nor->addr_width = 4; in spi_nor_parse_bfpt()
482 * Prevent overflows on params->size. Anyway, a NOR of 2^64 in spi_nor_parse_bfpt()
554 return spi_nor_post_bfpt_fixups(nor, bfpt_header, &bfpt); in spi_nor_parse_bfpt()
578 nor->flags |= SNOR_F_HAS_16BIT_SR | SNOR_F_NO_READ_CR; in spi_nor_parse_bfpt()
583 nor->flags &= ~SNOR_F_HAS_16BIT_SR; in spi_nor_parse_bfpt()
588 nor->flags &= ~SNOR_F_HAS_16BIT_SR; in spi_nor_parse_bfpt()
599 nor->flags |= SNOR_F_HAS_16BIT_SR; in spi_nor_parse_bfpt()
605 dev_dbg(nor->dev, "BFPT QER reserved value used\n"); in spi_nor_parse_bfpt()
611 nor->flags |= SNOR_F_SOFT_RESET; in spi_nor_parse_bfpt()
615 return spi_nor_post_bfpt_fixups(nor, bfpt_header, &bfpt); in spi_nor_parse_bfpt()
620 nor->cmd_ext_type = SPI_NOR_EXT_REPEAT; in spi_nor_parse_bfpt()
624 nor->cmd_ext_type = SPI_NOR_EXT_INVERT; in spi_nor_parse_bfpt()
628 dev_dbg(nor->dev, "Reserved command extension used\n"); in spi_nor_parse_bfpt()
632 dev_dbg(nor->dev, "16-bit opcodes not supported\n"); in spi_nor_parse_bfpt()
636 return spi_nor_post_bfpt_fixups(nor, bfpt_header, &bfpt); in spi_nor_parse_bfpt()
642 * @nor: pointer to a 'struct spi_nor'
645 static u8 spi_nor_smpt_addr_width(const struct spi_nor *nor, const u32 settings) in spi_nor_smpt_addr_width() argument
656 return nor->addr_width; in spi_nor_smpt_addr_width()
663 * @nor: pointer to a 'struct spi_nor'
668 static u8 spi_nor_smpt_read_dummy(const struct spi_nor *nor, const u32 settings) in spi_nor_smpt_read_dummy() argument
673 return nor->read_dummy; in spi_nor_smpt_read_dummy()
679 * @nor: pointer to a 'struct spi_nor'
685 static const u32 *spi_nor_get_map_in_use(struct spi_nor *nor, const u32 *smpt, in spi_nor_get_map_in_use() argument
701 addr_width = nor->addr_width; in spi_nor_get_map_in_use()
702 read_dummy = nor->read_dummy; in spi_nor_get_map_in_use()
703 read_opcode = nor->read_opcode; in spi_nor_get_map_in_use()
712 nor->addr_width = spi_nor_smpt_addr_width(nor, smpt[i]); in spi_nor_get_map_in_use()
713 nor->read_dummy = spi_nor_smpt_read_dummy(nor, smpt[i]); in spi_nor_get_map_in_use()
714 nor->read_opcode = SMPT_CMD_OPCODE(smpt[i]); in spi_nor_get_map_in_use()
717 err = spi_nor_read_raw(nor, addr, 1, buf); in spi_nor_get_map_in_use()
759 nor->addr_width = addr_width; in spi_nor_get_map_in_use()
760 nor->read_dummy = read_dummy; in spi_nor_get_map_in_use()
761 nor->read_opcode = read_opcode; in spi_nor_get_map_in_use()
777 * @region: pointer to a structure that describes a SPI NOR erase region
778 * @erase: pointer to a structure that describes a SPI NOR erase type
800 * @nor: pointer to a 'struct spi_nor'
805 static int spi_nor_init_non_uniform_erase_map(struct spi_nor *nor, in spi_nor_init_non_uniform_erase_map() argument
808 struct spi_nor_erase_map *map = &nor->params->erase_map; in spi_nor_init_non_uniform_erase_map()
822 region = devm_kcalloc(nor->dev, region_count, sizeof(*region), in spi_nor_init_non_uniform_erase_map()
884 * @nor: pointer to a 'struct spi_nor'
893 static int spi_nor_parse_smpt(struct spi_nor *nor, in spi_nor_parse_smpt() argument
909 ret = spi_nor_read_sfdp(nor, addr, len, smpt); in spi_nor_parse_smpt()
916 sector_map = spi_nor_get_map_in_use(nor, smpt, smpt_header->length); in spi_nor_parse_smpt()
922 ret = spi_nor_init_non_uniform_erase_map(nor, sector_map); in spi_nor_parse_smpt()
926 spi_nor_regions_sort_erase_types(&nor->params->erase_map); in spi_nor_parse_smpt()
935 * @nor: pointer to a 'struct spi_nor'.
941 static int spi_nor_parse_4bait(struct spi_nor *nor, in spi_nor_parse_4bait() argument
966 struct spi_nor_flash_parameter *params = nor->params; in spi_nor_parse_4bait()
988 ret = spi_nor_read_sfdp(nor, addr, len, dwords); in spi_nor_parse_4bait()
1047 * nor->addr_width value. in spi_nor_parse_4bait()
1101 nor->addr_width = 4; in spi_nor_parse_4bait()
1102 nor->flags |= SNOR_F_4B_OPCODES | SNOR_F_HAS_4BAIT; in spi_nor_parse_4bait()
1120 * @nor: pointer to a 'struct spi_nor'
1126 static int spi_nor_parse_profile1(struct spi_nor *nor, in spi_nor_parse_profile1() argument
1140 ret = spi_nor_read_sfdp(nor, addr, len, dwords); in spi_nor_parse_profile1()
1151 nor->params->rdsr_dummy = 8; in spi_nor_parse_profile1()
1153 nor->params->rdsr_dummy = 4; in spi_nor_parse_profile1()
1156 nor->params->rdsr_addr_nbytes = 4; in spi_nor_parse_profile1()
1158 nor->params->rdsr_addr_nbytes = 0; in spi_nor_parse_profile1()
1177 dev_dbg(nor->dev, in spi_nor_parse_profile1()
1184 spi_nor_set_read_settings(&nor->params->reads[SNOR_CMD_READ_8_8_8_DTR], in spi_nor_parse_profile1()
1198 * @nor: pointer to a 'struct spi_nor'
1204 static int spi_nor_parse_sccr(struct spi_nor *nor, in spi_nor_parse_sccr() argument
1217 ret = spi_nor_read_sfdp(nor, addr, len, dwords); in spi_nor_parse_sccr()
1224 nor->flags |= SNOR_F_IO_MODE_EN_VOLATILE; in spi_nor_parse_sccr()
1233 * @nor: pointer to a 'struct spi_nor'
1243 int spi_nor_parse_sfdp(struct spi_nor *nor) in spi_nor_parse_sfdp() argument
1248 struct device *dev = nor->dev; in spi_nor_parse_sfdp()
1255 err = spi_nor_read_sfdp_dma_unsafe(nor, 0, sizeof(header), &header); in spi_nor_parse_sfdp()
1294 err = spi_nor_read_sfdp(nor, sizeof(header), in spi_nor_parse_sfdp()
1344 err = spi_nor_read_sfdp(nor, 0, sfdp_size, sfdp->dwords); in spi_nor_parse_sfdp()
1352 nor->sfdp = sfdp; in spi_nor_parse_sfdp()
1369 err = spi_nor_parse_bfpt(nor, bfpt_header); in spi_nor_parse_sfdp()
1379 err = spi_nor_parse_smpt(nor, param_header); in spi_nor_parse_sfdp()
1383 err = spi_nor_parse_4bait(nor, param_header); in spi_nor_parse_sfdp()
1387 err = spi_nor_parse_profile1(nor, param_header); in spi_nor_parse_sfdp()
1391 err = spi_nor_parse_sccr(nor, param_header); in spi_nor_parse_sfdp()