diff options
Diffstat (limited to 'drivers/bcma/main.c')
-rw-r--r-- | drivers/bcma/main.c | 25 |
1 files changed, 15 insertions, 10 deletions
diff --git a/drivers/bcma/main.c b/drivers/bcma/main.c index 2c1798e38abd..12da68ec48ba 100644 --- a/drivers/bcma/main.c +++ b/drivers/bcma/main.c @@ -136,17 +136,17 @@ static bool bcma_is_core_needed_early(u16 core_id) 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_child_device(struct platform_device *par 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 platform_device *parent, 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 platform_device *parent, 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(struct platform_device *parent, 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_device *core, int num) 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 *bus, struct bcma_device *core) 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 device *dev) 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 device *dev) if (adrv->remove) adrv->remove(core); + put_device(dev); return 0; } |