Blame view

include/linux/sh_pfc.h 5.66 KB
fae433991   Magnus Damm   sh: Break out Sup...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  /*
   * SuperH Pin Function Controller Support
   *
   * Copyright (c) 2008 Magnus Damm
   *
   * This file is subject to the terms and conditions of the GNU General Public
   * License.  See the file "COPYING" in the main directory of this archive
   * for more details.
   */
  
  #ifndef __SH_PFC_H
  #define __SH_PFC_H
  
  #include <asm-generic/gpio.h>
  
  typedef unsigned short pinmux_enum_t;
  typedef unsigned short pinmux_flag_t;
  
  #define PINMUX_TYPE_NONE            0
  #define PINMUX_TYPE_FUNCTION        1
  #define PINMUX_TYPE_GPIO            2
  #define PINMUX_TYPE_OUTPUT          3
  #define PINMUX_TYPE_INPUT           4
  #define PINMUX_TYPE_INPUT_PULLUP    5
  #define PINMUX_TYPE_INPUT_PULLDOWN  6
  
  #define PINMUX_FLAG_TYPE            (0x7)
  #define PINMUX_FLAG_WANT_PULLUP     (1 << 3)
  #define PINMUX_FLAG_WANT_PULLDOWN   (1 << 4)
  
  #define PINMUX_FLAG_DBIT_SHIFT      5
  #define PINMUX_FLAG_DBIT            (0x1f << PINMUX_FLAG_DBIT_SHIFT)
  #define PINMUX_FLAG_DREG_SHIFT      10
  #define PINMUX_FLAG_DREG            (0x3f << PINMUX_FLAG_DREG_SHIFT)
  
  struct pinmux_gpio {
  	pinmux_enum_t enum_id;
  	pinmux_flag_t flags;
  };
  
  #define PINMUX_GPIO(gpio, data_or_mark) [gpio] = { data_or_mark }
  #define PINMUX_DATA(data_or_mark, ids...) data_or_mark, ids, 0
  
  struct pinmux_cfg_reg {
  	unsigned long reg, reg_width, field_width;
  	unsigned long *cnt;
  	pinmux_enum_t *enum_ids;
f78a26f55   Magnus Damm   sh: pfc: Variable...
48
  	unsigned long *var_field_width;
fae433991   Magnus Damm   sh: Break out Sup...
49
50
51
52
53
  };
  
  #define PINMUX_CFG_REG(name, r, r_width, f_width) \
  	.reg = r, .reg_width = r_width, .field_width = f_width,		\
  	.cnt = (unsigned long [r_width / f_width]) {}, \
f78a26f55   Magnus Damm   sh: pfc: Variable...
54
55
56
57
58
59
60
  	.enum_ids = (pinmux_enum_t [(r_width / f_width) * (1 << f_width)])
  
  #define PINMUX_CFG_REG_VAR(name, r, r_width, var_fw0, var_fwn...) \
  	.reg = r, .reg_width = r_width,	\
  	.cnt = (unsigned long [r_width]) {}, \
  	.var_field_width = (unsigned long [r_width]) { var_fw0, var_fwn, 0 }, \
  	.enum_ids = (pinmux_enum_t [])
fae433991   Magnus Damm   sh: Break out Sup...
61
62
63
64
  
  struct pinmux_data_reg {
  	unsigned long reg, reg_width, reg_shadow;
  	pinmux_enum_t *enum_ids;
b0e10211c   Magnus Damm   sh: pfc: ioremap(...
65
  	void __iomem *mapped_reg;
fae433991   Magnus Damm   sh: Break out Sup...
66
67
68
69
70
  };
  
  #define PINMUX_DATA_REG(name, r, r_width) \
  	.reg = r, .reg_width = r_width,	\
  	.enum_ids = (pinmux_enum_t [r_width]) \
ad2a8e7ea   Magnus Damm   sh: pfc: Add GPIO...
71
72
73
74
75
76
77
  struct pinmux_irq {
  	int irq;
  	pinmux_enum_t *enum_ids;
  };
  
  #define PINMUX_IRQ(irq_nr, ids...)			   \
  	{ .irq = irq_nr, .enum_ids = (pinmux_enum_t []) { ids, 0 } }	\
fae433991   Magnus Damm   sh: Break out Sup...
78
79
80
81
82
  struct pinmux_range {
  	pinmux_enum_t begin;
  	pinmux_enum_t end;
  	pinmux_enum_t force;
  };
b0e10211c   Magnus Damm   sh: pfc: ioremap(...
83
84
85
86
87
  struct pfc_window {
  	phys_addr_t phys;
  	void __iomem *virt;
  	unsigned long size;
  };
fae433991   Magnus Damm   sh: Break out Sup...
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
  struct pinmux_info {
  	char *name;
  	pinmux_enum_t reserved_id;
  	struct pinmux_range data;
  	struct pinmux_range input;
  	struct pinmux_range input_pd;
  	struct pinmux_range input_pu;
  	struct pinmux_range output;
  	struct pinmux_range mark;
  	struct pinmux_range function;
  
  	unsigned first_gpio, last_gpio;
  
  	struct pinmux_gpio *gpios;
  	struct pinmux_cfg_reg *cfg_regs;
  	struct pinmux_data_reg *data_regs;
  
  	pinmux_enum_t *gpio_data;
  	unsigned int gpio_data_size;
ad2a8e7ea   Magnus Damm   sh: pfc: Add GPIO...
107
108
  	struct pinmux_irq *gpio_irq;
  	unsigned int gpio_irq_size;
b0e10211c   Magnus Damm   sh: pfc: ioremap(...
109
110
111
  	struct resource *resource;
  	unsigned int num_resources;
  	struct pfc_window *window;
e499ada82   Magnus Damm   sh: pfc: Unlock r...
112
  	unsigned long unlock_reg;
fae433991   Magnus Damm   sh: Break out Sup...
113
114
115
116
  	struct gpio_chip chip;
  };
  
  int register_pinmux(struct pinmux_info *pip);
b72421d8a   Paul Mundt   sh: pfc: support ...
117
  int unregister_pinmux(struct pinmux_info *pip);
fae433991   Magnus Damm   sh: Break out Sup...
118

972c3fb69   Kuninori Morimoto   ARM: mach-shmobil...
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  /* helper macro for port */
  #define PORT_1(fn, pfx, sfx) fn(pfx, sfx)
  
  #define PORT_10(fn, pfx, sfx) \
  	PORT_1(fn, pfx##0, sfx), PORT_1(fn, pfx##1, sfx),	\
  	PORT_1(fn, pfx##2, sfx), PORT_1(fn, pfx##3, sfx),	\
  	PORT_1(fn, pfx##4, sfx), PORT_1(fn, pfx##5, sfx),	\
  	PORT_1(fn, pfx##6, sfx), PORT_1(fn, pfx##7, sfx),	\
  	PORT_1(fn, pfx##8, sfx), PORT_1(fn, pfx##9, sfx)
  
  #define PORT_90(fn, pfx, sfx) \
  	PORT_10(fn, pfx##1, sfx), PORT_10(fn, pfx##2, sfx),	\
  	PORT_10(fn, pfx##3, sfx), PORT_10(fn, pfx##4, sfx),	\
  	PORT_10(fn, pfx##5, sfx), PORT_10(fn, pfx##6, sfx),	\
  	PORT_10(fn, pfx##7, sfx), PORT_10(fn, pfx##8, sfx),	\
  	PORT_10(fn, pfx##9, sfx)
  
  #define _PORT_ALL(pfx, sfx) pfx##_##sfx
  #define _GPIO_PORT(pfx, sfx) PINMUX_GPIO(GPIO_PORT##pfx, PORT##pfx##_DATA)
  #define PORT_ALL(str)	CPU_ALL_PORT(_PORT_ALL, PORT, str)
  #define GPIO_PORT_ALL()	CPU_ALL_PORT(_GPIO_PORT, , unused)
  #define GPIO_FN(str) PINMUX_GPIO(GPIO_FN_##str, str##_MARK)
bd8d0cbaa   Kuninori Morimoto   ARM: mach-shmobil...
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
  /* helper macro for pinmux_enum_t */
  #define PORT_DATA_I(nr)	\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_IN)
  
  #define PORT_DATA_I_PD(nr)	\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0,	\
  		    PORT##nr##_IN, PORT##nr##_IN_PD)
  
  #define PORT_DATA_I_PU(nr)	\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0,	\
  		    PORT##nr##_IN, PORT##nr##_IN_PU)
  
  #define PORT_DATA_I_PU_PD(nr)	\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0,			\
  		    PORT##nr##_IN, PORT##nr##_IN_PD, PORT##nr##_IN_PU)
  
  #define PORT_DATA_O(nr)		\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT)
  
  #define PORT_DATA_IO(nr)	\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT,	\
  		    PORT##nr##_IN)
  
  #define PORT_DATA_IO_PD(nr)	\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT,	\
  		    PORT##nr##_IN, PORT##nr##_IN_PD)
  
  #define PORT_DATA_IO_PU(nr)	\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT,	\
  		    PORT##nr##_IN, PORT##nr##_IN_PU)
  
  #define PORT_DATA_IO_PU_PD(nr)	\
  	PINMUX_DATA(PORT##nr##_DATA, PORT##nr##_FN0, PORT##nr##_OUT,	\
  		    PORT##nr##_IN, PORT##nr##_IN_PD, PORT##nr##_IN_PU)
9b49139b3   Kuninori Morimoto   ARM: mach-shmobil...
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
  /* helper macro for top 4 bits in PORTnCR */
  #define _PCRH(in, in_pd, in_pu, out)	\
  	0, (out), (in), 0,		\
  	0, 0, 0, 0,			\
  	0, 0, (in_pd), 0,		\
  	0, 0, (in_pu), 0
  
  #define PORTCR(nr, reg)							\
  	{								\
  		PINMUX_CFG_REG("PORT" nr "CR", reg, 8, 4) {		\
  			_PCRH(PORT##nr##_IN, PORT##nr##_IN_PD,		\
  			      PORT##nr##_IN_PU, PORT##nr##_OUT),	\
  				PORT##nr##_FN0, PORT##nr##_FN1,		\
  				PORT##nr##_FN2, PORT##nr##_FN3,		\
  				PORT##nr##_FN4, PORT##nr##_FN5,		\
  				PORT##nr##_FN6, PORT##nr##_FN7 }	\
  	}
bd8d0cbaa   Kuninori Morimoto   ARM: mach-shmobil...
192

fae433991   Magnus Damm   sh: Break out Sup...
193
  #endif /* __SH_PFC_H */