diff options
Diffstat (limited to 'arch/arm/plat-omap/omap_device.c')
| -rw-r--r-- | arch/arm/plat-omap/omap_device.c | 79 | 
1 files changed, 67 insertions, 12 deletions
diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c index 5c93c09a80c..d5f617c542d 100644 --- a/arch/arm/plat-omap/omap_device.c +++ b/arch/arm/plat-omap/omap_device.c @@ -365,6 +365,14 @@ static int omap_device_build_from_dt(struct platform_device *pdev)  		goto odbfd_exit1;  	} +	/* Fix up missing resource names */ +	for (i = 0; i < pdev->num_resources; i++) { +		struct resource *r = &pdev->resource[i]; + +		if (r->name == NULL) +			r->name = dev_name(&pdev->dev); +	} +  	if (of_get_property(node, "ti,no_idle_on_suspend", NULL))  		omap_device_disable_idle_on_suspend(pdev); @@ -485,6 +493,33 @@ static int omap_device_fill_resources(struct omap_device *od,  }  /** + * _od_fill_dma_resources - fill in array of struct resource with dma resources + * @od: struct omap_device * + * @res: pointer to an array of struct resource to be filled in + * + * Populate one or more empty struct resource pointed to by @res with + * the dma resource data for this omap_device @od.  Used by + * omap_device_alloc() after calling omap_device_count_resources(). + * + * Ideally this function would not be needed at all.  If we have + * mechanism to get dma resources from DT. + * + * Returns 0. + */ +static int _od_fill_dma_resources(struct omap_device *od, +				      struct resource *res) +{ +	int i, r; + +	for (i = 0; i < od->hwmods_cnt; i++) { +		r = omap_hwmod_fill_dma_resources(od->hwmods[i], res); +		res += r; +	} + +	return 0; +} + +/**   * omap_device_alloc - allocate an omap_device   * @pdev: platform_device that will be included in this omap_device   * @oh: ptr to the single omap_hwmod that backs this omap_device @@ -523,24 +558,44 @@ struct omap_device *omap_device_alloc(struct platform_device *pdev,  	od->hwmods = hwmods;  	od->pdev = pdev; +	res_count = omap_device_count_resources(od);  	/* -	 * HACK: Ideally the resources from DT should match, and hwmod -	 * should just add the missing ones. Since the name is not -	 * properly populated by DT, stick to hwmod resources only. +	 * DT Boot: +	 *   OF framework will construct the resource structure (currently +	 *   does for MEM & IRQ resource) and we should respect/use these +	 *   resources, killing hwmod dependency. +	 *   If pdev->num_resources > 0, we assume that MEM & IRQ resources +	 *   have been allocated by OF layer already (through DTB). +	 * +	 * Non-DT Boot: +	 *   Here, pdev->num_resources = 0, and we should get all the +	 *   resources from hwmod. +	 * +	 * TODO: Once DMA resource is available from OF layer, we should +	 *   kill filling any resources from hwmod.  	 */ -	if (pdev->num_resources && pdev->resource) -		dev_warn(&pdev->dev, "%s(): resources already allocated %d\n", -			__func__, pdev->num_resources); - -	res_count = omap_device_count_resources(od); -	if (res_count > 0) { -		dev_dbg(&pdev->dev, "%s(): resources allocated from hwmod %d\n", -			__func__, res_count); +	if (res_count > pdev->num_resources) { +		/* Allocate resources memory to account for new resources */  		res = kzalloc(sizeof(struct resource) * res_count, GFP_KERNEL);  		if (!res)  			goto oda_exit3; -		omap_device_fill_resources(od, res); +		/* +		 * If pdev->num_resources > 0, then assume that, +		 * MEM and IRQ resources will only come from DT and only +		 * fill DMA resource from hwmod layer. +		 */ +		if (pdev->num_resources && pdev->resource) { +			dev_dbg(&pdev->dev, "%s(): resources already allocated %d\n", +				__func__, res_count); +			memcpy(res, pdev->resource, +			       sizeof(struct resource) * pdev->num_resources); +			_od_fill_dma_resources(od, &res[pdev->num_resources]); +		} else { +			dev_dbg(&pdev->dev, "%s(): using resources from hwmod %d\n", +				__func__, res_count); +			omap_device_fill_resources(od, res); +		}  		ret = platform_device_add_resources(pdev, res, res_count);  		kfree(res);  |