diff options
Diffstat (limited to 'drivers/of/platform.c')
| -rw-r--r-- | drivers/of/platform.c | 24 | 
1 files changed, 13 insertions, 11 deletions
diff --git a/drivers/of/platform.c b/drivers/of/platform.c index 30726c8b069..5b4a07f1220 100644 --- a/drivers/of/platform.c +++ b/drivers/of/platform.c @@ -587,20 +587,23 @@ struct platform_device *of_device_alloc(struct device_node *np,  	int rc, i, num_reg = 0, num_irq;  	struct resource *res, temp_res; -	/* First count how many resources are needed */ +	dev = platform_device_alloc("", -1); +	if (!dev) +		return NULL; + +	/* count the io and irq resources */  	while (of_address_to_resource(np, num_reg, &temp_res) == 0)  		num_reg++;  	num_irq = of_irq_count(np); -	/* Allocate memory for both the struct device and the resource table */ -	dev = kzalloc(sizeof(*dev) + (sizeof(*res) * (num_reg + num_irq)), -		      GFP_KERNEL); -	if (!dev) -		return NULL; -	res = (struct resource *) &dev[1]; -  	/* Populate the resource table */  	if (num_irq || num_reg) { +		res = kzalloc(sizeof(*res) * (num_irq + num_reg), GFP_KERNEL); +		if (!res) { +			platform_device_put(dev); +			return NULL; +		} +  		dev->num_resources = num_reg + num_irq;  		dev->resource = res;  		for (i = 0; i < num_reg; i++, res++) { @@ -615,7 +618,6 @@ struct platform_device *of_device_alloc(struct device_node *np,  	dev->dev.dma_mask = &dev->archdata.dma_mask;  #endif  	dev->dev.parent = parent; -	dev->dev.release = of_release_dev;  	if (bus_id)  		dev_set_name(&dev->dev, "%s", bus_id); @@ -653,8 +655,8 @@ struct platform_device *of_platform_device_create(struct device_node *np,  	 * to do such, possibly using a device notifier  	 */ -	if (of_device_register(dev) != 0) { -		of_device_free(dev); +	if (of_device_add(dev) != 0) { +		platform_device_put(dev);  		return NULL;  	}  |