]> git.sur5r.net Git - u-boot/blob - arch/powerpc/include/asm/iopin_8xx.h
powerpc, 8xx: Use IO accessors to access IO memory
[u-boot] / arch / powerpc / include / asm / iopin_8xx.h
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_ */