[source] kernel: update bcma to fix devm memory leaks

LEDE Commits lede-commits at lists.infradead.org
Tue Jan 31 05:31:31 PST 2017


rmilecki pushed a commit to source.git, branch master:
https://git.lede-project.org/12288d450b18fd67293122fcd41761469fe5734b

commit 12288d450b18fd67293122fcd41761469fe5734b
Author: Rafał Miłecki <rafal at milecki.pl>
AuthorDate: Tue Jan 31 14:21:53 2017 +0100

    kernel: update bcma to fix devm memory leaks
    
    Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
---
 .../patches-4.4/905-BCM53573-minor-hacks.patch     |   4 +-
 .../generic/patches-4.4/023-bcma-from-4.9.patch    |  26 +++++
 .../generic/patches-4.4/025-bcma-from-4.11.patch   | 105 +++++++++++++++++++++
 3 files changed, 133 insertions(+), 2 deletions(-)

diff --git a/target/linux/bcm53xx/patches-4.4/905-BCM53573-minor-hacks.patch b/target/linux/bcm53xx/patches-4.4/905-BCM53573-minor-hacks.patch
index 4935a19..e48d3aa 100644
--- a/target/linux/bcm53xx/patches-4.4/905-BCM53573-minor-hacks.patch
+++ b/target/linux/bcm53xx/patches-4.4/905-BCM53573-minor-hacks.patch
@@ -29,7 +29,7 @@ Signed-off-by: Rafał Miłecki <rafal at 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 at 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);
  	}
  
diff --git a/target/linux/generic/patches-4.4/023-bcma-from-4.9.patch b/target/linux/generic/patches-4.4/023-bcma-from-4.9.patch
index 0391bcb..027054c 100644
--- a/target/linux/generic/patches-4.4/023-bcma-from-4.9.patch
+++ b/target/linux/generic/patches-4.4/023-bcma-from-4.9.patch
@@ -80,3 +80,29 @@
  
  /* 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
index 0000000..d5bdd2d
--- /dev/null
+++ b/target/linux/generic/patches-4.4/025-bcma-from-4.11.patch
@@ -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;
+ }



More information about the lede-commits mailing list