Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-2.6-block.git] / drivers / pinctrl / pinctrl-lantiq.h
CommitLineData
1d0ea069 1/* SPDX-License-Identifier: GPL-2.0-only */
3f8c50c9
JC
2/*
3 * linux/drivers/pinctrl/pinctrl-lantiq.h
4 * based on linux/drivers/pinctrl/pinctrl-pxa3xx.h
5 *
55e40950 6 * Copyright (C) 2012 John Crispin <john@phrozen.org>
3f8c50c9
JC
7 */
8
9#ifndef __PINCTRL_LANTIQ_H
edb052c3 10#define __PINCTRL_LANTIQ_H
3f8c50c9
JC
11
12#include <linux/clkdev.h>
13#include <linux/pinctrl/pinctrl.h>
14#include <linux/pinctrl/pinconf.h>
15#include <linux/pinctrl/pinmux.h>
16#include <linux/pinctrl/consumer.h>
17#include <linux/pinctrl/machine.h>
18
19#include "core.h"
20
21#define ARRAY_AND_SIZE(x) (x), ARRAY_SIZE(x)
22
23#define LTQ_MAX_MUX 4
24#define MFPR_FUNC_MASK 0x3
25
26#define LTQ_PINCONF_PACK(param, arg) ((param) << 16 | (arg))
27#define LTQ_PINCONF_UNPACK_PARAM(conf) ((conf) >> 16)
28#define LTQ_PINCONF_UNPACK_ARG(conf) ((conf) & 0xffff)
29
30enum ltq_pinconf_param {
31 LTQ_PINCONF_PARAM_PULL,
32 LTQ_PINCONF_PARAM_OPEN_DRAIN,
33 LTQ_PINCONF_PARAM_DRIVE_CURRENT,
34 LTQ_PINCONF_PARAM_SLEW_RATE,
6360350c 35 LTQ_PINCONF_PARAM_OUTPUT,
3f8c50c9
JC
36};
37
38struct ltq_cfg_param {
39 const char *property;
40 enum ltq_pinconf_param param;
41};
42
43struct ltq_mfp_pin {
44 const char *name;
45 const unsigned int pin;
46 const unsigned short func[LTQ_MAX_MUX];
47};
48
49struct ltq_pin_group {
50 const char *name;
51 const unsigned mux;
52 const unsigned *pins;
53 const unsigned npins;
54};
55
56struct ltq_pmx_func {
57 const char *name;
58 const char * const *groups;
59 const unsigned num_groups;
60};
61
62struct ltq_pinmux_info {
63 struct device *dev;
64 struct pinctrl_dev *pctrl;
65
66 /* we need to manage up to 5 pad controllers */
67 void __iomem *membase[5];
68
69 /* the descriptor for the subsystem */
70 struct pinctrl_desc *desc;
71
72 /* we expose our pads to the subsystem */
73 struct pinctrl_pin_desc *pads;
74
75 /* the number of pads. this varies between socs */
76 unsigned int num_pads;
77
78 /* these are our multifunction pins */
79 const struct ltq_mfp_pin *mfp;
80 unsigned int num_mfp;
81
82 /* a number of multifunction pins can be grouped together */
83 const struct ltq_pin_group *grps;
84 unsigned int num_grps;
85
86 /* a mapping between function string and id */
87 const struct ltq_pmx_func *funcs;
88 unsigned int num_funcs;
89
90 /* the pinconf options that we are able to read from the DT */
91 const struct ltq_cfg_param *params;
92 unsigned int num_params;
93
94 /* the pad controller can have a irq mapping */
95 const unsigned *exin;
96 unsigned int num_exin;
97
98 /* we need 5 clocks max */
99 struct clk *clk[5];
100
101 /* soc specific callback used to apply muxing */
102 int (*apply_mux)(struct pinctrl_dev *pctrldev, int pin, int mux);
103};
104
105enum ltq_pin {
106 GPIO0 = 0,
107 GPIO1,
108 GPIO2,
109 GPIO3,
110 GPIO4,
111 GPIO5,
112 GPIO6,
113 GPIO7,
114 GPIO8,
115 GPIO9,
116 GPIO10, /* 10 */
117 GPIO11,
118 GPIO12,
119 GPIO13,
120 GPIO14,
121 GPIO15,
122 GPIO16,
123 GPIO17,
124 GPIO18,
125 GPIO19,
126 GPIO20, /* 20 */
127 GPIO21,
128 GPIO22,
129 GPIO23,
130 GPIO24,
131 GPIO25,
132 GPIO26,
133 GPIO27,
134 GPIO28,
135 GPIO29,
136 GPIO30, /* 30 */
137 GPIO31,
138 GPIO32,
139 GPIO33,
140 GPIO34,
141 GPIO35,
142 GPIO36,
143 GPIO37,
144 GPIO38,
145 GPIO39,
146 GPIO40, /* 40 */
147 GPIO41,
148 GPIO42,
149 GPIO43,
150 GPIO44,
151 GPIO45,
152 GPIO46,
153 GPIO47,
154 GPIO48,
155 GPIO49,
156 GPIO50, /* 50 */
157 GPIO51,
158 GPIO52,
159 GPIO53,
160 GPIO54,
161 GPIO55,
be14811c
MS
162 GPIO56,
163 GPIO57,
164 GPIO58,
165 GPIO59,
166 GPIO60, /* 60 */
167 GPIO61,
168 GPIO62,
169 GPIO63,
3f8c50c9
JC
170
171 GPIO64,
172 GPIO65,
173 GPIO66,
174 GPIO67,
175 GPIO68,
176 GPIO69,
177 GPIO70,
178 GPIO71,
179 GPIO72,
180 GPIO73,
181 GPIO74,
182 GPIO75,
183 GPIO76,
184 GPIO77,
185 GPIO78,
186 GPIO79,
187 GPIO80,
188 GPIO81,
189 GPIO82,
190 GPIO83,
191 GPIO84,
192 GPIO85,
193 GPIO86,
194 GPIO87,
195 GPIO88,
196};
197
198extern int ltq_pinctrl_register(struct platform_device *pdev,
199 struct ltq_pinmux_info *info);
200extern int ltq_pinctrl_unregister(struct platform_device *pdev);
b5eec4d0 201#endif /* __PINCTRL_LANTIQ_H */