]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/mtd/devices/m25p80.c
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux...
[net-next-2.6.git] / drivers / mtd / devices / m25p80.c
index f90941a785e4b163bf6f0451f2cbbb001c71b499..669d2b7e36bb758fd5b41ceab37bf29c95ad7fca 100644 (file)
@@ -347,8 +347,7 @@ static int m25p80_read(struct mtd_info *mtd, loff_t from, size_t len,
        spi_message_add_tail(&t[1], &m);
 
        /* Byte count starts at zero. */
-       if (retlen)
-               *retlen = 0;
+       *retlen = 0;
 
        mutex_lock(&flash->lock);
 
@@ -394,8 +393,7 @@ static int m25p80_write(struct mtd_info *mtd, loff_t to, size_t len,
                        dev_name(&flash->spi->dev), __func__, "to",
                        (u32)to, len);
 
-       if (retlen)
-               *retlen = 0;
+       *retlen = 0;
 
        /* sanity checks */
        if (!len)
@@ -466,8 +464,7 @@ static int m25p80_write(struct mtd_info *mtd, loff_t to, size_t len,
 
                        spi_sync(flash->spi, &m);
 
-                       if (retlen)
-                               *retlen += m.actual_length - m25p_cmdsz(flash);
+                       *retlen += m.actual_length - m25p_cmdsz(flash);
                }
        }
 
@@ -485,8 +482,7 @@ static int sst_write(struct mtd_info *mtd, loff_t to, size_t len,
        size_t actual;
        int cmd_sz, ret;
 
-       if (retlen)
-               *retlen = 0;
+       *retlen = 0;
 
        /* sanity checks */
        if (!len)
@@ -665,11 +661,14 @@ static const struct spi_device_id m25p_ids[] = {
        { "s25sl008a",  INFO(0x010213,      0,  64 * 1024,  16, 0) },
        { "s25sl016a",  INFO(0x010214,      0,  64 * 1024,  32, 0) },
        { "s25sl032a",  INFO(0x010215,      0,  64 * 1024,  64, 0) },
+       { "s25sl032p",  INFO(0x010215, 0x4d00,  64 * 1024,  64, SECT_4K) },
        { "s25sl064a",  INFO(0x010216,      0,  64 * 1024, 128, 0) },
        { "s25sl12800", INFO(0x012018, 0x0300, 256 * 1024,  64, 0) },
        { "s25sl12801", INFO(0x012018, 0x0301,  64 * 1024, 256, 0) },
        { "s25fl129p0", INFO(0x012018, 0x4d00, 256 * 1024,  64, 0) },
        { "s25fl129p1", INFO(0x012018, 0x4d01,  64 * 1024, 256, 0) },
+       { "s25fl016k",  INFO(0xef4015,      0,  64 * 1024,  32, SECT_4K) },
+       { "s25fl064k",  INFO(0xef4017,      0,  64 * 1024, 128, SECT_4K) },
 
        /* SST -- large erase sizes are "overlays", "sectors" are 4K */
        { "sst25vf040b", INFO(0xbf258d, 0, 64 * 1024,  8, SECT_4K) },
@@ -718,6 +717,7 @@ static const struct spi_device_id m25p_ids[] = {
        { "w25x32", INFO(0xef3016, 0, 64 * 1024,  64, SECT_4K) },
        { "w25q32", INFO(0xef4016, 0, 64 * 1024,  64, SECT_4K) },
        { "w25x64", INFO(0xef3017, 0, 64 * 1024, 128, SECT_4K) },
+       { "w25q64", INFO(0xef4017, 0, 64 * 1024, 128, SECT_4K) },
 
        /* Catalyst / On Semiconductor -- non-JEDEC */
        { "cat25c11", CAT25_INFO(  16, 8, 16, 1) },
@@ -797,7 +797,7 @@ static int __devinit m25p_probe(struct spi_device *spi)
                        break;
                }
 
-               if (plat_id)
+               if (i < ARRAY_SIZE(m25p_ids) - 1)
                        id = plat_id;
                else
                        dev_warn(&spi->dev, "unrecognized id %s\n", data->type);
@@ -928,6 +928,13 @@ static int __devinit m25p_probe(struct spi_device *spi)
                        nr_parts = data->nr_parts;
                }
 
+#ifdef CONFIG_OF
+               if (nr_parts <= 0 && spi->dev.of_node) {
+                       nr_parts = of_mtd_parse_partitions(&spi->dev,
+                                       spi->dev.of_node, &parts);
+               }
+#endif
+
                if (nr_parts > 0) {
                        for (i = 0; i < nr_parts; i++) {
                                DEBUG(MTD_DEBUG_LEVEL2, "partitions[%d] = "