xref: /openbmc/u-boot/arch/powerpc/include/asm/iopin_8xx.h (revision ba3da7348ac9aaa1cc0a9ccbc8b3c9367d87ca4b)
1 /*
2  * SPDX-License-Identifier:	GPL-2.0+
3  */
4 
5 /*
6  * MPC8xx I/O port pin manipulation functions
7  * Roughly based on iopin_8260.h
8  */
9 
10 #ifndef _ASM_IOPIN_8XX_H_
11 #define _ASM_IOPIN_8XX_H_
12 
13 #include <linux/types.h>
14 #include <asm/8xx_immap.h>
15 #include <asm/io.h>
16 
17 #ifdef __KERNEL__
18 
19 typedef struct {
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 */
23 } iopin_t;
24 
25 #define IOPIN_PORTA	0
26 #define IOPIN_PORTB	1
27 #define IOPIN_PORTC	2
28 #define IOPIN_PORTD	3
29 
30 static __inline__ void
31 iopin_set_high(iopin_t *iopin)
32 {
33 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
34 
35 	if (iopin->port == IOPIN_PORTA) {
36 		ushort __iomem *datp = &immap->im_ioport.iop_padat;
37 
38 		setbits_be16(datp, 1 << (15 - iopin->pin));
39 	} else if (iopin->port == IOPIN_PORTB) {
40 		uint __iomem *datp = &immap->im_cpm.cp_pbdat;
41 
42 		setbits_be32(datp, 1 << (31 - iopin->pin));
43 	} else if (iopin->port == IOPIN_PORTC) {
44 		ushort __iomem *datp = &immap->im_ioport.iop_pcdat;
45 
46 		setbits_be16(datp, 1 << (15 - iopin->pin));
47 	} else if (iopin->port == IOPIN_PORTD) {
48 		ushort __iomem *datp = &immap->im_ioport.iop_pddat;
49 
50 		setbits_be16(datp, 1 << (15 - iopin->pin));
51 	}
52 }
53 
54 static __inline__ void
55 iopin_set_low(iopin_t *iopin)
56 {
57 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
58 
59 	if (iopin->port == IOPIN_PORTA) {
60 		ushort __iomem *datp = &immap->im_ioport.iop_padat;
61 
62 		clrbits_be16(datp, 1 << (15 - iopin->pin));
63 	} else if (iopin->port == IOPIN_PORTB) {
64 		uint __iomem *datp = &immap->im_cpm.cp_pbdat;
65 
66 		clrbits_be32(datp, 1 << (31 - iopin->pin));
67 	} else if (iopin->port == IOPIN_PORTC) {
68 		ushort __iomem *datp = &immap->im_ioport.iop_pcdat;
69 
70 		clrbits_be16(datp, 1 << (15 - iopin->pin));
71 	} else if (iopin->port == IOPIN_PORTD) {
72 		ushort __iomem *datp = &immap->im_ioport.iop_pddat;
73 
74 		clrbits_be16(datp, 1 << (15 - iopin->pin));
75 	}
76 }
77 
78 static __inline__ uint
79 iopin_is_high(iopin_t *iopin)
80 {
81 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
82 
83 	if (iopin->port == IOPIN_PORTA) {
84 		ushort __iomem *datp = &immap->im_ioport.iop_padat;
85 
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;
89 
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;
93 
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;
97 
98 		return (in_be16(datp) >> (15 - iopin->pin)) & 1;
99 	}
100 	return 0;
101 }
102 
103 static __inline__ uint
104 iopin_is_low(iopin_t *iopin)
105 {
106 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
107 
108 	if (iopin->port == IOPIN_PORTA) {
109 		ushort __iomem *datp = &immap->im_ioport.iop_padat;
110 
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;
114 
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;
118 
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;
122 
123 		return ((in_be16(datp) >> (15 - iopin->pin)) & 1) ^ 1;
124 	}
125 	return 0;
126 }
127 
128 static __inline__ void
129 iopin_set_out(iopin_t *iopin)
130 {
131 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
132 
133 	if (iopin->port == IOPIN_PORTA) {
134 		ushort __iomem *dirp = &immap->im_ioport.iop_padir;
135 
136 		setbits_be16(dirp, 1 << (15 - iopin->pin));
137 	} else if (iopin->port == IOPIN_PORTB) {
138 		uint __iomem *dirp = &immap->im_cpm.cp_pbdir;
139 
140 		setbits_be32(dirp, 1 << (31 - iopin->pin));
141 	} else if (iopin->port == IOPIN_PORTC) {
142 		ushort __iomem *dirp = &immap->im_ioport.iop_pcdir;
143 
144 		setbits_be16(dirp, 1 << (15 - iopin->pin));
145 	} else if (iopin->port == IOPIN_PORTD) {
146 		ushort __iomem *dirp = &immap->im_ioport.iop_pddir;
147 
148 		setbits_be16(dirp, 1 << (15 - iopin->pin));
149 	}
150 }
151 
152 static __inline__ void
153 iopin_set_in(iopin_t *iopin)
154 {
155 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
156 
157 	if (iopin->port == IOPIN_PORTA) {
158 		ushort __iomem *dirp = &immap->im_ioport.iop_padir;
159 
160 		clrbits_be16(dirp, 1 << (15 - iopin->pin));
161 	} else if (iopin->port == IOPIN_PORTB) {
162 		uint __iomem *dirp = &immap->im_cpm.cp_pbdir;
163 
164 		clrbits_be32(dirp, 1 << (31 - iopin->pin));
165 	} else if (iopin->port == IOPIN_PORTC) {
166 		ushort __iomem *dirp = &immap->im_ioport.iop_pcdir;
167 
168 		clrbits_be16(dirp, 1 << (15 - iopin->pin));
169 	} else if (iopin->port == IOPIN_PORTD) {
170 		ushort __iomem *dirp = &immap->im_ioport.iop_pddir;
171 
172 		clrbits_be16(dirp, 1 << (15 - iopin->pin));
173 	}
174 }
175 
176 static __inline__ uint
177 iopin_is_out(iopin_t *iopin)
178 {
179 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
180 
181 	if (iopin->port == IOPIN_PORTA) {
182 		ushort __iomem *dirp = &immap->im_ioport.iop_padir;
183 
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;
187 
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;
191 
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;
195 
196 		return (in_be16(dirp) >> (15 - iopin->pin)) & 1;
197 	}
198 	return 0;
199 }
200 
201 static __inline__ uint
202 iopin_is_in(iopin_t *iopin)
203 {
204 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
205 
206 	if (iopin->port == IOPIN_PORTA) {
207 		ushort __iomem *dirp = &immap->im_ioport.iop_padir;
208 
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;
212 
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;
216 
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;
220 
221 		return ((in_be16(dirp) >> (15 - iopin->pin)) & 1) ^ 1;
222 	}
223 	return 0;
224 }
225 
226 static __inline__ void
227 iopin_set_odr(iopin_t *iopin)
228 {
229 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
230 
231 	if (iopin->port == IOPIN_PORTA) {
232 		ushort __iomem *odrp = &immap->im_ioport.iop_paodr;
233 
234 		setbits_be16(odrp, 1 << (15 - iopin->pin));
235 	} else if (iopin->port == IOPIN_PORTB) {
236 		ushort __iomem *odrp = &immap->im_cpm.cp_pbodr;
237 
238 		setbits_be16(odrp, 1 << (31 - iopin->pin));
239 	}
240 }
241 
242 static __inline__ void
243 iopin_set_act(iopin_t *iopin)
244 {
245 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
246 
247 	if (iopin->port == IOPIN_PORTA) {
248 		ushort __iomem *odrp = &immap->im_ioport.iop_paodr;
249 
250 		clrbits_be16(odrp, 1 << (15 - iopin->pin));
251 	} else if (iopin->port == IOPIN_PORTB) {
252 		ushort __iomem *odrp = &immap->im_cpm.cp_pbodr;
253 
254 		clrbits_be16(odrp, 1 << (31 - iopin->pin));
255 	}
256 }
257 
258 static __inline__ uint
259 iopin_is_odr(iopin_t *iopin)
260 {
261 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
262 
263 	if (iopin->port == IOPIN_PORTA) {
264 		ushort __iomem *odrp = &immap->im_ioport.iop_paodr;
265 
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;
269 
270 		return (in_be16(odrp) >> (31 - iopin->pin)) & 1;
271 	}
272 	return 0;
273 }
274 
275 static __inline__ uint
276 iopin_is_act(iopin_t *iopin)
277 {
278 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
279 
280 	if (iopin->port == IOPIN_PORTA) {
281 		ushort __iomem *odrp = &immap->im_ioport.iop_paodr;
282 
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;
286 
287 		return ((in_be16(odrp) >> (31 - iopin->pin)) & 1) ^ 1;
288 	}
289 	return 0;
290 }
291 
292 static __inline__ void
293 iopin_set_ded(iopin_t *iopin)
294 {
295 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
296 
297 	if (iopin->port == IOPIN_PORTA) {
298 		ushort __iomem *parp = &immap->im_ioport.iop_papar;
299 
300 		setbits_be16(parp, 1 << (15 - iopin->pin));
301 	} else if (iopin->port == IOPIN_PORTB) {
302 		uint __iomem *parp = &immap->im_cpm.cp_pbpar;
303 
304 		setbits_be32(parp, 1 << (31 - iopin->pin));
305 	} else if (iopin->port == IOPIN_PORTC) {
306 		ushort __iomem *parp = &immap->im_ioport.iop_pcpar;
307 
308 		setbits_be16(parp, 1 << (15 - iopin->pin));
309 	} else if (iopin->port == IOPIN_PORTD) {
310 		ushort __iomem *parp = &immap->im_ioport.iop_pdpar;
311 
312 		setbits_be16(parp, 1 << (15 - iopin->pin));
313 	}
314 }
315 
316 static __inline__ void
317 iopin_set_gen(iopin_t *iopin)
318 {
319 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
320 
321 	if (iopin->port == IOPIN_PORTA) {
322 		ushort __iomem *parp = &immap->im_ioport.iop_papar;
323 
324 		clrbits_be16(parp, 1 << (15 - iopin->pin));
325 	} else if (iopin->port == IOPIN_PORTB) {
326 		uint __iomem *parp = &immap->im_cpm.cp_pbpar;
327 
328 		clrbits_be32(parp, 1 << (31 - iopin->pin));
329 	} else if (iopin->port == IOPIN_PORTC) {
330 		ushort __iomem *parp = &immap->im_ioport.iop_pcpar;
331 
332 		clrbits_be16(parp, 1 << (15 - iopin->pin));
333 	} else if (iopin->port == IOPIN_PORTD) {
334 		ushort __iomem *parp = &immap->im_ioport.iop_pdpar;
335 
336 		clrbits_be16(parp, 1 << (15 - iopin->pin));
337 	}
338 }
339 
340 static __inline__ uint
341 iopin_is_ded(iopin_t *iopin)
342 {
343 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
344 
345 	if (iopin->port == IOPIN_PORTA) {
346 		ushort __iomem *parp = &immap->im_ioport.iop_papar;
347 
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;
351 
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;
355 
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;
359 
360 		return (in_be16(parp) >> (15 - iopin->pin)) & 1;
361 	}
362 	return 0;
363 }
364 
365 static __inline__ uint
366 iopin_is_gen(iopin_t *iopin)
367 {
368 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
369 
370 	if (iopin->port == IOPIN_PORTA) {
371 		ushort __iomem *parp = &immap->im_ioport.iop_papar;
372 
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;
376 
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;
380 
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;
384 
385 		return ((in_be16(parp) >> (15 - iopin->pin)) & 1) ^ 1;
386 	}
387 	return 0;
388 }
389 
390 static __inline__ void
391 iopin_set_opt2(iopin_t *iopin)
392 {
393 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
394 
395 	if (iopin->port == IOPIN_PORTC) {
396 		ushort __iomem *sorp = &immap->im_ioport.iop_pcso;
397 
398 		setbits_be16(sorp, 1 << (15 - iopin->pin));
399 	}
400 }
401 
402 static __inline__ void
403 iopin_set_opt1(iopin_t *iopin)
404 {
405 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
406 
407 	if (iopin->port == IOPIN_PORTC) {
408 		ushort __iomem *sorp = &immap->im_ioport.iop_pcso;
409 
410 		clrbits_be16(sorp, 1 << (15 - iopin->pin));
411 	}
412 }
413 
414 static __inline__ uint
415 iopin_is_opt2(iopin_t *iopin)
416 {
417 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
418 
419 	if (iopin->port == IOPIN_PORTC) {
420 		ushort __iomem *sorp = &immap->im_ioport.iop_pcso;
421 
422 		return (in_be16(sorp) >> (15 - iopin->pin)) & 1;
423 	}
424 	return 0;
425 }
426 
427 static __inline__ uint
428 iopin_is_opt1(iopin_t *iopin)
429 {
430 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
431 
432 	if (iopin->port == IOPIN_PORTC) {
433 		ushort __iomem *sorp = &immap->im_ioport.iop_pcso;
434 
435 		return ((in_be16(sorp) >> (15 - iopin->pin)) & 1) ^ 1;
436 	}
437 	return 0;
438 }
439 
440 static __inline__ void
441 iopin_set_falledge(iopin_t *iopin)
442 {
443 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
444 
445 	if (iopin->port == IOPIN_PORTC) {
446 		ushort __iomem *intp = &immap->im_ioport.iop_pcint;
447 
448 		setbits_be16(intp, 1 << (15 - iopin->pin));
449 	}
450 }
451 
452 static __inline__ void
453 iopin_set_anyedge(iopin_t *iopin)
454 {
455 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
456 
457 	if (iopin->port == IOPIN_PORTC) {
458 		ushort __iomem *intp = &immap->im_ioport.iop_pcint;
459 
460 		clrbits_be16(intp, 1 << (15 - iopin->pin));
461 	}
462 }
463 
464 static __inline__ uint
465 iopin_is_falledge(iopin_t *iopin)
466 {
467 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
468 
469 	if (iopin->port == IOPIN_PORTC) {
470 		ushort __iomem *intp = &immap->im_ioport.iop_pcint;
471 
472 		return (in_be16(intp) >> (15 - iopin->pin)) & 1;
473 	}
474 	return 0;
475 }
476 
477 static __inline__ uint
478 iopin_is_anyedge(iopin_t *iopin)
479 {
480 	immap_t __iomem *immap = (immap_t __iomem *)CONFIG_SYS_IMMR;
481 
482 	if (iopin->port == IOPIN_PORTC) {
483 		ushort __iomem *intp = &immap->im_ioport.iop_pcint;
484 
485 		return ((in_be16(intp) >> (15 - iopin->pin)) & 1) ^ 1;
486 	}
487 	return 0;
488 }
489 
490 #endif /* __KERNEL__ */
491 
492 #endif /* _ASM_IOPIN_8XX_H_ */
493