kernel: update bcma to fix devm memory leaks
authorRafał Miłecki <rafal@milecki.pl>
Tue, 31 Jan 2017 13:21:53 +0000 (14:21 +0100)
committerRafał Miłecki <rafal@milecki.pl>
Tue, 31 Jan 2017 13:45:52 +0000 (14:45 +0100)
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
target/linux/bcm53xx/patches-4.4/905-BCM53573-minor-hacks.patch
target/linux/generic/patches-4.4/023-bcma-from-4.9.patch
target/linux/generic/patches-4.4/025-bcma-from-4.11.patch [new file with mode: 0644]

index 4935a19329c4752beb183b892402a2907e0087e2..e48d3aa6789d4a6887afde09409ac43a8bf5a0ef 100644 (file)
@@ -29,7 +29,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
                #size-cells = <1>;
 --- a/drivers/bcma/main.c
 +++ b/drivers/bcma/main.c
-@@ -349,14 +349,6 @@ static int bcma_register_devices(struct
+@@ -352,14 +352,6 @@ static int bcma_register_devices(struct
        }
  #endif
  
@@ -44,7 +44,7 @@ Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
  #ifdef CONFIG_BCMA_NFLASH
        if (bus->drv_cc.nflash.present) {
                err = platform_device_register(&bcma_nflash_dev);
-@@ -437,6 +429,14 @@ int bcma_bus_register(struct bcma_bus *b
+@@ -440,6 +432,14 @@ int bcma_bus_register(struct bcma_bus *b
                        bcma_register_core(bus, core);
        }
  
index 0391bcb80221724e9763294d01a1279516ed1265..027054c162e2a8d40f192a89d34999b13417566f 100644 (file)
  
  /* Board types (on PCI usually equals to the subsystem dev id) */
  /* BCM4313 */
+--- a/drivers/bcma/main.c
++++ b/drivers/bcma/main.c
+@@ -209,6 +209,8 @@ static void bcma_of_fill_device(struct p
+               core->dev.of_node = node;
+       core->irq = bcma_of_get_irq(parent, core, 0);
++
++      of_dma_configure(&core->dev, node);
+ }
+ unsigned int bcma_core_irq(struct bcma_device *core, int num)
+@@ -248,12 +250,12 @@ void bcma_prepare_core(struct bcma_bus *
+               core->irq = bus->host_pci->irq;
+               break;
+       case BCMA_HOSTTYPE_SOC:
+-              core->dev.dma_mask = &core->dev.coherent_dma_mask;
+-              if (bus->host_pdev) {
++              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);
+               } else {
++                      core->dev.dma_mask = &core->dev.coherent_dma_mask;
+                       core->dma_dev = &core->dev;
+               }
+               break;
diff --git a/target/linux/generic/patches-4.4/025-bcma-from-4.11.patch b/target/linux/generic/patches-4.4/025-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;
+ }