kernel: update bcma to fix devm memory leaks
Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
This commit is contained in:
parent
1a14ffaf2b
commit
12288d450b
3 changed files with 133 additions and 2 deletions
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
105
target/linux/generic/patches-4.4/025-bcma-from-4.11.patch
Normal file
105
target/linux/generic/patches-4.4/025-bcma-from-4.11.patch
Normal file
|
@ -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;
|
||||
}
|
Loading…
Reference in a new issue