|
@@ -269,6 +269,11 @@ static const struct edmacc_param dummy_paramset = {
|
|
|
.ccnt = 1,
|
|
|
};
|
|
|
|
|
|
+static const struct of_device_id edma_of_ids[] = {
|
|
|
+ { .compatible = "ti,edma3", },
|
|
|
+ {}
|
|
|
+};
|
|
|
+
|
|
|
/*****************************************************************************/
|
|
|
|
|
|
static void map_dmach_queue(unsigned ctlr, unsigned ch_no,
|
|
@@ -560,14 +565,38 @@ static int reserve_contiguous_slots(int ctlr, unsigned int id,
|
|
|
static int prepare_unused_channel_list(struct device *dev, void *data)
|
|
|
{
|
|
|
struct platform_device *pdev = to_platform_device(dev);
|
|
|
- int i, ctlr;
|
|
|
+ int i, count, ctlr;
|
|
|
+ struct of_phandle_args dma_spec;
|
|
|
|
|
|
+ if (dev->of_node) {
|
|
|
+ count = of_property_count_strings(dev->of_node, "dma-names");
|
|
|
+ if (count < 0)
|
|
|
+ return 0;
|
|
|
+ for (i = 0; i < count; i++) {
|
|
|
+ if (of_parse_phandle_with_args(dev->of_node, "dmas",
|
|
|
+ "#dma-cells", i,
|
|
|
+ &dma_spec))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (!of_match_node(edma_of_ids, dma_spec.np)) {
|
|
|
+ of_node_put(dma_spec.np);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+
|
|
|
+ clear_bit(EDMA_CHAN_SLOT(dma_spec.args[0]),
|
|
|
+ edma_cc[0]->edma_unused);
|
|
|
+ of_node_put(dma_spec.np);
|
|
|
+ }
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* For non-OF case */
|
|
|
for (i = 0; i < pdev->num_resources; i++) {
|
|
|
if ((pdev->resource[i].flags & IORESOURCE_DMA) &&
|
|
|
(int)pdev->resource[i].start >= 0) {
|
|
|
ctlr = EDMA_CTLR(pdev->resource[i].start);
|
|
|
clear_bit(EDMA_CHAN_SLOT(pdev->resource[i].start),
|
|
|
- edma_cc[ctlr]->edma_unused);
|
|
|
+ edma_cc[ctlr]->edma_unused);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1762,11 +1791,6 @@ static int edma_probe(struct platform_device *pdev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static const struct of_device_id edma_of_ids[] = {
|
|
|
- { .compatible = "ti,edma3", },
|
|
|
- {}
|
|
|
-};
|
|
|
-
|
|
|
static struct platform_driver edma_driver = {
|
|
|
.driver = {
|
|
|
.name = "edma",
|