Message ID | 20231209112058.453030-1-andreas@kemnade.info |
---|---|
State | New |
Headers | show |
Series | [RESEND] Input: omap4-keypad: react on keypresses if device is runtime-suspended | expand |
Hi Andreas, On Sat, Dec 09, 2023 at 12:20:58PM +0100, Andreas Kemnade wrote: > According to SWPU235AB, table 26-6, fclk is required to generate events > at least on OMAP4460, so keep fclk enabled all the time the device > is opened. > > Suggested-by: Tony Lindgren <tony@atomide.com> > Signed-off-by: Andreas Kemnade <andreas@kemnade.info> > Reviewed-by: Tony Lindgren <tony@atomide.com> > --- > Changes since RFC: > - add R-by: > > drivers/input/keyboard/omap4-keypad.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) > > diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c > index d3f8688fdd9c3..7d83aff95617f 100644 > --- a/drivers/input/keyboard/omap4-keypad.c > +++ b/drivers/input/keyboard/omap4-keypad.c > @@ -11,6 +11,7 @@ > #include <linux/module.h> > #include <linux/interrupt.h> > #include <linux/platform_device.h> > +#include <linux/clk.h> > #include <linux/errno.h> > #include <linux/io.h> > #include <linux/of.h> > @@ -83,6 +84,7 @@ struct omap4_keypad { > bool no_autorepeat; > u64 keys; > unsigned short *keymap; > + struct clk *fck; > }; > > static int kbd_readl(struct omap4_keypad *keypad_data, u32 offset) > @@ -211,6 +213,8 @@ static int omap4_keypad_open(struct input_dev *input) > > disable_irq(keypad_data->irq); > > + clk_prepare_enable(keypad_data->fck); I believe this needs error handling. Thanks.
diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c index d3f8688fdd9c3..7d83aff95617f 100644 --- a/drivers/input/keyboard/omap4-keypad.c +++ b/drivers/input/keyboard/omap4-keypad.c @@ -11,6 +11,7 @@ #include <linux/module.h> #include <linux/interrupt.h> #include <linux/platform_device.h> +#include <linux/clk.h> #include <linux/errno.h> #include <linux/io.h> #include <linux/of.h> @@ -83,6 +84,7 @@ struct omap4_keypad { bool no_autorepeat; u64 keys; unsigned short *keymap; + struct clk *fck; }; static int kbd_readl(struct omap4_keypad *keypad_data, u32 offset) @@ -211,6 +213,8 @@ static int omap4_keypad_open(struct input_dev *input) disable_irq(keypad_data->irq); + clk_prepare_enable(keypad_data->fck); + kbd_writel(keypad_data, OMAP4_KBD_CTRL, OMAP4_DEF_CTRL_NOSOFTMODE | (OMAP4_KEYPAD_PTV_DIV_128 << OMAP4_DEF_CTRL_PTV_SHIFT)); @@ -258,6 +262,7 @@ static void omap4_keypad_close(struct input_dev *input) disable_irq(keypad_data->irq); omap4_keypad_stop(keypad_data); enable_irq(keypad_data->irq); + clk_disable_unprepare(keypad_data->fck); pm_runtime_mark_last_busy(dev); pm_runtime_put_autosuspend(dev); @@ -356,6 +361,11 @@ static int omap4_keypad_probe(struct platform_device *pdev) } keypad_data->irq = irq; + keypad_data->fck = devm_clk_get(&pdev->dev, "fck"); + if (IS_ERR(keypad_data->fck)) + return dev_err_probe(&pdev->dev, PTR_ERR(keypad_data->fck), + "unable to get fck"); + mutex_init(&keypad_data->lock); platform_set_drvdata(pdev, keypad_data);