[go: nahoru, domu]

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