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_ */ 493