diff options
author | Xinyu Chen <xinyu.chen@freescale.com> | 2011-01-17 10:02:57 +0800 |
---|---|---|
committer | Xinyu Chen <xinyu.chen@freescale.com> | 2011-01-17 10:43:09 +0800 |
commit | a3928359c9d8109ca50ea6dfb20f541ab45973e4 (patch) | |
tree | 8c39c7b879a8190ccc74f8405b0c44c8a7543e30 | |
parent | 7d368afb424a3d994617a8c86d2d1edb8e05fa08 (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.c | 31 | ||||
-rw-r--r-- | arch/arm/mach-mx5/mx51_babbage.c | 39 | ||||
-rw-r--r-- | arch/arm/mach-mx5/mx53_evk.c | 21 |
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 */ |