Lines Matching +full:spi +full:- +full:device

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Atmel AT45xxx DataFlash MTD driver for lightweight SPI framework
6 * Copyright (C) 2003-2005 SAN People (Pty) Ltd
11 #include <linux/device.h>
18 #include <linux/spi/spi.h>
19 #include <linux/spi/flash.h>
25 * DataFlash is a kind of SPI flash. Most AT45 chips have two buffers in
29 * Sometimes DataFlash is packaged in MMC-format cards, although the
58 #define OP_MWRITE_BUFFER1 0x88 /* sector must be pre-erased */
59 #define OP_MWRITE_BUFFER2 0x89 /* sector must be pre-erased */
61 /* write to buffer, then write-erase to flash */
69 /* read flash to buffer, then write-erase to flash */
73 /* newer chips report JEDEC manufacturer and device IDs; chip
74 * serial number and OTP bits; and per-sector writeprotect.
94 struct spi_device *spi; member
111 * Return the status of the DataFlash device.
113 static inline int dataflash_status(struct spi_device *spi) in dataflash_status() argument
118 return spi_w8r8(spi, OP_READ_STATUS); in dataflash_status()
122 * Poll the DataFlash device until it is READY.
123 * This usually takes 5-20 msec or so; more for sector erase.
125 static int dataflash_waitready(struct spi_device *spi) in dataflash_waitready() argument
130 status = dataflash_status(spi); in dataflash_waitready()
132 dev_dbg(&spi->dev, "status %d?\n", status); in dataflash_waitready()
150 struct dataflash *priv = mtd->priv; in dataflash_erase()
151 struct spi_device *spi = priv->spi; in dataflash_erase() local
154 unsigned blocksize = priv->page_size << 3; in dataflash_erase()
158 dev_dbg(&spi->dev, "erase addr=0x%llx len 0x%llx\n", in dataflash_erase()
159 (long long)instr->addr, (long long)instr->len); in dataflash_erase()
161 div_u64_rem(instr->len, priv->page_size, &rem); in dataflash_erase()
163 return -EINVAL; in dataflash_erase()
164 div_u64_rem(instr->addr, priv->page_size, &rem); in dataflash_erase()
166 return -EINVAL; in dataflash_erase()
170 x.tx_buf = command = priv->command; in dataflash_erase()
174 mutex_lock(&priv->lock); in dataflash_erase()
175 while (instr->len > 0) { in dataflash_erase()
183 pageaddr = div_u64(instr->addr, priv->page_size); in dataflash_erase()
184 do_block = (pageaddr & 0x7) == 0 && instr->len >= blocksize; in dataflash_erase()
185 pageaddr = pageaddr << priv->page_offset; in dataflash_erase()
192 dev_dbg(&spi->dev, "ERASE %s: (%x) %x %x %x [%i]\n", in dataflash_erase()
197 status = spi_sync(spi, &msg); in dataflash_erase()
198 (void) dataflash_waitready(spi); in dataflash_erase()
201 dev_err(&spi->dev, "erase %x, err %d\n", in dataflash_erase()
203 /* REVISIT: can retry instr->retries times; or in dataflash_erase()
204 * giveup and instr->fail_addr = instr->addr; in dataflash_erase()
210 instr->addr += blocksize; in dataflash_erase()
211 instr->len -= blocksize; in dataflash_erase()
213 instr->addr += priv->page_size; in dataflash_erase()
214 instr->len -= priv->page_size; in dataflash_erase()
217 mutex_unlock(&priv->lock); in dataflash_erase()
223 * Read from the DataFlash device.
224 * from : Start offset in flash device
232 struct dataflash *priv = mtd->priv; in dataflash_read()
239 dev_dbg(&priv->spi->dev, "read 0x%x..0x%x\n", in dataflash_read()
243 addr = (((unsigned)from / priv->page_size) << priv->page_offset) in dataflash_read()
244 + ((unsigned)from % priv->page_size); in dataflash_read()
246 command = priv->command; in dataflash_read()
248 dev_dbg(&priv->spi->dev, "READ: (%x) %x %x %x\n", in dataflash_read()
261 mutex_lock(&priv->lock); in dataflash_read()
273 status = spi_sync(priv->spi, &msg); in dataflash_read()
274 mutex_unlock(&priv->lock); in dataflash_read()
277 *retlen = msg.actual_length - 8; in dataflash_read()
280 dev_dbg(&priv->spi->dev, "read %x..%x --> %d\n", in dataflash_read()
287 * Write to the DataFlash device.
288 * to : Start offset in flash device
296 struct dataflash *priv = mtd->priv; in dataflash_write()
297 struct spi_device *spi = priv->spi; in dataflash_write() local
303 int status = -EINVAL; in dataflash_write()
306 dev_dbg(&spi->dev, "write 0x%x..0x%x\n", in dataflash_write()
311 x[0].tx_buf = command = priv->command; in dataflash_write()
315 pageaddr = ((unsigned)to / priv->page_size); in dataflash_write()
316 offset = ((unsigned)to % priv->page_size); in dataflash_write()
317 if (offset + len > priv->page_size) in dataflash_write()
318 writelen = priv->page_size - offset; in dataflash_write()
322 mutex_lock(&priv->lock); in dataflash_write()
324 dev_dbg(&spi->dev, "write @ %i:%i len=%i\n", in dataflash_write()
336 * Two persistent bits per page, plus a per-sector counter, in dataflash_write()
340 * support boot-from-DataFlash.) in dataflash_write()
343 addr = pageaddr << priv->page_offset; in dataflash_write()
346 if (writelen != priv->page_size) { in dataflash_write()
352 dev_dbg(&spi->dev, "TRANSFER: (%x) %x %x %x\n", in dataflash_write()
355 status = spi_sync(spi, &msg); in dataflash_write()
357 dev_dbg(&spi->dev, "xfer %u -> %d\n", in dataflash_write()
360 (void) dataflash_waitready(priv->spi); in dataflash_write()
370 dev_dbg(&spi->dev, "PROGRAM: (%x) %x %x %x\n", in dataflash_write()
376 status = spi_sync(spi, &msg); in dataflash_write()
379 dev_dbg(&spi->dev, "pgm %u/%u -> %d\n", in dataflash_write()
382 (void) dataflash_waitready(priv->spi); in dataflash_write()
388 addr = pageaddr << priv->page_offset; in dataflash_write()
394 dev_dbg(&spi->dev, "COMPARE: (%x) %x %x %x\n", in dataflash_write()
397 status = spi_sync(spi, &msg); in dataflash_write()
399 dev_dbg(&spi->dev, "compare %u -> %d\n", in dataflash_write()
402 status = dataflash_waitready(priv->spi); in dataflash_write()
406 dev_err(&spi->dev, "compare page %u, err %d\n", in dataflash_write()
409 status = -EIO; in dataflash_write()
416 remaining = remaining - writelen; in dataflash_write()
422 if (remaining > priv->page_size) in dataflash_write()
423 writelen = priv->page_size; in dataflash_write()
427 mutex_unlock(&priv->lock); in dataflash_write()
440 * Unless the user block changed from all-ones, we can't in dataflash_get_otp_info()
443 info->start = 0; in dataflash_get_otp_info()
444 info->length = 64; in dataflash_get_otp_info()
445 info->locked = 1; in dataflash_get_otp_info()
450 static ssize_t otp_read(struct spi_device *spi, unsigned base, in otp_read() argument
460 return -EINVAL; in otp_read()
463 len = 64 - off; in otp_read()
470 return -ENOMEM; in otp_read()
472 /* OUT: OP_READ_SECURITY, 3 don't-care bytes, zeroes in otp_read()
483 dataflash_waitready(spi); in otp_read()
485 status = spi_sync(spi, &m); in otp_read()
498 struct dataflash *priv = mtd->priv; in dataflash_read_fact_otp()
501 /* 64 bytes, from 0..63 ... start at 64 on-chip */ in dataflash_read_fact_otp()
502 mutex_lock(&priv->lock); in dataflash_read_fact_otp()
503 status = otp_read(priv->spi, 64, buf, from, len); in dataflash_read_fact_otp()
504 mutex_unlock(&priv->lock); in dataflash_read_fact_otp()
515 struct dataflash *priv = mtd->priv; in dataflash_read_user_otp()
518 /* 64 bytes, from 0..63 ... start at 0 on-chip */ in dataflash_read_user_otp()
519 mutex_lock(&priv->lock); in dataflash_read_user_otp()
520 status = otp_read(priv->spi, 0, buf, from, len); in dataflash_read_user_otp()
521 mutex_unlock(&priv->lock); in dataflash_read_user_otp()
536 struct dataflash *priv = mtd->priv; in dataflash_write_user_otp()
550 len = 64 - from; in dataflash_write_user_otp()
552 /* OUT: OP_WRITE_SECURITY, 3 zeroes, 64 data-or-zero bytes in dataflash_write_user_otp()
557 return -ENOMEM; in dataflash_write_user_otp()
571 mutex_lock(&priv->lock); in dataflash_write_user_otp()
572 dataflash_waitready(priv->spi); in dataflash_write_user_otp()
573 status = spi_sync(priv->spi, &m); in dataflash_write_user_otp()
574 mutex_unlock(&priv->lock); in dataflash_write_user_otp()
585 static char *otp_setup(struct mtd_info *device, char revision) in otp_setup() argument
587 device->_get_fact_prot_info = dataflash_get_otp_info; in otp_setup()
588 device->_read_fact_prot_reg = dataflash_read_fact_otp; in otp_setup()
589 device->_get_user_prot_info = dataflash_get_otp_info; in otp_setup()
590 device->_read_user_prot_reg = dataflash_read_user_otp; in otp_setup()
596 device->_write_user_prot_reg = dataflash_write_user_otp; in otp_setup()
603 static char *otp_setup(struct mtd_info *device, char revision) in otp_setup() argument
613 * Register DataFlash device with MTD subsystem.
615 static int add_dataflash_otp(struct spi_device *spi, char *name, int nr_pages, in add_dataflash_otp() argument
619 struct mtd_info *device; in add_dataflash_otp() local
620 struct flash_platform_data *pdata = dev_get_platdata(&spi->dev); in add_dataflash_otp()
626 return -ENOMEM; in add_dataflash_otp()
628 mutex_init(&priv->lock); in add_dataflash_otp()
629 priv->spi = spi; in add_dataflash_otp()
630 priv->page_size = pagesize; in add_dataflash_otp()
631 priv->page_offset = pageoffset; in add_dataflash_otp()
634 sprintf(priv->name, "spi%d.%d-%s", in add_dataflash_otp()
635 spi->master->bus_num, spi->chip_select, in add_dataflash_otp()
638 device = &priv->mtd; in add_dataflash_otp()
639 device->name = (pdata && pdata->name) ? pdata->name : priv->name; in add_dataflash_otp()
640 device->size = nr_pages * pagesize; in add_dataflash_otp()
641 device->erasesize = pagesize; in add_dataflash_otp()
642 device->writesize = pagesize; in add_dataflash_otp()
643 device->type = MTD_DATAFLASH; in add_dataflash_otp()
644 device->flags = MTD_WRITEABLE; in add_dataflash_otp()
645 device->_erase = dataflash_erase; in add_dataflash_otp()
646 device->_read = dataflash_read; in add_dataflash_otp()
647 device->_write = dataflash_write; in add_dataflash_otp()
648 device->priv = priv; in add_dataflash_otp()
650 device->dev.parent = &spi->dev; in add_dataflash_otp()
651 mtd_set_of_node(device, spi->dev.of_node); in add_dataflash_otp()
654 otp_tag = otp_setup(device, revision); in add_dataflash_otp()
656 dev_info(&spi->dev, "%s (%lld KBytes) pagesize %d bytes%s\n", in add_dataflash_otp()
657 name, (long long)((device->size + 1023) >> 10), in add_dataflash_otp()
659 spi_set_drvdata(spi, priv); in add_dataflash_otp()
661 err = mtd_device_register(device, in add_dataflash_otp()
662 pdata ? pdata->parts : NULL, in add_dataflash_otp()
663 pdata ? pdata->nr_parts : 0); in add_dataflash_otp()
672 static inline int add_dataflash(struct spi_device *spi, char *name, in add_dataflash() argument
675 return add_dataflash_otp(spi, name, nr_pages, pagesize, in add_dataflash()
683 * the manufacturer id, then a two byte device id.
703 * non-2^N byte page size can't name exact chip revisions without
706 * These newer chips also support 128-byte security registers (with
707 * 64 bytes one-time-programmable) and software write-protection.
736 static struct flash_info *jedec_lookup(struct spi_device *spi, in jedec_lookup() argument
745 if (use_extid && !(info->flags & SUP_EXTID)) in jedec_lookup()
748 if (info->jedec_id == jedec) { in jedec_lookup()
749 dev_dbg(&spi->dev, "OTP, sector protect%s\n", in jedec_lookup()
750 (info->flags & SUP_POW2PS) ? in jedec_lookup()
752 if (info->flags & SUP_POW2PS) { in jedec_lookup()
753 status = dataflash_status(spi); in jedec_lookup()
755 dev_dbg(&spi->dev, "status error %d\n", in jedec_lookup()
760 if (info->flags & IS_POW2PS) in jedec_lookup()
763 if (!(info->flags & IS_POW2PS)) in jedec_lookup()
771 return ERR_PTR(-ENODEV); in jedec_lookup()
774 static struct flash_info *jedec_probe(struct spi_device *spi) in jedec_probe() argument
784 * JEDEC also defines an optional "extended device information" in jedec_probe()
785 * string for after vendor-specific data, after the three bytes in jedec_probe()
792 ret = spi_write_then_read(spi, &code, 1, id, id_size); in jedec_probe()
794 dev_dbg(&spi->dev, "error %d reading JEDEC ID\n", ret); in jedec_probe()
804 * First, try to match device using extended device in jedec_probe()
807 info = jedec_lookup(spi, jedec >> DATAFLASH_SHIFT_EXTID, true); in jedec_probe()
814 info = jedec_lookup(spi, jedec >> DATAFLASH_SHIFT_ID, false); in jedec_probe()
822 dev_warn(&spi->dev, "JEDEC id %016llx not handled\n", jedec); in jedec_probe()
823 return ERR_PTR(-ENODEV); in jedec_probe()
827 * Detect and initialize DataFlash device, using JEDEC IDs on newer chips
830 * Device Density ID code #Pages PageSize Offset
840 static int dataflash_probe(struct spi_device *spi) in dataflash_probe() argument
852 info = jedec_probe(spi); in dataflash_probe()
856 return add_dataflash_otp(spi, info->name, info->nr_pages, in dataflash_probe()
857 info->pagesize, info->pageoffset, in dataflash_probe()
858 (info->flags & SUP_POW2PS) ? 'd' : 'c'); in dataflash_probe()
864 status = dataflash_status(spi); in dataflash_probe()
866 dev_dbg(&spi->dev, "status error %d\n", status); in dataflash_probe()
868 status = -ENODEV; in dataflash_probe()
872 /* if there's a device there, assume it's dataflash. in dataflash_probe()
873 * board setup should have set spi->max_speed_max to in dataflash_probe()
878 status = add_dataflash(spi, "AT45DB011B", 512, 264, 9); in dataflash_probe()
881 status = add_dataflash(spi, "AT45DB021B", 1024, 264, 9); in dataflash_probe()
884 status = add_dataflash(spi, "AT45DB041x", 2048, 264, 9); in dataflash_probe()
887 status = add_dataflash(spi, "AT45DB081B", 4096, 264, 9); in dataflash_probe()
890 status = add_dataflash(spi, "AT45DB161x", 4096, 528, 10); in dataflash_probe()
893 status = add_dataflash(spi, "AT45DB321x", 8192, 528, 10); in dataflash_probe()
897 status = add_dataflash(spi, "AT45DB642x", 8192, 1056, 11); in dataflash_probe()
901 dev_info(&spi->dev, "unsupported device (%x)\n", in dataflash_probe()
903 status = -ENODEV; in dataflash_probe()
907 dev_dbg(&spi->dev, "add_dataflash --> %d\n", status); in dataflash_probe()
912 static int dataflash_remove(struct spi_device *spi) in dataflash_remove() argument
914 struct dataflash *flash = spi_get_drvdata(spi); in dataflash_remove()
917 dev_dbg(&spi->dev, "remove\n"); in dataflash_remove()
919 status = mtd_device_unregister(&flash->mtd); in dataflash_remove()
942 MODULE_ALIAS("spi:mtd_dataflash");