1 /*
2  * See file CREDITS for list of people who contributed to this
3  * project.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
18  * MA 02111-1307 USA
19  */
20 
21 /*
22  * MPC8xx I/O port pin manipulation functions
23  * Roughly based on iopin_8260.h
24  */
25 
26 #ifndef _ASM_IOPIN_8XX_H_
27 #define _ASM_IOPIN_8XX_H_
28 
29 #include <linux/types.h>
30 #include <asm/8xx_immap.h>
31 
32 #ifdef __KERNEL__
33 
34 typedef struct {
35 	u_char port:2;	/* port number (A=0, B=1, C=2, D=3) */
36 	u_char pin:5;	/* port pin (0-31) */
37 	u_char flag:1;	/* for whatever */
38 } iopin_t;
39 
40 #define IOPIN_PORTA	0
41 #define IOPIN_PORTB	1
42 #define IOPIN_PORTC	2
43 #define IOPIN_PORTD	3
44 
45 extern __inline__ void
46 iopin_set_high(iopin_t *iopin)
47 {
48 	if (iopin->port == IOPIN_PORTA) {
49 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_padat;
50 		*datp |= (1 << (15 - iopin->pin));
51 	} else if (iopin->port == IOPIN_PORTB) {
52 		volatile uint *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbdat;
53 		*datp |= (1 << (31 - iopin->pin));
54 	} else if (iopin->port == IOPIN_PORTC) {
55 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcdat;
56 		*datp |= (1 << (15 - iopin->pin));
57 	} else if (iopin->port == IOPIN_PORTD) {
58 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddat;
59 		*datp |= (1 << (15 - iopin->pin));
60 	}
61 }
62 
63 extern __inline__ void
64 iopin_set_low(iopin_t *iopin)
65 {
66 	if (iopin->port == IOPIN_PORTA) {
67 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_padat;
68 		*datp &= ~(1 << (15 - iopin->pin));
69 	} else if (iopin->port == IOPIN_PORTB) {
70 		volatile uint *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbdat;
71 		*datp &= ~(1 << (31 - iopin->pin));
72 	} else if (iopin->port == IOPIN_PORTC) {
73 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcdat;
74 		*datp &= ~(1 << (15 - iopin->pin));
75 	} else if (iopin->port == IOPIN_PORTD) {
76 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddat;
77 		*datp &= ~(1 << (15 - iopin->pin));
78 	}
79 }
80 
81 extern __inline__ uint
82 iopin_is_high(iopin_t *iopin)
83 {
84 	if (iopin->port == IOPIN_PORTA) {
85 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_padat;
86 		return (*datp >> (15 - iopin->pin)) & 1;
87 	} else if (iopin->port == IOPIN_PORTB) {
88 		volatile uint *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbdat;
89 		return (*datp >> (31 - iopin->pin)) & 1;
90 	} else if (iopin->port == IOPIN_PORTC) {
91 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcdat;
92 		return (*datp >> (15 - iopin->pin)) & 1;
93 	} else if (iopin->port == IOPIN_PORTD) {
94 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddat;
95 		return (*datp >> (15 - iopin->pin)) & 1;
96 	}
97 	return 0;
98 }
99 
100 extern __inline__ uint
101 iopin_is_low(iopin_t *iopin)
102 {
103 	if (iopin->port == IOPIN_PORTA) {
104 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_padat;
105 		return ((*datp >> (15 - iopin->pin)) & 1) ^ 1;
106 	} else if (iopin->port == IOPIN_PORTB) {
107 		volatile uint *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbdat;
108 		return ((*datp >> (31 - iopin->pin)) & 1) ^ 1;
109 	} else if (iopin->port == IOPIN_PORTC) {
110 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcdat;
111 		return ((*datp >> (15 - iopin->pin)) & 1) ^ 1;
112 	} else if (iopin->port == IOPIN_PORTD) {
113 		volatile ushort *datp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddat;
114 		return ((*datp >> (15 - iopin->pin)) & 1) ^ 1;
115 	}
116 	return 0;
117 }
118 
119 extern __inline__ void
120 iopin_set_out(iopin_t *iopin)
121 {
122 	if (iopin->port == IOPIN_PORTA) {
123 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_padir;
124 		*dirp |= (1 << (15 - iopin->pin));
125 	} else if (iopin->port == IOPIN_PORTB) {
126 		volatile uint *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbdir;
127 		*dirp |= (1 << (31 - iopin->pin));
128 	} else if (iopin->port == IOPIN_PORTC) {
129 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcdir;
130 		*dirp |= (1 << (15 - iopin->pin));
131 	} else if (iopin->port == IOPIN_PORTD) {
132 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddir;
133 		*dirp |= (1 << (15 - iopin->pin));
134 	}
135 }
136 
137 extern __inline__ void
138 iopin_set_in(iopin_t *iopin)
139 {
140 	if (iopin->port == IOPIN_PORTA) {
141 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_padir;
142 		*dirp &= ~(1 << (15 - iopin->pin));
143 	} else if (iopin->port == IOPIN_PORTB) {
144 		volatile uint *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbdir;
145 		*dirp &= ~(1 << (31 - iopin->pin));
146 	} else if (iopin->port == IOPIN_PORTC) {
147 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcdir;
148 		*dirp &= ~(1 << (15 - iopin->pin));
149 	} else if (iopin->port == IOPIN_PORTD) {
150 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddir;
151 		*dirp &= ~(1 << (15 - iopin->pin));
152 	}
153 }
154 
155 extern __inline__ uint
156 iopin_is_out(iopin_t *iopin)
157 {
158 	if (iopin->port == IOPIN_PORTA) {
159 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_padir;
160 		return (*dirp >> (15 - iopin->pin)) & 1;
161 	} else if (iopin->port == IOPIN_PORTB) {
162 		volatile uint *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbdir;
163 		return (*dirp >> (31 - iopin->pin)) & 1;
164 	} else if (iopin->port == IOPIN_PORTC) {
165 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcdir;
166 		return (*dirp >> (15 - iopin->pin)) & 1;
167 	} else if (iopin->port == IOPIN_PORTD) {
168 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddir;
169 		return (*dirp >> (15 - iopin->pin)) & 1;
170 	}
171 	return 0;
172 }
173 
174 extern __inline__ uint
175 iopin_is_in(iopin_t *iopin)
176 {
177 	if (iopin->port == IOPIN_PORTA) {
178 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_padir;
179 		return ((*dirp >> (15 - iopin->pin)) & 1) ^ 1;
180 	} else if (iopin->port == IOPIN_PORTB) {
181 		volatile uint *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbdir;
182 		return ((*dirp >> (31 - iopin->pin)) & 1) ^ 1;
183 	} else if (iopin->port == IOPIN_PORTC) {
184 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcdir;
185 		return ((*dirp >> (15 - iopin->pin)) & 1) ^ 1;
186 	} else if (iopin->port == IOPIN_PORTD) {
187 		volatile ushort *dirp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pddir;
188 		return ((*dirp >> (15 - iopin->pin)) & 1) ^ 1;
189 	}
190 	return 0;
191 }
192 
193 extern __inline__ void
194 iopin_set_odr(iopin_t *iopin)
195 {
196 	if (iopin->port == IOPIN_PORTA) {
197 		volatile ushort *odrp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_paodr;
198 		*odrp |= (1 << (15 - iopin->pin));
199 	} else if (iopin->port == IOPIN_PORTB) {
200 		volatile ushort *odrp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbodr;
201 		*odrp |= (1 << (31 - iopin->pin));
202 	}
203 }
204 
205 extern __inline__ void
206 iopin_set_act(iopin_t *iopin)
207 {
208 	if (iopin->port == IOPIN_PORTA) {
209 		volatile ushort *odrp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_paodr;
210 		*odrp &= ~(1 << (15 - iopin->pin));
211 	} else if (iopin->port == IOPIN_PORTB) {
212 		volatile ushort *odrp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbodr;
213 		*odrp &= ~(1 << (31 - iopin->pin));
214 	}
215 }
216 
217 extern __inline__ uint
218 iopin_is_odr(iopin_t *iopin)
219 {
220 	if (iopin->port == IOPIN_PORTA) {
221 		volatile ushort *odrp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_paodr;
222 		return (*odrp >> (15 - iopin->pin)) & 1;
223 	} else if (iopin->port == IOPIN_PORTB) {
224 		volatile ushort *odrp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbodr;
225 		return (*odrp >> (31 - iopin->pin)) & 1;
226 	}
227 	return 0;
228 }
229 
230 extern __inline__ uint
231 iopin_is_act(iopin_t *iopin)
232 {
233 	if (iopin->port == IOPIN_PORTA) {
234 		volatile ushort *odrp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_paodr;
235 		return ((*odrp >> (15 - iopin->pin)) & 1) ^ 1;
236 	} else if (iopin->port == IOPIN_PORTB) {
237 		volatile ushort *odrp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbodr;
238 		return ((*odrp >> (31 - iopin->pin)) & 1) ^ 1;
239 	}
240 	return 0;
241 }
242 
243 extern __inline__ void
244 iopin_set_ded(iopin_t *iopin)
245 {
246 	if (iopin->port == IOPIN_PORTA) {
247 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_papar;
248 		*parp |= (1 << (15 - iopin->pin));
249 	} else if (iopin->port == IOPIN_PORTB) {
250 		volatile uint *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbpar;
251 		*parp |= (1 << (31 - iopin->pin));
252 	} else if (iopin->port == IOPIN_PORTC) {
253 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcpar;
254 		*parp |= (1 << (15 - iopin->pin));
255 	} else if (iopin->port == IOPIN_PORTD) {
256 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pdpar;
257 		*parp |= (1 << (15 - iopin->pin));
258 	}
259 }
260 
261 extern __inline__ void
262 iopin_set_gen(iopin_t *iopin)
263 {
264 	if (iopin->port == IOPIN_PORTA) {
265 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_papar;
266 		*parp &= ~(1 << (15 - iopin->pin));
267 	} else if (iopin->port == IOPIN_PORTB) {
268 		volatile uint *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbpar;
269 		*parp &= ~(1 << (31 - iopin->pin));
270 	} else if (iopin->port == IOPIN_PORTC) {
271 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcpar;
272 		*parp &= ~(1 << (15 - iopin->pin));
273 	} else if (iopin->port == IOPIN_PORTD) {
274 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pdpar;
275 		*parp &= ~(1 << (15 - iopin->pin));
276 	}
277 }
278 
279 extern __inline__ uint
280 iopin_is_ded(iopin_t *iopin)
281 {
282 	if (iopin->port == IOPIN_PORTA) {
283 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_papar;
284 		return (*parp >> (15 - iopin->pin)) & 1;
285 	} else if (iopin->port == IOPIN_PORTB) {
286 		volatile uint *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbpar;
287 		return (*parp >> (31 - iopin->pin)) & 1;
288 	} else if (iopin->port == IOPIN_PORTC) {
289 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcpar;
290 		return (*parp >> (15 - iopin->pin)) & 1;
291 	} else if (iopin->port == IOPIN_PORTD) {
292 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pdpar;
293 		return (*parp >> (15 - iopin->pin)) & 1;
294 	}
295 	return 0;
296 }
297 
298 extern __inline__ uint
299 iopin_is_gen(iopin_t *iopin)
300 {
301 	if (iopin->port == IOPIN_PORTA) {
302 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_papar;
303 		return ((*parp >> (15 - iopin->pin)) & 1) ^ 1;
304 	} else if (iopin->port == IOPIN_PORTB) {
305 		volatile uint *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_cpm.cp_pbpar;
306 		return ((*parp >> (31 - iopin->pin)) & 1) ^ 1;
307 	} else if (iopin->port == IOPIN_PORTC) {
308 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcpar;
309 		return ((*parp >> (15 - iopin->pin)) & 1) ^ 1;
310 	} else if (iopin->port == IOPIN_PORTD) {
311 		volatile ushort *parp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pdpar;
312 		return ((*parp >> (15 - iopin->pin)) & 1) ^ 1;
313 	}
314 	return 0;
315 }
316 
317 extern __inline__ void
318 iopin_set_opt2(iopin_t *iopin)
319 {
320 	if (iopin->port == IOPIN_PORTC) {
321 		volatile ushort *sorp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcso;
322 		*sorp |= (1 << (15 - iopin->pin));
323 	}
324 }
325 
326 extern __inline__ void
327 iopin_set_opt1(iopin_t *iopin)
328 {
329 	if (iopin->port == IOPIN_PORTC) {
330 		volatile ushort *sorp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcso;
331 		*sorp &= ~(1 << (15 - iopin->pin));
332 	}
333 }
334 
335 extern __inline__ uint
336 iopin_is_opt2(iopin_t *iopin)
337 {
338 	if (iopin->port == IOPIN_PORTC) {
339 		volatile ushort *sorp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcso;
340 		return (*sorp >> (15 - iopin->pin)) & 1;
341 	}
342 	return 0;
343 }
344 
345 extern __inline__ uint
346 iopin_is_opt1(iopin_t *iopin)
347 {
348 	if (iopin->port == IOPIN_PORTC) {
349 		volatile ushort *sorp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcso;
350 		return ((*sorp >> (15 - iopin->pin)) & 1) ^ 1;
351 	}
352 	return 0;
353 }
354 
355 extern __inline__ void
356 iopin_set_falledge(iopin_t *iopin)
357 {
358 	if (iopin->port == IOPIN_PORTC) {
359 		volatile ushort *intp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcint;
360 		*intp |= (1 << (15 - iopin->pin));
361 	}
362 }
363 
364 extern __inline__ void
365 iopin_set_anyedge(iopin_t *iopin)
366 {
367 	if (iopin->port == IOPIN_PORTC) {
368 		volatile ushort *intp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcint;
369 		*intp &= ~(1 << (15 - iopin->pin));
370 	}
371 }
372 
373 extern __inline__ uint
374 iopin_is_falledge(iopin_t *iopin)
375 {
376 	if (iopin->port == IOPIN_PORTC) {
377 		volatile ushort *intp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcint;
378 		return (*intp >> (15 - iopin->pin)) & 1;
379 	}
380 	return 0;
381 }
382 
383 extern __inline__ uint
384 iopin_is_anyedge(iopin_t *iopin)
385 {
386 	if (iopin->port == IOPIN_PORTC) {
387 		volatile ushort *intp = &((immap_t *)CONFIG_SYS_IMMR)->im_ioport.iop_pcint;
388 		return ((*intp >> (15 - iopin->pin)) & 1) ^ 1;
389 	}
390 	return 0;
391 }
392 
393 #endif /* __KERNEL__ */
394 
395 #endif /* _ASM_IOPIN_8XX_H_ */
396