Home | History | Annotate | Download | only in asm
      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