The patch titled
     SPI: EEPROM learns about 8 and 24 bit addressing
has been removed from the -mm tree.  Its filename was
     spi-eeprom-learns-about-8-and-24-bit-addressing.patch

This patch was dropped because it was folded into spi-eeprom-driver.patch

------------------------------------------------------
Subject: SPI: EEPROM learns about 8 and 24 bit addressing
From: "Tuppa, Walter" <[EMAIL PROTECTED]>

Since I have EEPROMs on SPI with different address sizing, I made some
changes to your at25.c to support them.  Works perfectly.  (Also includes a
small bugfix for the "what size address" test.)

Signed-off-by: Walter Tuppa <[EMAIL PROTECTED]>
Signed-off-by: David Brownell <[EMAIL PROTECTED]>
Signed-off-by: Andrew Morton <[EMAIL PROTECTED]>
---

 drivers/spi/at25.c |   78 +++++++++++++++++++++++++++++--------------
 1 file changed, 54 insertions(+), 24 deletions(-)

diff -puN drivers/spi/at25.c~spi-eeprom-learns-about-8-and-24-bit-addressing 
drivers/spi/at25.c
--- a/drivers/spi/at25.c~spi-eeprom-learns-about-8-and-24-bit-addressing
+++ a/drivers/spi/at25.c
@@ -26,6 +26,7 @@ struct at25_data {
        struct mutex            lock;
        struct spi_eeprom       chip;
        struct bin_attribute    bin;
+       unsigned                addrlen;
 };
 
 #define        AT25_WREN       0x06            /* latch the write enable */
@@ -42,6 +43,8 @@ struct at25_data {
 #define        AT25_SR_WPEN    0x80            /* writeprotect enable */
 
 
+#define EE_MAXADDRLEN  3               /* 24 bit addresses, up to 2 MBytes */
+
 /* Specs often allow 5 msec for a page write, sometimes 20 msec;
  * it's important to recover from write timeouts.
  */
@@ -59,21 +62,31 @@ at25_ee_read(
        size_t                  count
 )
 {
-       u8                      command[3];
+       u8                      command[EE_MAXADDRLEN + 1];
+       u8                      *cp;
        ssize_t                 status;
        struct spi_transfer     t[2];
        struct spi_message      m;
 
-       /* 16-bit address is written MSB first */
-       command[0] = AT25_READ;
-       command[1] = (u8) (offset >> 8);
-       command[2] = (u8) (offset >> 0);
+       cp = command;
+       *cp++ = AT25_READ;
+
+       /* 8/16/24-bit address is written MSB first */
+       switch (at25->addrlen) {
+       default:        /* case 3 */
+               *cp++ = offset >> 16;
+       case 2:
+               *cp++ = offset >> 8;
+       case 1:
+       case 0: /* can't happen: for better codegen */
+               *cp++ = offset >> 0;
+       }
 
        spi_message_init(&m);
        memset(t, 0, sizeof t);
 
        t[0].tx_buf = command;
-       t[0].len = 3;
+       t[0].len = at25->addrlen + 1;
        spi_message_add_tail(&t[0], &m);
 
        t[1].rx_buf = buf;
@@ -129,7 +142,7 @@ at25_ee_write(struct at25_data *at25, ch
        buf_size = at25->chip.page_size;
        if (buf_size > io_limit)
                buf_size = io_limit;
-       bounce = kmalloc(buf_size + 3, GFP_KERNEL);
+       bounce = kmalloc(buf_size + at25->addrlen + 1, GFP_KERNEL);
        if (!bounce)
                return -ENOMEM;
 
@@ -142,28 +155,37 @@ at25_ee_write(struct at25_data *at25, ch
                unsigned long   timeout, retries;
                unsigned        segment;
                unsigned        offset = (unsigned) off;
+               u8              *cp = bounce + 1;
 
-               bounce[3] = AT25_WREN;
-               status = spi_write(at25->spi, bounce + 3, 1);
+               *cp = AT25_WREN;
+               status = spi_write(at25->spi, cp, 1);
                if (status < 0) {
                        dev_dbg(&at25->spi->dev, "WREN --> %d\n",
                                        (int) status);
                        break;
                }
 
-               /* 16-bit address is written MSB first */
-               bounce[1] = (u8)(offset >> 8);
-               bounce[2] = (u8)(offset >> 0);
+               /* 8/16/24-bit address is written MSB first */
+               switch (at25->addrlen) {
+               default:        /* case 3 */
+                       *cp++ = offset >> 16;
+               case 2:
+                       *cp++ = offset >> 8;
+               case 1:
+               case 0: /* can't happen: for better codegen */
+                       *cp++ = offset >> 0;
+               }
 
                /* Write as much of a page as we can */
                segment = buf_size - (offset % buf_size);
                if (segment > count)
                        segment = count;
-               memcpy(&bounce[3], buf, segment);
-               status = spi_write(at25->spi, bounce, segment + 3);
+               memcpy(cp, buf, segment);
+               status = spi_write(at25->spi, bounce,
+                               segment + at25->addrlen + 1);
                dev_dbg(&at25->spi->dev,
-                       "write %u bytes at %u --> %d\n",
-                       segment, offset, (int) status);
+                               "write %u bytes at %u --> %d\n",
+                               segment, offset, (int) status);
                if (status < 0)
                        break;
 
@@ -240,6 +262,7 @@ static int at25_probe(struct spi_device 
        const struct spi_eeprom *chip;
        int                     err;
        int                     sr;
+       int                     addrlen;
 
        /* Chip description */
        chip = spi->dev.platform_data;
@@ -249,12 +272,14 @@ static int at25_probe(struct spi_device 
                goto fail;
        }
 
-       /* For now we only support 16 bit addressing, for
-        * chips from 512 bytes to 64 Kbytes (4-512 Kbits).
-        *
-        * REVISIT some chips use 8 or 24 bit addressing
-        */
-       if (!chip->flags & EE_ADDR2) {
+       /* For now we only support 8/16/24 bit addressing */
+       if (chip->flags & EE_ADDR1)
+               addrlen = 1;
+       else if (chip->flags & EE_ADDR2)
+               addrlen = 2;
+       else if (chip->flags & EE_ADDR3)
+               addrlen = 3;
+       else {
                dev_dbg(&spi->dev, "unsupported address type\n");
                err = -EINVAL;
                goto fail;
@@ -280,6 +305,7 @@ static int at25_probe(struct spi_device 
        at25->chip = *chip;
        at25->spi = spi_dev_get(spi);
        dev_set_drvdata(&spi->dev, at25);
+       at25->addrlen = addrlen;
 
        /* Export the EEPROM bytes through sysfs, since that's convenient.
         * Default to root-only access to the data; EEPROMs often hold data
@@ -301,8 +327,12 @@ static int at25_probe(struct spi_device 
        if (err)
                goto fail;
 
-       dev_info(&spi->dev, "%Zd KByte %s eeprom%s, pagesize %u\n",
-               at25->bin.size / 1024, at25->chip.name,
+       dev_info(&spi->dev, "%Zd %s %s eeprom%s, pagesize %u\n",
+               (at25->bin.size < 1024)
+                       ? at25->bin.size
+                       : (at25->bin.size / 1024),
+               (at25->bin.size < 1024) ? "Byte" : "KByte",
+               at25->chip.name,
                (chip->flags & EE_READONLY) ? " (readonly)" : "",
                at25->chip.page_size);
        return 0;
_

Patches currently in -mm which might be from [EMAIL PROTECTED] are

spi-eeprom-driver.patch
spi-eeprom-learns-about-8-and-24-bit-addressing.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to