commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=c41ae36852e9e1b213e471453aac964e9f2f4387 branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk
Signed-off-by: Steven Miao <[email protected]> Signed-off-by: Bob Liu <[email protected]> --- arch/blackfin/mach-bf609/pm.c | 99 ++++++++++++++++++++++++++++++++++++++++- 1 files changed, 97 insertions(+), 2 deletions(-) diff --git a/arch/blackfin/mach-bf609/pm.c b/arch/blackfin/mach-bf609/pm.c index 3a63a09..576721b 100644 --- a/arch/blackfin/mach-bf609/pm.c +++ b/arch/blackfin/mach-bf609/pm.c @@ -8,8 +8,13 @@ #include <linux/suspend.h> #include <linux/io.h> +#include <linux/interrupt.h> +#include <linux/gpio.h> + +#include <linux/delay.h> #include <asm/dpmc.h> +#include <asm/pm.h> #include <mach/pm.h> void bfin_cpu_suspend(void) @@ -21,6 +26,13 @@ void bfin_cpu_suspend(void) ); } +void pm_dump_reg(void) +{ + uint32_t reg; + reg = bfin_read32(SEC_SCTL1); + printk("SEC_SCTL1 %08x %08x\n", SEC_SCTL1, reg); +} + void bfin_deepsleep(unsigned long mask) { uint32_t dpm0_ctl; @@ -28,8 +40,18 @@ void bfin_deepsleep(unsigned long mask) bfin_write32(DPM0_WAKE_EN, mask); dpm0_ctl = bfin_read32(DPM0_CTL); - dpm0_ctl |= 0x00000004; + dpm0_ctl = 0x00000008; bfin_write32(DPM0_CTL, dpm0_ctl); + bfin_write32(DPM0_WAKE_EN, mask); + bfin_write32(DPM0_WAKE_POL, 0); + SSYNC(); + pm_dump_reg(); +#if 1 + while (1) { + mdelay(500); + printk("idle\n"); + } +#endif bfin_cpu_suspend(); } @@ -37,10 +59,29 @@ void bfin_deepsleep(unsigned long mask) void bfin_hibernate(unsigned long mask) { uint32_t dpm0_ctl; + int i = 100000000; + + bfin_write32(DPM0_WAKE_EN, mask); + bfin_write32(DPM0_WAKE_POL, 0); + bfin_write32(DPM0_RESTORE0, 0xFFAABBCC); + bfin_write32(DPM0_PGCNTR, 0x0000FFFF); + bfin_write32(DPM0_HIB_DIS, 0xFFFF); + SSYNC(); + + printk("hibernate: restore %x pgcnt %x\n", bfin_read32(DPM0_RESTORE0), bfin_read32(DPM0_PGCNTR)); dpm0_ctl = bfin_read32(DPM0_CTL); - dpm0_ctl |= 0x00000010; + dpm0_ctl = 0x00000010; bfin_write32(DPM0_CTL, dpm0_ctl); + SSYNC(); + +#if 1 + while (1) { + mdelay(500); + printk("idle\n"); + } +#endif + bf609_hibernate(); } @@ -89,6 +130,11 @@ void bf609_ddr_sr_exit(void) void bf609_cpu_pm_enter(suspend_state_t state) { + int error; + error = irq_set_irq_wake(255, 1); + if (error < 0) + printk("Unable to get irq wake\n"); + if (state == PM_SUSPEND_STANDBY) bfin_deepsleep(0xffff); else @@ -111,8 +157,57 @@ static struct bfin_cpu_pm_fns bf609_cpu_pm = { .finish = bf609_cpu_pm_finish, }; +static irqreturn_t test_isr(int irq, void *dev_id) +{ + printk("gpio irq %d\n", irq); + return IRQ_HANDLED; +} + +static irqreturn_t dummy_isr(int irq, void *dev_id) +{ + printk("enter %s\n", __func__); + return IRQ_HANDLED; +} + static int __init bf609_init_pm(void) { + int irq; + int error; + error = gpio_request(GPIO_PG4, "gpiopg4"); + if (error < 0) { + printk("failed to request GPIO %d, error %d\n", + GPIO_PG4, error); + } + + error = gpio_direction_input(GPIO_PG4); + if (error < 0) { + printk("failed to configure" + " direction for GPIO %d, error %d\n", + GPIO_PG4, error); + } + + irq = gpio_to_irq(GPIO_PG4); + if (irq < 0) { + error = irq; + printk("Unable to get irq number for GPIO %d, error %d\n", + GPIO_PG4, error); + } + + printk("%s gpio %d irq %d\n", __func__, GPIO_PG4, irq); + + error = request_irq(irq, test_isr, IRQF_TRIGGER_FALLING | IRQF_NO_SUSPEND, "gpiopg4", NULL); + if (error < 0) + printk("Unable to get irq\n"); + + error = request_irq(IRQ_CGU_EVT, dummy_isr, IRQF_NO_SUSPEND, "cgu0 event", NULL); + if (error < 0) + printk("Unable to get irq\n"); + + error = request_irq(IRQ_DPM, dummy_isr, IRQF_NO_SUSPEND, "dpm0 event", NULL); + if (error < 0) + printk("Unable to get irq\n"); + + bfin_cpu_pm = &bf609_cpu_pm; return 0; }
_______________________________________________ Linux-kernel-commits mailing list [email protected] https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits
