Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/mpc5200: Document and tidy irq driver

This patch adds documentation to the mpc5200 interrupt controller
driver and cleans up some minor coding conventions. It also moves the
contents of mpc52xx_pic.h into the driver proper (except for a small
common bit that is moved to the common mpc52xx.h) because the
information encoded there is not required by any other part of kernel
code. Finally for code readability sake, the L2_OFFSET shift value
is removed because the code using it resolves to a noop.

Signed-off-by: Grant Likely <grant.likely@secretlab.ca>

+189 -122
+19
arch/powerpc/include/asm/mpc52xx.h
··· 239 239 u16 mclken_div_psc6; /* CDM + 0x36 reg13 byte2,3 */ 240 240 }; 241 241 242 + /* Interrupt controller Register set */ 243 + struct mpc52xx_intr { 244 + u32 per_mask; /* INTR + 0x00 */ 245 + u32 per_pri1; /* INTR + 0x04 */ 246 + u32 per_pri2; /* INTR + 0x08 */ 247 + u32 per_pri3; /* INTR + 0x0c */ 248 + u32 ctrl; /* INTR + 0x10 */ 249 + u32 main_mask; /* INTR + 0x14 */ 250 + u32 main_pri1; /* INTR + 0x18 */ 251 + u32 main_pri2; /* INTR + 0x1c */ 252 + u32 reserved1; /* INTR + 0x20 */ 253 + u32 enc_status; /* INTR + 0x24 */ 254 + u32 crit_status; /* INTR + 0x28 */ 255 + u32 main_status; /* INTR + 0x2c */ 256 + u32 per_status; /* INTR + 0x30 */ 257 + u32 reserved2; /* INTR + 0x34 */ 258 + u32 per_error; /* INTR + 0x38 */ 259 + }; 260 + 242 261 #endif /* __ASSEMBLY__ */ 243 262 244 263
-1
arch/powerpc/platforms/52xx/lite5200_pm.c
··· 3 3 #include <asm/io.h> 4 4 #include <asm/time.h> 5 5 #include <asm/mpc52xx.h> 6 - #include "mpc52xx_pic.h" 7 6 8 7 /* defined in lite5200_sleep.S and only used here */ 9 8 extern void lite5200_low_power(void __iomem *sram, void __iomem *mbar);
+170 -65
arch/powerpc/platforms/52xx/mpc52xx_pic.c
··· 2 2 * 3 3 * Programmable Interrupt Controller functions for the Freescale MPC52xx. 4 4 * 5 + * Copyright (C) 2008 Secret Lab Technologies Ltd. 5 6 * Copyright (C) 2006 bplan GmbH 7 + * Copyright (C) 2004 Sylvain Munaut <tnt@246tNt.com> 8 + * Copyright (C) 2003 Montavista Software, Inc 6 9 * 7 10 * Based on the code from the 2.4 kernel by 8 11 * Dale Farnsworth <dfarnsworth@mvista.com> and Kent Borg. 9 - * 10 - * Copyright (C) 2004 Sylvain Munaut <tnt@246tNt.com> 11 - * Copyright (C) 2003 Montavista Software, Inc 12 12 * 13 13 * This file is licensed under the terms of the GNU General Public License 14 14 * version 2. This program is licensed "as is" without any warranty of any ··· 16 16 * 17 17 */ 18 18 19 + /* 20 + * This is the device driver for the MPC5200 interrupt controller. 21 + * 22 + * hardware overview 23 + * ----------------- 24 + * The MPC5200 interrupt controller groups the all interrupt sources into 25 + * three groups called 'critical', 'main', and 'peripheral'. The critical 26 + * group has 3 irqs, External IRQ0, slice timer 0 irq, and wake from deep 27 + * sleep. Main group include the other 3 external IRQs, slice timer 1, RTC, 28 + * gpios, and the general purpose timers. Peripheral group contains the 29 + * remaining irq sources from all of the on-chip peripherals (PSCs, Ethernet, 30 + * USB, DMA, etc). 31 + * 32 + * virqs 33 + * ----- 34 + * The Linux IRQ subsystem requires that each irq source be assigned a 35 + * system wide unique IRQ number starting at 1 (0 means no irq). Since 36 + * systems can have multiple interrupt controllers, the virtual IRQ (virq) 37 + * infrastructure lets each interrupt controller to define a local set 38 + * of IRQ numbers and the virq infrastructure maps those numbers into 39 + * a unique range of the global IRQ# space. 40 + * 41 + * To define a range of virq numbers for this controller, this driver first 42 + * assigns a number to each of the irq groups (called the level 1 or L1 43 + * value). Within each group individual irq sources are also assigned a 44 + * number, as defined by the MPC5200 user guide, and refers to it as the 45 + * level 2 or L2 value. The virq number is determined by shifting up the 46 + * L1 value by MPC52xx_IRQ_L1_OFFSET and ORing it with the L2 value. 47 + * 48 + * For example, the TMR0 interrupt is irq 9 in the main group. The 49 + * virq for TMR0 is calculated by ((1 << MPC52xx_IRQ_L1_OFFSET) | 9). 50 + * 51 + * The observant reader will also notice that this driver defines a 4th 52 + * interrupt group called 'bestcomm'. The bestcomm group isn't physically 53 + * part of the MPC5200 interrupt controller, but it is used here to assign 54 + * a separate virq number for each bestcomm task (since any of the 16 55 + * bestcomm tasks can cause the bestcomm interrupt to be raised). When a 56 + * bestcomm interrupt occurs (peripheral group, irq 0) this driver determines 57 + * which task needs servicing and returns the irq number for that task. This 58 + * allows drivers which use bestcomm to define their own interrupt handlers. 59 + * 60 + * irq_chip structures 61 + * ------------------- 62 + * For actually manipulating IRQs (masking, enabling, clearing, etc) this 63 + * driver defines four separate 'irq_chip' structures, one for the main 64 + * group, one for the peripherals group, one for the bestcomm group and one 65 + * for external interrupts. The irq_chip structures provide the hooks needed 66 + * to manipulate each IRQ source, and since each group is has a separate set 67 + * of registers for controlling the irq, it makes sense to divide up the 68 + * hooks along those lines. 69 + * 70 + * You'll notice that there is not an irq_chip for the critical group and 71 + * you'll also notice that there is an irq_chip defined for external 72 + * interrupts even though there is no external interrupt group. The reason 73 + * for this is that the four external interrupts are all managed with the same 74 + * register even though one of the external IRQs is in the critical group and 75 + * the other three are in the main group. For this reason it makes sense for 76 + * the 4 external irqs to be managed using a separate set of hooks. The 77 + * reason there is no crit irq_chip is that of the 3 irqs in the critical 78 + * group, only external interrupt is actually support at this time by this 79 + * driver and since external interrupt is the only one used, it can just 80 + * be directed to make use of the external irq irq_chip. 81 + * 82 + * device tree bindings 83 + * -------------------- 84 + * The device tree bindings for this controller reflect the two level 85 + * organization of irqs in the device. #interrupt-cells = <3> where the 86 + * first cell is the group number [0..3], the second cell is the irq 87 + * number in the group, and the third cell is the sense type (level/edge). 88 + * For reference, the following is a list of the interrupt property values 89 + * associated with external interrupt sources on the MPC5200 (just because 90 + * it is non-obvious to determine what the interrupts property should be 91 + * when reading the mpc5200 manual and it is a frequently asked question). 92 + * 93 + * External interrupts: 94 + * <0 0 n> external irq0, n is sense (n=0: level high, 95 + * <1 1 n> external irq1, n is sense n=1: edge rising, 96 + * <1 2 n> external irq2, n is sense n=2: edge falling, 97 + * <1 3 n> external irq3, n is sense n=3: level low) 98 + */ 19 99 #undef DEBUG 20 100 21 101 #include <linux/interrupt.h> ··· 104 24 #include <asm/io.h> 105 25 #include <asm/prom.h> 106 26 #include <asm/mpc52xx.h> 107 - #include "mpc52xx_pic.h" 108 27 109 - /* 110 - * 111 - */ 28 + /* HW IRQ mapping */ 29 + #define MPC52xx_IRQ_L1_CRIT (0) 30 + #define MPC52xx_IRQ_L1_MAIN (1) 31 + #define MPC52xx_IRQ_L1_PERP (2) 32 + #define MPC52xx_IRQ_L1_SDMA (3) 33 + 34 + #define MPC52xx_IRQ_L1_OFFSET (6) 35 + #define MPC52xx_IRQ_L1_MASK (0x00c0) 36 + #define MPC52xx_IRQ_L2_MASK (0x003f) 37 + 38 + #define MPC52xx_IRQ_HIGHTESTHWIRQ (0xd0) 39 + 112 40 113 41 /* MPC5200 device tree match tables */ 114 42 static struct of_device_id mpc52xx_pic_ids[] __initdata = { ··· 141 53 IRQ_TYPE_LEVEL_LOW, 142 54 }; 143 55 144 - /* 145 - * 146 - */ 147 - 56 + /* Utility functions */ 148 57 static inline void io_be_setbit(u32 __iomem *addr, int bitno) 149 58 { 150 59 out_be32(addr, in_be32(addr) | (1 << bitno)); ··· 154 69 155 70 /* 156 71 * IRQ[0-3] interrupt irq_chip 157 - */ 158 - 72 + */ 159 73 static void mpc52xx_extirq_mask(unsigned int virq) 160 74 { 161 75 int irq; 162 76 int l2irq; 163 77 164 78 irq = irq_map[virq].hwirq; 165 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 79 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 166 80 167 81 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 168 82 ··· 174 90 int l2irq; 175 91 176 92 irq = irq_map[virq].hwirq; 177 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 93 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 178 94 179 95 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 180 96 ··· 187 103 int l2irq; 188 104 189 105 irq = irq_map[virq].hwirq; 190 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 106 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 191 107 192 108 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 193 109 ··· 201 117 int l2irq; 202 118 203 119 irq = irq_map[virq].hwirq; 204 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 120 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 205 121 206 122 pr_debug("%s: irq=%x. l2=%d flow_type=%d\n", __func__, irq, l2irq, flow_type); 207 123 ··· 240 156 241 157 /* 242 158 * Main interrupt irq_chip 243 - */ 244 - 159 + */ 245 160 static void mpc52xx_main_mask(unsigned int virq) 246 161 { 247 162 int irq; 248 163 int l2irq; 249 164 250 165 irq = irq_map[virq].hwirq; 251 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 166 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 252 167 253 168 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 254 169 ··· 260 177 int l2irq; 261 178 262 179 irq = irq_map[virq].hwirq; 263 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 180 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 264 181 265 182 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 266 183 ··· 276 193 277 194 /* 278 195 * Peripherals interrupt irq_chip 279 - */ 280 - 196 + */ 281 197 static void mpc52xx_periph_mask(unsigned int virq) 282 198 { 283 199 int irq; 284 200 int l2irq; 285 201 286 202 irq = irq_map[virq].hwirq; 287 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 203 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 288 204 289 205 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 290 206 ··· 296 214 int l2irq; 297 215 298 216 irq = irq_map[virq].hwirq; 299 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 217 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 300 218 301 219 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 302 220 ··· 312 230 313 231 /* 314 232 * SDMA interrupt irq_chip 315 - */ 316 - 233 + */ 317 234 static void mpc52xx_sdma_mask(unsigned int virq) 318 235 { 319 236 int irq; 320 237 int l2irq; 321 238 322 239 irq = irq_map[virq].hwirq; 323 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 240 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 324 241 325 242 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 326 243 ··· 332 251 int l2irq; 333 252 334 253 irq = irq_map[virq].hwirq; 335 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 254 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 336 255 337 256 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 338 257 ··· 345 264 int l2irq; 346 265 347 266 irq = irq_map[virq].hwirq; 348 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 267 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 349 268 350 269 pr_debug("%s: irq=%x. l2=%d\n", __func__, irq, l2irq); 351 270 ··· 359 278 .ack = mpc52xx_sdma_ack, 360 279 }; 361 280 362 - /* 363 - * irq_host 364 - */ 365 - 281 + /** 282 + * mpc52xx_irqhost_xlate - translate virq# from device tree interrupts property 283 + */ 366 284 static int mpc52xx_irqhost_xlate(struct irq_host *h, struct device_node *ct, 367 - u32 * intspec, unsigned int intsize, 368 - irq_hw_number_t * out_hwirq, 285 + u32 *intspec, unsigned int intsize, 286 + irq_hw_number_t *out_hwirq, 369 287 unsigned int *out_flags) 370 288 { 371 289 int intrvect_l1; ··· 379 299 intrvect_l2 = (int)intspec[1]; 380 300 intrvect_type = (int)intspec[2]; 381 301 382 - intrvect_linux = 383 - (intrvect_l1 << MPC52xx_IRQ_L1_OFFSET) & MPC52xx_IRQ_L1_MASK; 384 - intrvect_linux |= 385 - (intrvect_l2 << MPC52xx_IRQ_L2_OFFSET) & MPC52xx_IRQ_L2_MASK; 302 + intrvect_linux = (intrvect_l1 << MPC52xx_IRQ_L1_OFFSET) & 303 + MPC52xx_IRQ_L1_MASK; 304 + intrvect_linux |= intrvect_l2 & MPC52xx_IRQ_L2_MASK; 386 305 387 306 pr_debug("return %x, l1=%d, l2=%d\n", intrvect_linux, intrvect_l1, 388 307 intrvect_l2); ··· 392 313 return 0; 393 314 } 394 315 395 - /* 396 - * this function retrieves the correct IRQ type out 397 - * of the MPC regs 398 - * Only externals IRQs needs this 399 - */ 316 + /** 317 + * mpc52xx_irqx_gettype - determine the IRQ sense type (level/edge) 318 + * 319 + * Only external IRQs need this. 320 + */ 400 321 static int mpc52xx_irqx_gettype(int irq) 401 322 { 402 323 int type; ··· 408 329 return mpc52xx_map_senses[type]; 409 330 } 410 331 332 + /** 333 + * mpc52xx_irqhost_map - Hook to map from virq to an irq_chip structure 334 + */ 411 335 static int mpc52xx_irqhost_map(struct irq_host *h, unsigned int virq, 412 336 irq_hw_number_t irq) 413 337 { ··· 421 339 int type; 422 340 423 341 l1irq = (irq & MPC52xx_IRQ_L1_MASK) >> MPC52xx_IRQ_L1_OFFSET; 424 - l2irq = (irq & MPC52xx_IRQ_L2_MASK) >> MPC52xx_IRQ_L2_OFFSET; 342 + l2irq = irq & MPC52xx_IRQ_L2_MASK; 425 343 426 344 /* 427 345 * Most of ours IRQs will be level low ··· 461 379 break; 462 380 463 381 default: 464 - pr_debug("%s: Error, unknown L1 IRQ (0x%x)\n", __func__, l1irq); 465 - printk(KERN_ERR "Unknow IRQ!\n"); 382 + pr_err("%s: invalid virq requested (0x%x)\n", __func__, virq); 466 383 return -EINVAL; 467 384 } 468 385 ··· 487 406 .map = mpc52xx_irqhost_map, 488 407 }; 489 408 490 - /* 491 - * init (public) 492 - */ 493 - 409 + /** 410 + * mpc52xx_init_irq - Initialize and register with the virq subsystem 411 + * 412 + * Hook for setting up IRQs on an mpc5200 system. A pointer to this function 413 + * is to be put into the machine definition structure. 414 + * 415 + * This function searches the device tree for an MPC5200 interrupt controller, 416 + * initializes it, and registers it with the virq subsystem. 417 + */ 494 418 void __init mpc52xx_init_irq(void) 495 419 { 496 420 u32 intr_ctrl; ··· 540 454 * As last step, add an irq host to translate the real 541 455 * hw irq information provided by the ofw to linux virq 542 456 */ 543 - 544 457 mpc52xx_irqhost = irq_alloc_host(picnode, IRQ_HOST_MAP_LINEAR, 545 458 MPC52xx_IRQ_HIGHTESTHWIRQ, 546 459 &mpc52xx_irqhost_ops, -1); ··· 547 462 if (!mpc52xx_irqhost) 548 463 panic(__FILE__ ": Cannot allocate the IRQ host\n"); 549 464 550 - printk(KERN_INFO "MPC52xx PIC is up and running!\n"); 465 + pr_info("MPC52xx PIC is up and running!\n"); 551 466 } 552 467 553 - /* 554 - * get_irq (public) 555 - */ 468 + /** 469 + * mpc52xx_get_irq - Get pending interrupt number hook function 470 + * 471 + * Called by the interupt handler to determine what IRQ handler needs to be 472 + * executed. 473 + * 474 + * Status of pending interrupts is determined by reading the encoded status 475 + * register. The encoded status register has three fields; one for each of the 476 + * types of interrupts defined by the controller - 'critical', 'main' and 477 + * 'peripheral'. This function reads the status register and returns the IRQ 478 + * number associated with the highest priority pending interrupt. 'Critical' 479 + * interrupts have the highest priority, followed by 'main' interrupts, and 480 + * then 'peripheral'. 481 + * 482 + * The mpc5200 interrupt controller can be configured to boost the priority 483 + * of individual 'peripheral' interrupts. If this is the case then a special 484 + * value will appear in either the crit or main fields indicating a high 485 + * or medium priority peripheral irq has occurred. 486 + * 487 + * This function checks each of the 3 irq request fields and returns the 488 + * first pending interrupt that it finds. 489 + * 490 + * This function also identifies a 4th type of interrupt; 'bestcomm'. Each 491 + * bestcomm DMA task can raise the bestcomm peripheral interrupt. When this 492 + * occurs at task-specific IRQ# is decoded so that each task can have its 493 + * own IRQ handler. 494 + */ 556 495 unsigned int mpc52xx_get_irq(void) 557 496 { 558 497 u32 status; ··· 587 478 irq = (status >> 8) & 0x3; 588 479 if (irq == 2) /* high priority peripheral */ 589 480 goto peripheral; 590 - irq |= (MPC52xx_IRQ_L1_CRIT << MPC52xx_IRQ_L1_OFFSET) & 591 - MPC52xx_IRQ_L1_MASK; 481 + irq |= (MPC52xx_IRQ_L1_CRIT << MPC52xx_IRQ_L1_OFFSET); 592 482 } else if (status & 0x00200000) { /* main */ 593 483 irq = (status >> 16) & 0x1f; 594 484 if (irq == 4) /* low priority peripheral */ 595 485 goto peripheral; 596 - irq |= (MPC52xx_IRQ_L1_MAIN << MPC52xx_IRQ_L1_OFFSET) & 597 - MPC52xx_IRQ_L1_MASK; 486 + irq |= (MPC52xx_IRQ_L1_MAIN << MPC52xx_IRQ_L1_OFFSET); 598 487 } else if (status & 0x20000000) { /* peripheral */ 599 488 peripheral: 600 489 irq = (status >> 24) & 0x1f; 601 490 if (irq == 0) { /* bestcomm */ 602 491 status = in_be32(&sdma->IntPend); 603 492 irq = ffs(status) - 1; 604 - irq |= (MPC52xx_IRQ_L1_SDMA << MPC52xx_IRQ_L1_OFFSET) & 605 - MPC52xx_IRQ_L1_MASK; 493 + irq |= (MPC52xx_IRQ_L1_SDMA << MPC52xx_IRQ_L1_OFFSET); 606 494 } else { 607 - irq |= (MPC52xx_IRQ_L1_PERP << MPC52xx_IRQ_L1_OFFSET) & 608 - MPC52xx_IRQ_L1_MASK; 495 + irq |= (MPC52xx_IRQ_L1_PERP << MPC52xx_IRQ_L1_OFFSET); 609 496 } 610 497 } 611 498
-53
arch/powerpc/platforms/52xx/mpc52xx_pic.h
··· 1 - /* 2 - * Header file for Freescale MPC52xx Interrupt controller 3 - * 4 - * Copyright (C) 2004-2005 Sylvain Munaut <tnt@246tNt.com> 5 - * Copyright (C) 2003 MontaVista, Software, Inc. 6 - * 7 - * This file is licensed under the terms of the GNU General Public License 8 - * version 2. This program is licensed "as is" without any warranty of any 9 - * kind, whether express or implied. 10 - */ 11 - 12 - #ifndef __POWERPC_SYSDEV_MPC52xx_PIC_H__ 13 - #define __POWERPC_SYSDEV_MPC52xx_PIC_H__ 14 - 15 - #include <asm/types.h> 16 - 17 - 18 - /* HW IRQ mapping */ 19 - #define MPC52xx_IRQ_L1_CRIT (0) 20 - #define MPC52xx_IRQ_L1_MAIN (1) 21 - #define MPC52xx_IRQ_L1_PERP (2) 22 - #define MPC52xx_IRQ_L1_SDMA (3) 23 - 24 - #define MPC52xx_IRQ_L1_OFFSET (6) 25 - #define MPC52xx_IRQ_L1_MASK (0x00c0) 26 - 27 - #define MPC52xx_IRQ_L2_OFFSET (0) 28 - #define MPC52xx_IRQ_L2_MASK (0x003f) 29 - 30 - #define MPC52xx_IRQ_HIGHTESTHWIRQ (0xd0) 31 - 32 - 33 - /* Interrupt controller Register set */ 34 - struct mpc52xx_intr { 35 - u32 per_mask; /* INTR + 0x00 */ 36 - u32 per_pri1; /* INTR + 0x04 */ 37 - u32 per_pri2; /* INTR + 0x08 */ 38 - u32 per_pri3; /* INTR + 0x0c */ 39 - u32 ctrl; /* INTR + 0x10 */ 40 - u32 main_mask; /* INTR + 0x14 */ 41 - u32 main_pri1; /* INTR + 0x18 */ 42 - u32 main_pri2; /* INTR + 0x1c */ 43 - u32 reserved1; /* INTR + 0x20 */ 44 - u32 enc_status; /* INTR + 0x24 */ 45 - u32 crit_status; /* INTR + 0x28 */ 46 - u32 main_status; /* INTR + 0x2c */ 47 - u32 per_status; /* INTR + 0x30 */ 48 - u32 reserved2; /* INTR + 0x34 */ 49 - u32 per_error; /* INTR + 0x38 */ 50 - }; 51 - 52 - #endif /* __POWERPC_SYSDEV_MPC52xx_PIC_H__ */ 53 -
-3
arch/powerpc/platforms/52xx/mpc52xx_pm.c
··· 5 5 #include <asm/cacheflush.h> 6 6 #include <asm/mpc52xx.h> 7 7 8 - #include "mpc52xx_pic.h" 9 - 10 - 11 8 /* these are defined in mpc52xx_sleep.S, and only used here */ 12 9 extern void mpc52xx_deep_sleep(void __iomem *sram, void __iomem *sdram_regs, 13 10 struct mpc52xx_cdm __iomem *, struct mpc52xx_intr __iomem*);