]>
Commit | Line | Data |
---|---|---|
2025cf9e | 1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
170c6152 TP |
2 | /* |
3 | * Pinctrl driver for the Wondermedia SoC's | |
4 | * | |
5 | * Copyright (c) 2013 Tony Prisk <linux@prisktech.co.nz> | |
170c6152 TP |
6 | */ |
7 | ||
1c5fb66a | 8 | #include <linux/gpio/driver.h> |
170c6152 TP |
9 | |
10 | /* VT8500 has no enable register in the extgpio bank. */ | |
11 | #define NO_REG 0xFFFF | |
12 | ||
13 | #define WMT_PINCTRL_BANK(__en, __dir, __dout, __din, __pen, __pcfg) \ | |
14 | { \ | |
15 | .reg_en = __en, \ | |
16 | .reg_dir = __dir, \ | |
17 | .reg_data_out = __dout, \ | |
18 | .reg_data_in = __din, \ | |
19 | .reg_pull_en = __pen, \ | |
20 | .reg_pull_cfg = __pcfg, \ | |
21 | } | |
22 | ||
23 | /* Encode/decode the bank/bit pairs into a pin value */ | |
24 | #define WMT_PIN(__bank, __offset) ((__bank << 5) | __offset) | |
25 | #define WMT_BANK_FROM_PIN(__pin) (__pin >> 5) | |
26 | #define WMT_BIT_FROM_PIN(__pin) (__pin & 0x1f) | |
27 | ||
28 | #define WMT_GROUP(__name, __data) \ | |
29 | { \ | |
30 | .name = __name, \ | |
31 | .pins = __data, \ | |
32 | .npins = ARRAY_SIZE(__data), \ | |
33 | } | |
34 | ||
35 | struct wmt_pinctrl_bank_registers { | |
36 | u32 reg_en; | |
37 | u32 reg_dir; | |
38 | u32 reg_data_out; | |
39 | u32 reg_data_in; | |
40 | ||
41 | u32 reg_pull_en; | |
42 | u32 reg_pull_cfg; | |
43 | }; | |
44 | ||
45 | struct wmt_pinctrl_group { | |
46 | const char *name; | |
47 | const unsigned int *pins; | |
48 | const unsigned npins; | |
49 | }; | |
50 | ||
51 | struct wmt_pinctrl_data { | |
52 | struct device *dev; | |
53 | struct pinctrl_dev *pctl_dev; | |
54 | ||
55 | /* must be initialized before calling wmt_pinctrl_probe */ | |
56 | void __iomem *base; | |
57 | const struct wmt_pinctrl_bank_registers *banks; | |
58 | const struct pinctrl_pin_desc *pins; | |
59 | const char * const *groups; | |
60 | ||
61 | u32 nbanks; | |
62 | u32 npins; | |
63 | u32 ngroups; | |
64 | ||
65 | struct gpio_chip gpio_chip; | |
66 | struct pinctrl_gpio_range gpio_range; | |
67 | }; | |
68 | ||
69 | int wmt_pinctrl_probe(struct platform_device *pdev, | |
70 | struct wmt_pinctrl_data *data); |