platform.c (b685fe26e9af7318d73bf50af659a282d188a3e5) platform.c (f5e84eae7956c694d27ddaba7113fe7d1174eff7)
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Platform driver for the Synopsys DesignWare DMA Controller
4 *
5 * Copyright (C) 2007-2008 Atmel Corporation
6 * Copyright (C) 2010-2011 ST Microelectronics
7 * Copyright (C) 2013 Intel Corporation
8 *
9 * Some parts of this driver are derived from the original dw_dmac.
10 */
11
12#include <linux/module.h>
13#include <linux/device.h>
14#include <linux/clk.h>
15#include <linux/pm_runtime.h>
16#include <linux/platform_device.h>
17#include <linux/dmaengine.h>
18#include <linux/dma-mapping.h>
19#include <linux/of.h>
1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Platform driver for the Synopsys DesignWare DMA Controller
4 *
5 * Copyright (C) 2007-2008 Atmel Corporation
6 * Copyright (C) 2010-2011 ST Microelectronics
7 * Copyright (C) 2013 Intel Corporation
8 *
9 * Some parts of this driver are derived from the original dw_dmac.
10 */
11
12#include <linux/module.h>
13#include <linux/device.h>
14#include <linux/clk.h>
15#include <linux/pm_runtime.h>
16#include <linux/platform_device.h>
17#include <linux/dmaengine.h>
18#include <linux/dma-mapping.h>
19#include <linux/of.h>
20#include <linux/of_dma.h>
21#include <linux/acpi.h>
22
23#include "internal.h"
24
25#define DRV_NAME "dw_dmac"
26
20#include <linux/acpi.h>
21
22#include "internal.h"
23
24#define DRV_NAME "dw_dmac"
25
27static struct dma_chan *dw_dma_of_xlate(struct of_phandle_args *dma_spec,
28 struct of_dma *ofdma)
29{
30 struct dw_dma *dw = ofdma->of_dma_data;
31 struct dw_dma_slave slave = {
32 .dma_dev = dw->dma.dev,
33 };
34 dma_cap_mask_t cap;
35
36 if (dma_spec->args_count != 3)
37 return NULL;
38
39 slave.src_id = dma_spec->args[0];
40 slave.dst_id = dma_spec->args[0];
41 slave.m_master = dma_spec->args[1];
42 slave.p_master = dma_spec->args[2];
43
44 if (WARN_ON(slave.src_id >= DW_DMA_MAX_NR_REQUESTS ||
45 slave.dst_id >= DW_DMA_MAX_NR_REQUESTS ||
46 slave.m_master >= dw->pdata->nr_masters ||
47 slave.p_master >= dw->pdata->nr_masters))
48 return NULL;
49
50 dma_cap_zero(cap);
51 dma_cap_set(DMA_SLAVE, cap);
52
53 /* TODO: there should be a simpler way to do this */
54 return dma_request_channel(cap, dw_dma_filter, &slave);
55}
56
57#ifdef CONFIG_OF
58static struct dw_dma_platform_data *
59dw_dma_parse_dt(struct platform_device *pdev)
60{
61 struct device_node *np = pdev->dev.of_node;
62 struct dw_dma_platform_data *pdata;
63 u32 tmp, arr[DW_DMA_MAX_NR_MASTERS], mb[DW_DMA_MAX_NR_CHANNELS];
64 u32 nr_masters;
65 u32 nr_channels;
66
67 if (!np) {
68 dev_err(&pdev->dev, "Missing DT data\n");
69 return NULL;
70 }
71
72 if (of_property_read_u32(np, "dma-masters", &nr_masters))
73 return NULL;
74 if (nr_masters < 1 || nr_masters > DW_DMA_MAX_NR_MASTERS)
75 return NULL;
76
77 if (of_property_read_u32(np, "dma-channels", &nr_channels))
78 return NULL;
79 if (nr_channels > DW_DMA_MAX_NR_CHANNELS)
80 return NULL;
81
82 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL);
83 if (!pdata)
84 return NULL;
85
86 pdata->nr_masters = nr_masters;
87 pdata->nr_channels = nr_channels;
88
89 if (!of_property_read_u32(np, "chan_allocation_order", &tmp))
90 pdata->chan_allocation_order = (unsigned char)tmp;
91
92 if (!of_property_read_u32(np, "chan_priority", &tmp))
93 pdata->chan_priority = tmp;
94
95 if (!of_property_read_u32(np, "block_size", &tmp))
96 pdata->block_size = tmp;
97
98 if (!of_property_read_u32_array(np, "data-width", arr, nr_masters)) {
99 for (tmp = 0; tmp < nr_masters; tmp++)
100 pdata->data_width[tmp] = arr[tmp];
101 } else if (!of_property_read_u32_array(np, "data_width", arr, nr_masters)) {
102 for (tmp = 0; tmp < nr_masters; tmp++)
103 pdata->data_width[tmp] = BIT(arr[tmp] & 0x07);
104 }
105
106 if (!of_property_read_u32_array(np, "multi-block", mb, nr_channels)) {
107 for (tmp = 0; tmp < nr_channels; tmp++)
108 pdata->multi_block[tmp] = mb[tmp];
109 } else {
110 for (tmp = 0; tmp < nr_channels; tmp++)
111 pdata->multi_block[tmp] = 1;
112 }
113
114 if (!of_property_read_u32(np, "snps,dma-protection-control", &tmp)) {
115 if (tmp > CHAN_PROTCTL_MASK)
116 return NULL;
117 pdata->protctl = tmp;
118 }
119
120 return pdata;
121}
122#else
123static inline struct dw_dma_platform_data *
124dw_dma_parse_dt(struct platform_device *pdev)
125{
126 return NULL;
127}
128#endif
129
130static int dw_probe(struct platform_device *pdev)
131{
132 const struct dw_dma_chip_pdata *match;
133 struct dw_dma_chip_pdata *data;
134 struct dw_dma_chip *chip;
135 struct device *dev = &pdev->dev;
136 int err;
137

--- 42 unchanged lines hidden (view full) ---

180 pm_runtime_enable(&pdev->dev);
181
182 err = data->probe(chip);
183 if (err)
184 goto err_dw_dma_probe;
185
186 platform_set_drvdata(pdev, data);
187
26static int dw_probe(struct platform_device *pdev)
27{
28 const struct dw_dma_chip_pdata *match;
29 struct dw_dma_chip_pdata *data;
30 struct dw_dma_chip *chip;
31 struct device *dev = &pdev->dev;
32 int err;
33

--- 42 unchanged lines hidden (view full) ---

76 pm_runtime_enable(&pdev->dev);
77
78 err = data->probe(chip);
79 if (err)
80 goto err_dw_dma_probe;
81
82 platform_set_drvdata(pdev, data);
83
188 if (pdev->dev.of_node) {
189 err = of_dma_controller_register(pdev->dev.of_node,
190 dw_dma_of_xlate, chip->dw);
191 if (err)
192 dev_err(&pdev->dev,
193 "could not register of_dma_controller\n");
194 }
84 dw_dma_of_controller_register(chip->dw);
195
196 dw_dma_acpi_controller_register(chip->dw);
197
198 return 0;
199
200err_dw_dma_probe:
201 pm_runtime_disable(&pdev->dev);
202 clk_disable_unprepare(chip->clk);
203 return err;
204}
205
206static int dw_remove(struct platform_device *pdev)
207{
208 struct dw_dma_chip_pdata *data = platform_get_drvdata(pdev);
209 struct dw_dma_chip *chip = data->chip;
210 int ret;
211
212 dw_dma_acpi_controller_free(chip->dw);
213
85
86 dw_dma_acpi_controller_register(chip->dw);
87
88 return 0;
89
90err_dw_dma_probe:
91 pm_runtime_disable(&pdev->dev);
92 clk_disable_unprepare(chip->clk);
93 return err;
94}
95
96static int dw_remove(struct platform_device *pdev)
97{
98 struct dw_dma_chip_pdata *data = platform_get_drvdata(pdev);
99 struct dw_dma_chip *chip = data->chip;
100 int ret;
101
102 dw_dma_acpi_controller_free(chip->dw);
103
214 if (pdev->dev.of_node)
215 of_dma_controller_free(pdev->dev.of_node);
104 dw_dma_of_controller_free(chip->dw);
216
217 ret = data->remove(chip);
218 if (ret)
219 dev_warn(chip->dev, "can't remove device properly: %d\n", ret);
220
221 pm_runtime_disable(&pdev->dev);
222 clk_disable_unprepare(chip->clk);
223

--- 107 unchanged lines hidden ---
105
106 ret = data->remove(chip);
107 if (ret)
108 dev_warn(chip->dev, "can't remove device properly: %d\n", ret);
109
110 pm_runtime_disable(&pdev->dev);
111 clk_disable_unprepare(chip->clk);
112

--- 107 unchanged lines hidden ---