}
--- a/drivers/bcma/host_pci.c
+++ b/drivers/bcma/host_pci.c
-@@ -294,7 +294,7 @@ static const struct pci_device_id bcma_p
+@@ -294,7 +294,8 @@ static const struct pci_device_id bcma_p
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4358) },
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4359) },
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4360) },
- { PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x4365) },
+ { PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, 0x4365, PCI_VENDOR_ID_DELL, 0x0016) },
++ { PCI_DEVICE_SUB(PCI_VENDOR_ID_BROADCOM, 0x4365, PCI_VENDOR_ID_FOXCONN, 0xe092) },
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a0) },
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43a9) },
{ PCI_DEVICE(PCI_VENDOR_ID_BROADCOM, 0x43aa) },
+}
--- a/drivers/bcma/main.c
+++ b/drivers/bcma/main.c
-@@ -350,7 +350,7 @@ static int bcma_register_devices(struct
+@@ -136,7 +136,6 @@ static bool bcma_is_core_needed_early(u1
+ return false;
+ }
+
+-#if defined(CONFIG_OF) && defined(CONFIG_OF_ADDRESS)
+ static struct device_node *bcma_of_find_child_device(struct platform_device *parent,
+ struct bcma_device *core)
+ {
+@@ -184,7 +183,7 @@ static unsigned int bcma_of_get_irq(stru
+ struct of_phandle_args out_irq;
+ int ret;
+
+- if (!parent || !parent->dev.of_node)
++ if (!IS_ENABLED(CONFIG_OF_IRQ) || !parent || !parent->dev.of_node)
+ return 0;
+
+ ret = bcma_of_irq_parse(parent, core, &out_irq, num);
+@@ -202,23 +201,15 @@ static void bcma_of_fill_device(struct p
+ {
+ struct device_node *node;
+
++ if (!IS_ENABLED(CONFIG_OF_IRQ))
++ return;
++
+ node = bcma_of_find_child_device(parent, core);
+ if (node)
+ core->dev.of_node = node;
+
+ core->irq = bcma_of_get_irq(parent, core, 0);
+ }
+-#else
+-static void bcma_of_fill_device(struct platform_device *parent,
+- struct bcma_device *core)
+-{
+-}
+-static inline unsigned int bcma_of_get_irq(struct platform_device *parent,
+- struct bcma_device *core, int num)
+-{
+- return 0;
+-}
+-#endif /* CONFIG_OF */
+
+ unsigned int bcma_core_irq(struct bcma_device *core, int num)
+ {
+@@ -350,7 +341,7 @@ static int bcma_register_devices(struct
bcma_register_core(bus, core);
}
--- /dev/null
+--- a/drivers/bcma/Kconfig
++++ b/drivers/bcma/Kconfig
+@@ -76,9 +76,16 @@ config BCMA_PFLASH
+ default y
+
+ config BCMA_SFLASH
+- bool
+- depends on BCMA_DRIVER_MIPS
++ bool "ChipCommon-attached serial flash support"
++ depends on BCMA_HOST_SOC
+ default y
++ help
++ Some cheap devices have serial flash connected to the ChipCommon
++ instead of independent SPI controller. It requires using a separated
++ driver that implements ChipCommon specific interface communication.
++
++ Enabling this symbol will let bcma recognize serial flash and register
++ it as platform device.
+
+ config BCMA_NFLASH
+ bool
+--- a/drivers/bcma/driver_chipcommon_b.c
++++ b/drivers/bcma/driver_chipcommon_b.c
+@@ -33,11 +33,12 @@ static bool bcma_wait_reg(struct bcma_bu
+ void bcma_chipco_b_mii_write(struct bcma_drv_cc_b *ccb, u32 offset, u32 value)
+ {
+ struct bcma_bus *bus = ccb->core->bus;
++ void __iomem *mii = ccb->mii;
+
+- writel(offset, ccb->mii + 0x00);
+- bcma_wait_reg(bus, ccb->mii + 0x00, 0x0100, 0x0000, 100);
+- writel(value, ccb->mii + 0x04);
+- bcma_wait_reg(bus, ccb->mii + 0x00, 0x0100, 0x0000, 100);
++ writel(offset, mii + BCMA_CCB_MII_MNG_CTL);
++ bcma_wait_reg(bus, mii + BCMA_CCB_MII_MNG_CTL, 0x0100, 0x0000, 100);
++ writel(value, mii + BCMA_CCB_MII_MNG_CMD_DATA);
++ bcma_wait_reg(bus, mii + BCMA_CCB_MII_MNG_CTL, 0x0100, 0x0000, 100);
+ }
+ EXPORT_SYMBOL_GPL(bcma_chipco_b_mii_write);
+
+--- a/include/linux/bcma/bcma_driver_chipcommon.h
++++ b/include/linux/bcma/bcma_driver_chipcommon.h
+@@ -504,6 +504,9 @@
+ #define BCMA_CC_PMU1_PLL0_PC2_NDIV_INT_MASK 0x1ff00000
+ #define BCMA_CC_PMU1_PLL0_PC2_NDIV_INT_SHIFT 20
+
++#define BCMA_CCB_MII_MNG_CTL 0x0000
++#define BCMA_CCB_MII_MNG_CMD_DATA 0x0004
++
+ /* BCM4331 ChipControl numbers. */
+ #define BCMA_CHIPCTL_4331_BT_COEXIST BIT(0) /* 0 disable */
+ #define BCMA_CHIPCTL_4331_SECI BIT(1) /* 0 SECI is disabled (JATG functional) */