Merge with /home/sr/git/u-boot
[platform/kernel/u-boot.git] / include / asm-ppc / iopin_8xx.h
1 /*
2  * See file CREDITS for list of people who contributed to this
3  * project.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License as
7  * published by the Free Software Foundation; either version 2 of
8  * the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
18  * MA 02111-1307 USA
19  */
20
21 /*
22  * MPC8xx I/O port pin manipulation functions
23  * Roughly based on iopin_8260.h
24  */
25
26 #ifndef _ASM_IOPIN_8XX_H_
27 #define _ASM_IOPIN_8XX_H_
28
29 #include <linux/types.h>
30 #include <asm/8xx_immap.h>
31
32 #ifdef __KERNEL__
33
34 typedef struct {
35         u_char port:2;  /* port number (A=0, B=1, C=2, D=3) */
36         u_char pin:5;   /* port pin (0-31) */
37         u_char flag:1;  /* for whatever */
38 } iopin_t;
39
40 #define IOPIN_PORTA     0
41 #define IOPIN_PORTB     1
42 #define IOPIN_PORTC     2
43 #define IOPIN_PORTD     3
44
45 extern __inline__ void
46 iopin_set_high(iopin_t *iopin)
47 {
48         if (iopin->port == IOPIN_PORTA) {
49                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_padat;
50                 *datp |= (1 << (15 - iopin->pin));
51         } else if (iopin->port == IOPIN_PORTB) {
52                 volatile uint *datp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbdat;
53                 *datp |= (1 << (31 - iopin->pin));
54         } else if (iopin->port == IOPIN_PORTC) {
55                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcdat;
56                 *datp |= (1 << (15 - iopin->pin));
57         } else if (iopin->port == IOPIN_PORTD) {
58                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pddat;
59                 *datp |= (1 << (15 - iopin->pin));
60         }
61 }
62
63 extern __inline__ void
64 iopin_set_low(iopin_t *iopin)
65 {
66         if (iopin->port == IOPIN_PORTA) {
67                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_padat;
68                 *datp &= ~(1 << (15 - iopin->pin));
69         } else if (iopin->port == IOPIN_PORTB) {
70                 volatile uint *datp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbdat;
71                 *datp &= ~(1 << (31 - iopin->pin));
72         } else if (iopin->port == IOPIN_PORTC) {
73                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcdat;
74                 *datp &= ~(1 << (15 - iopin->pin));
75         } else if (iopin->port == IOPIN_PORTD) {
76                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pddat;
77                 *datp &= ~(1 << (15 - iopin->pin));
78         }
79 }
80
81 extern __inline__ uint
82 iopin_is_high(iopin_t *iopin)
83 {
84         if (iopin->port == IOPIN_PORTA) {
85                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_padat;
86                 return (*datp >> (15 - iopin->pin)) & 1;
87         } else if (iopin->port == IOPIN_PORTB) {
88                 volatile uint *datp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbdat;
89                 return (*datp >> (31 - iopin->pin)) & 1;
90         } else if (iopin->port == IOPIN_PORTC) {
91                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcdat;
92                 return (*datp >> (15 - iopin->pin)) & 1;
93         } else if (iopin->port == IOPIN_PORTD) {
94                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pddat;
95                 return (*datp >> (15 - iopin->pin)) & 1;
96         }
97         return 0;
98 }
99
100 extern __inline__ uint
101 iopin_is_low(iopin_t *iopin)
102 {
103         if (iopin->port == IOPIN_PORTA) {
104                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_padat;
105                 return ((*datp >> (15 - iopin->pin)) & 1) ^ 1;
106         } else if (iopin->port == IOPIN_PORTB) {
107                 volatile uint *datp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbdat;
108                 return ((*datp >> (31 - iopin->pin)) & 1) ^ 1;
109         } else if (iopin->port == IOPIN_PORTC) {
110                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcdat;
111                 return ((*datp >> (15 - iopin->pin)) & 1) ^ 1;
112         } else if (iopin->port == IOPIN_PORTD) {
113                 volatile ushort *datp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pddat;
114                 return ((*datp >> (15 - iopin->pin)) & 1) ^ 1;
115         }
116         return 0;
117 }
118
119 extern __inline__ void
120 iopin_set_out(iopin_t *iopin)
121 {
122         if (iopin->port == IOPIN_PORTA) {
123                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_padir;
124                 *dirp |= (1 << (15 - iopin->pin));
125         } else if (iopin->port == IOPIN_PORTB) {
126                 volatile uint *dirp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbdir;
127                 *dirp |= (1 << (31 - iopin->pin));
128         } else if (iopin->port == IOPIN_PORTC) {
129                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcdir;
130                 *dirp |= (1 << (15 - iopin->pin));
131         } else if (iopin->port == IOPIN_PORTD) {
132                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pddir;
133                 *dirp |= (1 << (15 - iopin->pin));
134         }
135 }
136
137 extern __inline__ void
138 iopin_set_in(iopin_t *iopin)
139 {
140         if (iopin->port == IOPIN_PORTA) {
141                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_padir;
142                 *dirp &= ~(1 << (15 - iopin->pin));
143         } else if (iopin->port == IOPIN_PORTB) {
144                 volatile uint *dirp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbdir;
145                 *dirp &= ~(1 << (31 - iopin->pin));
146         } else if (iopin->port == IOPIN_PORTC) {
147                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcdir;
148                 *dirp &= ~(1 << (15 - iopin->pin));
149         } else if (iopin->port == IOPIN_PORTD) {
150                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pddir;
151                 *dirp &= ~(1 << (15 - iopin->pin));
152         }
153 }
154
155 extern __inline__ uint
156 iopin_is_out(iopin_t *iopin)
157 {
158         if (iopin->port == IOPIN_PORTA) {
159                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_padir;
160                 return (*dirp >> (15 - iopin->pin)) & 1;
161         } else if (iopin->port == IOPIN_PORTB) {
162                 volatile uint *dirp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbdir;
163                 return (*dirp >> (31 - iopin->pin)) & 1;
164         } else if (iopin->port == IOPIN_PORTC) {
165                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcdir;
166                 return (*dirp >> (15 - iopin->pin)) & 1;
167         } else if (iopin->port == IOPIN_PORTD) {
168                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pddir;
169                 return (*dirp >> (15 - iopin->pin)) & 1;
170         }
171         return 0;
172 }
173
174 extern __inline__ uint
175 iopin_is_in(iopin_t *iopin)
176 {
177         if (iopin->port == IOPIN_PORTA) {
178                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_padir;
179                 return ((*dirp >> (15 - iopin->pin)) & 1) ^ 1;
180         } else if (iopin->port == IOPIN_PORTB) {
181                 volatile uint *dirp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbdir;
182                 return ((*dirp >> (31 - iopin->pin)) & 1) ^ 1;
183         } else if (iopin->port == IOPIN_PORTC) {
184                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcdir;
185                 return ((*dirp >> (15 - iopin->pin)) & 1) ^ 1;
186         } else if (iopin->port == IOPIN_PORTD) {
187                 volatile ushort *dirp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pddir;
188                 return ((*dirp >> (15 - iopin->pin)) & 1) ^ 1;
189         }
190         return 0;
191 }
192
193 extern __inline__ void
194 iopin_set_odr(iopin_t *iopin)
195 {
196         if (iopin->port == IOPIN_PORTA) {
197                 volatile ushort *odrp = &((immap_t *)CFG_IMMR)->im_ioport.iop_paodr;
198                 *odrp |= (1 << (15 - iopin->pin));
199         } else if (iopin->port == IOPIN_PORTB) {
200                 volatile ushort *odrp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbodr;
201                 *odrp |= (1 << (31 - iopin->pin));
202         }
203 }
204
205 extern __inline__ void
206 iopin_set_act(iopin_t *iopin)
207 {
208         if (iopin->port == IOPIN_PORTA) {
209                 volatile ushort *odrp = &((immap_t *)CFG_IMMR)->im_ioport.iop_paodr;
210                 *odrp &= ~(1 << (15 - iopin->pin));
211         } else if (iopin->port == IOPIN_PORTB) {
212                 volatile ushort *odrp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbodr;
213                 *odrp &= ~(1 << (31 - iopin->pin));
214         }
215 }
216
217 extern __inline__ uint
218 iopin_is_odr(iopin_t *iopin)
219 {
220         if (iopin->port == IOPIN_PORTA) {
221                 volatile ushort *odrp = &((immap_t *)CFG_IMMR)->im_ioport.iop_paodr;
222                 return (*odrp >> (15 - iopin->pin)) & 1;
223         } else if (iopin->port == IOPIN_PORTB) {
224                 volatile ushort *odrp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbodr;
225                 return (*odrp >> (31 - iopin->pin)) & 1;
226         }
227         return 0;
228 }
229
230 extern __inline__ uint
231 iopin_is_act(iopin_t *iopin)
232 {
233         if (iopin->port == IOPIN_PORTA) {
234                 volatile ushort *odrp = &((immap_t *)CFG_IMMR)->im_ioport.iop_paodr;
235                 return ((*odrp >> (15 - iopin->pin)) & 1) ^ 1;
236         } else if (iopin->port == IOPIN_PORTB) {
237                 volatile ushort *odrp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbodr;
238                 return ((*odrp >> (31 - iopin->pin)) & 1) ^ 1;
239         }
240         return 0;
241 }
242
243 extern __inline__ void
244 iopin_set_ded(iopin_t *iopin)
245 {
246         if (iopin->port == IOPIN_PORTA) {
247                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_papar;
248                 *parp |= (1 << (15 - iopin->pin));
249         } else if (iopin->port == IOPIN_PORTB) {
250                 volatile uint *parp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbpar;
251                 *parp |= (1 << (31 - iopin->pin));
252         } else if (iopin->port == IOPIN_PORTC) {
253                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcpar;
254                 *parp |= (1 << (15 - iopin->pin));
255         } else if (iopin->port == IOPIN_PORTD) {
256                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pdpar;
257                 *parp |= (1 << (15 - iopin->pin));
258         }
259 }
260
261 extern __inline__ void
262 iopin_set_gen(iopin_t *iopin)
263 {
264         if (iopin->port == IOPIN_PORTA) {
265                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_papar;
266                 *parp &= ~(1 << (15 - iopin->pin));
267         } else if (iopin->port == IOPIN_PORTB) {
268                 volatile uint *parp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbpar;
269                 *parp &= ~(1 << (31 - iopin->pin));
270         } else if (iopin->port == IOPIN_PORTC) {
271                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcpar;
272                 *parp &= ~(1 << (15 - iopin->pin));
273         } else if (iopin->port == IOPIN_PORTD) {
274                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pdpar;
275                 *parp &= ~(1 << (15 - iopin->pin));
276         }
277 }
278
279 extern __inline__ uint
280 iopin_is_ded(iopin_t *iopin)
281 {
282         if (iopin->port == IOPIN_PORTA) {
283                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_papar;
284                 return (*parp >> (15 - iopin->pin)) & 1;
285         } else if (iopin->port == IOPIN_PORTB) {
286                 volatile uint *parp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbpar;
287                 return (*parp >> (31 - iopin->pin)) & 1;
288         } else if (iopin->port == IOPIN_PORTC) {
289                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcpar;
290                 return (*parp >> (15 - iopin->pin)) & 1;
291         } else if (iopin->port == IOPIN_PORTD) {
292                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pdpar;
293                 return (*parp >> (15 - iopin->pin)) & 1;
294         }
295         return 0;
296 }
297
298 extern __inline__ uint
299 iopin_is_gen(iopin_t *iopin)
300 {
301         if (iopin->port == IOPIN_PORTA) {
302                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_papar;
303                 return ((*parp >> (15 - iopin->pin)) & 1) ^ 1;
304         } else if (iopin->port == IOPIN_PORTB) {
305                 volatile uint *parp = &((immap_t *)CFG_IMMR)->im_cpm.cp_pbpar;
306                 return ((*parp >> (31 - iopin->pin)) & 1) ^ 1;
307         } else if (iopin->port == IOPIN_PORTC) {
308                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcpar;
309                 return ((*parp >> (15 - iopin->pin)) & 1) ^ 1;
310         } else if (iopin->port == IOPIN_PORTD) {
311                 volatile ushort *parp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pdpar;
312                 return ((*parp >> (15 - iopin->pin)) & 1) ^ 1;
313         }
314         return 0;
315 }
316
317 extern __inline__ void
318 iopin_set_opt2(iopin_t *iopin)
319 {
320         if (iopin->port == IOPIN_PORTC) {
321                 volatile ushort *sorp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcso;
322                 *sorp |= (1 << (15 - iopin->pin));
323         }
324 }
325
326 extern __inline__ void
327 iopin_set_opt1(iopin_t *iopin)
328 {
329         if (iopin->port == IOPIN_PORTC) {
330                 volatile ushort *sorp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcso;
331                 *sorp &= ~(1 << (15 - iopin->pin));
332         }
333 }
334
335 extern __inline__ uint
336 iopin_is_opt2(iopin_t *iopin)
337 {
338         if (iopin->port == IOPIN_PORTC) {
339                 volatile ushort *sorp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcso;
340                 return (*sorp >> (15 - iopin->pin)) & 1;
341         }
342         return 0;
343 }
344
345 extern __inline__ uint
346 iopin_is_opt1(iopin_t *iopin)
347 {
348         if (iopin->port == IOPIN_PORTC) {
349                 volatile ushort *sorp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcso;
350                 return ((*sorp >> (15 - iopin->pin)) & 1) ^ 1;
351         }
352         return 0;
353 }
354
355 extern __inline__ void
356 iopin_set_falledge(iopin_t *iopin)
357 {
358         if (iopin->port == IOPIN_PORTC) {
359                 volatile ushort *intp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcint;
360                 *intp |= (1 << (15 - iopin->pin));
361         }
362 }
363
364 extern __inline__ void
365 iopin_set_anyedge(iopin_t *iopin)
366 {
367         if (iopin->port == IOPIN_PORTC) {
368                 volatile ushort *intp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcint;
369                 *intp &= ~(1 << (15 - iopin->pin));
370         }
371 }
372
373 extern __inline__ uint
374 iopin_is_falledge(iopin_t *iopin)
375 {
376         if (iopin->port == IOPIN_PORTC) {
377                 volatile ushort *intp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcint;
378                 return (*intp >> (15 - iopin->pin)) & 1;
379         }
380         return 0;
381 }
382
383 extern __inline__ uint
384 iopin_is_anyedge(iopin_t *iopin)
385 {
386         if (iopin->port == IOPIN_PORTC) {
387                 volatile ushort *intp = &((immap_t *)CFG_IMMR)->im_ioport.iop_pcint;
388                 return ((*intp >> (15 - iopin->pin)) & 1) ^ 1;
389         }
390         return 0;
391 }
392
393 #endif /* __KERNEL__ */
394
395 #endif /* _ASM_IOPIN_8XX_H_ */