bcma: add extra sprom check
authorHauke Mehrtens <hauke@hauke-m.de>
Mon, 30 Jan 2012 23:03:37 +0000 (00:03 +0100)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 6 Feb 2012 19:53:06 +0000 (14:53 -0500)
This check is needed on the BCM43224 device as it says in the
capabilities it has an sprom but is extra check says it has not.

Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/bcma/sprom.c
include/linux/bcma/bcma_driver_chipcommon.h

index e35134f..ca77525 100644 (file)
@@ -250,6 +250,7 @@ int bcma_sprom_get(struct bcma_bus *bus)
 {
        u16 offset;
        u16 *sprom;
+       u32 sromctrl;
        int err = 0;
 
        if (!bus->drv_cc.core)
@@ -258,6 +259,12 @@ int bcma_sprom_get(struct bcma_bus *bus)
        if (!(bus->drv_cc.capabilities & BCMA_CC_CAP_SPROM))
                return -ENOENT;
 
+       if (bus->drv_cc.core->id.rev >= 32) {
+               sromctrl = bcma_read32(bus->drv_cc.core, BCMA_CC_SROM_CONTROL);
+               if (!(sromctrl & BCMA_CC_SROM_CONTROL_PRESENT))
+                       return -ENOENT;
+       }
+
        sprom = kcalloc(SSB_SPROMSIZE_WORDS_R4, sizeof(u16),
                        GFP_KERNEL);
        if (!sprom)
index a33086a..e72938b 100644 (file)
 #define BCMA_CC_FLASH_CFG              0x0128
 #define  BCMA_CC_FLASH_CFG_DS          0x0010  /* Data size, 0=8bit, 1=16bit */
 #define BCMA_CC_FLASH_WAITCNT          0x012C
+#define BCMA_CC_SROM_CONTROL           0x0190
+#define  BCMA_CC_SROM_CONTROL_START    0x80000000
+#define  BCMA_CC_SROM_CONTROL_BUSY     0x80000000
+#define  BCMA_CC_SROM_CONTROL_OPCODE   0x60000000
+#define  BCMA_CC_SROM_CONTROL_OP_READ  0x00000000
+#define  BCMA_CC_SROM_CONTROL_OP_WRITE 0x20000000
+#define  BCMA_CC_SROM_CONTROL_OP_WRDIS 0x40000000
+#define  BCMA_CC_SROM_CONTROL_OP_WREN  0x60000000
+#define  BCMA_CC_SROM_CONTROL_OTPSEL   0x00000010
+#define  BCMA_CC_SROM_CONTROL_LOCK     0x00000008
+#define  BCMA_CC_SROM_CONTROL_SIZE_MASK        0x00000006
+#define  BCMA_CC_SROM_CONTROL_SIZE_1K  0x00000000
+#define  BCMA_CC_SROM_CONTROL_SIZE_4K  0x00000002
+#define  BCMA_CC_SROM_CONTROL_SIZE_16K 0x00000004
+#define  BCMA_CC_SROM_CONTROL_SIZE_SHIFT       1
+#define  BCMA_CC_SROM_CONTROL_PRESENT  0x00000001
 /* 0x1E0 is defined as shared BCMA_CLKCTLST */
 #define BCMA_CC_HW_WORKAROUND          0x01E4 /* Hardware workaround (rev >= 20) */
 #define BCMA_CC_UART0_DATA             0x0300