ssb: register serial flash as platform device
authorRafał Miłecki <zajec5@gmail.com>
Tue, 18 Jun 2013 05:33:40 +0000 (07:33 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Tue, 18 Jun 2013 18:46:46 +0000 (14:46 -0400)
This allows writing MTD driver working as a platform driver. In
platform_data it will receive struct ssb_sflash, which contains all
important data about flash (window, size).

Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/ssb/driver_chipcommon_sflash.c
drivers/ssb/main.c
drivers/ssb/ssb_private.h

index 205f1c499c463840b7feac961128bd72e2582aae..e84cf04f441690e0d518e05a4b59976a80860662 100644 (file)
@@ -9,6 +9,19 @@
 
 #include "ssb_private.h"
 
+static struct resource ssb_sflash_resource = {
+       .name   = "ssb_sflash",
+       .start  = SSB_FLASH2,
+       .end    = 0,
+       .flags  = IORESOURCE_MEM | IORESOURCE_READONLY,
+};
+
+struct platform_device ssb_sflash_dev = {
+       .name           = "ssb_sflash",
+       .resource       = &ssb_sflash_resource,
+       .num_resources  = 1,
+};
+
 struct ssb_sflash_tbl_e {
        char *name;
        u32 id;
@@ -141,6 +154,12 @@ int ssb_sflash_init(struct ssb_chipcommon *cc)
        pr_info("Found %s serial flash (blocksize: 0x%X, blocks: %d)\n",
                e->name, e->blocksize, e->numblocks);
 
+       /* Prepare platform device, but don't register it yet. It's too early,
+        * malloc (required by device_private_init) is not available yet. */
+       ssb_sflash_dev.resource[0].end = ssb_sflash_dev.resource[0].start +
+                                        sflash->size;
+       ssb_sflash_dev.dev.platform_data = sflash;
+
        pr_err("Serial flash support is not implemented yet!\n");
 
        return -ENOTSUPP;
index 812775a4bfb6c6a2accfba6549b6d930c5b59fb2..e55ddf7cd7c2c42274145051c16760da800ad5ee 100644 (file)
@@ -553,6 +553,14 @@ static int ssb_devices_register(struct ssb_bus *bus)
        }
 #endif
 
+#ifdef CONFIG_SSB_SFLASH
+       if (bus->mipscore.sflash.present) {
+               err = platform_device_register(&ssb_sflash_dev);
+               if (err)
+                       pr_err("Error registering serial flash\n");
+       }
+#endif
+
        return 0;
 error:
        /* Unwind the already registered devices. */
index 4671f17f09aff44e809766e6317273d480ec6444..eb507a50a564dae01362b5cec6ae2ad25c766100 100644 (file)
@@ -243,6 +243,10 @@ static inline int ssb_sflash_init(struct ssb_chipcommon *cc)
 extern struct platform_device ssb_pflash_dev;
 #endif
 
+#ifdef CONFIG_SSB_SFLASH
+extern struct platform_device ssb_sflash_dev;
+#endif
+
 #ifdef CONFIG_SSB_DRIVER_EXTIF
 extern u32 ssb_extif_watchdog_timer_set_wdt(struct bcm47xx_wdt *wdt, u32 ticks);
 extern u32 ssb_extif_watchdog_timer_set_ms(struct bcm47xx_wdt *wdt, u32 ms);