{
        u16 offset;
        u16 *sprom;
+       u32 sromctrl;
        int err = 0;
 
        if (!bus->drv_cc.core)
        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)
 
 #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