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; };