Merge tag 'char-misc-3.6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[deliverable/linux.git] / drivers / misc / eeprom / at25.c
index 25003d6ceb56f2bca0364c81c881b79dee870711..4ed93dd541164d2a1763688caab1b351d3a799c9 100644 (file)
@@ -302,6 +302,61 @@ static ssize_t at25_mem_write(struct memory_accessor *mem, const char *buf,
 
 /*-------------------------------------------------------------------------*/
 
+static int at25_np_to_chip(struct device *dev,
+                          struct device_node *np,
+                          struct spi_eeprom *chip)
+{
+       u32 val;
+
+       memset(chip, 0, sizeof(*chip));
+       strncpy(chip->name, np->name, sizeof(chip->name));
+
+       if (of_property_read_u32(np, "size", &val) == 0 ||
+           of_property_read_u32(np, "at25,byte-len", &val) == 0) {
+               chip->byte_len = val;
+       } else {
+               dev_err(dev, "Error: missing \"size\" property\n");
+               return -ENODEV;
+       }
+
+       if (of_property_read_u32(np, "pagesize", &val) == 0 ||
+           of_property_read_u32(np, "at25,page-size", &val) == 0) {
+               chip->page_size = (u16)val;
+       } else {
+               dev_err(dev, "Error: missing \"pagesize\" property\n");
+               return -ENODEV;
+       }
+
+       if (of_property_read_u32(np, "at25,addr-mode", &val) == 0) {
+               chip->flags = (u16)val;
+       } else {
+               if (of_property_read_u32(np, "address-width", &val)) {
+                       dev_err(dev,
+                               "Error: missing \"address-width\" property\n");
+                       return -ENODEV;
+               }
+               switch (val) {
+               case 8:
+                       chip->flags |= EE_ADDR1;
+                       break;
+               case 16:
+                       chip->flags |= EE_ADDR2;
+                       break;
+               case 24:
+                       chip->flags |= EE_ADDR3;
+                       break;
+               default:
+                       dev_err(dev,
+                               "Error: bad \"address-width\" property: %u\n",
+                               val);
+                       return -ENODEV;
+               }
+               if (of_find_property(np, "read-only", NULL))
+                       chip->flags |= EE_READONLY;
+       }
+       return 0;
+}
+
 static int at25_probe(struct spi_device *spi)
 {
        struct at25_data        *at25 = NULL;
@@ -314,33 +369,11 @@ static int at25_probe(struct spi_device *spi)
        /* Chip description */
        if (!spi->dev.platform_data) {
                if (np) {
-                       u32 val;
-
-                       memset(&chip, 0, sizeof(chip));
-                       strncpy(chip.name, np->name, 10);
-
-                       err = of_property_read_u32(np, "at25,byte-len", &val);
-                       if (err) {
-                               dev_dbg(&spi->dev, "invalid chip dt description\n");
-                               goto fail;
-                       }
-                       chip.byte_len = val;
-
-                       err = of_property_read_u32(np, "at25,addr-mode", &val);
-                       if (err) {
-                               dev_dbg(&spi->dev, "invalid chip dt description\n");
-                               goto fail;
-                       }
-                       chip.flags = (u16)val;
-
-                       err = of_property_read_u32(np, "at25,page-size", &val);
-                       if (err) {
-                               dev_dbg(&spi->dev, "invalid chip dt description\n");
+                       err = at25_np_to_chip(&spi->dev, np, &chip);
+                       if (err)
                                goto fail;
-                       }
-                       chip.page_size = (u16)val;
                } else {
-                       dev_dbg(&spi->dev, "no chip description\n");
+                       dev_err(&spi->dev, "Error: no chip description\n");
                        err = -ENODEV;
                        goto fail;
                }
This page took 0.03243 seconds and 5 git commands to generate.