Commit 2f58d46c authored by Stephen Boyd's avatar Stephen Boyd Committed by Ben Hutchings

Input: pmic8xxx-pwrkey - fix algorithm for converting trigger delay

commit eda5ecc0 upstream.

The trigger delay algorithm that converts from microseconds to
the register value looks incorrect. According to most of the PMIC
documentation, the equation is

	delay (Seconds) = (1 / 1024) * 2 ^ (x + 4)

except for one case where the documentation looks to have a
formatting issue and the equation looks like

	delay (Seconds) = (1 / 1024) * 2 x + 4

Most likely this driver was written with the improper
documentation to begin with. According to the downstream sources
the valid delays are from 2 seconds to 1/64 second, and the
latter equation just doesn't make sense for that. Let's fix the
algorithm and the range check to match the documentation and the
downstream sources.
Reported-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Fixes: 92d57a73 ("input: Add support for Qualcomm PMIC8XXX power key")
Signed-off-by: default avatarStephen Boyd <sboyd@codeaurora.org>
Tested-by: default avatarJohn Stultz <john.stultz@linaro.org>
Acked-by: default avatarBjorn Andersson <bjorn.andersson@linaro.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
[bwh: Backported to 3.2: use pdata->kpd_trigger_delay_us not kpd_delay]
Signed-off-by: default avatarBen Hutchings <ben@decadent.org.uk>
parent 4af9256c
...@@ -98,7 +98,9 @@ static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev) ...@@ -98,7 +98,9 @@ static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev)
return -EINVAL; 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"); dev_err(&pdev->dev, "invalid power key trigger delay\n");
return -EINVAL; return -EINVAL;
} }
...@@ -120,8 +122,8 @@ static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev) ...@@ -120,8 +122,8 @@ static int __devinit pmic8xxx_pwrkey_probe(struct platform_device *pdev)
pwr->phys = "pmic8xxx_pwrkey/input0"; pwr->phys = "pmic8xxx_pwrkey/input0";
pwr->dev.parent = &pdev->dev; pwr->dev.parent = &pdev->dev;
delay = (pdata->kpd_trigger_delay_us << 10) / USEC_PER_SEC; delay = (pdata->kpd_trigger_delay_us << 6) / USEC_PER_SEC;
delay = 1 + ilog2(delay); delay = ilog2(delay);
err = pm8xxx_readb(pdev->dev.parent, PON_CNTL_1, &pon_cntl); err = pm8xxx_readb(pdev->dev.parent, PON_CNTL_1, &pon_cntl);
if (err < 0) { if (err < 0) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment