diff options
Diffstat (limited to 'drivers/dma/dw/platform.c')
-rw-r--r-- | drivers/dma/dw/platform.c | 40 |
1 files changed, 22 insertions, 18 deletions
diff --git a/drivers/dma/dw/platform.c b/drivers/dma/dw/platform.c index 26edbe3a27ac..5bda0eb9f393 100644 --- a/drivers/dma/dw/platform.c +++ b/drivers/dma/dw/platform.c | |||
@@ -42,13 +42,13 @@ static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec, | |||
42 | 42 | ||
43 | slave.src_id = dma_spec->args[0]; | 43 | slave.src_id = dma_spec->args[0]; |
44 | slave.dst_id = dma_spec->args[0]; | 44 | slave.dst_id = dma_spec->args[0]; |
45 | slave.src_master = dma_spec->args[1]; | 45 | slave.m_master = dma_spec->args[1]; |
46 | slave.dst_master = dma_spec->args[2]; | 46 | slave.p_master = dma_spec->args[2]; |
47 | 47 | ||
48 | if (WARN_ON(slave.src_id >= DW_DMA_MAX_NR_REQUESTS || | 48 | if (WARN_ON(slave.src_id >= DW_DMA_MAX_NR_REQUESTS || |
49 | slave.dst_id >= DW_DMA_MAX_NR_REQUESTS || | 49 | slave.dst_id >= DW_DMA_MAX_NR_REQUESTS || |
50 | slave.src_master >= dw->nr_masters || | 50 | slave.m_master >= dw->pdata->nr_masters || |
51 | slave.dst_master >= dw->nr_masters)) | 51 | slave.p_master >= dw->pdata->nr_masters)) |
52 | return NULL; | 52 | return NULL; |
53 | 53 | ||
54 | dma_cap_zero(cap); | 54 | dma_cap_zero(cap); |
@@ -66,8 +66,8 @@ static bool dw_dma_acpi_filter(struct dma_chan *chan, void *param) | |||
66 | .dma_dev = dma_spec->dev, | 66 | .dma_dev = dma_spec->dev, |
67 | .src_id = dma_spec->slave_id, | 67 | .src_id = dma_spec->slave_id, |
68 | .dst_id = dma_spec->slave_id, | 68 | .dst_id = dma_spec->slave_id, |
69 | .src_master = 1, | 69 | .m_master = 0, |
70 | .dst_master = 0, | 70 | .p_master = 1, |
71 | }; | 71 | }; |
72 | 72 | ||
73 | return dw_dma_filter(chan, &slave); | 73 | return dw_dma_filter(chan, &slave); |
@@ -103,6 +103,7 @@ dw_dma_parse_dt(struct platform_device *pdev) | |||
103 | struct device_node *np = pdev->dev.of_node; | 103 | struct device_node *np = pdev->dev.of_node; |
104 | struct dw_dma_platform_data *pdata; | 104 | struct dw_dma_platform_data *pdata; |
105 | u32 tmp, arr[DW_DMA_MAX_NR_MASTERS]; | 105 | u32 tmp, arr[DW_DMA_MAX_NR_MASTERS]; |
106 | u32 nr_masters; | ||
106 | u32 nr_channels; | 107 | u32 nr_channels; |
107 | 108 | ||
108 | if (!np) { | 109 | if (!np) { |
@@ -110,6 +111,11 @@ dw_dma_parse_dt(struct platform_device *pdev) | |||
110 | return NULL; | 111 | return NULL; |
111 | } | 112 | } |
112 | 113 | ||
114 | if (of_property_read_u32(np, "dma-masters", &nr_masters)) | ||
115 | return NULL; | ||
116 | if (nr_masters < 1 || nr_masters > DW_DMA_MAX_NR_MASTERS) | ||
117 | return NULL; | ||
118 | |||
113 | if (of_property_read_u32(np, "dma-channels", &nr_channels)) | 119 | if (of_property_read_u32(np, "dma-channels", &nr_channels)) |
114 | return NULL; | 120 | return NULL; |
115 | 121 | ||
@@ -117,6 +123,7 @@ dw_dma_parse_dt(struct platform_device *pdev) | |||
117 | if (!pdata) | 123 | if (!pdata) |
118 | return NULL; | 124 | return NULL; |
119 | 125 | ||
126 | pdata->nr_masters = nr_masters; | ||
120 | pdata->nr_channels = nr_channels; | 127 | pdata->nr_channels = nr_channels; |
121 | 128 | ||
122 | if (of_property_read_bool(np, "is_private")) | 129 | if (of_property_read_bool(np, "is_private")) |
@@ -131,17 +138,13 @@ dw_dma_parse_dt(struct platform_device *pdev) | |||
131 | if (!of_property_read_u32(np, "block_size", &tmp)) | 138 | if (!of_property_read_u32(np, "block_size", &tmp)) |
132 | pdata->block_size = tmp; | 139 | pdata->block_size = tmp; |
133 | 140 | ||
134 | if (!of_property_read_u32(np, "dma-masters", &tmp)) { | 141 | if (!of_property_read_u32_array(np, "data-width", arr, nr_masters)) { |
135 | if (tmp > DW_DMA_MAX_NR_MASTERS) | 142 | for (tmp = 0; tmp < nr_masters; tmp++) |
136 | return NULL; | ||
137 | |||
138 | pdata->nr_masters = tmp; | ||
139 | } | ||
140 | |||
141 | if (!of_property_read_u32_array(np, "data_width", arr, | ||
142 | pdata->nr_masters)) | ||
143 | for (tmp = 0; tmp < pdata->nr_masters; tmp++) | ||
144 | pdata->data_width[tmp] = arr[tmp]; | 143 | pdata->data_width[tmp] = arr[tmp]; |
144 | } else if (!of_property_read_u32_array(np, "data_width", arr, nr_masters)) { | ||
145 | for (tmp = 0; tmp < nr_masters; tmp++) | ||
146 | pdata->data_width[tmp] = BIT(arr[tmp] & 0x07); | ||
147 | } | ||
145 | 148 | ||
146 | return pdata; | 149 | return pdata; |
147 | } | 150 | } |
@@ -158,7 +161,7 @@ static int dw_probe(struct platform_device *pdev) | |||
158 | struct dw_dma_chip *chip; | 161 | struct dw_dma_chip *chip; |
159 | struct device *dev = &pdev->dev; | 162 | struct device *dev = &pdev->dev; |
160 | struct resource *mem; | 163 | struct resource *mem; |
161 | struct dw_dma_platform_data *pdata; | 164 | const struct dw_dma_platform_data *pdata; |
162 | int err; | 165 | int err; |
163 | 166 | ||
164 | chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); | 167 | chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL); |
@@ -183,6 +186,7 @@ static int dw_probe(struct platform_device *pdev) | |||
183 | pdata = dw_dma_parse_dt(pdev); | 186 | pdata = dw_dma_parse_dt(pdev); |
184 | 187 | ||
185 | chip->dev = dev; | 188 | chip->dev = dev; |
189 | chip->pdata = pdata; | ||
186 | 190 | ||
187 | chip->clk = devm_clk_get(chip->dev, "hclk"); | 191 | chip->clk = devm_clk_get(chip->dev, "hclk"); |
188 | if (IS_ERR(chip->clk)) | 192 | if (IS_ERR(chip->clk)) |
@@ -193,7 +197,7 @@ static int dw_probe(struct platform_device *pdev) | |||
193 | 197 | ||
194 | pm_runtime_enable(&pdev->dev); | 198 | pm_runtime_enable(&pdev->dev); |
195 | 199 | ||
196 | err = dw_dma_probe(chip, pdata); | 200 | err = dw_dma_probe(chip); |
197 | if (err) | 201 | if (err) |
198 | goto err_dw_dma_probe; | 202 | goto err_dw_dma_probe; |
199 | 203 | ||