lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Fri, 7 Feb 2020 08:10:22 +0000 From: Horia Geanta <horia.geanta@....com> To: André Draszik <git@...red.net>, "linux-kernel@...r.kernel.org" <linux-kernel@...r.kernel.org> CC: Anson Huang <anson.huang@....com>, Dmitry Torokhov <dmitry.torokhov@...il.com>, Aymen Sghaier <aymen.sghaier@....com>, Herbert Xu <herbert@...dor.apana.org.au>, "David S. Miller" <davem@...emloft.net>, Rob Herring <robh+dt@...nel.org>, Mark Rutland <mark.rutland@....com>, "linux-crypto@...r.kernel.org" <linux-crypto@...r.kernel.org>, "devicetree@...r.kernel.org" <devicetree@...r.kernel.org>, "linux-input@...r.kernel.org" <linux-input@...r.kernel.org>, Robin Gong <yibin.gong@....com>, dl-linux-imx <linux-imx@....com> Subject: Re: [PATCH 2/3] Input: snvs_pwrkey - enable snvs clock as needed On 1/30/2020 10:45 PM, André Draszik wrote: > At the moment, enabling this driver without the SNVS RTC driver > being active will hang the kernel as soon as the power button > is pressed. > > The reason is that in that case the SNVS isn't enabled, and > any attempt to read the SNVS registers will simply hang forever. > > Ensure the clock is enabled (during the interrupt handler) to > make this driver work. > > Also see commit 7f8993995410 ("drivers/rtc/rtc-snvs: add clock support") > and commit edb190cb1734 > ("rtc: snvs: make sure clock is enabled for interrupt handle") > for similar updates to the snvs rtc driver. > > Signed-off-by: André Draszik <git@...red.net> > Cc: Anson Huang <Anson.Huang@....com> > Cc: Dmitry Torokhov <dmitry.torokhov@...il.com> > Cc: "Horia Geantă" <horia.geanta@....com> > Cc: Aymen Sghaier <aymen.sghaier@....com> > Cc: Herbert Xu <herbert@...dor.apana.org.au> > Cc: "David S. Miller" <davem@...emloft.net> > Cc: Rob Herring <robh+dt@...nel.org> > Cc: Mark Rutland <mark.rutland@....com> > Cc: linux-crypto@...r.kernel.org > Cc: devicetree@...r.kernel.org > Cc: linux-input@...r.kernel.org > --- > drivers/input/keyboard/snvs_pwrkey.c | 27 +++++++++++++++++++++++++++ > 1 file changed, 27 insertions(+) > > diff --git a/drivers/input/keyboard/snvs_pwrkey.c b/drivers/input/keyboard/snvs_pwrkey.c > index 2f5e3ab5ed63..c29711d8735c 100644 > --- a/drivers/input/keyboard/snvs_pwrkey.c > +++ b/drivers/input/keyboard/snvs_pwrkey.c > @@ -16,6 +16,7 @@ > #include <linux/of_address.h> > #include <linux/platform_device.h> > #include <linux/pm_wakeirq.h> > +#include <linux/clk.h> > #include <linux/mfd/syscon.h> > #include <linux/regmap.h> > > @@ -38,6 +39,7 @@ struct pwrkey_drv_data { > int wakeup; > struct timer_list check_timer; > struct input_dev *input; > + struct clk *clk; > u8 minor_rev; > }; > > @@ -72,6 +74,9 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id) > struct input_dev *input = pdata->input; > u32 lp_status; > > + if (pdata->clk) > + clk_enable(pdata->clk); > + clk framework handles NULL pointers internally, the check is redundant. > pm_wakeup_event(input->dev.parent, 0); > > regmap_read(pdata->snvs, SNVS_LPSR_REG, &lp_status); > @@ -96,6 +101,9 @@ static irqreturn_t imx_snvs_pwrkey_interrupt(int irq, void *dev_id) > /* clear SPO status */ > regmap_write(pdata->snvs, SNVS_LPSR_REG, SNVS_LPSR_SPO); > > + if (pdata->clk) > + clk_disable(pdata->clk); > + > return IRQ_HANDLED; > } > > @@ -140,6 +148,25 @@ static int imx_snvs_pwrkey_probe(struct platform_device *pdev) > if (pdata->irq < 0) > return -EINVAL; > > + pdata->clk = devm_clk_get(&pdev->dev, "snvs-pwrkey"); > + if (IS_ERR(pdata->clk)) { > + pdata->clk = NULL; Using devm_clk_get_optional() would simplify error handling. > + } else { > + error = clk_prepare_enable(pdata->clk); > + if (error) { > + dev_err(&pdev->dev, > + "Could not prepare or enable the snvs clock\n"); > + return error; > + } > + error = devm_add_action_or_reset(&pdev->dev, > + (void(*)(void *))clk_disable_unprepare, > + pdata->clk); > + if (error) { > + dev_err(&pdev->dev, "failed to add reset action on 'snvs-pwrkey'"); > + return error; > + } > + } > + > regmap_read(pdata->snvs, SNVS_HPVIDR1_REG, &vid); > pdata->minor_rev = vid & 0xff; > >
Powered by blists - more mailing lists