bcma: only map wrapper if its address is available
authorHauke Mehrtens <hauke@hauke-m.de>
Fri, 22 Aug 2014 06:44:52 +0000 (08:44 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Thu, 28 Aug 2014 18:41:56 +0000 (14:41 -0400)
The Chipcommon B core does not have a wrap address and it would fail here.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: Rafał Miłecki <zajec5@gmail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/bcma/host_soc.c
drivers/bcma/scan.c

index 3475e60..1edd7e0 100644 (file)
@@ -134,12 +134,16 @@ static void bcma_host_soc_block_write(struct bcma_device *core,
 
 static u32 bcma_host_soc_aread32(struct bcma_device *core, u16 offset)
 {
+       if (WARN_ONCE(!core->io_wrap, "Accessed core has no wrapper/agent\n"))
+               return ~0;
        return readl(core->io_wrap + offset);
 }
 
 static void bcma_host_soc_awrite32(struct bcma_device *core, u16 offset,
                                  u32 value)
 {
+       if (WARN_ONCE(!core->io_wrap, "Accessed core has no wrapper/agent\n"))
+               return;
        writel(value, core->io_wrap + offset);
 }
 
index b4764c6..e9bd772 100644 (file)
@@ -421,10 +421,13 @@ static int bcma_get_next_core(struct bcma_bus *bus, u32 __iomem **eromptr,
                core->io_addr = ioremap_nocache(core->addr, BCMA_CORE_SIZE);
                if (!core->io_addr)
                        return -ENOMEM;
-               core->io_wrap = ioremap_nocache(core->wrap, BCMA_CORE_SIZE);
-               if (!core->io_wrap) {
-                       iounmap(core->io_addr);
-                       return -ENOMEM;
+               if (core->wrap) {
+                       core->io_wrap = ioremap_nocache(core->wrap,
+                                                       BCMA_CORE_SIZE);
+                       if (!core->io_wrap) {
+                               iounmap(core->io_addr);
+                               return -ENOMEM;
+                       }
                }
        }
        return 0;