From 445932772394e8bed69f4e733f6ad7bde85e1632 Mon Sep 17 00:00:00 2001 From: Manuel Lauss Date: Tue, 23 Feb 2010 18:57:43 +0100 Subject: [PATCH] --- yaml --- r: 182143 b: refs/heads/master c: e275ed5ee94b358964a0dae1c8b49f0bff260b60 h: refs/heads/master i: 182141: 6f979f6be3a9b743bb18d478d6c529c4fbd90ff1 182139: fed52044b3dc6de9319411ac33d6f01de949ece1 182135: 49e6a3c6f616cea9d2d5d2dd90325fa86bff2a99 182127: 4f3f461099196bd5a12c17011bfeb74abc447871 182111: 6fc68cfad274f42cb0ab42822d86812e13a67101 182079: 7af2a49d253151bf9839e2850e8b4f456aef08b2 182015: 2aa464760926d4bbfd8eb18502cd4f81605cc06f v: v3 --- [refs] | 2 +- trunk/arch/mips/alchemy/devboards/pm.c | 32 ++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 0acb8df61440..29f58af4adf1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 81fc0179541dd52763cf62a52f0c09a05bcc6439 +refs/heads/master: e275ed5ee94b358964a0dae1c8b49f0bff260b60 diff --git a/trunk/arch/mips/alchemy/devboards/pm.c b/trunk/arch/mips/alchemy/devboards/pm.c index 632f9862a0fb..4bbd3133e451 100644 --- a/trunk/arch/mips/alchemy/devboards/pm.c +++ b/trunk/arch/mips/alchemy/devboards/pm.c @@ -10,6 +10,7 @@ #include #include #include +#include /* * Generic suspend userspace interface for Alchemy development boards. @@ -26,6 +27,20 @@ static unsigned long db1x_pm_last_wakesrc; static int db1x_pm_enter(suspend_state_t state) { + unsigned short bcsrs[16]; + int i, j, hasint; + + /* save CPLD regs */ + hasint = bcsr_read(BCSR_WHOAMI); + hasint = BCSR_WHOAMI_BOARD(hasint) >= BCSR_WHOAMI_DB1200; + j = (hasint) ? BCSR_MASKSET : BCSR_SYSTEM; + + for (i = BCSR_STATUS; i <= j; i++) + bcsrs[i] = bcsr_read(i); + + /* shut off hexleds */ + bcsr_write(BCSR_HEXCLEAR, 3); + /* enable GPIO based wakeup */ alchemy_gpio1_input_enable(); @@ -52,6 +67,23 @@ static int db1x_pm_enter(suspend_state_t state) /* ...and now the sandman can come! */ au_sleep(); + + /* restore CPLD regs */ + for (i = BCSR_STATUS; i <= BCSR_SYSTEM; i++) + bcsr_write(i, bcsrs[i]); + + /* restore CPLD int registers */ + if (hasint) { + bcsr_write(BCSR_INTCLR, 0xffff); + bcsr_write(BCSR_MASKCLR, 0xffff); + bcsr_write(BCSR_INTSTAT, 0xffff); + bcsr_write(BCSR_INTSET, bcsrs[BCSR_INTSET]); + bcsr_write(BCSR_MASKSET, bcsrs[BCSR_MASKSET]); + } + + /* light up hexleds */ + bcsr_write(BCSR_HEXCLEAR, 0); + return 0; }