Lines Matching refs:nor

82 static int read_sr(struct spi_nor *nor)  in read_sr()  argument
87 ret = nor->read_reg(nor, SPINOR_OP_RDSR, &val, 1); in read_sr()
101 static int read_fsr(struct spi_nor *nor) in read_fsr() argument
106 ret = nor->read_reg(nor, SPINOR_OP_RDFSR, &val, 1); in read_fsr()
120 static int read_cr(struct spi_nor *nor) in read_cr() argument
125 ret = nor->read_reg(nor, SPINOR_OP_RDCR, &val, 1); in read_cr()
127 dev_err(nor->dev, "error %d reading CR\n", ret); in read_cr()
139 static inline int spi_nor_read_dummy_cycles(struct spi_nor *nor) in spi_nor_read_dummy_cycles() argument
141 switch (nor->flash_read) { in spi_nor_read_dummy_cycles()
156 static inline int write_sr(struct spi_nor *nor, u8 val) in write_sr() argument
158 nor->cmd_buf[0] = val; in write_sr()
159 return nor->write_reg(nor, SPINOR_OP_WRSR, nor->cmd_buf, 1); in write_sr()
166 static inline int write_enable(struct spi_nor *nor) in write_enable() argument
168 return nor->write_reg(nor, SPINOR_OP_WREN, NULL, 0); in write_enable()
174 static inline int write_disable(struct spi_nor *nor) in write_disable() argument
176 return nor->write_reg(nor, SPINOR_OP_WRDI, NULL, 0); in write_disable()
185 static inline int set_4byte(struct spi_nor *nor, const struct flash_info *info, in set_4byte() argument
199 write_enable(nor); in set_4byte()
202 status = nor->write_reg(nor, cmd, NULL, 0); in set_4byte()
204 write_disable(nor); in set_4byte()
209 nor->cmd_buf[0] = enable << 7; in set_4byte()
210 return nor->write_reg(nor, SPINOR_OP_BRWR, nor->cmd_buf, 1); in set_4byte()
213 static inline int spi_nor_sr_ready(struct spi_nor *nor) in spi_nor_sr_ready() argument
215 int sr = read_sr(nor); in spi_nor_sr_ready()
222 static inline int spi_nor_fsr_ready(struct spi_nor *nor) in spi_nor_fsr_ready() argument
224 int fsr = read_fsr(nor); in spi_nor_fsr_ready()
231 static int spi_nor_ready(struct spi_nor *nor) in spi_nor_ready() argument
234 sr = spi_nor_sr_ready(nor); in spi_nor_ready()
237 fsr = nor->flags & SNOR_F_USE_FSR ? spi_nor_fsr_ready(nor) : 1; in spi_nor_ready()
247 static int spi_nor_wait_till_ready_with_timeout(struct spi_nor *nor, in spi_nor_wait_till_ready_with_timeout() argument
259 ret = spi_nor_ready(nor); in spi_nor_wait_till_ready_with_timeout()
268 dev_err(nor->dev, "flash operation timed out\n"); in spi_nor_wait_till_ready_with_timeout()
273 static int spi_nor_wait_till_ready(struct spi_nor *nor) in spi_nor_wait_till_ready() argument
275 return spi_nor_wait_till_ready_with_timeout(nor, in spi_nor_wait_till_ready()
284 static int erase_chip(struct spi_nor *nor) in erase_chip() argument
286 dev_dbg(nor->dev, " %lldKiB\n", (long long)(nor->mtd.size >> 10)); in erase_chip()
288 return nor->write_reg(nor, SPINOR_OP_CHIP_ERASE, NULL, 0); in erase_chip()
291 static int spi_nor_lock_and_prep(struct spi_nor *nor, enum spi_nor_ops ops) in spi_nor_lock_and_prep() argument
295 mutex_lock(&nor->lock); in spi_nor_lock_and_prep()
297 if (nor->prepare) { in spi_nor_lock_and_prep()
298 ret = nor->prepare(nor, ops); in spi_nor_lock_and_prep()
300 dev_err(nor->dev, "failed in the preparation.\n"); in spi_nor_lock_and_prep()
301 mutex_unlock(&nor->lock); in spi_nor_lock_and_prep()
308 static void spi_nor_unlock_and_unprep(struct spi_nor *nor, enum spi_nor_ops ops) in spi_nor_unlock_and_unprep() argument
310 if (nor->unprepare) in spi_nor_unlock_and_unprep()
311 nor->unprepare(nor, ops); in spi_nor_unlock_and_unprep()
312 mutex_unlock(&nor->lock); in spi_nor_unlock_and_unprep()
321 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_erase() local
326 dev_dbg(nor->dev, "at 0x%llx, len %lld\n", (long long)instr->addr, in spi_nor_erase()
336 ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_ERASE); in spi_nor_erase()
344 write_enable(nor); in spi_nor_erase()
346 if (erase_chip(nor)) { in spi_nor_erase()
360 ret = spi_nor_wait_till_ready_with_timeout(nor, timeout); in spi_nor_erase()
372 write_enable(nor); in spi_nor_erase()
374 if (nor->erase(nor, addr)) { in spi_nor_erase()
382 ret = spi_nor_wait_till_ready(nor); in spi_nor_erase()
388 write_disable(nor); in spi_nor_erase()
390 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_ERASE); in spi_nor_erase()
398 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_ERASE); in spi_nor_erase()
403 static void stm_get_locked_range(struct spi_nor *nor, u8 sr, loff_t *ofs, in stm_get_locked_range() argument
406 struct mtd_info *mtd = &nor->mtd; in stm_get_locked_range()
425 static int stm_is_locked_sr(struct spi_nor *nor, loff_t ofs, uint64_t len, in stm_is_locked_sr() argument
431 stm_get_locked_range(nor, sr, &lock_offs, &lock_len); in stm_is_locked_sr()
459 static int stm_lock(struct spi_nor *nor, loff_t ofs, uint64_t len) in stm_lock() argument
461 struct mtd_info *mtd = &nor->mtd; in stm_lock()
466 status_old = read_sr(nor); in stm_lock()
471 if (!stm_is_locked_sr(nor, ofs + len, mtd->size - ofs - len, in stm_lock()
500 write_enable(nor); in stm_lock()
501 return write_sr(nor, status_new); in stm_lock()
509 static int stm_unlock(struct spi_nor *nor, loff_t ofs, uint64_t len) in stm_unlock() argument
511 struct mtd_info *mtd = &nor->mtd; in stm_unlock()
516 status_old = read_sr(nor); in stm_unlock()
519 if (stm_is_locked_sr(nor, ofs - mtd->erasesize, mtd->erasesize, in stm_unlock()
548 write_enable(nor); in stm_unlock()
549 return write_sr(nor, status_new); in stm_unlock()
559 static int stm_is_locked(struct spi_nor *nor, loff_t ofs, uint64_t len) in stm_is_locked() argument
563 status = read_sr(nor); in stm_is_locked()
567 return stm_is_locked_sr(nor, ofs, len, status); in stm_is_locked()
572 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_lock() local
575 ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_LOCK); in spi_nor_lock()
579 ret = nor->flash_lock(nor, ofs, len); in spi_nor_lock()
581 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_UNLOCK); in spi_nor_lock()
587 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_unlock() local
590 ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_UNLOCK); in spi_nor_unlock()
594 ret = nor->flash_unlock(nor, ofs, len); in spi_nor_unlock()
596 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_LOCK); in spi_nor_unlock()
602 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_is_locked() local
605 ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_UNLOCK); in spi_nor_is_locked()
609 ret = nor->flash_is_locked(nor, ofs, len); in spi_nor_is_locked()
611 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_LOCK); in spi_nor_is_locked()
851 static const struct flash_info *spi_nor_read_id(struct spi_nor *nor) in spi_nor_read_id() argument
857 tmp = nor->read_reg(nor, SPINOR_OP_RDID, id, SPI_NOR_MAX_ID_LEN); in spi_nor_read_id()
859 dev_dbg(nor->dev, " error %d reading JEDEC ID\n", tmp); in spi_nor_read_id()
870 dev_err(nor->dev, "unrecognized JEDEC id bytes: %02x, %2x, %2x\n", in spi_nor_read_id()
878 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_read() local
881 dev_dbg(nor->dev, "from 0x%08x, len %zd\n", (u32)from, len); in spi_nor_read()
883 ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_READ); in spi_nor_read()
887 ret = nor->read(nor, from, len, retlen, buf); in spi_nor_read()
889 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_READ); in spi_nor_read()
896 struct spi_nor *nor = mtd_to_spi_nor(mtd); in sst_write() local
900 dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len); in sst_write()
902 ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_WRITE); in sst_write()
906 write_enable(nor); in sst_write()
908 nor->sst_write_second = false; in sst_write()
913 nor->program_opcode = SPINOR_OP_BP; in sst_write()
916 nor->write(nor, to, 1, retlen, buf); in sst_write()
917 ret = spi_nor_wait_till_ready(nor); in sst_write()
925 nor->program_opcode = SPINOR_OP_AAI_WP; in sst_write()
928 nor->write(nor, to, 2, retlen, buf + actual); in sst_write()
929 ret = spi_nor_wait_till_ready(nor); in sst_write()
933 nor->sst_write_second = true; in sst_write()
935 nor->sst_write_second = false; in sst_write()
937 write_disable(nor); in sst_write()
938 ret = spi_nor_wait_till_ready(nor); in sst_write()
944 write_enable(nor); in sst_write()
946 nor->program_opcode = SPINOR_OP_BP; in sst_write()
947 nor->write(nor, to, 1, retlen, buf + actual); in sst_write()
949 ret = spi_nor_wait_till_ready(nor); in sst_write()
952 write_disable(nor); in sst_write()
955 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE); in sst_write()
967 struct spi_nor *nor = mtd_to_spi_nor(mtd); in spi_nor_write() local
971 dev_dbg(nor->dev, "to 0x%08x, len %zd\n", (u32)to, len); in spi_nor_write()
973 ret = spi_nor_lock_and_prep(nor, SPI_NOR_OPS_WRITE); in spi_nor_write()
977 write_enable(nor); in spi_nor_write()
979 page_offset = to & (nor->page_size - 1); in spi_nor_write()
982 if (page_offset + len <= nor->page_size) { in spi_nor_write()
983 nor->write(nor, to, len, retlen, buf); in spi_nor_write()
986 page_size = nor->page_size - page_offset; in spi_nor_write()
987 nor->write(nor, to, page_size, retlen, buf); in spi_nor_write()
992 if (page_size > nor->page_size) in spi_nor_write()
993 page_size = nor->page_size; in spi_nor_write()
995 ret = spi_nor_wait_till_ready(nor); in spi_nor_write()
999 write_enable(nor); in spi_nor_write()
1001 nor->write(nor, to + i, page_size, retlen, buf + i); in spi_nor_write()
1005 ret = spi_nor_wait_till_ready(nor); in spi_nor_write()
1007 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_WRITE); in spi_nor_write()
1011 static int macronix_quad_enable(struct spi_nor *nor) in macronix_quad_enable() argument
1015 val = read_sr(nor); in macronix_quad_enable()
1016 write_enable(nor); in macronix_quad_enable()
1018 write_sr(nor, val | SR_QUAD_EN_MX); in macronix_quad_enable()
1020 if (spi_nor_wait_till_ready(nor)) in macronix_quad_enable()
1023 ret = read_sr(nor); in macronix_quad_enable()
1025 dev_err(nor->dev, "Macronix Quad bit not set\n"); in macronix_quad_enable()
1038 static int write_sr_cr(struct spi_nor *nor, u16 val) in write_sr_cr() argument
1040 nor->cmd_buf[0] = val & 0xff; in write_sr_cr()
1041 nor->cmd_buf[1] = (val >> 8); in write_sr_cr()
1043 return nor->write_reg(nor, SPINOR_OP_WRSR, nor->cmd_buf, 2); in write_sr_cr()
1046 static int spansion_quad_enable(struct spi_nor *nor) in spansion_quad_enable() argument
1051 write_enable(nor); in spansion_quad_enable()
1053 ret = write_sr_cr(nor, quad_en); in spansion_quad_enable()
1055 dev_err(nor->dev, in spansion_quad_enable()
1061 ret = read_cr(nor); in spansion_quad_enable()
1063 dev_err(nor->dev, "Spansion Quad bit not set\n"); in spansion_quad_enable()
1070 static int set_quad_mode(struct spi_nor *nor, const struct flash_info *info) in set_quad_mode() argument
1076 status = macronix_quad_enable(nor); in set_quad_mode()
1078 dev_err(nor->dev, "Macronix quad-read not enabled\n"); in set_quad_mode()
1085 status = spansion_quad_enable(nor); in set_quad_mode()
1087 dev_err(nor->dev, "Spansion quad-read not enabled\n"); in set_quad_mode()
1094 static int spi_nor_check(struct spi_nor *nor) in spi_nor_check() argument
1096 if (!nor->dev || !nor->read || !nor->write || in spi_nor_check()
1097 !nor->read_reg || !nor->write_reg || !nor->erase) { in spi_nor_check()
1105 int spi_nor_scan(struct spi_nor *nor, const char *name, enum read_mode mode) in spi_nor_scan() argument
1108 struct device *dev = nor->dev; in spi_nor_scan()
1109 struct mtd_info *mtd = &nor->mtd; in spi_nor_scan()
1110 struct device_node *np = nor->flash_node; in spi_nor_scan()
1114 ret = spi_nor_check(nor); in spi_nor_scan()
1122 info = spi_nor_read_id(nor); in spi_nor_scan()
1133 jinfo = spi_nor_read_id(nor); in spi_nor_scan()
1150 mutex_init(&nor->lock); in spi_nor_scan()
1160 write_enable(nor); in spi_nor_scan()
1161 write_sr(nor, 0); in spi_nor_scan()
1166 mtd->priv = nor; in spi_nor_scan()
1176 nor->flash_lock = stm_lock; in spi_nor_scan()
1177 nor->flash_unlock = stm_unlock; in spi_nor_scan()
1178 nor->flash_is_locked = stm_is_locked; in spi_nor_scan()
1181 if (nor->flash_lock && nor->flash_unlock && nor->flash_is_locked) { in spi_nor_scan()
1194 nor->flags |= SNOR_F_USE_FSR; in spi_nor_scan()
1199 nor->erase_opcode = SPINOR_OP_BE_4K; in spi_nor_scan()
1202 nor->erase_opcode = SPINOR_OP_BE_4K_PMC; in spi_nor_scan()
1207 nor->erase_opcode = SPINOR_OP_SE; in spi_nor_scan()
1215 nor->page_size = info->page_size; in spi_nor_scan()
1216 mtd->writebufsize = nor->page_size; in spi_nor_scan()
1221 nor->flash_read = SPI_NOR_FAST; in spi_nor_scan()
1223 nor->flash_read = SPI_NOR_NORMAL; in spi_nor_scan()
1226 nor->flash_read = SPI_NOR_FAST; in spi_nor_scan()
1231 nor->flash_read = SPI_NOR_NORMAL; in spi_nor_scan()
1235 ret = set_quad_mode(nor, info); in spi_nor_scan()
1240 nor->flash_read = SPI_NOR_QUAD; in spi_nor_scan()
1242 nor->flash_read = SPI_NOR_DUAL; in spi_nor_scan()
1246 switch (nor->flash_read) { in spi_nor_scan()
1248 nor->read_opcode = SPINOR_OP_READ_1_1_4; in spi_nor_scan()
1251 nor->read_opcode = SPINOR_OP_READ_1_1_2; in spi_nor_scan()
1254 nor->read_opcode = SPINOR_OP_READ_FAST; in spi_nor_scan()
1257 nor->read_opcode = SPINOR_OP_READ; in spi_nor_scan()
1264 nor->program_opcode = SPINOR_OP_PP; in spi_nor_scan()
1267 nor->addr_width = info->addr_width; in spi_nor_scan()
1270 nor->addr_width = 4; in spi_nor_scan()
1273 switch (nor->flash_read) { in spi_nor_scan()
1275 nor->read_opcode = SPINOR_OP_READ4_1_1_4; in spi_nor_scan()
1278 nor->read_opcode = SPINOR_OP_READ4_1_1_2; in spi_nor_scan()
1281 nor->read_opcode = SPINOR_OP_READ4_FAST; in spi_nor_scan()
1284 nor->read_opcode = SPINOR_OP_READ4; in spi_nor_scan()
1287 nor->program_opcode = SPINOR_OP_PP_4B; in spi_nor_scan()
1289 nor->erase_opcode = SPINOR_OP_SE_4B; in spi_nor_scan()
1292 set_4byte(nor, info, 1); in spi_nor_scan()
1294 nor->addr_width = 3; in spi_nor_scan()
1297 nor->read_dummy = spi_nor_read_dummy_cycles(nor); in spi_nor_scan()