diff options
author | Viresh Kumar <viresh.kumar@st.com> | 2012-03-28 12:57:07 -0400 |
---|---|---|
committer | Arnd Bergmann <arnd@arndb.de> | 2012-04-22 16:49:23 -0400 |
commit | deda8287e1a602393b052c80b815b3706987b3da (patch) | |
tree | 49f77fb650a90a6aaff711206067ff2e1ba6a445 /drivers/pinctrl | |
parent | f3215b427bec2add8b5c776e8f50c3ba35b0e8f1 (diff) |
pinctrl: Add SPEAr pinctrl drivers
This adds pinctrl driver for SPEAr platform. It also updates MAINTAINERS file
for SPEAr pinctrl drivers.
Signed-off-by: Viresh Kumar <viresh.kumar@st.com>
Acked-by: Linus Walleij <linus.walleij@linaro.org>
Reviewed-by: Stephen Warren <swarren@wwwdotorg.org>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r-- | drivers/pinctrl/Kconfig | 2 | ||||
-rw-r--r-- | drivers/pinctrl/Makefile | 2 | ||||
-rw-r--r-- | drivers/pinctrl/spear/Kconfig | 14 | ||||
-rw-r--r-- | drivers/pinctrl/spear/Makefile | 3 | ||||
-rw-r--r-- | drivers/pinctrl/spear/pinctrl-spear.c | 354 | ||||
-rw-r--r-- | drivers/pinctrl/spear/pinctrl-spear.h | 142 |
6 files changed, 517 insertions, 0 deletions
diff --git a/drivers/pinctrl/Kconfig b/drivers/pinctrl/Kconfig index abfb96408779..b25ac41f7939 100644 --- a/drivers/pinctrl/Kconfig +++ b/drivers/pinctrl/Kconfig | |||
@@ -84,6 +84,8 @@ config PINCTRL_COH901 | |||
84 | COH 901 335 and COH 901 571/3. They contain 3, 5 or 7 | 84 | COH 901 335 and COH 901 571/3. They contain 3, 5 or 7 |
85 | ports of 8 GPIO pins each. | 85 | ports of 8 GPIO pins each. |
86 | 86 | ||
87 | source "drivers/pinctrl/spear/Kconfig" | ||
88 | |||
87 | endmenu | 89 | endmenu |
88 | 90 | ||
89 | endif | 91 | endif |
diff --git a/drivers/pinctrl/Makefile b/drivers/pinctrl/Makefile index 6d4150b4eced..2febd7608050 100644 --- a/drivers/pinctrl/Makefile +++ b/drivers/pinctrl/Makefile | |||
@@ -16,3 +16,5 @@ obj-$(CONFIG_PINCTRL_TEGRA20) += pinctrl-tegra20.o | |||
16 | obj-$(CONFIG_PINCTRL_TEGRA30) += pinctrl-tegra30.o | 16 | obj-$(CONFIG_PINCTRL_TEGRA30) += pinctrl-tegra30.o |
17 | obj-$(CONFIG_PINCTRL_U300) += pinctrl-u300.o | 17 | obj-$(CONFIG_PINCTRL_U300) += pinctrl-u300.o |
18 | obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o | 18 | obj-$(CONFIG_PINCTRL_COH901) += pinctrl-coh901.o |
19 | |||
20 | obj-$(CONFIG_PLAT_SPEAR) += spear/ | ||
diff --git a/drivers/pinctrl/spear/Kconfig b/drivers/pinctrl/spear/Kconfig new file mode 100644 index 000000000000..47a0e2954922 --- /dev/null +++ b/drivers/pinctrl/spear/Kconfig | |||
@@ -0,0 +1,14 @@ | |||
1 | # | ||
2 | # ST Microelectronics SPEAr PINCTRL drivers | ||
3 | # | ||
4 | |||
5 | if PLAT_SPEAR | ||
6 | |||
7 | config PINCTRL_SPEAR | ||
8 | bool | ||
9 | depends on OF | ||
10 | select PINMUX | ||
11 | help | ||
12 | This enables pin control drivers for SPEAr Platform | ||
13 | |||
14 | endif | ||
diff --git a/drivers/pinctrl/spear/Makefile b/drivers/pinctrl/spear/Makefile new file mode 100644 index 000000000000..69c1a51e19d3 --- /dev/null +++ b/drivers/pinctrl/spear/Makefile | |||
@@ -0,0 +1,3 @@ | |||
1 | # SPEAr pinmux support | ||
2 | |||
3 | obj-$(CONFIG_PINCTRL_SPEAR) += pinctrl-spear.o | ||
diff --git a/drivers/pinctrl/spear/pinctrl-spear.c b/drivers/pinctrl/spear/pinctrl-spear.c new file mode 100644 index 000000000000..5ae50aadf885 --- /dev/null +++ b/drivers/pinctrl/spear/pinctrl-spear.c | |||
@@ -0,0 +1,354 @@ | |||
1 | /* | ||
2 | * Driver for the ST Microelectronics SPEAr pinmux | ||
3 | * | ||
4 | * Copyright (C) 2012 ST Microelectronics | ||
5 | * Viresh Kumar <viresh.kumar@st.com> | ||
6 | * | ||
7 | * Inspired from: | ||
8 | * - U300 Pinctl drivers | ||
9 | * - Tegra Pinctl drivers | ||
10 | * | ||
11 | * This file is licensed under the terms of the GNU General Public | ||
12 | * License version 2. This program is licensed "as is" without any | ||
13 | * warranty of any kind, whether express or implied. | ||
14 | */ | ||
15 | |||
16 | #include <linux/err.h> | ||
17 | #include <linux/io.h> | ||
18 | #include <linux/module.h> | ||
19 | #include <linux/of.h> | ||
20 | #include <linux/of_address.h> | ||
21 | #include <linux/pinctrl/machine.h> | ||
22 | #include <linux/pinctrl/pinctrl.h> | ||
23 | #include <linux/pinctrl/pinmux.h> | ||
24 | #include <linux/platform_device.h> | ||
25 | #include <linux/slab.h> | ||
26 | |||
27 | #include "pinctrl-spear.h" | ||
28 | |||
29 | #define DRIVER_NAME "spear-pinmux" | ||
30 | |||
31 | static inline u32 pmx_readl(struct spear_pmx *pmx, u32 reg) | ||
32 | { | ||
33 | return readl_relaxed(pmx->vbase + reg); | ||
34 | } | ||
35 | |||
36 | static inline void pmx_writel(struct spear_pmx *pmx, u32 val, u32 reg) | ||
37 | { | ||
38 | writel_relaxed(val, pmx->vbase + reg); | ||
39 | } | ||
40 | |||
41 | static int set_mode(struct spear_pmx *pmx, int mode) | ||
42 | { | ||
43 | struct spear_pmx_mode *pmx_mode = NULL; | ||
44 | int i; | ||
45 | u32 val; | ||
46 | |||
47 | if (!pmx->machdata->pmx_modes || !pmx->machdata->npmx_modes) | ||
48 | return -EINVAL; | ||
49 | |||
50 | for (i = 0; i < pmx->machdata->npmx_modes; i++) { | ||
51 | if (pmx->machdata->pmx_modes[i]->mode == (1 << mode)) { | ||
52 | pmx_mode = pmx->machdata->pmx_modes[i]; | ||
53 | break; | ||
54 | } | ||
55 | } | ||
56 | |||
57 | if (!pmx_mode) | ||
58 | return -EINVAL; | ||
59 | |||
60 | val = pmx_readl(pmx, pmx_mode->reg); | ||
61 | val &= ~pmx_mode->mask; | ||
62 | val |= pmx_mode->val; | ||
63 | pmx_writel(pmx, val, pmx_mode->reg); | ||
64 | |||
65 | pmx->machdata->mode = pmx_mode->mode; | ||
66 | dev_info(pmx->dev, "Configured Mode: %s with id: %x\n\n", | ||
67 | pmx_mode->name ? pmx_mode->name : "no_name", | ||
68 | pmx_mode->reg); | ||
69 | |||
70 | return 0; | ||
71 | } | ||
72 | |||
73 | void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg) | ||
74 | { | ||
75 | struct spear_pingroup *pgroup; | ||
76 | struct spear_modemux *modemux; | ||
77 | int i, j, group; | ||
78 | |||
79 | for (group = 0; group < machdata->ngroups; group++) { | ||
80 | pgroup = machdata->groups[group]; | ||
81 | |||
82 | for (i = 0; i < pgroup->nmodemuxs; i++) { | ||
83 | modemux = &pgroup->modemuxs[i]; | ||
84 | |||
85 | for (j = 0; j < modemux->nmuxregs; j++) | ||
86 | if (modemux->muxregs[j].reg == 0xFFFF) | ||
87 | modemux->muxregs[j].reg = reg; | ||
88 | } | ||
89 | } | ||
90 | } | ||
91 | |||
92 | static int spear_pinctrl_get_groups_cnt(struct pinctrl_dev *pctldev) | ||
93 | { | ||
94 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
95 | |||
96 | return pmx->machdata->ngroups; | ||
97 | } | ||
98 | |||
99 | static const char *spear_pinctrl_get_group_name(struct pinctrl_dev *pctldev, | ||
100 | unsigned group) | ||
101 | { | ||
102 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
103 | |||
104 | return pmx->machdata->groups[group]->name; | ||
105 | } | ||
106 | |||
107 | static int spear_pinctrl_get_group_pins(struct pinctrl_dev *pctldev, | ||
108 | unsigned group, const unsigned **pins, unsigned *num_pins) | ||
109 | { | ||
110 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
111 | |||
112 | *pins = pmx->machdata->groups[group]->pins; | ||
113 | *num_pins = pmx->machdata->groups[group]->npins; | ||
114 | |||
115 | return 0; | ||
116 | } | ||
117 | |||
118 | static void spear_pinctrl_pin_dbg_show(struct pinctrl_dev *pctldev, | ||
119 | struct seq_file *s, unsigned offset) | ||
120 | { | ||
121 | seq_printf(s, " " DRIVER_NAME); | ||
122 | } | ||
123 | |||
124 | int spear_pinctrl_dt_node_to_map(struct pinctrl_dev *pctldev, | ||
125 | struct device_node *np_config, | ||
126 | struct pinctrl_map **map, unsigned *num_maps) | ||
127 | { | ||
128 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
129 | struct device_node *np; | ||
130 | struct property *prop; | ||
131 | const char *function, *group; | ||
132 | int ret, index = 0, count = 0; | ||
133 | |||
134 | /* calculate number of maps required */ | ||
135 | for_each_child_of_node(np_config, np) { | ||
136 | ret = of_property_read_string(np, "st,function", &function); | ||
137 | if (ret < 0) | ||
138 | return ret; | ||
139 | |||
140 | ret = of_property_count_strings(np, "st,pins"); | ||
141 | if (ret < 0) | ||
142 | return ret; | ||
143 | |||
144 | count += ret; | ||
145 | } | ||
146 | |||
147 | if (!count) { | ||
148 | dev_err(pmx->dev, "No child nodes passed via DT\n"); | ||
149 | return -ENODEV; | ||
150 | } | ||
151 | |||
152 | *map = kzalloc(sizeof(**map) * count, GFP_KERNEL); | ||
153 | if (!*map) | ||
154 | return -ENOMEM; | ||
155 | |||
156 | for_each_child_of_node(np_config, np) { | ||
157 | of_property_read_string(np, "st,function", &function); | ||
158 | of_property_for_each_string(np, "st,pins", prop, group) { | ||
159 | (*map)[index].type = PIN_MAP_TYPE_MUX_GROUP; | ||
160 | (*map)[index].data.mux.group = group; | ||
161 | (*map)[index].data.mux.function = function; | ||
162 | index++; | ||
163 | } | ||
164 | } | ||
165 | |||
166 | *num_maps = count; | ||
167 | |||
168 | return 0; | ||
169 | } | ||
170 | |||
171 | void spear_pinctrl_dt_free_map(struct pinctrl_dev *pctldev, | ||
172 | struct pinctrl_map *map, unsigned num_maps) | ||
173 | { | ||
174 | kfree(map); | ||
175 | } | ||
176 | |||
177 | static struct pinctrl_ops spear_pinctrl_ops = { | ||
178 | .get_groups_count = spear_pinctrl_get_groups_cnt, | ||
179 | .get_group_name = spear_pinctrl_get_group_name, | ||
180 | .get_group_pins = spear_pinctrl_get_group_pins, | ||
181 | .pin_dbg_show = spear_pinctrl_pin_dbg_show, | ||
182 | .dt_node_to_map = spear_pinctrl_dt_node_to_map, | ||
183 | .dt_free_map = spear_pinctrl_dt_free_map, | ||
184 | }; | ||
185 | |||
186 | static int spear_pinctrl_get_funcs_count(struct pinctrl_dev *pctldev) | ||
187 | { | ||
188 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
189 | |||
190 | return pmx->machdata->nfunctions; | ||
191 | } | ||
192 | |||
193 | static const char *spear_pinctrl_get_func_name(struct pinctrl_dev *pctldev, | ||
194 | unsigned function) | ||
195 | { | ||
196 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
197 | |||
198 | return pmx->machdata->functions[function]->name; | ||
199 | } | ||
200 | |||
201 | static int spear_pinctrl_get_func_groups(struct pinctrl_dev *pctldev, | ||
202 | unsigned function, const char *const **groups, | ||
203 | unsigned * const ngroups) | ||
204 | { | ||
205 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
206 | |||
207 | *groups = pmx->machdata->functions[function]->groups; | ||
208 | *ngroups = pmx->machdata->functions[function]->ngroups; | ||
209 | |||
210 | return 0; | ||
211 | } | ||
212 | |||
213 | static int spear_pinctrl_endisable(struct pinctrl_dev *pctldev, | ||
214 | unsigned function, unsigned group, bool enable) | ||
215 | { | ||
216 | struct spear_pmx *pmx = pinctrl_dev_get_drvdata(pctldev); | ||
217 | const struct spear_pingroup *pgroup; | ||
218 | const struct spear_modemux *modemux; | ||
219 | struct spear_muxreg *muxreg; | ||
220 | u32 val, temp; | ||
221 | int i, j; | ||
222 | bool found = false; | ||
223 | |||
224 | pgroup = pmx->machdata->groups[group]; | ||
225 | |||
226 | for (i = 0; i < pgroup->nmodemuxs; i++) { | ||
227 | modemux = &pgroup->modemuxs[i]; | ||
228 | |||
229 | /* SoC have any modes */ | ||
230 | if (pmx->machdata->modes_supported) { | ||
231 | if (!(pmx->machdata->mode & modemux->modes)) | ||
232 | continue; | ||
233 | } | ||
234 | |||
235 | found = true; | ||
236 | for (j = 0; j < modemux->nmuxregs; j++) { | ||
237 | muxreg = &modemux->muxregs[j]; | ||
238 | |||
239 | val = pmx_readl(pmx, muxreg->reg); | ||
240 | val &= ~muxreg->mask; | ||
241 | |||
242 | if (enable) | ||
243 | temp = muxreg->val; | ||
244 | else | ||
245 | temp = ~muxreg->val; | ||
246 | |||
247 | val |= temp; | ||
248 | pmx_writel(pmx, val, muxreg->reg); | ||
249 | } | ||
250 | } | ||
251 | |||
252 | if (!found) { | ||
253 | dev_err(pmx->dev, "pinmux group: %s not supported\n", | ||
254 | pgroup->name); | ||
255 | return -ENODEV; | ||
256 | } | ||
257 | |||
258 | return 0; | ||
259 | } | ||
260 | |||
261 | static int spear_pinctrl_enable(struct pinctrl_dev *pctldev, unsigned function, | ||
262 | unsigned group) | ||
263 | { | ||
264 | return spear_pinctrl_endisable(pctldev, function, group, true); | ||
265 | } | ||
266 | |||
267 | static void spear_pinctrl_disable(struct pinctrl_dev *pctldev, | ||
268 | unsigned function, unsigned group) | ||
269 | { | ||
270 | spear_pinctrl_endisable(pctldev, function, group, false); | ||
271 | } | ||
272 | |||
273 | static struct pinmux_ops spear_pinmux_ops = { | ||
274 | .get_functions_count = spear_pinctrl_get_funcs_count, | ||
275 | .get_function_name = spear_pinctrl_get_func_name, | ||
276 | .get_function_groups = spear_pinctrl_get_func_groups, | ||
277 | .enable = spear_pinctrl_enable, | ||
278 | .disable = spear_pinctrl_disable, | ||
279 | }; | ||
280 | |||
281 | static struct pinctrl_desc spear_pinctrl_desc = { | ||
282 | .name = DRIVER_NAME, | ||
283 | .pctlops = &spear_pinctrl_ops, | ||
284 | .pmxops = &spear_pinmux_ops, | ||
285 | .owner = THIS_MODULE, | ||
286 | }; | ||
287 | |||
288 | int __devinit spear_pinctrl_probe(struct platform_device *pdev, | ||
289 | struct spear_pinctrl_machdata *machdata) | ||
290 | { | ||
291 | struct device_node *np = pdev->dev.of_node; | ||
292 | struct resource *res; | ||
293 | struct spear_pmx *pmx; | ||
294 | |||
295 | if (!machdata) | ||
296 | return -ENODEV; | ||
297 | |||
298 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
299 | if (!res) | ||
300 | return -EINVAL; | ||
301 | |||
302 | pmx = devm_kzalloc(&pdev->dev, sizeof(*pmx), GFP_KERNEL); | ||
303 | if (!pmx) { | ||
304 | dev_err(&pdev->dev, "Can't alloc spear_pmx\n"); | ||
305 | return -ENOMEM; | ||
306 | } | ||
307 | |||
308 | pmx->vbase = devm_ioremap(&pdev->dev, res->start, resource_size(res)); | ||
309 | if (!pmx->vbase) { | ||
310 | dev_err(&pdev->dev, "Couldn't ioremap at index 0\n"); | ||
311 | return -ENODEV; | ||
312 | } | ||
313 | |||
314 | pmx->dev = &pdev->dev; | ||
315 | pmx->machdata = machdata; | ||
316 | |||
317 | /* configure mode, if supported by SoC */ | ||
318 | if (machdata->modes_supported) { | ||
319 | int mode = 0; | ||
320 | |||
321 | if (of_property_read_u32(np, "st,pinmux-mode", &mode)) { | ||
322 | dev_err(&pdev->dev, "OF: pinmux mode not passed\n"); | ||
323 | return -EINVAL; | ||
324 | } | ||
325 | |||
326 | if (set_mode(pmx, mode)) { | ||
327 | dev_err(&pdev->dev, "OF: Couldn't configure mode: %x\n", | ||
328 | mode); | ||
329 | return -EINVAL; | ||
330 | } | ||
331 | } | ||
332 | |||
333 | platform_set_drvdata(pdev, pmx); | ||
334 | |||
335 | spear_pinctrl_desc.pins = machdata->pins; | ||
336 | spear_pinctrl_desc.npins = machdata->npins; | ||
337 | |||
338 | pmx->pctl = pinctrl_register(&spear_pinctrl_desc, &pdev->dev, pmx); | ||
339 | if (IS_ERR(pmx->pctl)) { | ||
340 | dev_err(&pdev->dev, "Couldn't register pinctrl driver\n"); | ||
341 | return PTR_ERR(pmx->pctl); | ||
342 | } | ||
343 | |||
344 | return 0; | ||
345 | } | ||
346 | |||
347 | int __devexit spear_pinctrl_remove(struct platform_device *pdev) | ||
348 | { | ||
349 | struct spear_pmx *pmx = platform_get_drvdata(pdev); | ||
350 | |||
351 | pinctrl_unregister(pmx->pctl); | ||
352 | |||
353 | return 0; | ||
354 | } | ||
diff --git a/drivers/pinctrl/spear/pinctrl-spear.h b/drivers/pinctrl/spear/pinctrl-spear.h new file mode 100644 index 000000000000..47a6b5b72f90 --- /dev/null +++ b/drivers/pinctrl/spear/pinctrl-spear.h | |||
@@ -0,0 +1,142 @@ | |||
1 | /* | ||
2 | * Driver header file for the ST Microelectronics SPEAr pinmux | ||
3 | * | ||
4 | * Copyright (C) 2012 ST Microelectronics | ||
5 | * Viresh Kumar <viresh.kumar@st.com> | ||
6 | * | ||
7 | * This file is licensed under the terms of the GNU General Public | ||
8 | * License version 2. This program is licensed "as is" without any | ||
9 | * warranty of any kind, whether express or implied. | ||
10 | */ | ||
11 | |||
12 | #ifndef __PINMUX_SPEAR_H__ | ||
13 | #define __PINMUX_SPEAR_H__ | ||
14 | |||
15 | #include <linux/pinctrl/pinctrl.h> | ||
16 | #include <linux/types.h> | ||
17 | |||
18 | struct platform_device; | ||
19 | struct device; | ||
20 | |||
21 | /** | ||
22 | * struct spear_pmx_mode - SPEAr pmx mode | ||
23 | * @name: name of pmx mode | ||
24 | * @mode: mode id | ||
25 | * @reg: register for configuring this mode | ||
26 | * @mask: mask of this mode in reg | ||
27 | * @val: val to be configured at reg after doing (val & mask) | ||
28 | */ | ||
29 | struct spear_pmx_mode { | ||
30 | const char *const name; | ||
31 | u16 mode; | ||
32 | u16 reg; | ||
33 | u16 mask; | ||
34 | u32 val; | ||
35 | }; | ||
36 | |||
37 | /** | ||
38 | * struct spear_muxreg - SPEAr mux reg configuration | ||
39 | * @reg: register offset | ||
40 | * @mask: mask bits | ||
41 | * @val: val to be written on mask bits | ||
42 | */ | ||
43 | struct spear_muxreg { | ||
44 | u16 reg; | ||
45 | u32 mask; | ||
46 | u32 val; | ||
47 | }; | ||
48 | |||
49 | /** | ||
50 | * struct spear_modemux - SPEAr mode mux configuration | ||
51 | * @modes: mode ids supported by this group of muxregs | ||
52 | * @nmuxregs: number of muxreg configurations to be done for modes | ||
53 | * @muxregs: array of muxreg configurations to be done for modes | ||
54 | */ | ||
55 | struct spear_modemux { | ||
56 | u16 modes; | ||
57 | u8 nmuxregs; | ||
58 | struct spear_muxreg *muxregs; | ||
59 | }; | ||
60 | |||
61 | /** | ||
62 | * struct spear_pingroup - SPEAr pin group configurations | ||
63 | * @name: name of pin group | ||
64 | * @pins: array containing pin numbers | ||
65 | * @npins: size of pins array | ||
66 | * @modemuxs: array of modemux configurations for this pin group | ||
67 | * @nmodemuxs: size of array modemuxs | ||
68 | * | ||
69 | * A representation of a group of pins in the SPEAr pin controller. Each group | ||
70 | * allows some parameter or parameters to be configured. | ||
71 | */ | ||
72 | struct spear_pingroup { | ||
73 | const char *name; | ||
74 | const unsigned *pins; | ||
75 | unsigned npins; | ||
76 | struct spear_modemux *modemuxs; | ||
77 | unsigned nmodemuxs; | ||
78 | }; | ||
79 | |||
80 | /** | ||
81 | * struct spear_function - SPEAr pinctrl mux function | ||
82 | * @name: The name of the function, exported to pinctrl core. | ||
83 | * @groups: An array of pin groups that may select this function. | ||
84 | * @ngroups: The number of entries in @groups. | ||
85 | */ | ||
86 | struct spear_function { | ||
87 | const char *name; | ||
88 | const char *const *groups; | ||
89 | unsigned ngroups; | ||
90 | }; | ||
91 | |||
92 | /** | ||
93 | * struct spear_pinctrl_machdata - SPEAr pin controller machine driver | ||
94 | * configuration | ||
95 | * @pins: An array describing all pins the pin controller affects. | ||
96 | * All pins which are also GPIOs must be listed first within the *array, | ||
97 | * and be numbered identically to the GPIO controller's *numbering. | ||
98 | * @npins: The numbmer of entries in @pins. | ||
99 | * @functions: An array describing all mux functions the SoC supports. | ||
100 | * @nfunctions: The numbmer of entries in @functions. | ||
101 | * @groups: An array describing all pin groups the pin SoC supports. | ||
102 | * @ngroups: The numbmer of entries in @groups. | ||
103 | * | ||
104 | * @modes_supported: Does SoC support modes | ||
105 | * @mode: mode configured from probe | ||
106 | * @pmx_modes: array of modes supported by SoC | ||
107 | * @npmx_modes: number of entries in pmx_modes. | ||
108 | */ | ||
109 | struct spear_pinctrl_machdata { | ||
110 | const struct pinctrl_pin_desc *pins; | ||
111 | unsigned npins; | ||
112 | struct spear_function **functions; | ||
113 | unsigned nfunctions; | ||
114 | struct spear_pingroup **groups; | ||
115 | unsigned ngroups; | ||
116 | |||
117 | bool modes_supported; | ||
118 | u16 mode; | ||
119 | struct spear_pmx_mode **pmx_modes; | ||
120 | unsigned npmx_modes; | ||
121 | }; | ||
122 | |||
123 | /** | ||
124 | * struct spear_pmx - SPEAr pinctrl mux | ||
125 | * @dev: pointer to struct dev of platform_device registered | ||
126 | * @pctl: pointer to struct pinctrl_dev | ||
127 | * @machdata: pointer to SoC or machine specific structure | ||
128 | * @vbase: virtual base address of pinmux controller | ||
129 | */ | ||
130 | struct spear_pmx { | ||
131 | struct device *dev; | ||
132 | struct pinctrl_dev *pctl; | ||
133 | struct spear_pinctrl_machdata *machdata; | ||
134 | void __iomem *vbase; | ||
135 | }; | ||
136 | |||
137 | /* exported routines */ | ||
138 | void __devinit pmx_init_addr(struct spear_pinctrl_machdata *machdata, u16 reg); | ||
139 | int __devinit spear_pinctrl_probe(struct platform_device *pdev, | ||
140 | struct spear_pinctrl_machdata *machdata); | ||
141 | int __devexit spear_pinctrl_remove(struct platform_device *pdev); | ||
142 | #endif /* __PINMUX_SPEAR_H__ */ | ||