mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-11-04 06:54:27 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
--- 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;
 | 
						|
 }
 |