kernel: add linux 4.9 support
[openwrt/openwrt.git] / target / linux / generic / patches-4.9 / 070-bcma-from-4.11.patch
diff --git a/target/linux/generic/patches-4.9/070-bcma-from-4.11.patch b/target/linux/generic/patches-4.9/070-bcma-from-4.11.patch
new file mode 100644 (file)
index 0000000..d5bdd2d
--- /dev/null
@@ -0,0 +1,105 @@
+--- a/drivers/bcma/main.c
++++ b/drivers/bcma/main.c
+@@ -136,17 +136,17 @@ static bool bcma_is_core_needed_early(u1
+       return false;
+ }
+-static struct device_node *bcma_of_find_child_device(struct platform_device *parent,
++static struct device_node *bcma_of_find_child_device(struct device *parent,
+                                                    struct bcma_device *core)
+ {
+       struct device_node *node;
+       u64 size;
+       const __be32 *reg;
+-      if (!parent || !parent->dev.of_node)
++      if (!parent->of_node)
+               return NULL;
+-      for_each_child_of_node(parent->dev.of_node, node) {
++      for_each_child_of_node(parent->of_node, node) {
+               reg = of_get_address(node, 0, &size, NULL);
+               if (!reg)
+                       continue;
+@@ -156,7 +156,7 @@ static struct device_node *bcma_of_find_
+       return NULL;
+ }
+-static int bcma_of_irq_parse(struct platform_device *parent,
++static int bcma_of_irq_parse(struct device *parent,
+                            struct bcma_device *core,
+                            struct of_phandle_args *out_irq, int num)
+ {
+@@ -169,7 +169,7 @@ static int bcma_of_irq_parse(struct plat
+                       return rc;
+       }
+-      out_irq->np = parent->dev.of_node;
++      out_irq->np = parent->of_node;
+       out_irq->args_count = 1;
+       out_irq->args[0] = num;
+@@ -177,13 +177,13 @@ static int bcma_of_irq_parse(struct plat
+       return of_irq_parse_raw(laddr, out_irq);
+ }
+-static unsigned int bcma_of_get_irq(struct platform_device *parent,
++static unsigned int bcma_of_get_irq(struct device *parent,
+                                   struct bcma_device *core, int num)
+ {
+       struct of_phandle_args out_irq;
+       int ret;
+-      if (!IS_ENABLED(CONFIG_OF_IRQ) || !parent || !parent->dev.of_node)
++      if (!IS_ENABLED(CONFIG_OF_IRQ) || !parent->of_node)
+               return 0;
+       ret = bcma_of_irq_parse(parent, core, &out_irq, num);
+@@ -196,7 +196,7 @@ static unsigned int bcma_of_get_irq(stru
+       return irq_create_of_mapping(&out_irq);
+ }
+-static void bcma_of_fill_device(struct platform_device *parent,
++static void bcma_of_fill_device(struct device *parent,
+                               struct bcma_device *core)
+ {
+       struct device_node *node;
+@@ -227,7 +227,7 @@ unsigned int bcma_core_irq(struct bcma_d
+                       return mips_irq <= 4 ? mips_irq + 2 : 0;
+               }
+               if (bus->host_pdev)
+-                      return bcma_of_get_irq(bus->host_pdev, core, num);
++                      return bcma_of_get_irq(&bus->host_pdev->dev, core, num);
+               return 0;
+       case BCMA_HOSTTYPE_SDIO:
+               return 0;
+@@ -253,7 +253,8 @@ void bcma_prepare_core(struct bcma_bus *
+               if (IS_ENABLED(CONFIG_OF) && bus->host_pdev) {
+                       core->dma_dev = &bus->host_pdev->dev;
+                       core->dev.parent = &bus->host_pdev->dev;
+-                      bcma_of_fill_device(bus->host_pdev, core);
++                      if (core->dev.parent)
++                              bcma_of_fill_device(core->dev.parent, core);
+               } else {
+                       core->dev.dma_mask = &core->dev.coherent_dma_mask;
+                       core->dma_dev = &core->dev;
+@@ -633,8 +634,11 @@ static int bcma_device_probe(struct devi
+                                              drv);
+       int err = 0;
++      get_device(dev);
+       if (adrv->probe)
+               err = adrv->probe(core);
++      if (err)
++              put_device(dev);
+       return err;
+ }
+@@ -647,6 +651,7 @@ static int bcma_device_remove(struct dev
+       if (adrv->remove)
+               adrv->remove(core);
++      put_device(dev);
+       return 0;
+ }