Skip to content

Commit b6ef916

Browse files
author
James Hogan
committed
irq-imgpdc: add ImgTec PDC irqchip driver
Add irqchip driver for the ImgTec PowerDown Controller (PDC) as found in the TZ1090. The PDC has a number of general system wakeup (SysWake) interrupts (which would for example be connected to a power button or an external peripheral), and a number of peripheral interrupts which can also wake the system but are connected straight to specific low-power peripherals (such as RTC or Infrared). It has a single interrupt output for SysWakes, and individual interrupt outputs for each peripheral. The driver demuxes the SysWake interrupt line, and passes the peripheral interrupts straight through. It also handles the set_wake interrupt operation to enable/disable the appropriate wake event bits. Signed-off-by: James Hogan <james.hogan@imgtec.com> Reviewed-by: Thomas Gleixner <tglx@linutronix.de> Cc: Grant Likely <grant.likely@linaro.org> Cc: Rob Herring <rob.herring@calxeda.com> Cc: Rob Landley <rob@landley.net> Cc: linux-metag@vger.kernel.org Cc: linux-doc@vger.kernel.org Cc: devicetree-discuss@lists.ozlabs.org
1 parent d668d9e commit b6ef916

File tree

4 files changed

+610
-0
lines changed

4 files changed

+610
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
* ImgTec Powerdown Controller (PDC) Interrupt Controller Binding
2+
3+
This binding specifies what properties must be available in the device tree
4+
representation of a PDC IRQ controller. This has a number of input interrupt
5+
lines which can wake the system, and are passed on through output interrupt
6+
lines.
7+
8+
Required properties:
9+
10+
- compatible: Specifies the compatibility list for the interrupt controller.
11+
The type shall be <string> and the value shall include "img,pdc-intc".
12+
13+
- reg: Specifies the base PDC physical address(s) and size(s) of the
14+
addressable register space. The type shall be <prop-encoded-array>.
15+
16+
- interrupt-controller: The presence of this property identifies the node
17+
as an interrupt controller. No property value shall be defined.
18+
19+
- #interrupt-cells: Specifies the number of cells needed to encode an
20+
interrupt source. The type shall be a <u32> and the value shall be 2.
21+
22+
- num-perips: Number of waking peripherals.
23+
24+
- num-syswakes: Number of SysWake inputs.
25+
26+
- interrupts: List of interrupt specifiers. The first specifier shall be the
27+
shared SysWake interrupt, and remaining specifies shall be PDC peripheral
28+
interrupts in order.
29+
30+
* Interrupt Specifier Definition
31+
32+
Interrupt specifiers consists of 2 cells encoded as follows:
33+
34+
- <1st-cell>: The interrupt-number that identifies the interrupt source.
35+
0-7: Peripheral interrupts
36+
8-15: SysWake interrupts
37+
38+
- <2nd-cell>: The level-sense information, encoded using the Linux interrupt
39+
flags as follows (only 4 valid for peripheral interrupts):
40+
0 = none (decided by software)
41+
1 = low-to-high edge triggered
42+
2 = high-to-low edge triggered
43+
3 = both edge triggered
44+
4 = active-high level-sensitive (required for perip irqs)
45+
8 = active-low level-sensitive
46+
47+
* Examples
48+
49+
Example 1:
50+
51+
/*
52+
* TZ1090 PDC block
53+
*/
54+
pdc: pdc@0x02006000 {
55+
// This is an interrupt controller node.
56+
interrupt-controller;
57+
58+
// Three cells to encode interrupt sources.
59+
#interrupt-cells = <2>;
60+
61+
// Offset address of 0x02006000 and size of 0x1000.
62+
reg = <0x02006000 0x1000>;
63+
64+
// Compatible with Meta hardware trigger block.
65+
compatible = "img,pdc-intc";
66+
67+
// Three peripherals are connected.
68+
num-perips = <3>;
69+
70+
// Four SysWakes are connected.
71+
num-syswakes = <4>;
72+
73+
interrupts = <18 4 /* level */>, /* Syswakes */
74+
<30 4 /* level */>, /* Peripheral 0 (RTC) */
75+
<29 4 /* level */>, /* Peripheral 1 (IR) */
76+
<31 4 /* level */>; /* Peripheral 2 (WDT) */
77+
};
78+
79+
Example 2:
80+
81+
/*
82+
* An SoC peripheral that is wired through the PDC.
83+
*/
84+
rtc0 {
85+
// The interrupt controller that this device is wired to.
86+
interrupt-parent = <&pdc>;
87+
88+
// Interrupt source Peripheral 0
89+
interrupts = <0 /* Peripheral 0 (RTC) */
90+
4> /* IRQ_TYPE_LEVEL_HIGH */
91+
};
92+
93+
Example 3:
94+
95+
/*
96+
* An interrupt generating device that is wired to a SysWake pin.
97+
*/
98+
touchscreen0 {
99+
// The interrupt controller that this device is wired to.
100+
interrupt-parent = <&pdc>;
101+
102+
// Interrupt source SysWake 0 that is active-low level-sensitive
103+
interrupts = <8 /* SysWake0 */
104+
8 /* IRQ_TYPE_LEVEL_LOW */>;
105+
};

drivers/irqchip/Kconfig

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@ config ARM_VIC_NR
3030
The maximum number of VICs available in the system, for
3131
power management.
3232

33+
config IMGPDC_IRQ
34+
bool
35+
select GENERIC_IRQ_CHIP
36+
select IRQ_DOMAIN
37+
3338
config ORION_IRQCHIP
3439
bool
3540
select IRQ_DOMAIN

drivers/irqchip/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ obj-$(CONFIG_ARCH_SPEAR3XX) += spear-shirq.o
1414
obj-$(CONFIG_ARM_GIC) += irq-gic.o
1515
obj-$(CONFIG_ARM_NVIC) += irq-nvic.o
1616
obj-$(CONFIG_ARM_VIC) += irq-vic.o
17+
obj-$(CONFIG_IMGPDC_IRQ) += irq-imgpdc.o
1718
obj-$(CONFIG_SIRF_IRQ) += irq-sirfsoc.o
1819
obj-$(CONFIG_RENESAS_INTC_IRQPIN) += irq-renesas-intc-irqpin.o
1920
obj-$(CONFIG_RENESAS_IRQC) += irq-renesas-irqc.o

0 commit comments

Comments
 (0)