SPDX: Convert all of our single license tags to Linux Kernel style
[platform/kernel/u-boot.git] / arch / powerpc / include / asm / iopin_8xx.h
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_ */