On 10/30/2012 11:33 AM, Peter Ujfalusi wrote: > When booting with DT the OF core can fill up the resources provided within > the DT blob. > The current way of handling the DT boot prevents us from removing hwmod data > for platforms only suppose to boot with DT (OMAP5 for example) since we need > to keep the whole hwmod database intact in order to have more resources in > hwmod than in DT (to be able to append the DMA resource from hwmod). > > To fix this issue we just examine the OF provided resources: > If we do not have resources we use hwmod to fill them. > If we have resources we check if we already able to recive DMA resource, if > no we only append the DMA resurce from hwmod to the OF provided ones. > > In this way we can start removing hwmod data for devices which have their > resources correctly configured in DT without regressions. > > Signed-off-by: Peter Ujfalusi <peter.ujfalusi@xxxxxx> > --- > arch/arm/plat-omap/omap_device.c | 80 +++++++++++++++++++++++----------------- > 1 file changed, 47 insertions(+), 33 deletions(-) > > diff --git a/arch/arm/plat-omap/omap_device.c b/arch/arm/plat-omap/omap_device.c > index 915cf68..a8a9d08 100644 > --- a/arch/arm/plat-omap/omap_device.c > +++ b/arch/arm/plat-omap/omap_device.c > @@ -560,55 +560,69 @@ struct omap_device *omap_device_alloc(struct platform_device *pdev, > od->hwmods = hwmods; > od->pdev = pdev; > > - /* Count all resources for the device */ > - res_count = omap_device_count_resources(od, IORESOURCE_IRQ | > - IORESOURCE_DMA | > - IORESOURCE_MEM); > /* > + * Non-DT Boot: > + * Here, pdev->num_resources = 0, and we should get all the > + * resources from hwmod. > + * > * 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. > + * As preparation for the future we examine the OF provided resources > + * to see if we have DMA resources provided already. In this case > + * there is no need to update the resources for the device, we use the > + * OF provided ones. > * > * TODO: Once DMA resource is available from OF layer, we should > * kill filling any resources from hwmod. > */ > - 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; > - > - /* > - * 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); > + if (!pdev->num_resources) { > + /* Count all resources for the device */ > + res_count = omap_device_count_resources(od, IORESOURCE_IRQ | > + IORESOURCE_DMA | > + IORESOURCE_MEM); > + } else { > + /* Take a look if we already have DMA resource via DT */ > + for (i = 0; i < pdev->num_resources; i++) { > + struct resource *r = &pdev->resource[i]; > + > + /* We have it, no need to touch the resources */ > + if (r->flags == IORESOURCE_DMA) > + goto have_everything; > } > + /* Count only DMA resources for the device */ > + res_count = omap_device_count_resources(od, IORESOURCE_DMA); We have devices without DMA channel so we can skip the resource recreation for them. I'll resend the series with this update. > + res_count += pdev->num_resources; > + } > > - ret = platform_device_add_resources(pdev, res, res_count); > - kfree(res); > + /* Allocate resources memory to account for new resources */ > + res = kzalloc(sizeof(struct resource) * res_count, GFP_KERNEL); > + if (!res) > + goto oda_exit3; > > - if (ret) > - goto oda_exit3; > + if (!pdev->num_resources) { > + dev_dbg(&pdev->dev, "%s: using %d resources from hwmod\n", > + __func__, res_count); > + omap_device_fill_resources(od, res); > + } else { > + dev_dbg(&pdev->dev, > + "%s: appending %d DMA resources from hwmod\n", > + __func__, res_count - pdev->num_resources); > + memcpy(res, pdev->resource, > + sizeof(struct resource) * pdev->num_resources); > + _od_fill_dma_resources(od, &res[pdev->num_resources]); > } > > + ret = platform_device_add_resources(pdev, res, res_count); > + kfree(res); > + > + if (ret) > + goto oda_exit3; > + > +have_everything: > if (!pm_lats) { > pm_lats = omap_default_latency; > pm_lats_cnt = ARRAY_SIZE(omap_default_latency); > -- Péter -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html