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