root/arch/powerpc/sysdev/ipic.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. ipic_read
  2. ipic_write
  3. ipic_from_irq
  4. ipic_unmask_irq
  5. ipic_mask_irq
  6. ipic_ack_irq
  7. ipic_mask_irq_and_ack
  8. ipic_set_irq_type
  9. ipic_host_match
  10. ipic_host_map
  11. ipic_init
  12. ipic_set_default_priority
  13. ipic_get_mcp_status
  14. ipic_clear_mcp_status
  15. ipic_get_irq
  16. ipic_suspend
  17. ipic_resume
  18. init_ipic_syscore

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * arch/powerpc/sysdev/ipic.c
   4  *
   5  * IPIC routines implementations.
   6  *
   7  * Copyright 2005 Freescale Semiconductor, Inc.
   8  */
   9 #include <linux/kernel.h>
  10 #include <linux/init.h>
  11 #include <linux/errno.h>
  12 #include <linux/reboot.h>
  13 #include <linux/slab.h>
  14 #include <linux/stddef.h>
  15 #include <linux/sched.h>
  16 #include <linux/signal.h>
  17 #include <linux/syscore_ops.h>
  18 #include <linux/device.h>
  19 #include <linux/spinlock.h>
  20 #include <linux/fsl_devices.h>
  21 #include <asm/irq.h>
  22 #include <asm/io.h>
  23 #include <asm/prom.h>
  24 #include <asm/ipic.h>
  25 
  26 #include "ipic.h"
  27 
  28 static struct ipic * primary_ipic;
  29 static struct irq_chip ipic_level_irq_chip, ipic_edge_irq_chip;
  30 static DEFINE_RAW_SPINLOCK(ipic_lock);
  31 
  32 static struct ipic_info ipic_info[] = {
  33         [1] = {
  34                 .mask   = IPIC_SIMSR_H,
  35                 .prio   = IPIC_SIPRR_C,
  36                 .force  = IPIC_SIFCR_H,
  37                 .bit    = 16,
  38                 .prio_mask = 0,
  39         },
  40         [2] = {
  41                 .mask   = IPIC_SIMSR_H,
  42                 .prio   = IPIC_SIPRR_C,
  43                 .force  = IPIC_SIFCR_H,
  44                 .bit    = 17,
  45                 .prio_mask = 1,
  46         },
  47         [3] = {
  48                 .mask   = IPIC_SIMSR_H,
  49                 .prio   = IPIC_SIPRR_C,
  50                 .force  = IPIC_SIFCR_H,
  51                 .bit    = 18,
  52                 .prio_mask = 2,
  53         },
  54         [4] = {
  55                 .mask   = IPIC_SIMSR_H,
  56                 .prio   = IPIC_SIPRR_C,
  57                 .force  = IPIC_SIFCR_H,
  58                 .bit    = 19,
  59                 .prio_mask = 3,
  60         },
  61         [5] = {
  62                 .mask   = IPIC_SIMSR_H,
  63                 .prio   = IPIC_SIPRR_C,
  64                 .force  = IPIC_SIFCR_H,
  65                 .bit    = 20,
  66                 .prio_mask = 4,
  67         },
  68         [6] = {
  69                 .mask   = IPIC_SIMSR_H,
  70                 .prio   = IPIC_SIPRR_C,
  71                 .force  = IPIC_SIFCR_H,
  72                 .bit    = 21,
  73                 .prio_mask = 5,
  74         },
  75         [7] = {
  76                 .mask   = IPIC_SIMSR_H,
  77                 .prio   = IPIC_SIPRR_C,
  78                 .force  = IPIC_SIFCR_H,
  79                 .bit    = 22,
  80                 .prio_mask = 6,
  81         },
  82         [8] = {
  83                 .mask   = IPIC_SIMSR_H,
  84                 .prio   = IPIC_SIPRR_C,
  85                 .force  = IPIC_SIFCR_H,
  86                 .bit    = 23,
  87                 .prio_mask = 7,
  88         },
  89         [9] = {
  90                 .mask   = IPIC_SIMSR_H,
  91                 .prio   = IPIC_SIPRR_D,
  92                 .force  = IPIC_SIFCR_H,
  93                 .bit    = 24,
  94                 .prio_mask = 0,
  95         },
  96         [10] = {
  97                 .mask   = IPIC_SIMSR_H,
  98                 .prio   = IPIC_SIPRR_D,
  99                 .force  = IPIC_SIFCR_H,
 100                 .bit    = 25,
 101                 .prio_mask = 1,
 102         },
 103         [11] = {
 104                 .mask   = IPIC_SIMSR_H,
 105                 .prio   = IPIC_SIPRR_D,
 106                 .force  = IPIC_SIFCR_H,
 107                 .bit    = 26,
 108                 .prio_mask = 2,
 109         },
 110         [12] = {
 111                 .mask   = IPIC_SIMSR_H,
 112                 .prio   = IPIC_SIPRR_D,
 113                 .force  = IPIC_SIFCR_H,
 114                 .bit    = 27,
 115                 .prio_mask = 3,
 116         },
 117         [13] = {
 118                 .mask   = IPIC_SIMSR_H,
 119                 .prio   = IPIC_SIPRR_D,
 120                 .force  = IPIC_SIFCR_H,
 121                 .bit    = 28,
 122                 .prio_mask = 4,
 123         },
 124         [14] = {
 125                 .mask   = IPIC_SIMSR_H,
 126                 .prio   = IPIC_SIPRR_D,
 127                 .force  = IPIC_SIFCR_H,
 128                 .bit    = 29,
 129                 .prio_mask = 5,
 130         },
 131         [15] = {
 132                 .mask   = IPIC_SIMSR_H,
 133                 .prio   = IPIC_SIPRR_D,
 134                 .force  = IPIC_SIFCR_H,
 135                 .bit    = 30,
 136                 .prio_mask = 6,
 137         },
 138         [16] = {
 139                 .mask   = IPIC_SIMSR_H,
 140                 .prio   = IPIC_SIPRR_D,
 141                 .force  = IPIC_SIFCR_H,
 142                 .bit    = 31,
 143                 .prio_mask = 7,
 144         },
 145         [17] = {
 146                 .ack    = IPIC_SEPNR,
 147                 .mask   = IPIC_SEMSR,
 148                 .prio   = IPIC_SMPRR_A,
 149                 .force  = IPIC_SEFCR,
 150                 .bit    = 1,
 151                 .prio_mask = 5,
 152         },
 153         [18] = {
 154                 .ack    = IPIC_SEPNR,
 155                 .mask   = IPIC_SEMSR,
 156                 .prio   = IPIC_SMPRR_A,
 157                 .force  = IPIC_SEFCR,
 158                 .bit    = 2,
 159                 .prio_mask = 6,
 160         },
 161         [19] = {
 162                 .ack    = IPIC_SEPNR,
 163                 .mask   = IPIC_SEMSR,
 164                 .prio   = IPIC_SMPRR_A,
 165                 .force  = IPIC_SEFCR,
 166                 .bit    = 3,
 167                 .prio_mask = 7,
 168         },
 169         [20] = {
 170                 .ack    = IPIC_SEPNR,
 171                 .mask   = IPIC_SEMSR,
 172                 .prio   = IPIC_SMPRR_B,
 173                 .force  = IPIC_SEFCR,
 174                 .bit    = 4,
 175                 .prio_mask = 4,
 176         },
 177         [21] = {
 178                 .ack    = IPIC_SEPNR,
 179                 .mask   = IPIC_SEMSR,
 180                 .prio   = IPIC_SMPRR_B,
 181                 .force  = IPIC_SEFCR,
 182                 .bit    = 5,
 183                 .prio_mask = 5,
 184         },
 185         [22] = {
 186                 .ack    = IPIC_SEPNR,
 187                 .mask   = IPIC_SEMSR,
 188                 .prio   = IPIC_SMPRR_B,
 189                 .force  = IPIC_SEFCR,
 190                 .bit    = 6,
 191                 .prio_mask = 6,
 192         },
 193         [23] = {
 194                 .ack    = IPIC_SEPNR,
 195                 .mask   = IPIC_SEMSR,
 196                 .prio   = IPIC_SMPRR_B,
 197                 .force  = IPIC_SEFCR,
 198                 .bit    = 7,
 199                 .prio_mask = 7,
 200         },
 201         [32] = {
 202                 .mask   = IPIC_SIMSR_H,
 203                 .prio   = IPIC_SIPRR_A,
 204                 .force  = IPIC_SIFCR_H,
 205                 .bit    = 0,
 206                 .prio_mask = 0,
 207         },
 208         [33] = {
 209                 .mask   = IPIC_SIMSR_H,
 210                 .prio   = IPIC_SIPRR_A,
 211                 .force  = IPIC_SIFCR_H,
 212                 .bit    = 1,
 213                 .prio_mask = 1,
 214         },
 215         [34] = {
 216                 .mask   = IPIC_SIMSR_H,
 217                 .prio   = IPIC_SIPRR_A,
 218                 .force  = IPIC_SIFCR_H,
 219                 .bit    = 2,
 220                 .prio_mask = 2,
 221         },
 222         [35] = {
 223                 .mask   = IPIC_SIMSR_H,
 224                 .prio   = IPIC_SIPRR_A,
 225                 .force  = IPIC_SIFCR_H,
 226                 .bit    = 3,
 227                 .prio_mask = 3,
 228         },
 229         [36] = {
 230                 .mask   = IPIC_SIMSR_H,
 231                 .prio   = IPIC_SIPRR_A,
 232                 .force  = IPIC_SIFCR_H,
 233                 .bit    = 4,
 234                 .prio_mask = 4,
 235         },
 236         [37] = {
 237                 .mask   = IPIC_SIMSR_H,
 238                 .prio   = IPIC_SIPRR_A,
 239                 .force  = IPIC_SIFCR_H,
 240                 .bit    = 5,
 241                 .prio_mask = 5,
 242         },
 243         [38] = {
 244                 .mask   = IPIC_SIMSR_H,
 245                 .prio   = IPIC_SIPRR_A,
 246                 .force  = IPIC_SIFCR_H,
 247                 .bit    = 6,
 248                 .prio_mask = 6,
 249         },
 250         [39] = {
 251                 .mask   = IPIC_SIMSR_H,
 252                 .prio   = IPIC_SIPRR_A,
 253                 .force  = IPIC_SIFCR_H,
 254                 .bit    = 7,
 255                 .prio_mask = 7,
 256         },
 257         [40] = {
 258                 .mask   = IPIC_SIMSR_H,
 259                 .prio   = IPIC_SIPRR_B,
 260                 .force  = IPIC_SIFCR_H,
 261                 .bit    = 8,
 262                 .prio_mask = 0,
 263         },
 264         [41] = {
 265                 .mask   = IPIC_SIMSR_H,
 266                 .prio   = IPIC_SIPRR_B,
 267                 .force  = IPIC_SIFCR_H,
 268                 .bit    = 9,
 269                 .prio_mask = 1,
 270         },
 271         [42] = {
 272                 .mask   = IPIC_SIMSR_H,
 273                 .prio   = IPIC_SIPRR_B,
 274                 .force  = IPIC_SIFCR_H,
 275                 .bit    = 10,
 276                 .prio_mask = 2,
 277         },
 278         [43] = {
 279                 .mask   = IPIC_SIMSR_H,
 280                 .prio   = IPIC_SIPRR_B,
 281                 .force  = IPIC_SIFCR_H,
 282                 .bit    = 11,
 283                 .prio_mask = 3,
 284         },
 285         [44] = {
 286                 .mask   = IPIC_SIMSR_H,
 287                 .prio   = IPIC_SIPRR_B,
 288                 .force  = IPIC_SIFCR_H,
 289                 .bit    = 12,
 290                 .prio_mask = 4,
 291         },
 292         [45] = {
 293                 .mask   = IPIC_SIMSR_H,
 294                 .prio   = IPIC_SIPRR_B,
 295                 .force  = IPIC_SIFCR_H,
 296                 .bit    = 13,
 297                 .prio_mask = 5,
 298         },
 299         [46] = {
 300                 .mask   = IPIC_SIMSR_H,
 301                 .prio   = IPIC_SIPRR_B,
 302                 .force  = IPIC_SIFCR_H,
 303                 .bit    = 14,
 304                 .prio_mask = 6,
 305         },
 306         [47] = {
 307                 .mask   = IPIC_SIMSR_H,
 308                 .prio   = IPIC_SIPRR_B,
 309                 .force  = IPIC_SIFCR_H,
 310                 .bit    = 15,
 311                 .prio_mask = 7,
 312         },
 313         [48] = {
 314                 .ack    = IPIC_SEPNR,
 315                 .mask   = IPIC_SEMSR,
 316                 .prio   = IPIC_SMPRR_A,
 317                 .force  = IPIC_SEFCR,
 318                 .bit    = 0,
 319                 .prio_mask = 4,
 320         },
 321         [64] = {
 322                 .mask   = IPIC_SIMSR_L,
 323                 .prio   = IPIC_SMPRR_A,
 324                 .force  = IPIC_SIFCR_L,
 325                 .bit    = 0,
 326                 .prio_mask = 0,
 327         },
 328         [65] = {
 329                 .mask   = IPIC_SIMSR_L,
 330                 .prio   = IPIC_SMPRR_A,
 331                 .force  = IPIC_SIFCR_L,
 332                 .bit    = 1,
 333                 .prio_mask = 1,
 334         },
 335         [66] = {
 336                 .mask   = IPIC_SIMSR_L,
 337                 .prio   = IPIC_SMPRR_A,
 338                 .force  = IPIC_SIFCR_L,
 339                 .bit    = 2,
 340                 .prio_mask = 2,
 341         },
 342         [67] = {
 343                 .mask   = IPIC_SIMSR_L,
 344                 .prio   = IPIC_SMPRR_A,
 345                 .force  = IPIC_SIFCR_L,
 346                 .bit    = 3,
 347                 .prio_mask = 3,
 348         },
 349         [68] = {
 350                 .mask   = IPIC_SIMSR_L,
 351                 .prio   = IPIC_SMPRR_B,
 352                 .force  = IPIC_SIFCR_L,
 353                 .bit    = 4,
 354                 .prio_mask = 0,
 355         },
 356         [69] = {
 357                 .mask   = IPIC_SIMSR_L,
 358                 .prio   = IPIC_SMPRR_B,
 359                 .force  = IPIC_SIFCR_L,
 360                 .bit    = 5,
 361                 .prio_mask = 1,
 362         },
 363         [70] = {
 364                 .mask   = IPIC_SIMSR_L,
 365                 .prio   = IPIC_SMPRR_B,
 366                 .force  = IPIC_SIFCR_L,
 367                 .bit    = 6,
 368                 .prio_mask = 2,
 369         },
 370         [71] = {
 371                 .mask   = IPIC_SIMSR_L,
 372                 .prio   = IPIC_SMPRR_B,
 373                 .force  = IPIC_SIFCR_L,
 374                 .bit    = 7,
 375                 .prio_mask = 3,
 376         },
 377         [72] = {
 378                 .mask   = IPIC_SIMSR_L,
 379                 .prio   = 0,
 380                 .force  = IPIC_SIFCR_L,
 381                 .bit    = 8,
 382         },
 383         [73] = {
 384                 .mask   = IPIC_SIMSR_L,
 385                 .prio   = 0,
 386                 .force  = IPIC_SIFCR_L,
 387                 .bit    = 9,
 388         },
 389         [74] = {
 390                 .mask   = IPIC_SIMSR_L,
 391                 .prio   = 0,
 392                 .force  = IPIC_SIFCR_L,
 393                 .bit    = 10,
 394         },
 395         [75] = {
 396                 .mask   = IPIC_SIMSR_L,
 397                 .prio   = 0,
 398                 .force  = IPIC_SIFCR_L,
 399                 .bit    = 11,
 400         },
 401         [76] = {
 402                 .mask   = IPIC_SIMSR_L,
 403                 .prio   = 0,
 404                 .force  = IPIC_SIFCR_L,
 405                 .bit    = 12,
 406         },
 407         [77] = {
 408                 .mask   = IPIC_SIMSR_L,
 409                 .prio   = 0,
 410                 .force  = IPIC_SIFCR_L,
 411                 .bit    = 13,
 412         },
 413         [78] = {
 414                 .mask   = IPIC_SIMSR_L,
 415                 .prio   = 0,
 416                 .force  = IPIC_SIFCR_L,
 417                 .bit    = 14,
 418         },
 419         [79] = {
 420                 .mask   = IPIC_SIMSR_L,
 421                 .prio   = 0,
 422                 .force  = IPIC_SIFCR_L,
 423                 .bit    = 15,
 424         },
 425         [80] = {
 426                 .mask   = IPIC_SIMSR_L,
 427                 .prio   = 0,
 428                 .force  = IPIC_SIFCR_L,
 429                 .bit    = 16,
 430         },
 431         [81] = {
 432                 .mask   = IPIC_SIMSR_L,
 433                 .prio   = 0,
 434                 .force  = IPIC_SIFCR_L,
 435                 .bit    = 17,
 436         },
 437         [82] = {
 438                 .mask   = IPIC_SIMSR_L,
 439                 .prio   = 0,
 440                 .force  = IPIC_SIFCR_L,
 441                 .bit    = 18,
 442         },
 443         [83] = {
 444                 .mask   = IPIC_SIMSR_L,
 445                 .prio   = 0,
 446                 .force  = IPIC_SIFCR_L,
 447                 .bit    = 19,
 448         },
 449         [84] = {
 450                 .mask   = IPIC_SIMSR_L,
 451                 .prio   = 0,
 452                 .force  = IPIC_SIFCR_L,
 453                 .bit    = 20,
 454         },
 455         [85] = {
 456                 .mask   = IPIC_SIMSR_L,
 457                 .prio   = 0,
 458                 .force  = IPIC_SIFCR_L,
 459                 .bit    = 21,
 460         },
 461         [86] = {
 462                 .mask   = IPIC_SIMSR_L,
 463                 .prio   = 0,
 464                 .force  = IPIC_SIFCR_L,
 465                 .bit    = 22,
 466         },
 467         [87] = {
 468                 .mask   = IPIC_SIMSR_L,
 469                 .prio   = 0,
 470                 .force  = IPIC_SIFCR_L,
 471                 .bit    = 23,
 472         },
 473         [88] = {
 474                 .mask   = IPIC_SIMSR_L,
 475                 .prio   = 0,
 476                 .force  = IPIC_SIFCR_L,
 477                 .bit    = 24,
 478         },
 479         [89] = {
 480                 .mask   = IPIC_SIMSR_L,
 481                 .prio   = 0,
 482                 .force  = IPIC_SIFCR_L,
 483                 .bit    = 25,
 484         },
 485         [90] = {
 486                 .mask   = IPIC_SIMSR_L,
 487                 .prio   = 0,
 488                 .force  = IPIC_SIFCR_L,
 489                 .bit    = 26,
 490         },
 491         [91] = {
 492                 .mask   = IPIC_SIMSR_L,
 493                 .prio   = 0,
 494                 .force  = IPIC_SIFCR_L,
 495                 .bit    = 27,
 496         },
 497         [94] = {
 498                 .mask   = IPIC_SIMSR_L,
 499                 .prio   = 0,
 500                 .force  = IPIC_SIFCR_L,
 501                 .bit    = 30,
 502         },
 503 };
 504 
 505 static inline u32 ipic_read(volatile u32 __iomem *base, unsigned int reg)
 506 {
 507         return in_be32(base + (reg >> 2));
 508 }
 509 
 510 static inline void ipic_write(volatile u32 __iomem *base, unsigned int reg, u32 value)
 511 {
 512         out_be32(base + (reg >> 2), value);
 513 }
 514 
 515 static inline struct ipic * ipic_from_irq(unsigned int virq)
 516 {
 517         return primary_ipic;
 518 }
 519 
 520 static void ipic_unmask_irq(struct irq_data *d)
 521 {
 522         struct ipic *ipic = ipic_from_irq(d->irq);
 523         unsigned int src = irqd_to_hwirq(d);
 524         unsigned long flags;
 525         u32 temp;
 526 
 527         raw_spin_lock_irqsave(&ipic_lock, flags);
 528 
 529         temp = ipic_read(ipic->regs, ipic_info[src].mask);
 530         temp |= (1 << (31 - ipic_info[src].bit));
 531         ipic_write(ipic->regs, ipic_info[src].mask, temp);
 532 
 533         raw_spin_unlock_irqrestore(&ipic_lock, flags);
 534 }
 535 
 536 static void ipic_mask_irq(struct irq_data *d)
 537 {
 538         struct ipic *ipic = ipic_from_irq(d->irq);
 539         unsigned int src = irqd_to_hwirq(d);
 540         unsigned long flags;
 541         u32 temp;
 542 
 543         raw_spin_lock_irqsave(&ipic_lock, flags);
 544 
 545         temp = ipic_read(ipic->regs, ipic_info[src].mask);
 546         temp &= ~(1 << (31 - ipic_info[src].bit));
 547         ipic_write(ipic->regs, ipic_info[src].mask, temp);
 548 
 549         /* mb() can't guarantee that masking is finished.  But it does finish
 550          * for nearly all cases. */
 551         mb();
 552 
 553         raw_spin_unlock_irqrestore(&ipic_lock, flags);
 554 }
 555 
 556 static void ipic_ack_irq(struct irq_data *d)
 557 {
 558         struct ipic *ipic = ipic_from_irq(d->irq);
 559         unsigned int src = irqd_to_hwirq(d);
 560         unsigned long flags;
 561         u32 temp;
 562 
 563         raw_spin_lock_irqsave(&ipic_lock, flags);
 564 
 565         temp = 1 << (31 - ipic_info[src].bit);
 566         ipic_write(ipic->regs, ipic_info[src].ack, temp);
 567 
 568         /* mb() can't guarantee that ack is finished.  But it does finish
 569          * for nearly all cases. */
 570         mb();
 571 
 572         raw_spin_unlock_irqrestore(&ipic_lock, flags);
 573 }
 574 
 575 static void ipic_mask_irq_and_ack(struct irq_data *d)
 576 {
 577         struct ipic *ipic = ipic_from_irq(d->irq);
 578         unsigned int src = irqd_to_hwirq(d);
 579         unsigned long flags;
 580         u32 temp;
 581 
 582         raw_spin_lock_irqsave(&ipic_lock, flags);
 583 
 584         temp = ipic_read(ipic->regs, ipic_info[src].mask);
 585         temp &= ~(1 << (31 - ipic_info[src].bit));
 586         ipic_write(ipic->regs, ipic_info[src].mask, temp);
 587 
 588         temp = 1 << (31 - ipic_info[src].bit);
 589         ipic_write(ipic->regs, ipic_info[src].ack, temp);
 590 
 591         /* mb() can't guarantee that ack is finished.  But it does finish
 592          * for nearly all cases. */
 593         mb();
 594 
 595         raw_spin_unlock_irqrestore(&ipic_lock, flags);
 596 }
 597 
 598 static int ipic_set_irq_type(struct irq_data *d, unsigned int flow_type)
 599 {
 600         struct ipic *ipic = ipic_from_irq(d->irq);
 601         unsigned int src = irqd_to_hwirq(d);
 602         unsigned int vold, vnew, edibit;
 603 
 604         if (flow_type == IRQ_TYPE_NONE)
 605                 flow_type = IRQ_TYPE_LEVEL_LOW;
 606 
 607         /* ipic supports only low assertion and high-to-low change senses
 608          */
 609         if (!(flow_type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_EDGE_FALLING))) {
 610                 printk(KERN_ERR "ipic: sense type 0x%x not supported\n",
 611                         flow_type);
 612                 return -EINVAL;
 613         }
 614         /* ipic supports only edge mode on external interrupts */
 615         if ((flow_type & IRQ_TYPE_EDGE_FALLING) && !ipic_info[src].ack) {
 616                 printk(KERN_ERR "ipic: edge sense not supported on internal "
 617                                 "interrupts\n");
 618                 return -EINVAL;
 619 
 620         }
 621 
 622         irqd_set_trigger_type(d, flow_type);
 623         if (flow_type & IRQ_TYPE_LEVEL_LOW)  {
 624                 irq_set_handler_locked(d, handle_level_irq);
 625                 d->chip = &ipic_level_irq_chip;
 626         } else {
 627                 irq_set_handler_locked(d, handle_edge_irq);
 628                 d->chip = &ipic_edge_irq_chip;
 629         }
 630 
 631         /* only EXT IRQ senses are programmable on ipic
 632          * internal IRQ senses are LEVEL_LOW
 633          */
 634         if (src == IPIC_IRQ_EXT0)
 635                 edibit = 15;
 636         else
 637                 if (src >= IPIC_IRQ_EXT1 && src <= IPIC_IRQ_EXT7)
 638                         edibit = (14 - (src - IPIC_IRQ_EXT1));
 639                 else
 640                         return (flow_type & IRQ_TYPE_LEVEL_LOW) ? 0 : -EINVAL;
 641 
 642         vold = ipic_read(ipic->regs, IPIC_SECNR);
 643         if ((flow_type & IRQ_TYPE_SENSE_MASK) == IRQ_TYPE_EDGE_FALLING) {
 644                 vnew = vold | (1 << edibit);
 645         } else {
 646                 vnew = vold & ~(1 << edibit);
 647         }
 648         if (vold != vnew)
 649                 ipic_write(ipic->regs, IPIC_SECNR, vnew);
 650         return IRQ_SET_MASK_OK_NOCOPY;
 651 }
 652 
 653 /* level interrupts and edge interrupts have different ack operations */
 654 static struct irq_chip ipic_level_irq_chip = {
 655         .name           = "IPIC",
 656         .irq_unmask     = ipic_unmask_irq,
 657         .irq_mask       = ipic_mask_irq,
 658         .irq_mask_ack   = ipic_mask_irq,
 659         .irq_set_type   = ipic_set_irq_type,
 660 };
 661 
 662 static struct irq_chip ipic_edge_irq_chip = {
 663         .name           = "IPIC",
 664         .irq_unmask     = ipic_unmask_irq,
 665         .irq_mask       = ipic_mask_irq,
 666         .irq_mask_ack   = ipic_mask_irq_and_ack,
 667         .irq_ack        = ipic_ack_irq,
 668         .irq_set_type   = ipic_set_irq_type,
 669 };
 670 
 671 static int ipic_host_match(struct irq_domain *h, struct device_node *node,
 672                            enum irq_domain_bus_token bus_token)
 673 {
 674         /* Exact match, unless ipic node is NULL */
 675         struct device_node *of_node = irq_domain_get_of_node(h);
 676         return of_node == NULL || of_node == node;
 677 }
 678 
 679 static int ipic_host_map(struct irq_domain *h, unsigned int virq,
 680                          irq_hw_number_t hw)
 681 {
 682         struct ipic *ipic = h->host_data;
 683 
 684         irq_set_chip_data(virq, ipic);
 685         irq_set_chip_and_handler(virq, &ipic_level_irq_chip, handle_level_irq);
 686 
 687         /* Set default irq type */
 688         irq_set_irq_type(virq, IRQ_TYPE_NONE);
 689 
 690         return 0;
 691 }
 692 
 693 static const struct irq_domain_ops ipic_host_ops = {
 694         .match  = ipic_host_match,
 695         .map    = ipic_host_map,
 696         .xlate  = irq_domain_xlate_onetwocell,
 697 };
 698 
 699 struct ipic * __init ipic_init(struct device_node *node, unsigned int flags)
 700 {
 701         struct ipic     *ipic;
 702         struct resource res;
 703         u32 temp = 0, ret;
 704 
 705         ret = of_address_to_resource(node, 0, &res);
 706         if (ret)
 707                 return NULL;
 708 
 709         ipic = kzalloc(sizeof(*ipic), GFP_KERNEL);
 710         if (ipic == NULL)
 711                 return NULL;
 712 
 713         ipic->irqhost = irq_domain_add_linear(node, NR_IPIC_INTS,
 714                                               &ipic_host_ops, ipic);
 715         if (ipic->irqhost == NULL) {
 716                 kfree(ipic);
 717                 return NULL;
 718         }
 719 
 720         ipic->regs = ioremap(res.start, resource_size(&res));
 721 
 722         /* init hw */
 723         ipic_write(ipic->regs, IPIC_SICNR, 0x0);
 724 
 725         /* default priority scheme is grouped. If spread mode is required
 726          * configure SICFR accordingly */
 727         if (flags & IPIC_SPREADMODE_GRP_A)
 728                 temp |= SICFR_IPSA;
 729         if (flags & IPIC_SPREADMODE_GRP_B)
 730                 temp |= SICFR_IPSB;
 731         if (flags & IPIC_SPREADMODE_GRP_C)
 732                 temp |= SICFR_IPSC;
 733         if (flags & IPIC_SPREADMODE_GRP_D)
 734                 temp |= SICFR_IPSD;
 735         if (flags & IPIC_SPREADMODE_MIX_A)
 736                 temp |= SICFR_MPSA;
 737         if (flags & IPIC_SPREADMODE_MIX_B)
 738                 temp |= SICFR_MPSB;
 739 
 740         ipic_write(ipic->regs, IPIC_SICFR, temp);
 741 
 742         /* handle MCP route */
 743         temp = 0;
 744         if (flags & IPIC_DISABLE_MCP_OUT)
 745                 temp = SERCR_MCPR;
 746         ipic_write(ipic->regs, IPIC_SERCR, temp);
 747 
 748         /* handle routing of IRQ0 to MCP */
 749         temp = ipic_read(ipic->regs, IPIC_SEMSR);
 750 
 751         if (flags & IPIC_IRQ0_MCP)
 752                 temp |= SEMSR_SIRQ0;
 753         else
 754                 temp &= ~SEMSR_SIRQ0;
 755 
 756         ipic_write(ipic->regs, IPIC_SEMSR, temp);
 757 
 758         primary_ipic = ipic;
 759         irq_set_default_host(primary_ipic->irqhost);
 760 
 761         ipic_write(ipic->regs, IPIC_SIMSR_H, 0);
 762         ipic_write(ipic->regs, IPIC_SIMSR_L, 0);
 763 
 764         printk ("IPIC (%d IRQ sources) at %p\n", NR_IPIC_INTS,
 765                         primary_ipic->regs);
 766 
 767         return ipic;
 768 }
 769 
 770 void ipic_set_default_priority(void)
 771 {
 772         ipic_write(primary_ipic->regs, IPIC_SIPRR_A, IPIC_PRIORITY_DEFAULT);
 773         ipic_write(primary_ipic->regs, IPIC_SIPRR_B, IPIC_PRIORITY_DEFAULT);
 774         ipic_write(primary_ipic->regs, IPIC_SIPRR_C, IPIC_PRIORITY_DEFAULT);
 775         ipic_write(primary_ipic->regs, IPIC_SIPRR_D, IPIC_PRIORITY_DEFAULT);
 776         ipic_write(primary_ipic->regs, IPIC_SMPRR_A, IPIC_PRIORITY_DEFAULT);
 777         ipic_write(primary_ipic->regs, IPIC_SMPRR_B, IPIC_PRIORITY_DEFAULT);
 778 }
 779 
 780 u32 ipic_get_mcp_status(void)
 781 {
 782         return primary_ipic ? ipic_read(primary_ipic->regs, IPIC_SERSR) : 0;
 783 }
 784 
 785 void ipic_clear_mcp_status(u32 mask)
 786 {
 787         ipic_write(primary_ipic->regs, IPIC_SERSR, mask);
 788 }
 789 
 790 /* Return an interrupt vector or 0 if no interrupt is pending. */
 791 unsigned int ipic_get_irq(void)
 792 {
 793         int irq;
 794 
 795         BUG_ON(primary_ipic == NULL);
 796 
 797 #define IPIC_SIVCR_VECTOR_MASK  0x7f
 798         irq = ipic_read(primary_ipic->regs, IPIC_SIVCR) & IPIC_SIVCR_VECTOR_MASK;
 799 
 800         if (irq == 0)    /* 0 --> no irq is pending */
 801                 return 0;
 802 
 803         return irq_linear_revmap(primary_ipic->irqhost, irq);
 804 }
 805 
 806 #ifdef CONFIG_SUSPEND
 807 static struct {
 808         u32 sicfr;
 809         u32 siprr[2];
 810         u32 simsr[2];
 811         u32 sicnr;
 812         u32 smprr[2];
 813         u32 semsr;
 814         u32 secnr;
 815         u32 sermr;
 816         u32 sercr;
 817 } ipic_saved_state;
 818 
 819 static int ipic_suspend(void)
 820 {
 821         struct ipic *ipic = primary_ipic;
 822 
 823         ipic_saved_state.sicfr = ipic_read(ipic->regs, IPIC_SICFR);
 824         ipic_saved_state.siprr[0] = ipic_read(ipic->regs, IPIC_SIPRR_A);
 825         ipic_saved_state.siprr[1] = ipic_read(ipic->regs, IPIC_SIPRR_D);
 826         ipic_saved_state.simsr[0] = ipic_read(ipic->regs, IPIC_SIMSR_H);
 827         ipic_saved_state.simsr[1] = ipic_read(ipic->regs, IPIC_SIMSR_L);
 828         ipic_saved_state.sicnr = ipic_read(ipic->regs, IPIC_SICNR);
 829         ipic_saved_state.smprr[0] = ipic_read(ipic->regs, IPIC_SMPRR_A);
 830         ipic_saved_state.smprr[1] = ipic_read(ipic->regs, IPIC_SMPRR_B);
 831         ipic_saved_state.semsr = ipic_read(ipic->regs, IPIC_SEMSR);
 832         ipic_saved_state.secnr = ipic_read(ipic->regs, IPIC_SECNR);
 833         ipic_saved_state.sermr = ipic_read(ipic->regs, IPIC_SERMR);
 834         ipic_saved_state.sercr = ipic_read(ipic->regs, IPIC_SERCR);
 835 
 836         if (fsl_deep_sleep()) {
 837                 /* In deep sleep, make sure there can be no
 838                  * pending interrupts, as this can cause
 839                  * problems on 831x.
 840                  */
 841                 ipic_write(ipic->regs, IPIC_SIMSR_H, 0);
 842                 ipic_write(ipic->regs, IPIC_SIMSR_L, 0);
 843                 ipic_write(ipic->regs, IPIC_SEMSR, 0);
 844                 ipic_write(ipic->regs, IPIC_SERMR, 0);
 845         }
 846 
 847         return 0;
 848 }
 849 
 850 static void ipic_resume(void)
 851 {
 852         struct ipic *ipic = primary_ipic;
 853 
 854         ipic_write(ipic->regs, IPIC_SICFR, ipic_saved_state.sicfr);
 855         ipic_write(ipic->regs, IPIC_SIPRR_A, ipic_saved_state.siprr[0]);
 856         ipic_write(ipic->regs, IPIC_SIPRR_D, ipic_saved_state.siprr[1]);
 857         ipic_write(ipic->regs, IPIC_SIMSR_H, ipic_saved_state.simsr[0]);
 858         ipic_write(ipic->regs, IPIC_SIMSR_L, ipic_saved_state.simsr[1]);
 859         ipic_write(ipic->regs, IPIC_SICNR, ipic_saved_state.sicnr);
 860         ipic_write(ipic->regs, IPIC_SMPRR_A, ipic_saved_state.smprr[0]);
 861         ipic_write(ipic->regs, IPIC_SMPRR_B, ipic_saved_state.smprr[1]);
 862         ipic_write(ipic->regs, IPIC_SEMSR, ipic_saved_state.semsr);
 863         ipic_write(ipic->regs, IPIC_SECNR, ipic_saved_state.secnr);
 864         ipic_write(ipic->regs, IPIC_SERMR, ipic_saved_state.sermr);
 865         ipic_write(ipic->regs, IPIC_SERCR, ipic_saved_state.sercr);
 866 }
 867 #else
 868 #define ipic_suspend NULL
 869 #define ipic_resume NULL
 870 #endif
 871 
 872 static struct syscore_ops ipic_syscore_ops = {
 873         .suspend = ipic_suspend,
 874         .resume = ipic_resume,
 875 };
 876 
 877 static int __init init_ipic_syscore(void)
 878 {
 879         if (!primary_ipic || !primary_ipic->regs)
 880                 return -ENODEV;
 881 
 882         printk(KERN_DEBUG "Registering ipic system core operations\n");
 883         register_syscore_ops(&ipic_syscore_ops);
 884 
 885         return 0;
 886 }
 887 
 888 subsys_initcall(init_ipic_syscore);

/* [<][>][^][v][top][bottom][index][help] */