aboutsummaryrefslogtreecommitdiff
path: root/arch/arm
diff options
context:
space:
mode:
authorTony Lin <tony.lin@freescale.com>2011-08-16 17:00:26 +0800
committerTony Lin <tony.lin@freescale.com>2011-08-16 17:29:02 +0800
commitfc8e7f42bff479718cd40ee37c1dea4434a9e9cb (patch)
treef712af792002abbbbfabfa1a87b6706ca71474fa /arch/arm
parentfdd85eb4304b1cd0d7f69b30ae2fcc68905d95b0 (diff)
ENGR00154890 [MX6Q]suspend/resume restore GPIO interrupt enable status
re-init GPIO interrupt to make GPIO interrupt workable after suspend/resume (dormant mode) Signed-off-by: Tony Lin <tony.lin@freescale.com>
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/mach-mx6/devices.c2
-rw-r--r--arch/arm/mach-mx6/irq.c2
-rw-r--r--arch/arm/mach-mx6/pm.c6
-rw-r--r--arch/arm/plat-mxc/gpio.c10
4 files changed, 12 insertions, 8 deletions
diff --git a/arch/arm/mach-mx6/devices.c b/arch/arm/mach-mx6/devices.c
index 996de31d493..3eab54de33c 100644
--- a/arch/arm/mach-mx6/devices.c
+++ b/arch/arm/mach-mx6/devices.c
@@ -84,7 +84,7 @@ static struct mxc_gpio_port mxc_gpio_ports[] = {
},
};
-int __init mx6q_register_gpios(void)
+int mx6q_register_gpios(void)
{
/* 7 ports for Mx6 */
return mxc_gpio_init(mxc_gpio_ports, 7);
diff --git a/arch/arm/mach-mx6/irq.c b/arch/arm/mach-mx6/irq.c
index 7cc93962de7..4633607c1e8 100644
--- a/arch/arm/mach-mx6/irq.c
+++ b/arch/arm/mach-mx6/irq.c
@@ -43,7 +43,7 @@ static int mx6_gic_irq_set_wake(struct irq_data *d, unsigned int enable)
}
return 0;
}
-void __init mx6_init_irq(void)
+void mx6_init_irq(void)
{
struct irq_desc *desc;
unsigned int i;
diff --git a/arch/arm/mach-mx6/pm.c b/arch/arm/mach-mx6/pm.c
index 4c53bb44d5e..2a94689bbf6 100644
--- a/arch/arm/mach-mx6/pm.c
+++ b/arch/arm/mach-mx6/pm.c
@@ -61,6 +61,7 @@ static int org_freq;
extern int set_cpu_freq(int wp);
#endif
extern void mx6q_suspend(suspend_state_t state);
+extern void mx6_init_irq(void);
static struct device *pm_dev;
struct clk *gpc_dvfs_clk;
@@ -115,6 +116,7 @@ static void mx6_suspend_restore(void)
__raw_writel(local_timer[3], local_twd_base + LOCAL_TWD_INT_OFFSET);
#endif
}
+
static int mx6_suspend_enter(suspend_state_t state)
{
mx6_suspend_store();
@@ -147,8 +149,8 @@ static int mx6_suspend_enter(suspend_state_t state)
mx6q_suspend(state);
if (state == PM_SUSPEND_MEM) {
- /* need to re-init gic */
- gic_init(0, 29, gic_dist_base, gic_cpu_base);
+ /* need to re-init irq */
+ mx6_init_irq();
#ifdef CONFIG_LOCAL_TIMERS
gic_enable_ppi(IRQ_LOCALTIMER);
diff --git a/arch/arm/plat-mxc/gpio.c b/arch/arm/plat-mxc/gpio.c
index 66630785e02..5b72ff40914 100644
--- a/arch/arm/plat-mxc/gpio.c
+++ b/arch/arm/plat-mxc/gpio.c
@@ -299,9 +299,10 @@ static int mxc_gpio_direction_output(struct gpio_chip *chip,
return 0;
}
-int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt)
+int mxc_gpio_init(struct mxc_gpio_port *port, int cnt)
{
int i, j;
+ static bool initialed;
/* save for local usage */
mxc_gpio_ports = port;
@@ -330,8 +331,9 @@ int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt)
spin_lock_init(&port[i].lock);
- /* its a serious configuration bug when it fails */
- BUG_ON( gpiochip_add(&port[i].chip) < 0 );
+ if (!initialed)
+ /* its a serious configuration bug when it fails */
+ BUG_ON(gpiochip_add(&port[i].chip) < 0);
if (cpu_is_mx1() || cpu_is_mx3() || cpu_is_mx25() ||
cpu_is_mx51() || cpu_is_mx53() || cpu_is_mx6q()) {
@@ -346,7 +348,7 @@ int __init mxc_gpio_init(struct mxc_gpio_port *port, int cnt)
}
}
}
-
+ initialed = true;
if (cpu_is_mx2()) {
/* setup one handler for all GPIO interrupts */
set_irq_chained_handler(port[0].irq, mx2_gpio_irq_handler);