From 46bf579fdfe442fb05c0d7aecb47a2860e4f55df Mon Sep 17 00:00:00 2001 From: Jing Lin Date: Thu, 17 Nov 2011 09:47:09 -0800 Subject: [PATCH] input: pmic8xxx-pwrkey: Change algorithm on converting trigger delay The previous algorithm requires that kpd_trigger_delay_us be set to 1/32 of the preferred trigger delay. The new algorithm allows setting kpd_trigger_delay_us to the preferred trigger delay directly. The actual delay can only be one of the eight levels: 2 sec, 1 sec, 1/2 sec, 1/4 sec, 1/8 sec, 1/16 sec, 1/32 sec, and 1/64 sec. The valid range of kpd_trigger_delay_us is 1/64 second to 2 seconds. A value within the valid range will be rounded down to the closest level. Any value outside the valid range will be rejected. Update board files for targets that use this driver accordingly. CRs-Fixed: 307203 Change-Id: If98b9cd32e03ab85cd078024b2adee02212cf030 Signed-off-by: Jing Lin [sboyd: dropped board file changes] Signed-off-by: Stephen Boyd --- drivers/input/misc/pmic8xxx-pwrkey.c | 8 +++++--- include/linux/input/pmic8xxx-pwrkey.h | 7 +++++++ 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/input/misc/pmic8xxx-pwrkey.c b/drivers/input/misc/pmic8xxx-pwrkey.c index 0f83d0f1d01..86141f9b940 100644 --- a/drivers/input/misc/pmic8xxx-pwrkey.c +++ b/drivers/input/misc/pmic8xxx-pwrkey.c @@ -98,7 +98,9 @@ static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev) return -EINVAL; } - if (pdata->kpd_trigger_delay_us > 62500) { + /* Valid range of pwr key trigger delay is 1/64 sec to 2 seconds. */ + if (pdata->kpd_trigger_delay_us > USEC_PER_SEC * 2 || + pdata->kpd_trigger_delay_us < USEC_PER_SEC / 64) { dev_err(&pdev->dev, "invalid power key trigger delay\n"); return -EINVAL; } @@ -120,8 +122,8 @@ static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev) pwr->phys = "pmic8xxx_pwrkey/input0"; pwr->dev.parent = &pdev->dev; - delay = (pdata->kpd_trigger_delay_us << 10) / USEC_PER_SEC; - delay = 1 + ilog2(delay); + delay = (pdata->kpd_trigger_delay_us << 6) / USEC_PER_SEC; + delay = ilog2(delay); err = pm8xxx_readb(pdev->dev.parent, PON_CNTL_1, &pon_cntl); if (err < 0) { diff --git a/include/linux/input/pmic8xxx-pwrkey.h b/include/linux/input/pmic8xxx-pwrkey.h index 6d2974e5710..a32eafd64da 100644 --- a/include/linux/input/pmic8xxx-pwrkey.h +++ b/include/linux/input/pmic8xxx-pwrkey.h @@ -24,6 +24,13 @@ */ struct pm8xxx_pwrkey_platform_data { bool pull_up; + /* Time delay for pwr-key state change interrupt triggering in micro- + * second. The actual delay can only be one of these eight levels: + * 2 sec, 1 sec, 1/2 sec, 1/4 sec, 1/8 sec, 1/16 sec, 1/32 sec, and + * 1/64 sec. The valid range of kpd_trigger_delay_us is 1/64 second to + * 2 seconds. A value within the valid range will be rounded down to the + * closest level. Any value outside the valid range will be rejected. + */ u32 kpd_trigger_delay_us; u32 wakeup; };