Lines Matching refs:nor

10 #include <linux/mtd/spi-nor.h>
14 #define spi_nor_otp_region_len(nor) ((nor)->params->otp.org->len)
15 #define spi_nor_otp_n_regions(nor) ((nor)->params->otp.org->n_regions)
19 * @nor: pointer to 'struct spi_nor'
36 int spi_nor_otp_read_secr(struct spi_nor *nor, loff_t addr, size_t len, u8 *buf)
43 read_opcode = nor->read_opcode;
44 addr_nbytes = nor->addr_nbytes;
45 read_dummy = nor->read_dummy;
46 read_proto = nor->read_proto;
47 rdesc = nor->dirmap.rdesc;
49 nor->read_opcode = SPINOR_OP_RSECR;
50 nor->read_dummy = 8;
51 nor->read_proto = SNOR_PROTO_1_1_1;
52 nor->dirmap.rdesc = NULL;
54 ret = spi_nor_read_data(nor, addr, len, buf);
56 nor->read_opcode = read_opcode;
57 nor->addr_nbytes = addr_nbytes;
58 nor->read_dummy = read_dummy;
59 nor->read_proto = read_proto;
60 nor->dirmap.rdesc = rdesc;
67 * @nor: pointer to 'struct spi_nor'
83 int spi_nor_otp_write_secr(struct spi_nor *nor, loff_t addr, size_t len,
91 program_opcode = nor->program_opcode;
92 addr_nbytes = nor->addr_nbytes;
93 write_proto = nor->write_proto;
94 wdesc = nor->dirmap.wdesc;
96 nor->program_opcode = SPINOR_OP_PSECR;
97 nor->write_proto = SNOR_PROTO_1_1_1;
98 nor->dirmap.wdesc = NULL;
104 ret = spi_nor_write_enable(nor);
108 written = spi_nor_write_data(nor, addr, len, buf);
112 ret = spi_nor_wait_till_ready(nor);
115 nor->program_opcode = program_opcode;
116 nor->addr_nbytes = addr_nbytes;
117 nor->write_proto = write_proto;
118 nor->dirmap.wdesc = wdesc;
125 * @nor: pointer to 'struct spi_nor'
137 int spi_nor_otp_erase_secr(struct spi_nor *nor, loff_t addr)
139 u8 erase_opcode = nor->erase_opcode;
142 ret = spi_nor_write_enable(nor);
146 nor->erase_opcode = SPINOR_OP_ESECR;
147 ret = spi_nor_erase_sector(nor, addr);
148 nor->erase_opcode = erase_opcode;
152 return spi_nor_wait_till_ready(nor);
167 * @nor: pointer to 'struct spi_nor'
175 int spi_nor_otp_lock_sr2(struct spi_nor *nor, unsigned int region)
177 u8 *cr = nor->bouncebuf;
184 ret = spi_nor_read_cr(nor, cr);
194 return spi_nor_write_16bit_cr_and_check(nor, cr[0]);
199 * @nor: pointer to 'struct spi_nor'
207 int spi_nor_otp_is_locked_sr2(struct spi_nor *nor, unsigned int region)
209 u8 *cr = nor->bouncebuf;
216 ret = spi_nor_read_cr(nor, cr);
223 static loff_t spi_nor_otp_region_start(const struct spi_nor *nor, unsigned int region)
225 const struct spi_nor_otp_organization *org = nor->params->otp.org;
230 static size_t spi_nor_otp_size(struct spi_nor *nor)
232 return spi_nor_otp_n_regions(nor) * spi_nor_otp_region_len(nor);
236 static loff_t spi_nor_otp_region_to_offset(struct spi_nor *nor, unsigned int region)
238 return region * spi_nor_otp_region_len(nor);
241 static unsigned int spi_nor_otp_offset_to_region(struct spi_nor *nor, loff_t ofs)
243 return div64_u64(ofs, spi_nor_otp_region_len(nor));
249 struct spi_nor *nor = mtd_to_spi_nor(mtd);
250 const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
251 unsigned int n_regions = spi_nor_otp_n_regions(nor);
258 ret = spi_nor_prep_and_lock(nor);
263 buf->start = spi_nor_otp_region_to_offset(nor, i);
264 buf->length = spi_nor_otp_region_len(nor);
266 locked = ops->is_locked(nor, i);
279 spi_nor_unlock_and_unprep(nor);
284 static int spi_nor_mtd_otp_range_is_locked(struct spi_nor *nor, loff_t ofs,
287 const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
295 for (region = spi_nor_otp_offset_to_region(nor, ofs);
296 region <= spi_nor_otp_offset_to_region(nor, ofs + len - 1);
298 locked = ops->is_locked(nor, region);
311 struct spi_nor *nor = mtd_to_spi_nor(mtd);
312 const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
313 const size_t rlen = spi_nor_otp_region_len(nor);
319 if (ofs < 0 || ofs >= spi_nor_otp_size(nor))
323 total_len = min_t(size_t, total_len, spi_nor_otp_size(nor) - ofs);
328 ret = spi_nor_prep_and_lock(nor);
333 ret = spi_nor_mtd_otp_range_is_locked(nor, ofs, total_len);
349 region = spi_nor_otp_offset_to_region(nor, ofs);
350 rstart = spi_nor_otp_region_start(nor, region);
363 ret = ops->write(nor, rstart + rofs, len, buf);
365 ret = ops->read(nor, rstart + rofs, len, (u8 *)buf);
379 spi_nor_unlock_and_unprep(nor);
397 struct spi_nor *nor = mtd_to_spi_nor(mtd);
398 const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
399 const size_t rlen = spi_nor_otp_region_len(nor);
411 if (from < 0 || (from + len) > spi_nor_otp_size(nor))
418 ret = spi_nor_prep_and_lock(nor);
422 ret = spi_nor_mtd_otp_range_is_locked(nor, from, len);
431 region = spi_nor_otp_offset_to_region(nor, from);
432 rstart = spi_nor_otp_region_start(nor, region);
434 ret = ops->erase(nor, rstart);
443 spi_nor_unlock_and_unprep(nor);
450 struct spi_nor *nor = mtd_to_spi_nor(mtd);
451 const struct spi_nor_otp_ops *ops = nor->params->otp.ops;
452 const size_t rlen = spi_nor_otp_region_len(nor);
456 if (from < 0 || (from + len) > spi_nor_otp_size(nor))
463 ret = spi_nor_prep_and_lock(nor);
468 region = spi_nor_otp_offset_to_region(nor, from);
469 ret = ops->lock(nor, region);
478 spi_nor_unlock_and_unprep(nor);
483 void spi_nor_set_mtd_otp_ops(struct spi_nor *nor)
485 struct mtd_info *mtd = &nor->mtd;
487 if (!nor->params->otp.ops)
490 if (WARN_ON(!is_power_of_2(spi_nor_otp_region_len(nor))))