Lines Matching full:at25

3  * at25.c -- support most SPI EEPROMs, such as Atmel AT25 models
26 * mean that some AT25 products are EEPROMs, and others are FLASH.
79 struct at25_data *at25 = priv; in at25_ee_read() local
88 if (unlikely(offset >= at25->chip.byte_len)) in at25_ee_read()
90 if ((offset + count) > at25->chip.byte_len) in at25_ee_read()
91 count = at25->chip.byte_len - offset; in at25_ee_read()
98 if (at25->chip.flags & EE_INSTR_BIT3_IS_ADDR) in at25_ee_read()
99 if (offset >= (1U << (at25->addrlen * 8))) in at25_ee_read()
104 switch (at25->addrlen) { in at25_ee_read()
120 t[0].len = at25->addrlen + 1; in at25_ee_read()
127 mutex_lock(&at25->lock); in at25_ee_read()
135 status = spi_sync(at25->spi, &m); in at25_ee_read()
136 dev_dbg(&at25->spi->dev, "read %zu bytes at %d --> %zd\n", in at25_ee_read()
139 mutex_unlock(&at25->lock); in at25_ee_read()
146 static int fm25_aux_read(struct at25_data *at25, u8 *buf, uint8_t command, in fm25_aux_read() argument
164 mutex_lock(&at25->lock); in fm25_aux_read()
166 status = spi_sync(at25->spi, &m); in fm25_aux_read()
167 dev_dbg(&at25->spi->dev, "read %d aux bytes --> %d\n", len, status); in fm25_aux_read()
169 mutex_unlock(&at25->lock); in fm25_aux_read()
175 struct at25_data *at25; in sernum_show() local
177 at25 = dev_get_drvdata(dev); in sernum_show()
178 return sysfs_emit(buf, "%*ph\n", (int)sizeof(at25->sernum), at25->sernum); in sernum_show()
190 struct at25_data *at25 = priv; in at25_ee_write() local
196 if (unlikely(off >= at25->chip.byte_len)) in at25_ee_write()
198 if ((off + count) > at25->chip.byte_len) in at25_ee_write()
199 count = at25->chip.byte_len - off; in at25_ee_write()
204 buf_size = at25->chip.page_size; in at25_ee_write()
207 bounce = kmalloc(buf_size + at25->addrlen + 1, GFP_KERNEL); in at25_ee_write()
214 mutex_lock(&at25->lock); in at25_ee_write()
224 status = spi_write(at25->spi, cp, 1); in at25_ee_write()
226 dev_dbg(&at25->spi->dev, "WREN --> %d\n", status); in at25_ee_write()
231 if (at25->chip.flags & EE_INSTR_BIT3_IS_ADDR) in at25_ee_write()
232 if (offset >= (1U << (at25->addrlen * 8))) in at25_ee_write()
237 switch (at25->addrlen) { in at25_ee_write()
254 status = spi_write(at25->spi, bounce, in at25_ee_write()
255 segment + at25->addrlen + 1); in at25_ee_write()
256 dev_dbg(&at25->spi->dev, "write %u bytes at %u --> %d\n", in at25_ee_write()
270 sr = spi_w8r8(at25->spi, AT25_RDSR); in at25_ee_write()
272 dev_dbg(&at25->spi->dev, in at25_ee_write()
283 dev_err(&at25->spi->dev, in at25_ee_write()
298 mutex_unlock(&at25->lock); in at25_ee_write()
311 strncpy(chip->name, "at25", sizeof(chip->name)); in at25_fw_to_chip()
314 device_property_read_u32(dev, "at25,byte-len", &val) == 0) { in at25_fw_to_chip()
322 device_property_read_u32(dev, "at25,page-size", &val) == 0) { in at25_fw_to_chip()
329 if (device_property_read_u32(dev, "at25,addr-mode", &val) == 0) { in at25_fw_to_chip()
363 { .compatible = "atmel,at25",},
370 { .name = "at25",},
378 struct at25_data *at25 = NULL; in at25_probe() local
412 at25 = devm_kzalloc(&spi->dev, sizeof(struct at25_data), GFP_KERNEL); in at25_probe()
413 if (!at25) in at25_probe()
416 mutex_init(&at25->lock); in at25_probe()
417 at25->chip = chip; in at25_probe()
418 at25->spi = spi; in at25_probe()
419 spi_set_drvdata(spi, at25); in at25_probe()
423 fm25_aux_read(at25, id, FM25_RDID, FM25_ID_LEN); in at25_probe()
436 if (at25->chip.byte_len > 64 * 1024) in at25_probe()
437 at25->chip.flags |= EE_ADDR3; in at25_probe()
439 at25->chip.flags |= EE_ADDR2; in at25_probe()
442 fm25_aux_read(at25, sernum, FM25_RDSN, FM25_SN_LEN); in at25_probe()
445 at25->sernum[i] = sernum[FM25_SN_LEN - 1 - i]; in at25_probe()
448 at25->chip.page_size = PAGE_SIZE; in at25_probe()
449 strncpy(at25->chip.name, "fm25", sizeof(at25->chip.name)); in at25_probe()
453 if (at25->chip.flags & EE_ADDR1) in at25_probe()
454 at25->addrlen = 1; in at25_probe()
455 else if (at25->chip.flags & EE_ADDR2) in at25_probe()
456 at25->addrlen = 2; in at25_probe()
457 else if (at25->chip.flags & EE_ADDR3) in at25_probe()
458 at25->addrlen = 3; in at25_probe()
464 at25->nvmem_config.type = is_fram ? NVMEM_TYPE_FRAM : NVMEM_TYPE_EEPROM; in at25_probe()
465 at25->nvmem_config.name = dev_name(&spi->dev); in at25_probe()
466 at25->nvmem_config.dev = &spi->dev; in at25_probe()
467 at25->nvmem_config.read_only = chip.flags & EE_READONLY; in at25_probe()
468 at25->nvmem_config.root_only = true; in at25_probe()
469 at25->nvmem_config.owner = THIS_MODULE; in at25_probe()
470 at25->nvmem_config.compat = true; in at25_probe()
471 at25->nvmem_config.base_dev = &spi->dev; in at25_probe()
472 at25->nvmem_config.reg_read = at25_ee_read; in at25_probe()
473 at25->nvmem_config.reg_write = at25_ee_write; in at25_probe()
474 at25->nvmem_config.priv = at25; in at25_probe()
475 at25->nvmem_config.stride = 1; in at25_probe()
476 at25->nvmem_config.word_size = 1; in at25_probe()
477 at25->nvmem_config.size = chip.byte_len; in at25_probe()
479 at25->nvmem = devm_nvmem_register(&spi->dev, &at25->nvmem_config); in at25_probe()
480 if (IS_ERR(at25->nvmem)) in at25_probe()
481 return PTR_ERR(at25->nvmem); in at25_probe()
486 at25->chip.name, is_fram ? "fram" : "eeprom", in at25_probe()
488 at25->chip.page_size); in at25_probe()
496 .name = "at25",
509 MODULE_ALIAS("spi:at25");