On MPC8610HPCD there is a dedicated switch to wake up the board.

The SW9 button is routed to IRQ8, but could be re-routed (via PIXIS)
to sreset. Luckily, default is IRQ8.

With 'no_console_suspend' kernel command line argument specified, the
board is also able to wakeup upon the serial input.

Signed-off-by: Anton Vorontsov <[EMAIL PROTECTED]>
---
 Documentation/powerpc/booting-without-of.txt |    4 ++
 arch/powerpc/boot/dts/mpc8610_hpcd.dts       |    2 +
 arch/powerpc/platforms/86xx/mpc8610_hpcd.c   |   45 +++++++++++++++++++++++--
 3 files changed, 47 insertions(+), 4 deletions(-)

diff --git a/Documentation/powerpc/booting-without-of.txt 
b/Documentation/powerpc/booting-without-of.txt
index 6c55f3f..8fd0500 100644
--- a/Documentation/powerpc/booting-without-of.txt
+++ b/Documentation/powerpc/booting-without-of.txt
@@ -2896,11 +2896,15 @@ platforms are moved over to use the 
flattened-device-tree model.
     - compatible : should be "fsl,fpga-pixis".
     - reg : should contain the address and the lenght of the FPPGA register
       set.
+    - interrupt-parent: the phandle for the interrupt controller.
+    - interrupts : should specify event IRQ.
 
     Example (MPC8610HPCD)
        [EMAIL PROTECTED] {
                compatible = "fsl,fpga-pixis";
                reg = <0xe8000000 32>;
+               interrupt-parent = <&mpic>;
+               interrupts = <8 8>;
        };
 
     t) Freescale MSI interrupt controller
diff --git a/arch/powerpc/boot/dts/mpc8610_hpcd.dts 
b/arch/powerpc/boot/dts/mpc8610_hpcd.dts
index 8dd8350..5952aa0 100644
--- a/arch/powerpc/boot/dts/mpc8610_hpcd.dts
+++ b/arch/powerpc/boot/dts/mpc8610_hpcd.dts
@@ -105,6 +105,8 @@
                        compatible = "fsl,fpga-pixis";
                        ranges = <0 3 0 0x20>;
                        reg = <3 0 0x20>;
+                       interrupt-parent = <&mpic>;
+                       interrupts = <8 8>;
 
                        sdcsr_pio: [EMAIL PROTECTED] {
                                #gpio-cells = <2>;
diff --git a/arch/powerpc/platforms/86xx/mpc8610_hpcd.c 
b/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
index 83e8ffd..12612fa 100644
--- a/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
+++ b/arch/powerpc/platforms/86xx/mpc8610_hpcd.c
@@ -24,6 +24,7 @@
 #include <linux/seq_file.h>
 #include <linux/fsl_ir.h>
 #include <linux/gpio.h>
+#include <linux/interrupt.h>
 #include <linux/of.h>
 #include <linux/of_gpio.h>
 
@@ -43,11 +44,14 @@
 #include <sysdev/fsl_pci.h>
 #include <sysdev/fsl_soc.h>
 
+#define PX_CSR_EVES            (1 << 2)
 #define PX_BRDCFG0_DVISEL      (1 << 3)
 #define PX_BRDCFG0_DLINK       (1 << 4)
 #define PX_BRDCFG0_DIU_MASK    (PX_BRDCFG0_DVISEL | PX_BRDCFG0_DLINK)
 #define PX_BRDCFG0_IRDAEN      (1 << 5)
 
+static struct device_node *pixis_node;
+static u8 __iomem *pixis_csr;
 static u8 __iomem *pixis_bdcfg0;
 static u8 __iomem *pixis_arch;
 static u32 __iomem *clkdvdr;
@@ -182,6 +186,37 @@ err:
        of_node_put(irda);
 }
 
+#ifdef CONFIG_SUSPEND
+static irqreturn_t sw9_irq(int irq, void *data)
+{
+       pr_debug("%s: PIXIS' event (sw9/wakeup) IRQ handled\n", __func__);
+       return IRQ_HANDLED;
+}
+
+static void __init mpc8610_suspend_init(void)
+{
+       int irq;
+
+       if (!pixis_node)
+               return;
+
+       irq = irq_of_parse_and_map(pixis_node, 0);
+       if (irq < 0 || irq == NO_IRQ) {
+               pr_err("%s: can't map pixis event IRQ.\n", __func__);
+               return;
+       }
+
+       if (request_irq(irq, sw9_irq, 0, "sw9", NULL)) {
+               pr_err("%s: can't request pixis event IRQ.\n", __func__);
+               irq_dispose_mapping(irq);
+       }
+
+       enable_irq_wake(irq);
+}
+#else
+static inline void mpc8610_suspend_init(void) { }
+#endif /* CONFIG_SUSPEND */
+
 static struct of_device_id __initdata mpc8610_ids[] = {
        { .compatible = "fsl,mpc8610-immr", },
        { .compatible = "simple-bus", },
@@ -191,6 +226,7 @@ static struct of_device_id __initdata mpc8610_ids[] = {
 static int __init mpc8610_declare_of_platform_devices(void)
 {
        mpc8610_ir_init();
+       mpc8610_suspend_init();
 
        /* Without this call, the SSI device driver won't get probed. */
        of_platform_bus_probe(NULL, mpc8610_ids, NULL);
@@ -418,16 +454,17 @@ static void __init mpc86xx_hpcd_setup_arch(void)
                return;
        }
 
-       np = of_find_compatible_node(NULL, NULL, "fsl,fpga-pixis");
-       if (np) {
-               of_address_to_resource(np, 0, &r);
-               of_node_put(np);
+       pixis_node = of_find_compatible_node(NULL, NULL, "fsl,fpga-pixis");
+       if (pixis_node) {
+               of_address_to_resource(pixis_node, 0, &r);
+               of_node_put(pixis_node);
                pixis = ioremap(r.start, 32);
                if (!pixis) {
                        printk(KERN_ERR "Err: can't map FPGA cfg register!\n");
                        return;
                }
                pixis_bdcfg0 = pixis + 8;
+               pixis_csr = pixis + 3;
                pixis_arch = pixis + 1;
        } else
                printk(KERN_ERR "Err: "
-- 
1.5.5.1
_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@ozlabs.org
https://ozlabs.org/mailman/listinfo/linuxppc-dev

Reply via email to