2 * SPDX-License-Identifier: GPL-2.0+
6 * MPC8xx I/O port pin manipulation functions
7 * Roughly based on iopin_8260.h
10 #ifndef _ASM_IOPIN_8XX_H_
11 #define _ASM_IOPIN_8XX_H_
13 #include <linux/types.h>
14 #include <asm/8xx_immap.h>
20 u_char port:2; /* port number (A=0, B=1, C=2, D=3) */
21 u_char pin:5; /* port pin (0-31) */
22 u_char flag:1; /* for whatever */
30 static __inline__ void
31 iopin_set_high(iopin_t *iopin)
33 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
35 if (iopin->port == IOPIN_PORTA) {
36 ushort __iomem *datp = &immap->im_ioport.iop_padat;
38 setbits_be16(datp, 1 << (15 - iopin->pin));
39 } else if (iopin->port == IOPIN_PORTB) {
40 uint __iomem *datp = &immap->im_cpm.cp_pbdat;
42 setbits_be32(datp, 1 << (31 - iopin->pin));
43 } else if (iopin->port == IOPIN_PORTC) {
44 ushort __iomem *datp = &immap->im_ioport.iop_pcdat;
46 setbits_be16(datp, 1 << (15 - iopin->pin));
47 } else if (iopin->port == IOPIN_PORTD) {
48 ushort __iomem *datp = &immap->im_ioport.iop_pddat;
50 setbits_be16(datp, 1 << (15 - iopin->pin));
54 static __inline__ void
55 iopin_set_low(iopin_t *iopin)
57 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
59 if (iopin->port == IOPIN_PORTA) {
60 ushort __iomem *datp = &immap->im_ioport.iop_padat;
62 clrbits_be16(datp, 1 << (15 - iopin->pin));
63 } else if (iopin->port == IOPIN_PORTB) {
64 uint __iomem *datp = &immap->im_cpm.cp_pbdat;
66 clrbits_be32(datp, 1 << (31 - iopin->pin));
67 } else if (iopin->port == IOPIN_PORTC) {
68 ushort __iomem *datp = &immap->im_ioport.iop_pcdat;
70 clrbits_be16(datp, 1 << (15 - iopin->pin));
71 } else if (iopin->port == IOPIN_PORTD) {
72 ushort __iomem *datp = &immap->im_ioport.iop_pddat;
74 clrbits_be16(datp, 1 << (15 - iopin->pin));
78 static __inline__ uint
79 iopin_is_high(iopin_t *iopin)
81 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
83 if (iopin->port == IOPIN_PORTA) {
84 ushort __iomem *datp = &immap->im_ioport.iop_padat;
86 return (in_be16(datp) >> (15 - iopin->pin)) & 1;
87 } else if (iopin->port == IOPIN_PORTB) {
88 uint __iomem *datp = &immap->im_cpm.cp_pbdat;
90 return (in_be32(datp) >> (31 - iopin->pin)) & 1;
91 } else if (iopin->port == IOPIN_PORTC) {
92 ushort __iomem *datp = &immap->im_ioport.iop_pcdat;
94 return (in_be16(datp) >> (15 - iopin->pin)) & 1;
95 } else if (iopin->port == IOPIN_PORTD) {
96 ushort __iomem *datp = &immap->im_ioport.iop_pddat;
98 return (in_be16(datp) >> (15 - iopin->pin)) & 1;
103 static __inline__ uint
104 iopin_is_low(iopin_t *iopin)
106 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
108 if (iopin->port == IOPIN_PORTA) {
109 ushort __iomem *datp = &immap->im_ioport.iop_padat;
111 return ((in_be16(datp) >> (15 - iopin->pin)) & 1) ^ 1;
112 } else if (iopin->port == IOPIN_PORTB) {
113 uint __iomem *datp = &immap->im_cpm.cp_pbdat;
115 return ((in_be32(datp) >> (31 - iopin->pin)) & 1) ^ 1;
116 } else if (iopin->port == IOPIN_PORTC) {
117 ushort __iomem *datp = &immap->im_ioport.iop_pcdat;
119 return ((in_be16(datp) >> (15 - iopin->pin)) & 1) ^ 1;
120 } else if (iopin->port == IOPIN_PORTD) {
121 ushort __iomem *datp = &immap->im_ioport.iop_pddat;
123 return ((in_be16(datp) >> (15 - iopin->pin)) & 1) ^ 1;
128 static __inline__ void
129 iopin_set_out(iopin_t *iopin)
131 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
133 if (iopin->port == IOPIN_PORTA) {
134 ushort __iomem *dirp = &immap->im_ioport.iop_padir;
136 setbits_be16(dirp, 1 << (15 - iopin->pin));
137 } else if (iopin->port == IOPIN_PORTB) {
138 uint __iomem *dirp = &immap->im_cpm.cp_pbdir;
140 setbits_be32(dirp, 1 << (31 - iopin->pin));
141 } else if (iopin->port == IOPIN_PORTC) {
142 ushort __iomem *dirp = &immap->im_ioport.iop_pcdir;
144 setbits_be16(dirp, 1 << (15 - iopin->pin));
145 } else if (iopin->port == IOPIN_PORTD) {
146 ushort __iomem *dirp = &immap->im_ioport.iop_pddir;
148 setbits_be16(dirp, 1 << (15 - iopin->pin));
152 static __inline__ void
153 iopin_set_in(iopin_t *iopin)
155 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
157 if (iopin->port == IOPIN_PORTA) {
158 ushort __iomem *dirp = &immap->im_ioport.iop_padir;
160 clrbits_be16(dirp, 1 << (15 - iopin->pin));
161 } else if (iopin->port == IOPIN_PORTB) {
162 uint __iomem *dirp = &immap->im_cpm.cp_pbdir;
164 clrbits_be32(dirp, 1 << (31 - iopin->pin));
165 } else if (iopin->port == IOPIN_PORTC) {
166 ushort __iomem *dirp = &immap->im_ioport.iop_pcdir;
168 clrbits_be16(dirp, 1 << (15 - iopin->pin));
169 } else if (iopin->port == IOPIN_PORTD) {
170 ushort __iomem *dirp = &immap->im_ioport.iop_pddir;
172 clrbits_be16(dirp, 1 << (15 - iopin->pin));
176 static __inline__ uint
177 iopin_is_out(iopin_t *iopin)
179 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
181 if (iopin->port == IOPIN_PORTA) {
182 ushort __iomem *dirp = &immap->im_ioport.iop_padir;
184 return (in_be16(dirp) >> (15 - iopin->pin)) & 1;
185 } else if (iopin->port == IOPIN_PORTB) {
186 uint __iomem *dirp = &immap->im_cpm.cp_pbdir;
188 return (in_be32(dirp) >> (31 - iopin->pin)) & 1;
189 } else if (iopin->port == IOPIN_PORTC) {
190 ushort __iomem *dirp = &immap->im_ioport.iop_pcdir;
192 return (in_be16(dirp) >> (15 - iopin->pin)) & 1;
193 } else if (iopin->port == IOPIN_PORTD) {
194 ushort __iomem *dirp = &immap->im_ioport.iop_pddir;
196 return (in_be16(dirp) >> (15 - iopin->pin)) & 1;
201 static __inline__ uint
202 iopin_is_in(iopin_t *iopin)
204 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
206 if (iopin->port == IOPIN_PORTA) {
207 ushort __iomem *dirp = &immap->im_ioport.iop_padir;
209 return ((in_be16(dirp) >> (15 - iopin->pin)) & 1) ^ 1;
210 } else if (iopin->port == IOPIN_PORTB) {
211 uint __iomem *dirp = &immap->im_cpm.cp_pbdir;
213 return ((in_be32(dirp) >> (31 - iopin->pin)) & 1) ^ 1;
214 } else if (iopin->port == IOPIN_PORTC) {
215 ushort __iomem *dirp = &immap->im_ioport.iop_pcdir;
217 return ((in_be16(dirp) >> (15 - iopin->pin)) & 1) ^ 1;
218 } else if (iopin->port == IOPIN_PORTD) {
219 ushort __iomem *dirp = &immap->im_ioport.iop_pddir;
221 return ((in_be16(dirp) >> (15 - iopin->pin)) & 1) ^ 1;
226 static __inline__ void
227 iopin_set_odr(iopin_t *iopin)
229 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
231 if (iopin->port == IOPIN_PORTA) {
232 ushort __iomem *odrp = &immap->im_ioport.iop_paodr;
234 setbits_be16(odrp, 1 << (15 - iopin->pin));
235 } else if (iopin->port == IOPIN_PORTB) {
236 ushort __iomem *odrp = &immap->im_cpm.cp_pbodr;
238 setbits_be16(odrp, 1 << (31 - iopin->pin));
242 static __inline__ void
243 iopin_set_act(iopin_t *iopin)
245 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
247 if (iopin->port == IOPIN_PORTA) {
248 ushort __iomem *odrp = &immap->im_ioport.iop_paodr;
250 clrbits_be16(odrp, 1 << (15 - iopin->pin));
251 } else if (iopin->port == IOPIN_PORTB) {
252 ushort __iomem *odrp = &immap->im_cpm.cp_pbodr;
254 clrbits_be16(odrp, 1 << (31 - iopin->pin));
258 static __inline__ uint
259 iopin_is_odr(iopin_t *iopin)
261 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
263 if (iopin->port == IOPIN_PORTA) {
264 ushort __iomem *odrp = &immap->im_ioport.iop_paodr;
266 return (in_be16(odrp) >> (15 - iopin->pin)) & 1;
267 } else if (iopin->port == IOPIN_PORTB) {
268 ushort __iomem *odrp = &immap->im_cpm.cp_pbodr;
270 return (in_be16(odrp) >> (31 - iopin->pin)) & 1;
275 static __inline__ uint
276 iopin_is_act(iopin_t *iopin)
278 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
280 if (iopin->port == IOPIN_PORTA) {
281 ushort __iomem *odrp = &immap->im_ioport.iop_paodr;
283 return ((in_be16(odrp) >> (15 - iopin->pin)) & 1) ^ 1;
284 } else if (iopin->port == IOPIN_PORTB) {
285 ushort __iomem *odrp = &immap->im_cpm.cp_pbodr;
287 return ((in_be16(odrp) >> (31 - iopin->pin)) & 1) ^ 1;
292 static __inline__ void
293 iopin_set_ded(iopin_t *iopin)
295 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
297 if (iopin->port == IOPIN_PORTA) {
298 ushort __iomem *parp = &immap->im_ioport.iop_papar;
300 setbits_be16(parp, 1 << (15 - iopin->pin));
301 } else if (iopin->port == IOPIN_PORTB) {
302 uint __iomem *parp = &immap->im_cpm.cp_pbpar;
304 setbits_be32(parp, 1 << (31 - iopin->pin));
305 } else if (iopin->port == IOPIN_PORTC) {
306 ushort __iomem *parp = &immap->im_ioport.iop_pcpar;
308 setbits_be16(parp, 1 << (15 - iopin->pin));
309 } else if (iopin->port == IOPIN_PORTD) {
310 ushort __iomem *parp = &immap->im_ioport.iop_pdpar;
312 setbits_be16(parp, 1 << (15 - iopin->pin));
316 static __inline__ void
317 iopin_set_gen(iopin_t *iopin)
319 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
321 if (iopin->port == IOPIN_PORTA) {
322 ushort __iomem *parp = &immap->im_ioport.iop_papar;
324 clrbits_be16(parp, 1 << (15 - iopin->pin));
325 } else if (iopin->port == IOPIN_PORTB) {
326 uint __iomem *parp = &immap->im_cpm.cp_pbpar;
328 clrbits_be32(parp, 1 << (31 - iopin->pin));
329 } else if (iopin->port == IOPIN_PORTC) {
330 ushort __iomem *parp = &immap->im_ioport.iop_pcpar;
332 clrbits_be16(parp, 1 << (15 - iopin->pin));
333 } else if (iopin->port == IOPIN_PORTD) {
334 ushort __iomem *parp = &immap->im_ioport.iop_pdpar;
336 clrbits_be16(parp, 1 << (15 - iopin->pin));
340 static __inline__ uint
341 iopin_is_ded(iopin_t *iopin)
343 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
345 if (iopin->port == IOPIN_PORTA) {
346 ushort __iomem *parp = &immap->im_ioport.iop_papar;
348 return (in_be16(parp) >> (15 - iopin->pin)) & 1;
349 } else if (iopin->port == IOPIN_PORTB) {
350 uint __iomem *parp = &immap->im_cpm.cp_pbpar;
352 return (in_be32(parp) >> (31 - iopin->pin)) & 1;
353 } else if (iopin->port == IOPIN_PORTC) {
354 ushort __iomem *parp = &immap->im_ioport.iop_pcpar;
356 return (in_be16(parp) >> (15 - iopin->pin)) & 1;
357 } else if (iopin->port == IOPIN_PORTD) {
358 ushort __iomem *parp = &immap->im_ioport.iop_pdpar;
360 return (in_be16(parp) >> (15 - iopin->pin)) & 1;
365 static __inline__ uint
366 iopin_is_gen(iopin_t *iopin)
368 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
370 if (iopin->port == IOPIN_PORTA) {
371 ushort __iomem *parp = &immap->im_ioport.iop_papar;
373 return ((in_be16(parp) >> (15 - iopin->pin)) & 1) ^ 1;
374 } else if (iopin->port == IOPIN_PORTB) {
375 uint __iomem *parp = &immap->im_cpm.cp_pbpar;
377 return ((in_be32(parp) >> (31 - iopin->pin)) & 1) ^ 1;
378 } else if (iopin->port == IOPIN_PORTC) {
379 ushort __iomem *parp = &immap->im_ioport.iop_pcpar;
381 return ((in_be16(parp) >> (15 - iopin->pin)) & 1) ^ 1;
382 } else if (iopin->port == IOPIN_PORTD) {
383 ushort __iomem *parp = &immap->im_ioport.iop_pdpar;
385 return ((in_be16(parp) >> (15 - iopin->pin)) & 1) ^ 1;
390 static __inline__ void
391 iopin_set_opt2(iopin_t *iopin)
393 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
395 if (iopin->port == IOPIN_PORTC) {
396 ushort __iomem *sorp = &immap->im_ioport.iop_pcso;
398 setbits_be16(sorp, 1 << (15 - iopin->pin));
402 static __inline__ void
403 iopin_set_opt1(iopin_t *iopin)
405 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
407 if (iopin->port == IOPIN_PORTC) {
408 ushort __iomem *sorp = &immap->im_ioport.iop_pcso;
410 clrbits_be16(sorp, 1 << (15 - iopin->pin));
414 static __inline__ uint
415 iopin_is_opt2(iopin_t *iopin)
417 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
419 if (iopin->port == IOPIN_PORTC) {
420 ushort __iomem *sorp = &immap->im_ioport.iop_pcso;
422 return (in_be16(sorp) >> (15 - iopin->pin)) & 1;
427 static __inline__ uint
428 iopin_is_opt1(iopin_t *iopin)
430 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
432 if (iopin->port == IOPIN_PORTC) {
433 ushort __iomem *sorp = &immap->im_ioport.iop_pcso;
435 return ((in_be16(sorp) >> (15 - iopin->pin)) & 1) ^ 1;
440 static __inline__ void
441 iopin_set_falledge(iopin_t *iopin)
443 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
445 if (iopin->port == IOPIN_PORTC) {
446 ushort __iomem *intp = &immap->im_ioport.iop_pcint;
448 setbits_be16(intp, 1 << (15 - iopin->pin));
452 static __inline__ void
453 iopin_set_anyedge(iopin_t *iopin)
455 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
457 if (iopin->port == IOPIN_PORTC) {
458 ushort __iomem *intp = &immap->im_ioport.iop_pcint;
460 clrbits_be16(intp, 1 << (15 - iopin->pin));
464 static __inline__ uint
465 iopin_is_falledge(iopin_t *iopin)
467 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
469 if (iopin->port == IOPIN_PORTC) {
470 ushort __iomem *intp = &immap->im_ioport.iop_pcint;
472 return (in_be16(intp) >> (15 - iopin->pin)) & 1;
477 static __inline__ uint
478 iopin_is_anyedge(iopin_t *iopin)
480 immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
482 if (iopin->port == IOPIN_PORTC) {
483 ushort __iomem *intp = &immap->im_ioport.iop_pcint;
485 return ((in_be16(intp) >> (15 - iopin->pin)) & 1) ^ 1;
490 #endif /* __KERNEL__ */
492 #endif /* _ASM_IOPIN_8XX_H_ */