Message ID | 20210106125822.31315-5-tony@atomide.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Lost key-up interrupt handling for omap4-keypad | expand |
Hi Tony, On Wed, Jan 06, 2021 at 02:58:22PM +0200, Tony Lindgren wrote: > Simplify probe with devm. [...] > /* input device allocation */ > - keypad_data->input = input_dev = input_allocate_device(); > + keypad_data->input = input_dev = devm_input_allocate_device(&pdev->dev); > if (!input_dev) { > error = -ENOMEM; > goto err_pm_disable; [...] > static int omap4_keypad_remove(struct platform_device *pdev) > { > struct omap4_keypad *keypad_data = platform_get_drvdata(pdev); > - struct resource *res; > > dev_pm_clear_wake_irq(&pdev->dev); > - > - free_irq(keypad_data->irq, keypad_data); > - > pm_runtime_dont_use_autosuspend(&pdev->dev); > pm_runtime_disable(&pdev->dev); > - > input_unregister_device(keypad_data->input); not needed: * devm_input_allocate_device - allocate managed input device * @dev: device owning the input device being created * * Returns prepared struct input_dev or %NULL. * * Managed input devices do not need to be explicitly unregistered or * freed as it will be done automatically when owner device unbinds from * its driver (or binding fails). [...] -- Sebastian
Hi Tony,
I love your patch! Yet something to improve:
[auto build test ERROR on input/next]
[also build test ERROR on linus/master v5.11-rc2 next-20210104]
[cannot apply to hid/for-next linux/master]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Tony-Lindgren/Lost-key-up-interrupt-handling-for-omap4-keypad/20210106-210045
base: https://git.kernel.org/pub/scm/linux/kernel/git/dtor/input.git next
config: s390-randconfig-r024-20210106 (attached as .config)
compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 5c951623bc8965fa1e89660f2f5f4a2944e4981a)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install s390 cross compiling tool for clang build
# apt-get install binutils-s390x-linux-gnu
# https://github.com/0day-ci/linux/commit/f42e31515b38ac05424768b08a12316f301cfd1a
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Tony-Lindgren/Lost-key-up-interrupt-handling-for-omap4-keypad/20210106-210045
git checkout f42e31515b38ac05424768b08a12316f301cfd1a
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=s390
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All errors (new ones prefixed by >>):
dma-crossbar.c:(.text+0x344): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: dma-crossbar.c:(.text+0x48a): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/dma/xilinx/xilinx_dpdma.o: in function `xilinx_dpdma_probe':
xilinx_dpdma.c:(.text+0x6e): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/soc/aspeed/aspeed-lpc-ctrl.o: in function `aspeed_lpc_ctrl_probe':
aspeed-lpc-ctrl.c:(.text+0x72): undefined reference to `of_address_to_resource'
s390x-linux-gnu-ld: aspeed-lpc-ctrl.c:(.text+0xd6): undefined reference to `of_address_to_resource'
s390x-linux-gnu-ld: drivers/soc/fsl/dpaa2-console.o: in function `dpaa2_console_probe':
dpaa2-console.c:(.text+0x30): undefined reference to `of_address_to_resource'
s390x-linux-gnu-ld: drivers/soc/fsl/dpaa2-console.o: in function `dpaa2_mc_console_open':
dpaa2-console.c:(.text+0x34e): undefined reference to `ioremap'
s390x-linux-gnu-ld: dpaa2-console.c:(.text+0x37c): undefined reference to `iounmap'
s390x-linux-gnu-ld: dpaa2-console.c:(.text+0x394): undefined reference to `ioremap'
s390x-linux-gnu-ld: dpaa2-console.c:(.text+0x498): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/soc/fsl/dpaa2-console.o: in function `dpaa2_console_close':
dpaa2-console.c:(.text+0x4e8): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/soc/fsl/dpaa2-console.o: in function `dpaa2_aiop_console_open':
dpaa2-console.c:(.text+0x56e): undefined reference to `ioremap'
s390x-linux-gnu-ld: dpaa2-console.c:(.text+0x59c): undefined reference to `iounmap'
s390x-linux-gnu-ld: dpaa2-console.c:(.text+0x5b4): undefined reference to `ioremap'
s390x-linux-gnu-ld: dpaa2-console.c:(.text+0x6b2): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/soc/imx/soc-imx8m.o: in function `imx8mq_soc_revision':
soc-imx8m.c:(.init.text+0x1f0): undefined reference to `of_iomap'
s390x-linux-gnu-ld: soc-imx8m.c:(.init.text+0x232): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/soc/imx/soc-imx8m.o: in function `imx8mm_soc_revision':
soc-imx8m.c:(.init.text+0x2aa): undefined reference to `of_iomap'
s390x-linux-gnu-ld: soc-imx8m.c:(.init.text+0x2bc): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/soc/imx/soc-imx8m.o: in function `imx8mm_soc_uid':
soc-imx8m.c:(.init.text+0x33a): undefined reference to `of_iomap'
s390x-linux-gnu-ld: soc-imx8m.c:(.init.text+0x366): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/soc/mediatek/mtk-pmic-wrap.o: in function `pwrap_probe':
mtk-pmic-wrap.c:(.text+0xb0): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: mtk-pmic-wrap.c:(.text+0x140): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/soc/amlogic/meson-canvas.o: in function `meson_canvas_probe':
meson-canvas.c:(.text+0x42a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/soc/amlogic/meson-clk-measure.o: in function `meson_msr_probe':
meson-clk-measure.c:(.text+0x8e): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/soc/qcom/qcom-geni-se.o: in function `geni_se_probe':
qcom-geni-se.c:(.text+0xc90): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/soc/qcom/llcc-qcom.o:llcc-qcom.c:(.text+0x69c): more undefined references to `devm_ioremap_resource' follow
s390x-linux-gnu-ld: drivers/soc/renesas/renesas-soc.o: in function `renesas_soc_init':
renesas-soc.c:(.init.text+0x70): undefined reference to `of_iomap'
s390x-linux-gnu-ld: renesas-soc.c:(.init.text+0x9e): undefined reference to `iounmap'
s390x-linux-gnu-ld: renesas-soc.c:(.init.text+0xe6): undefined reference to `of_iomap'
s390x-linux-gnu-ld: renesas-soc.c:(.init.text+0x10a): undefined reference to `iounmap'
s390x-linux-gnu-ld: renesas-soc.c:(.init.text+0x18a): undefined reference to `ioremap'
s390x-linux-gnu-ld: drivers/soc/renesas/rcar-rst.o: in function `rcar_rst_init':
rcar-rst.c:(.init.text+0xa8): undefined reference to `of_iomap'
s390x-linux-gnu-ld: drivers/soc/renesas/rcar-sysc.o: in function `rcar_sysc_pd_init':
rcar-sysc.c:(.init.text+0xa6): undefined reference to `of_iomap'
s390x-linux-gnu-ld: drivers/regulator/stm32-vrefbuf.o: in function `stm32_vrefbuf_probe':
stm32-vrefbuf.c:(.text+0x5a): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/reset/reset-ath79.o: in function `ath79_reset_probe':
reset-ath79.c:(.text+0x60): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/reset/reset-brcmstb.o: in function `brcmstb_reset_probe':
reset-brcmstb.c:(.text+0x5e): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/reset/reset-lpc18xx.o: in function `lpc18xx_rgu_probe':
reset-lpc18xx.c:(.text+0x5a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/reset/reset-qcom-aoss.o: in function `qcom_aoss_reset_probe':
reset-qcom-aoss.c:(.text+0x74): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/reset/reset-qcom-pdc.o: in function `qcom_pdc_reset_probe':
reset-qcom-pdc.c:(.text+0x5a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/reset/reset-simple.o:reset-simple.c:(.text+0x310): more undefined references to `devm_ioremap_resource' follow
s390x-linux-gnu-ld: drivers/char/hw_random/exynos-trng.o: in function `exynos_trng_probe':
exynos-trng.c:(.text+0xa0): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/char/hw_random/meson-rng.o: in function `meson_rng_probe':
meson-rng.c:(.text+0x4e): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/char/hw_random/mtk-rng.o: in function `mtk_rng_probe':
mtk-rng.c:(.text+0x84): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/char/hw_random/ks-sa-rng.o: in function `ks_sa_rng_probe':
ks-sa-rng.c:(.text+0x96): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/char/hw_random/npcm-rng.o: in function `npcm_rng_probe':
npcm-rng.c:(.text+0x48): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/char/xillybus/xillybus_of.o:xillybus_of.c:(.text+0x74): more undefined references to `devm_platform_ioremap_resource' follow
s390x-linux-gnu-ld: drivers/mfd/syscon.o: in function `device_node_get_regmap':
syscon.c:(.text+0x108): undefined reference to `of_address_to_resource'
s390x-linux-gnu-ld: syscon.c:(.text+0x162): undefined reference to `ioremap'
s390x-linux-gnu-ld: syscon.c:(.text+0x314): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/mfd/syscon.o: in function `syscon_probe':
syscon.c:(.text+0x5d0): undefined reference to `devm_ioremap'
s390x-linux-gnu-ld: drivers/mfd/stm32-timers.o: in function `stm32_timers_probe':
stm32-timers.c:(.text+0x4de): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/mtd/nand/raw/mxic_nand.o: in function `mxic_nfc_probe':
mxic_nand.c:(.text+0x54): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/mtd/nand/raw/stm32_fmc2_nand.o: in function `stm32_fmc2_nfc_probe':
stm32_fmc2_nand.c:(.text+0x2bc): undefined reference to `of_address_to_resource'
s390x-linux-gnu-ld: stm32_fmc2_nand.c:(.text+0x4a2): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: stm32_fmc2_nand.c:(.text+0x4ee): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: stm32_fmc2_nand.c:(.text+0x52e): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: stm32_fmc2_nand.c:(.text+0x570): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: stm32_fmc2_nand.c:(.text+0x5b6): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/mtd/nand/raw/stm32_fmc2_nand.o:stm32_fmc2_nand.c:(.text+0x5ea): more undefined references to `devm_ioremap_resource' follow
s390x-linux-gnu-ld: drivers/input/serio/sun4i-ps2.o: in function `sun4i_ps2_probe':
sun4i-ps2.c:(.text+0xb4): undefined reference to `ioremap'
s390x-linux-gnu-ld: sun4i-ps2.c:(.text+0x230): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/input/serio/sun4i-ps2.o: in function `sun4i_ps2_remove':
sun4i-ps2.c:(.text+0x2b8): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/input/keyboard/goldfish_events.o: in function `events_probe':
goldfish_events.c:(.text+0x62): undefined reference to `devm_ioremap'
s390x-linux-gnu-ld: drivers/input/keyboard/omap4-keypad.o: in function `omap4_keypad_probe':
>> omap4-keypad.c:(.text+0x15c): undefined reference to `devm_ioremap'
s390x-linux-gnu-ld: drivers/input/keyboard/st-keyscan.o: in function `keyscan_probe':
st-keyscan.c:(.text+0x136): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/power/reset/ocelot-reset.o: in function `ocelot_reset_probe':
ocelot-reset.c:(.text+0x5a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/crypto/atmel-sha.o: in function `atmel_sha_probe':
atmel-sha.c:(.text+0x17a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/crypto/atmel-tdes.o: in function `atmel_tdes_probe':
atmel-tdes.c:(.text+0x17a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/crypto/ccree/cc_driver.o: in function `ccree_probe':
cc_driver.c:(.text+0x36c): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/crypto/ccree/cc_debugfs.o: in function `cc_debugfs_init':
cc_debugfs.c:(.text+0x94): undefined reference to `debugfs_create_regset32'
s390x-linux-gnu-ld: cc_debugfs.c:(.text+0x13a): undefined reference to `debugfs_create_regset32'
s390x-linux-gnu-ld: drivers/crypto/qcom-rng.o: in function `qcom_rng_probe':
qcom-rng.c:(.text+0x60): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/clocksource/timer-of.o: in function `timer_of_init':
timer-of.c:(.init.text+0x50): undefined reference to `of_iomap'
s390x-linux-gnu-ld: timer-of.c:(.init.text+0xec): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/clocksource/timer-of.o: in function `timer_of_cleanup':
timer-of.c:(.init.text+0x2e6): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/clocksource/timer-davinci.o: in function `davinci_timer_register':
timer-davinci.c:(.init.text+0x78): undefined reference to `ioremap'
s390x-linux-gnu-ld: drivers/clocksource/timer-davinci.o: in function `of_davinci_timer_register':
timer-davinci.c:(.init.text+0x2ca): undefined reference to `of_address_to_resource'
s390x-linux-gnu-ld: drivers/clocksource/mxs_timer.o: in function `mxs_timer_init':
mxs_timer.c:(.init.text+0x20): undefined reference to `of_iomap'
s390x-linux-gnu-ld: drivers/clocksource/timer-zevio.o: in function `zevio_timer_add':
timer-zevio.c:(.init.text+0x58): undefined reference to `of_iomap'
s390x-linux-gnu-ld: timer-zevio.c:(.init.text+0xb8): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/clocksource/armv7m_systick.o: in function `system_timer_of_register':
armv7m_systick.c:(.init.text+0x2e): undefined reference to `of_iomap'
s390x-linux-gnu-ld: armv7m_systick.c:(.init.text+0xe2): undefined reference to `iounmap'
s390x-linux-gnu-ld: drivers/mailbox/armada-37xx-rwtm-mailbox.o: in function `armada_37xx_mbox_probe':
armada-37xx-rwtm-mailbox.c:(.text+0x68): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/mailbox/qcom-apcs-ipc-mailbox.o: in function `qcom_apcs_ipc_probe':
qcom-apcs-ipc-mailbox.c:(.text+0x5a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/mailbox/mtk-cmdq-mailbox.o: in function `cmdq_probe':
mtk-cmdq-mailbox.c:(.text+0x7e): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/mailbox/sprd-mailbox.o: in function `sprd_mbox_probe':
sprd-mailbox.c:(.text+0x4e): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: sprd-mailbox.c:(.text+0x6c): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/iio/adc/adi-axi-adc.o: in function `adi_axi_adc_probe':
adi-axi-adc.c:(.text+0x386): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/iio/adc/at91_adc.o: in function `at91_adc_probe':
at91_adc.c:(.text+0x112): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/iio/adc/ingenic-adc.o: in function `ingenic_adc_probe':
ingenic-adc.c:(.text+0xea): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/iio/adc/rcar-gyroadc.o:rcar-gyroadc.c:(.text+0x50): more undefined references to `devm_platform_ioremap_resource' follow
s390x-linux-gnu-ld: drivers/iio/adc/stm32-adc-core.o: in function `stm32_adc_probe':
stm32-adc-core.c:(.text+0x9e): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/iio/adc/stm32-dfsdm-core.o: in function `stm32_dfsdm_probe':
stm32-dfsdm-core.c:(.text+0x29a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/iio/dac/stm32-dac-core.o: in function `stm32_dac_probe':
stm32-dac-core.c:(.text+0x8a): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/nvmem/imx-iim.o: in function `imx_iim_probe':
imx-iim.c:(.text+0x4e): undefined reference to `devm_platform_ioremap_resource'
s390x-linux-gnu-ld: drivers/nvmem/meson-mx-efuse.o: in function `meson_mx_efuse_probe':
meson-mx-efuse.c:(.text+0x6e): undefined reference to `devm_ioremap_resource'
s390x-linux-gnu-ld: drivers/counter/ti-eqep.o: in function `ti_eqep_probe':
ti-eqep.c:(.text+0x48): undefined reference to `devm_platform_ioremap_resource'
Kconfig warnings: (for reference only)
WARNING: unmet direct dependencies detected for MFD_SYSCON
Depends on HAS_IOMEM
Selected by
- MTD_NAND_STM32_FMC2 && MTD && MTD_RAW_NAND && (MACH_STM32MP157 || COMPILE_TEST
- MTD_NAND_MESON && MTD && MTD_RAW_NAND && (ARCH_MESON || COMPILE_TEST
- POWER_RESET_OCELOT_RESET && POWER_RESET && (MSCC_OCELOT || COMPILE_TEST
- INGENIC_TCU_IRQ && (MIPS || COMPILE_TEST
- PHY_BCM_SR_PCIE && OF && (ARCH_BCM_IPROC || COMPILE_TEST
- PHY_HI3660_USB && (ARCH_HISI && ARM64 || COMPILE_TEST
- PHY_HISTB_COMBPHY && (ARCH_HISI && ARM64 || COMPILE_TEST
- PHY_DA8XX_USB && (ARCH_DAVINCI_DA8XX || COMPILE_TEST
WARNING: unmet direct dependencies detected for MFD_STM32_TIMERS
Depends on HAS_IOMEM && (ARCH_STM32 && OF || COMPILE_TEST
Selected by
- STM32_ADC_CORE && IIO && (ARCH_STM32 || COMPILE_TEST && OF && REGULATOR
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
* Sebastian Reichel <sre@kernel.org> [210106 13:44]: > On Wed, Jan 06, 2021 at 02:58:22PM +0200, Tony Lindgren wrote: > > - struct resource *res; > > > > dev_pm_clear_wake_irq(&pdev->dev); > > - > > - free_irq(keypad_data->irq, keypad_data); > > - > > pm_runtime_dont_use_autosuspend(&pdev->dev); > > pm_runtime_disable(&pdev->dev); > > - > > input_unregister_device(keypad_data->input); > > not needed: > > * devm_input_allocate_device - allocate managed input device > * @dev: device owning the input device being created > * > * Returns prepared struct input_dev or %NULL. > * > * Managed input devices do not need to be explicitly unregistered or > * freed as it will be done automatically when owner device unbinds from > * its driver (or binding fails). [...] OK thanks will drop and fix up the reported autobuild warnings and repost. Looks like also the OMAP4_KEYPAD_AUTOIDLE_MS value of 50 is too long, I recently changed it from 30 but now have seen few stuck last pressed keys. Regards, Tony
Hi Tony, On Wed, Jan 06, 2021 at 02:58:22PM +0200, Tony Lindgren wrote: > static int omap4_keypad_remove(struct platform_device *pdev) > { > struct omap4_keypad *keypad_data = platform_get_drvdata(pdev); > - struct resource *res; > > dev_pm_clear_wake_irq(&pdev->dev); > - > - free_irq(keypad_data->irq, keypad_data); > - > pm_runtime_dont_use_autosuspend(&pdev->dev); > pm_runtime_disable(&pdev->dev); I do not quite like that we need to keep this in remove(). I had the patch below for quite some time, could you please try it? Thanks!
* Dmitry Torokhov <dmitry.torokhov@gmail.com> [210110 06:31]: > I do not quite like that we need to keep this in remove(). I had the > patch below for quite some time, could you please try it? Yes seems to work nice :) > Input: omap4-keypad - switch to use managed resources > > From: Dmitry Torokhov <dmitry.torokhov@gmail.com> > > Now that input core supports devres-managed input devices we can clean > up this driver a bit. > > Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com> Tested-by: Tony Lindgren <tony@atomide.com> > --- > drivers/input/keyboard/omap4-keypad.c | 139 +++++++++++++-------------------- > 1 file changed, 55 insertions(+), 84 deletions(-) > > diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c > index b17ac2a295b9..d36774a55a10 100644 > --- a/drivers/input/keyboard/omap4-keypad.c > +++ b/drivers/input/keyboard/omap4-keypad.c > @@ -252,8 +252,14 @@ static int omap4_keypad_check_revision(struct device *dev, > return 0; > } > > +static void omap4_disable_pm(void *d) > +{ > + pm_runtime_disable(d); > +} > + > static int omap4_keypad_probe(struct platform_device *pdev) > { > + struct device *dev = &pdev->dev; > struct omap4_keypad *keypad_data; > struct input_dev *input_dev; > struct resource *res; > @@ -271,33 +277,30 @@ static int omap4_keypad_probe(struct platform_device *pdev) > if (irq < 0) > return irq; > > - keypad_data = kzalloc(sizeof(struct omap4_keypad), GFP_KERNEL); > + keypad_data = devm_kzalloc(dev, sizeof(struct omap4_keypad), > + GFP_KERNEL); > if (!keypad_data) { > - dev_err(&pdev->dev, "keypad_data memory allocation failed\n"); > + dev_err(dev, "keypad_data memory allocation failed\n"); > return -ENOMEM; > } > > keypad_data->irq = irq; > > - error = omap4_keypad_parse_dt(&pdev->dev, keypad_data); > + error = omap4_keypad_parse_dt(dev, keypad_data); > if (error) > - goto err_free_keypad; > + return error; > > - res = request_mem_region(res->start, resource_size(res), pdev->name); > - if (!res) { > - dev_err(&pdev->dev, "can't request mem region\n"); > - error = -EBUSY; > - goto err_free_keypad; > - } > + keypad_data->base = devm_ioremap_resource(dev, res); > + if (IS_ERR(keypad_data->base)) > + return PTR_ERR(keypad_data->base); > > - keypad_data->base = ioremap(res->start, resource_size(res)); > - if (!keypad_data->base) { > - dev_err(&pdev->dev, "can't ioremap mem resource\n"); > - error = -ENOMEM; > - goto err_release_mem; > - } > + pm_runtime_enable(dev); > > - pm_runtime_enable(&pdev->dev); > + error = devm_add_action_or_reset(dev, omap4_disable_pm, dev); > + if (error) { > + dev_err(dev, "unable to register cleanup action\n"); > + return error; > + } > > /* > * Enable clocks for the keypad module so that we can read > @@ -307,27 +310,26 @@ static int omap4_keypad_probe(struct platform_device *pdev) > if (error) { > dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n"); > pm_runtime_put_noidle(&pdev->dev); > - } else { > - error = omap4_keypad_check_revision(&pdev->dev, > - keypad_data); > - if (!error) { > - /* Ensure device does not raise interrupts */ > - omap4_keypad_stop(keypad_data); > - } > - pm_runtime_put_sync(&pdev->dev); > + return error; > + } > + > + error = omap4_keypad_check_revision(&pdev->dev, > + keypad_data); > + if (!error) { > + /* Ensure device does not raise interrupts */ > + omap4_keypad_stop(keypad_data); > } > + > + pm_runtime_put_sync(&pdev->dev); > if (error) > - goto err_pm_disable; > + return error; > > /* input device allocation */ > - keypad_data->input = input_dev = input_allocate_device(); > - if (!input_dev) { > - error = -ENOMEM; > - goto err_pm_disable; > - } > + keypad_data->input = input_dev = devm_input_allocate_device(dev); > + if (!input_dev) > + return -ENOMEM; > > input_dev->name = pdev->name; > - input_dev->dev.parent = &pdev->dev; > input_dev->id.bustype = BUS_HOST; > input_dev->id.vendor = 0x0001; > input_dev->id.product = 0x0001; > @@ -344,84 +346,53 @@ static int omap4_keypad_probe(struct platform_device *pdev) > > keypad_data->row_shift = get_count_order(keypad_data->cols); > max_keys = keypad_data->rows << keypad_data->row_shift; > - keypad_data->keymap = kcalloc(max_keys, > - sizeof(keypad_data->keymap[0]), > - GFP_KERNEL); > + keypad_data->keymap = devm_kcalloc(dev, > + max_keys, > + sizeof(keypad_data->keymap[0]), > + GFP_KERNEL); > if (!keypad_data->keymap) { > - dev_err(&pdev->dev, "Not enough memory for keymap\n"); > - error = -ENOMEM; > - goto err_free_input; > + dev_err(dev, "Not enough memory for keymap\n"); > + return -ENOMEM; > } > > error = matrix_keypad_build_keymap(NULL, NULL, > keypad_data->rows, keypad_data->cols, > keypad_data->keymap, input_dev); > if (error) { > - dev_err(&pdev->dev, "failed to build keymap\n"); > - goto err_free_keymap; > + dev_err(dev, "failed to build keymap\n"); > + return error; > } > > - error = request_threaded_irq(keypad_data->irq, omap4_keypad_irq_handler, > - omap4_keypad_irq_thread_fn, IRQF_ONESHOT, > - "omap4-keypad", keypad_data); > + error = devm_request_threaded_irq(dev, keypad_data->irq, > + omap4_keypad_irq_handler, > + omap4_keypad_irq_thread_fn, > + IRQF_ONESHOT, > + "omap4-keypad", keypad_data); > if (error) { > - dev_err(&pdev->dev, "failed to register interrupt\n"); > - goto err_free_keymap; > + dev_err(dev, "failed to register interrupt\n"); > + return error; > } > > error = input_register_device(keypad_data->input); > - if (error < 0) { > - dev_err(&pdev->dev, "failed to register input device\n"); > - goto err_free_irq; > + if (error) { > + dev_err(dev, "failed to register input device\n"); > + return error; > } > > - device_init_wakeup(&pdev->dev, true); > - error = dev_pm_set_wake_irq(&pdev->dev, keypad_data->irq); > + device_init_wakeup(dev, true); > + error = dev_pm_set_wake_irq(dev, keypad_data->irq); > if (error) > - dev_warn(&pdev->dev, > - "failed to set up wakeup irq: %d\n", error); > + dev_warn(dev, "failed to set up wakeup irq: %d\n", error); > > platform_set_drvdata(pdev, keypad_data); > > return 0; > - > -err_free_irq: > - free_irq(keypad_data->irq, keypad_data); > -err_free_keymap: > - kfree(keypad_data->keymap); > -err_free_input: > - input_free_device(input_dev); > -err_pm_disable: > - pm_runtime_disable(&pdev->dev); > - iounmap(keypad_data->base); > -err_release_mem: > - release_mem_region(res->start, resource_size(res)); > -err_free_keypad: > - kfree(keypad_data); > - return error; > } > > static int omap4_keypad_remove(struct platform_device *pdev) > { > - struct omap4_keypad *keypad_data = platform_get_drvdata(pdev); > - struct resource *res; > - > dev_pm_clear_wake_irq(&pdev->dev); > > - free_irq(keypad_data->irq, keypad_data); > - > - pm_runtime_disable(&pdev->dev); > - > - input_unregister_device(keypad_data->input); > - > - iounmap(keypad_data->base); > - > - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); > - release_mem_region(res->start, resource_size(res)); > - > - kfree(keypad_data->keymap); > - kfree(keypad_data); > - > return 0; > } >
diff --git a/drivers/input/keyboard/omap4-keypad.c b/drivers/input/keyboard/omap4-keypad.c --- a/drivers/input/keyboard/omap4-keypad.c +++ b/drivers/input/keyboard/omap4-keypad.c @@ -341,7 +341,8 @@ static int omap4_keypad_probe(struct platform_device *pdev) if (irq < 0) return irq; - keypad_data = kzalloc(sizeof(struct omap4_keypad), GFP_KERNEL); + keypad_data = devm_kzalloc(&pdev->dev, sizeof(struct omap4_keypad), + GFP_KERNEL); if (!keypad_data) { dev_err(&pdev->dev, "keypad_data memory allocation failed\n"); return -ENOMEM; @@ -352,20 +353,20 @@ static int omap4_keypad_probe(struct platform_device *pdev) error = omap4_keypad_parse_dt(&pdev->dev, keypad_data); if (error) - goto err_free_keypad; + return error; - res = request_mem_region(res->start, resource_size(res), pdev->name); + res = devm_request_mem_region(&pdev->dev, res->start, + resource_size(res), pdev->name); if (!res) { dev_err(&pdev->dev, "can't request mem region\n"); - error = -EBUSY; - goto err_free_keypad; + return -EBUSY; } - keypad_data->base = ioremap(res->start, resource_size(res)); + keypad_data->base = devm_ioremap(&pdev->dev, res->start, + resource_size(res)); if (!keypad_data->base) { dev_err(&pdev->dev, "can't ioremap mem resource\n"); - error = -ENOMEM; - goto err_release_mem; + return -ENOMEM; } pm_runtime_use_autosuspend(&pdev->dev); @@ -379,20 +380,19 @@ static int omap4_keypad_probe(struct platform_device *pdev) error = pm_runtime_get_sync(&pdev->dev); if (error) { dev_err(&pdev->dev, "pm_runtime_get_sync() failed\n"); - pm_runtime_put_noidle(&pdev->dev); - } else { - error = omap4_keypad_check_revision(&pdev->dev, - keypad_data); - if (!error) { - /* Ensure device does not raise interrupts */ - omap4_keypad_stop(keypad_data); - } + return error; } + + error = omap4_keypad_check_revision(&pdev->dev, + keypad_data); if (error) goto err_pm_disable; + /* Ensure device does not raise interrupts */ + omap4_keypad_stop(keypad_data); + /* input device allocation */ - keypad_data->input = input_dev = input_allocate_device(); + keypad_data->input = input_dev = devm_input_allocate_device(&pdev->dev); if (!input_dev) { error = -ENOMEM; goto err_pm_disable; @@ -416,13 +416,13 @@ static int omap4_keypad_probe(struct platform_device *pdev) keypad_data->row_shift = get_count_order(keypad_data->cols); max_keys = keypad_data->rows << keypad_data->row_shift; - keypad_data->keymap = kcalloc(max_keys, - sizeof(keypad_data->keymap[0]), - GFP_KERNEL); + keypad_data->keymap = devm_kcalloc(&pdev->dev, max_keys, + sizeof(keypad_data->keymap[0]), + GFP_KERNEL); if (!keypad_data->keymap) { dev_err(&pdev->dev, "Not enough memory for keymap\n"); error = -ENOMEM; - goto err_free_input; + goto err_pm_disable; } error = matrix_keypad_build_keymap(NULL, NULL, @@ -430,21 +430,23 @@ static int omap4_keypad_probe(struct platform_device *pdev) keypad_data->keymap, input_dev); if (error) { dev_err(&pdev->dev, "failed to build keymap\n"); - goto err_free_keymap; + goto err_pm_disable; } - error = request_threaded_irq(keypad_data->irq, omap4_keypad_irq_handler, - omap4_keypad_irq_thread_fn, IRQF_ONESHOT, - "omap4-keypad", keypad_data); + error = devm_request_threaded_irq(&pdev->dev, keypad_data->irq, + omap4_keypad_irq_handler, + omap4_keypad_irq_thread_fn, + IRQF_ONESHOT, "omap4-keypad", + keypad_data); if (error) { dev_err(&pdev->dev, "failed to register interrupt\n"); - goto err_free_keymap; + goto err_pm_disable; } error = input_register_device(keypad_data->input); if (error < 0) { dev_err(&pdev->dev, "failed to register input device\n"); - goto err_free_irq; + goto err_pm_disable; } device_init_wakeup(&pdev->dev, true); @@ -460,46 +462,23 @@ static int omap4_keypad_probe(struct platform_device *pdev) return 0; -err_free_irq: - free_irq(keypad_data->irq, keypad_data); -err_free_keymap: - kfree(keypad_data->keymap); -err_free_input: - input_free_device(input_dev); err_pm_disable: pm_runtime_put_sync(&pdev->dev); pm_runtime_dont_use_autosuspend(&pdev->dev); pm_runtime_disable(&pdev->dev); - iounmap(keypad_data->base); -err_release_mem: - release_mem_region(res->start, resource_size(res)); -err_free_keypad: - kfree(keypad_data); + return error; } static int omap4_keypad_remove(struct platform_device *pdev) { struct omap4_keypad *keypad_data = platform_get_drvdata(pdev); - struct resource *res; dev_pm_clear_wake_irq(&pdev->dev); - - free_irq(keypad_data->irq, keypad_data); - pm_runtime_dont_use_autosuspend(&pdev->dev); pm_runtime_disable(&pdev->dev); - input_unregister_device(keypad_data->input); - iounmap(keypad_data->base); - - res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - release_mem_region(res->start, resource_size(res)); - - kfree(keypad_data->keymap); - kfree(keypad_data); - return 0; }
Simplify probe with devm. Cc: Arthur Demchenkov <spinal.by@gmail.com> Cc: Carl Philipp Klemm <philipp@uvos.xyz> Cc: Merlijn Wajer <merlijn@wizzup.org> Cc: Pavel Machek <pavel@ucw.cz> Cc: ruleh <ruleh@gmx.de> Cc: Sebastian Reichel <sre@kernel.org> Signed-off-by: Tony Lindgren <tony@atomide.com> --- drivers/input/keyboard/omap4-keypad.c | 81 ++++++++++----------------- 1 file changed, 30 insertions(+), 51 deletions(-)