summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkevin shen <b00984@freescale.com>2008-04-23 13:03:30 +0800
committerDaniel Schaeffer <daniel.schaeffer@timesys.com>2008-08-25 15:21:03 -0400
commit0d32c2690d03dbdcd84eb3b95e7499fd73e53724 (patch)
treeffca3084d1ee4f7260953f24797599ac5a5d4f5e
parent84a73e9fbb97a4fd25410fb9ea04cee3515a79b1 (diff)
ENGR00074126 CR fix on-off key wake up system problem
add interrupt handle for on-off key Signed-off-by: Kevin Shen <b00984@freescale.com> (cherry picked from commit 021b66f90e97984a360c0d02f43463963fb69eda)
-rw-r--r--arch/arm/mach-mx3/mx3_3stack.c1
-rw-r--r--arch/arm/mach-mx3/mx3_3stack_gpio.c11
-rw-r--r--drivers/mxc/pmic/core/pmic_core_spi.c2
-rw-r--r--drivers/mxc/pmic/mc13783/pmic_power.c36
4 files changed, 40 insertions, 10 deletions
diff --git a/arch/arm/mach-mx3/mx3_3stack.c b/arch/arm/mach-mx3/mx3_3stack.c
index 38de0e88b77f..88ecfff907bc 100644
--- a/arch/arm/mach-mx3/mx3_3stack.c
+++ b/arch/arm/mach-mx3/mx3_3stack.c
@@ -324,6 +324,7 @@ static struct spi_board_info mxc_spi_board_info[] __initdata = {
.irq = IOMUX_TO_IRQ(MX31_PIN_GPIO1_3),
.max_speed_hz = 4000000,
.bus_num = 2,
+ .platform_data = (void *)IOMUX_TO_IRQ(MX31_PIN_GPIO1_2),
.chip_select = 2,},
{
.modalias = "lcd_spi",
diff --git a/arch/arm/mach-mx3/mx3_3stack_gpio.c b/arch/arm/mach-mx3/mx3_3stack_gpio.c
index 3e612122da5a..fe6bf6351fa9 100644
--- a/arch/arm/mach-mx3/mx3_3stack_gpio.c
+++ b/arch/arm/mach-mx3/mx3_3stack_gpio.c
@@ -209,18 +209,15 @@ void gpio_keypad_inactive(void)
EXPORT_SYMBOL(gpio_keypad_inactive);
-void gpio_on_off_button_active(void)
+void gpio_power_key_active(void)
{
mxc_request_iomux(MX31_PIN_GPIO1_2, OUTPUTCONFIG_GPIO,
- INPUTCONFIG_GPIO);
+ INPUTCONFIG_GPIO);
mxc_set_gpio_direction(MX31_PIN_GPIO1_2, 1);
mxc_iomux_set_pad(MX31_PIN_GPIO1_2, PAD_CTL_PKE_NONE);
- set_irq_type(IOMUX_TO_IRQ(MX31_PIN_GPIO1_2), IRQF_TRIGGER_RISING);
- set_irq_wake(IOMUX_TO_IRQ(MX31_PIN_GPIO1_2), 1);
- /* gpio1 include on/off interrupt */
- set_irq_wake(52, 1);
}
-EXPORT_SYMBOL(gpio_on_off_button_active);
+
+EXPORT_SYMBOL(gpio_power_key_active);
/*!
* Setup GPIO for a CSPI device to be active
diff --git a/drivers/mxc/pmic/core/pmic_core_spi.c b/drivers/mxc/pmic/core/pmic_core_spi.c
index 173806228d94..3e7b9863ea90 100644
--- a/drivers/mxc/pmic/core/pmic_core_spi.c
+++ b/drivers/mxc/pmic/core/pmic_core_spi.c
@@ -247,6 +247,8 @@ static int __devinit pmic_probe(struct spi_device *spi)
return ret;
}
+ power_ldm.dev.platform_data = spi->dev.platform_data;
+
pmic_pdev_register();
printk(KERN_INFO "Device %s probed\n", spi->dev.bus_id);
diff --git a/drivers/mxc/pmic/mc13783/pmic_power.c b/drivers/mxc/pmic/mc13783/pmic_power.c
index 7b8c2998a84e..d62acad55592 100644
--- a/drivers/mxc/pmic/mc13783/pmic_power.c
+++ b/drivers/mxc/pmic/mc13783/pmic_power.c
@@ -26,6 +26,9 @@
#include <asm/ioctl.h>
#include <asm/arch/pmic_power.h>
#include <asm/arch/pmic_status.h>
+#include <linux/irq.h>
+#include <linux/interrupt.h>
+#include <linux/kernel.h>
#include "pmic_power_defs.h"
@@ -3064,16 +3067,43 @@ void pmic_power_key_callback(void)
#endif
}
-extern void gpio_on_off_button_active(void);
+static irqreturn_t power_key_int(int irq, void *dev_id)
+{
+ pr_info(KERN_INFO "on-off key pressed\n");
+
+ return 0;
+}
+
+extern void gpio_power_key_active(void);
/*
* Init and Exit
*/
static int pmic_power_probe(struct platform_device *pdev)
{
+ int irq, ret;
+
/* configure on/off button */
- gpio_on_off_button_active();
- printk(KERN_INFO "PMIC Power successfully probed\n");
+ gpio_power_key_active();
+
+ irq = (int)pdev->dev.platform_data;
+
+ if (irq == 0) {
+ pr_info(KERN_INFO "PMIC Power has no platform data\n");
+ goto done;
+ }
+ set_irq_type(irq, IRQF_TRIGGER_RISING);
+
+ ret = request_irq(irq, power_key_int, 0, "power_key", 0);
+ if (ret)
+ pr_info(KERN_ERR "register on-off key interrupt failed\n");
+
+ set_irq_wake(irq, 1);
+ /* gpio1 include on/off interrupt */
+ set_irq_wake(MXC_INT_GPIO1, 1);
+
+done:
+ pr_info(KERN_INFO "PMIC Power successfully probed\n");
return 0;
}