|
@@ -493,6 +493,33 @@ static int omap_device_fill_resources(struct omap_device *od,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * _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
|
|
@@ -532,24 +559,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);
|