summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinyu Chen <xinyu.chen@freescale.com>2011-01-17 10:02:57 +0800
committerXinyu Chen <xinyu.chen@freescale.com>2011-01-17 10:43:09 +0800
commita3928359c9d8109ca50ea6dfb20f541ab45973e4 (patch)
tree8c39c7b879a8190ccc74f8405b0c44c8a7543e30
parent7d368afb424a3d994617a8c86d2d1edb8e05fa08 (diff)
ENGR00136874-2 mx5x: update the power key platform data
mx50rdp, mx51bbg, mx53evk: Add get keypad press status callback and desired send key value to the platform data. Signed-off-by: Xinyu Chen <xinyu.chen@freescale.com>
-rw-r--r--arch/arm/mach-mx5/mx50_rdp.c31
-rw-r--r--arch/arm/mach-mx5/mx51_babbage.c39
-rw-r--r--arch/arm/mach-mx5/mx53_evk.c21
3 files changed, 74 insertions, 17 deletions
diff --git a/arch/arm/mach-mx5/mx50_rdp.c b/arch/arm/mach-mx5/mx50_rdp.c
index 659c9b13b48c..c36ff9b3f30b 100644
--- a/arch/arm/mach-mx5/mx50_rdp.c
+++ b/arch/arm/mach-mx5/mx50_rdp.c
@@ -1246,18 +1246,41 @@ static void mx50_arm2_usb_set_vbus(bool enable)
gpio_set_value(USB_OTG_PWR, enable);
}
-static void mxc_register_powerkey(key_press_call_back kp_cb, void *param)
+static void mxc_register_powerkey(pwrkey_callback pk_cb)
{
pmic_event_callback_t power_key_event;
- power_key_event.param = param;
- power_key_event.func = (void *)kp_cb;
+ power_key_event.param = (void *)1;
+ power_key_event.func = (void *)pk_cb;
pmic_event_subscribe(EVENT_PWRONI, power_key_event);
+ power_key_event.param = (void *)3;
pmic_event_subscribe(EVENT_PWRON3I, power_key_event);
}
+static int mxc_pwrkey_getstatus(int id)
+{
+ int sense, off = 3;
+
+ pmic_read_reg(REG_INT_SENSE1, &sense, 0xffffffff);
+ switch (id) {
+ case 2:
+ off = 4;
+ break;
+ case 3:
+ off = 2;
+ break;
+ }
+
+ if (sense & (1 << off))
+ return 0;
+
+ return 1;
+}
+
static struct power_key_platform_data pwrkey_data = {
- .register_key_press_handler = mxc_register_powerkey,
+ .key_value = KEY_F4,
+ .register_pwrkey = mxc_register_powerkey,
+ .get_key_status = mxc_pwrkey_getstatus,
};
diff --git a/arch/arm/mach-mx5/mx51_babbage.c b/arch/arm/mach-mx5/mx51_babbage.c
index c21623acb80a..3f3691d8684f 100644
--- a/arch/arm/mach-mx5/mx51_babbage.c
+++ b/arch/arm/mach-mx5/mx51_babbage.c
@@ -32,6 +32,7 @@
#include <linux/ipu.h>
#include <linux/mxcfb.h>
#include <linux/pwm_backlight.h>
+#include <linux/powerkey.h>
#include <mach/common.h>
#include <mach/hardware.h>
#include <asm/setup.h>
@@ -1073,27 +1074,46 @@ static void mxc_power_off(void)
*/
static irqreturn_t power_key_int(int irq, void *dev_id)
{
- pr_info(KERN_INFO "PWR key pressed\n");
+ pwrkey_callback cb = (pwrkey_callback)dev_id;
+
+ cb((void *)1);
+
+ if (gpio_get_value(BABBAGE_POWER_KEY))
+ set_irq_type(irq, IRQF_TRIGGER_FALLING);
+ else
+ set_irq_type(irq, IRQF_TRIGGER_RISING);
+
return 0;
}
-/*!
- * Power Key initialization.
- */
-static int __init mxc_init_power_key(void)
+static void mxc_register_powerkey(pwrkey_callback pk_cb)
{
/* Set power key as wakeup resource */
int irq, ret;
irq = IOMUX_TO_IRQ_V3(BABBAGE_POWER_KEY);
- set_irq_type(irq, IRQF_TRIGGER_RISING);
- ret = request_irq(irq, power_key_int, 0, "power_key", 0);
+
+ if (gpio_get_value(BABBAGE_POWER_KEY))
+ set_irq_type(irq, IRQF_TRIGGER_FALLING);
+ else
+ set_irq_type(irq, IRQF_TRIGGER_RISING);
+
+ ret = request_irq(irq, power_key_int, 0, "power_key", pk_cb);
if (ret)
pr_info("register on-off key interrupt failed\n");
else
enable_irq_wake(irq);
- return ret;
}
-late_initcall(mxc_init_power_key);
+
+static int mxc_pwrkey_getstatus(int id)
+{
+ return gpio_get_value(BABBAGE_POWER_KEY);
+}
+
+static struct power_key_platform_data pwrkey_data = {
+ .key_value = KEY_F4,
+ .register_pwrkey = mxc_register_powerkey,
+ .get_key_status = mxc_pwrkey_getstatus,
+};
static void __init mx51_babbage_io_init(void)
{
@@ -1255,6 +1275,7 @@ static void __init mxc_board_init(void)
mxc_register_device(&mxc_fec_device, NULL);
mxc_register_device(&mxc_v4l2_device, NULL);
mxc_register_device(&mxc_v4l2out_device, NULL);
+ mxc_register_device(&mxc_powerkey_device, &pwrkey_data);
mx51_babbage_init_mc13892();
diff --git a/arch/arm/mach-mx5/mx53_evk.c b/arch/arm/mach-mx5/mx53_evk.c
index c48355aaadab..f97ccdd9ae67 100644
--- a/arch/arm/mach-mx5/mx53_evk.c
+++ b/arch/arm/mach-mx5/mx53_evk.c
@@ -1145,17 +1145,30 @@ static struct mxc_mlb_platform_data mlb_data = {
.mlb_clk = "mlb_clk",
};
-static void mxc_register_powerkey(key_press_call_back kp_cb, void *param)
+static void mxc_register_powerkey(pwrkey_callback pk_cb)
{
pmic_event_callback_t power_key_event;
- power_key_event.param = param;
- power_key_event.func = (void *)kp_cb;
+ power_key_event.param = (void *)1;
+ power_key_event.func = (void *)pk_cb;
pmic_event_subscribe(EVENT_PWRONI, power_key_event);
}
+static int mxc_pwrkey_getstatus(int id)
+{
+ int sense;
+
+ pmic_read_reg(REG_INT_SENSE1, &sense, 0xffffffff);
+ if (sense & (1 << 3))
+ return 0;
+
+ return 1;
+}
+
static struct power_key_platform_data pwrkey_data = {
- .register_key_press_handler = mxc_register_powerkey,
+ .key_value = KEY_F4,
+ .register_pwrkey = mxc_register_powerkey,
+ .get_key_status = mxc_pwrkey_getstatus,
};
/* NAND Flash Partitions */