This is a note to let you know that I've just added the patch titled Input: gpio_keys - add support for GPIO descriptors to the 4.9-stable tree which can be found at: http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary The filename of the patch is: input-gpio_keys-add-support-for-gpio-descriptors.patch and it can be found in the queue-4.9 subdirectory. If you, or anyone else, feels it should not be added to the stable tree, please let <stable@xxxxxxxxxxxxxxx> know about it. >From foo@baz Mon Apr 10 17:43:56 CEST 2017 From: alexander.levin@xxxxxxxxxxx Date: Tue, 4 Apr 2017 19:32:22 +0000 Subject: Input: gpio_keys - add support for GPIO descriptors To: "gregkh@xxxxxxxxxxxxxxxxxxx" <gregkh@xxxxxxxxxxxxxxxxxxx> Cc: "stable@xxxxxxxxxxxxxxx" <stable@xxxxxxxxxxxxxxx> Message-ID: <20170404193158.19041-56-alexander.levin@xxxxxxxxxxx> From: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> [ Upstream commit 5feeca3c1e39c01f9ef5abc94dea94021ccf94fc ] GPIO descriptors are the preferred way over legacy GPIO numbers nowadays. Convert the driver to use GPIO descriptors internally but still allow passing legacy GPIO numbers from platform data to support existing platforms. Based on commits 633a21d80b4a2cd6 ("input: gpio_keys_polled: Add support for GPIO descriptors") and 1ae5ddb6f8837558 ("Input: gpio_keys_polled - request GPIO pin as input."). Signed-off-by: Geert Uytterhoeven <geert+renesas@xxxxxxxxx> Reviewed-by: Linus Walleij <linus.walleij@xxxxxxxxxx> Tested-by: Mika Westerberg <mika.westerberg@xxxxxxxxxxxxxxx> Signed-off-by: Dmitry Torokhov <dmitry.torokhov@xxxxxxxxx> Signed-off-by: Sasha Levin <alexander.levin@xxxxxxxxxxx> Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- drivers/input/keyboard/gpio_keys.c | 37 ++++++++++++++++++++++++++----------- 1 file changed, 26 insertions(+), 11 deletions(-) --- a/drivers/input/keyboard/gpio_keys.c +++ b/drivers/input/keyboard/gpio_keys.c @@ -26,6 +26,7 @@ #include <linux/gpio_keys.h> #include <linux/workqueue.h> #include <linux/gpio.h> +#include <linux/gpio/consumer.h> #include <linux/of.h> #include <linux/of_platform.h> #include <linux/of_gpio.h> @@ -35,6 +36,7 @@ struct gpio_button_data { const struct gpio_keys_button *button; struct input_dev *input; + struct gpio_desc *gpiod; struct timer_list release_timer; unsigned int release_delay; /* in msecs, for IRQ-only buttons */ @@ -140,7 +142,7 @@ static void gpio_keys_disable_button(str */ disable_irq(bdata->irq); - if (gpio_is_valid(bdata->button->gpio)) + if (bdata->gpiod) cancel_delayed_work_sync(&bdata->work); else del_timer_sync(&bdata->release_timer); @@ -358,19 +360,20 @@ static void gpio_keys_gpio_report_event( const struct gpio_keys_button *button = bdata->button; struct input_dev *input = bdata->input; unsigned int type = button->type ?: EV_KEY; - int state = gpio_get_value_cansleep(button->gpio); + int state; + state = gpiod_get_value_cansleep(bdata->gpiod); if (state < 0) { - dev_err(input->dev.parent, "failed to get gpio state\n"); + dev_err(input->dev.parent, + "failed to get gpio state: %d\n", state); return; } - state = (state ? 1 : 0) ^ button->active_low; if (type == EV_ABS) { if (state) input_event(input, type, button->code, button->value); } else { - input_event(input, type, button->code, !!state); + input_event(input, type, button->code, state); } input_sync(input); } @@ -456,7 +459,7 @@ static void gpio_keys_quiesce_key(void * { struct gpio_button_data *bdata = data; - if (gpio_is_valid(bdata->button->gpio)) + if (bdata->gpiod) cancel_delayed_work_sync(&bdata->work); else del_timer_sync(&bdata->release_timer); @@ -478,18 +481,30 @@ static int gpio_keys_setup_key(struct pl bdata->button = button; spin_lock_init(&bdata->lock); + /* + * Legacy GPIO number, so request the GPIO here and + * convert it to descriptor. + */ if (gpio_is_valid(button->gpio)) { + unsigned flags = GPIOF_IN; + + if (button->active_low) + flags |= GPIOF_ACTIVE_LOW; - error = devm_gpio_request_one(&pdev->dev, button->gpio, - GPIOF_IN, desc); + error = devm_gpio_request_one(&pdev->dev, button->gpio, flags, + desc); if (error < 0) { dev_err(dev, "Failed to request GPIO %d, error %d\n", button->gpio, error); return error; } + bdata->gpiod = gpio_to_desc(button->gpio); + if (!bdata->gpiod) + return -EINVAL; + if (button->debounce_interval) { - error = gpio_set_debounce(button->gpio, + error = gpiod_set_debounce(bdata->gpiod, button->debounce_interval * 1000); /* use timer if gpiolib doesn't provide debounce */ if (error < 0) @@ -500,7 +515,7 @@ static int gpio_keys_setup_key(struct pl if (button->irq) { bdata->irq = button->irq; } else { - irq = gpio_to_irq(button->gpio); + irq = gpiod_to_irq(bdata->gpiod); if (irq < 0) { error = irq; dev_err(dev, @@ -575,7 +590,7 @@ static void gpio_keys_report_state(struc for (i = 0; i < ddata->pdata->nbuttons; i++) { struct gpio_button_data *bdata = &ddata->data[i]; - if (gpio_is_valid(bdata->button->gpio)) + if (bdata->gpiod) gpio_keys_gpio_report_event(bdata); } input_sync(input); Patches currently in stable-queue which might be from gregkh@xxxxxxxxxxxxxxxxxxx are queue-4.9/staging-android-ashmem-lseek-failed-due-to-no-fmode_lseek.patch queue-4.9/arm64-dts-hisi-fix-hip06-sas-am-max-trans-quirk.patch queue-4.9/scsi-ufs-introduce-ufshcd_quirk_prdt_byte_gran-quirk.patch queue-4.9/acpi-button-change-default-behavior-to-lid_init_state-open.patch queue-4.9/usb-musb-da8xx-fix-host-mode-suspend.patch queue-4.9/drm-i915-fix-intel_bdw_ids-definition.patch queue-4.9/sysfs-be-careful-of-error-returns-from-ops-show.patch queue-4.9/mips-flush-wrong-invalid-ftlb-entry-for-huge-page.patch queue-4.9/mips-end-spinlocks-with-.insn.patch queue-4.9/mmc-sdhci-of-esdhc-remove-default-broken-cd-for-arm.patch queue-4.9/kvm-arm-arm64-fix-locking-for-kvm_free_stage2_pgd.patch queue-4.9/powerpc-disable-hfscr-if-tm-is-not-supported.patch queue-4.9/metag-usercopy-add-missing-fixups.patch queue-4.9/nios2-reserve-boot-memory-for-device-tree.patch queue-4.9/alsa-usb-audio-add-implicit-fb-quirk-for-axe-fx-ii.patch queue-4.9/svcauth_gss-close-connection-when-dropping-an-incoming-message.patch queue-4.9/platform-x86-asus-wmi-detect-quirk_no_rfkill-from-the-dsdt.patch queue-4.9/ring-buffer-fix-return-value-check-in-test_ringbuffer.patch queue-4.9/ppdev-check-before-attaching-port.patch queue-4.9/firmware-qcom-scm-fix-interrupted-scm-calls.patch queue-4.9/pci-add-broadcom-northstar2-paxc-quirk-for-device-class-and-mpss.patch queue-4.9/powerpc-64-fix-flush_-d-i-cache_range-called-from-modules.patch queue-4.9/drm-sun4i-tcon-move-soc-specific-quirks-to-a-dt-matched-data-structure.patch queue-4.9/acpi-gpio-do-not-fall-back-to-parsing-_crs-when-we-get-a-deferral.patch queue-4.9/pci-explain-arm64-acpi-mcfg-quirk-kconfig-and-build-strategy.patch queue-4.9/metag-usercopy-add-early-abort-to-copy_to_user.patch queue-4.9/powerpc-crypto-crc32c-vpmsum-fix-missing-preempt_disable.patch queue-4.9/hid-multitouch-do-not-retrieve-all-reports-for-all-devices.patch queue-4.9/arm-arm64-kvm-take-mmap_sem-in-kvm_arch_prepare_memory_region.patch queue-4.9/arm-dts-stih407-family-set-snps-dis_u3_susphy_quirk.patch queue-4.9/rx51-broken-build.patch queue-4.9/mips-ralink-fix-typos-in-rt3883-pinctrl.patch queue-4.9/cfg80211-check-rdev-resume-callback-only-for-registered-wiphy.patch queue-4.9/metag-usercopy-set-flags-before-addz.patch queue-4.9/asoc-intel-bytct_rt5640-change-default-capture-settings.patch queue-4.9/metag-usercopy-fix-src-fixup-in-from-user-rapf-loops.patch queue-4.9/hid-asus-fix-keyboard-support.patch queue-4.9/drm-sun4i-add-compatible-string-for-a31-a31s-tcon-timing-controller.patch queue-4.9/arm64-pci-manage-controller-specific-data-on-per-controller-basis.patch queue-4.9/platform-x86-acer-wmi-only-supports-amw0_guid1-on-acer-family.patch queue-4.9/xtensa-make-__pa-work-with-uncached-kseg-addresses.patch queue-4.9/asoc-codecs-rt5670-add-quirk-for-lenovo-thinkpad-10.patch queue-4.9/clk-lpc32xx-add-a-quirk-for-pwm-and-ms-clock-dividers.patch queue-4.9/powerpc-mm-add-missing-global-tlb-invalidate-if-cxl-is-active.patch queue-4.9/tools-power-turbostat-dump-atom-p-states-correctly.patch queue-4.9/clocksource-drivers-arm_arch_timer-don-t-assume-clock-runs-in-suspend.patch queue-4.9/asoc-intel-cht_bsw_rt5645-add-baytrail-mclk-support.patch queue-4.9/watchdog-s3c2410-fix-infinite-interrupt-in-soft-mode.patch queue-4.9/arm64-pci-search-acpi-namespace-to-ensure-ecam-space-is-reserved.patch queue-4.9/pci-add-mcfg-quirks-for-cavium-thunderx-pass1.x-host-controller.patch queue-4.9/drm-i915-actually-drive-the-bdw-reserved-ids.patch queue-4.9/net-mlx4_core-use-device-id-defines.patch queue-4.9/scsi-ufs-introduce-a-new-ufshcd_statea-ufshcd_state_eh_scheduled.patch queue-4.9/hid-sensor-hub-add-quirk-for-microsoft-surface-3.patch queue-4.9/serial-8250_omap-add-omap_dma_tx_kick-quirk-for-am437x.patch queue-4.9/brcmfmac-use-local-iftype-avoiding-use-after-free-of-virtual-interface.patch queue-4.9/pci-acpi-check-for-platform-specific-mcfg-quirks.patch queue-4.9/drm-vmwgfx-remove-getparam-error-message.patch queue-4.9/mac80211-unconditionally-start-new-netdev-queues-with-itxq-support.patch queue-4.9/dm-verity-fec-fix-bufio-leaks.patch queue-4.9/x86-intel_idle-add-cpu-model-0x4a-atom-z34xx-series.patch queue-4.9/hid-wacom-don-t-apply-generic-settings-to-old-devices.patch queue-4.9/hid-sensor-hub-add-quirk-for-microchip-mm7150.patch queue-4.9/arm-kernel-add-smc-structure-parameter.patch queue-4.9/usb-storage-add-ignore-residue-quirk-for-initio-inic-3619.patch queue-4.9/drm-vmwgfx-type-check-lookups-of-fence-objects.patch queue-4.9/hid-asus-add-i2c-touchpad-support.patch queue-4.9/nvme-simplify-stripe-quirk.patch queue-4.9/drm-sun4i-add-compatible-strings-for-a31-a31s-display-pipelines.patch queue-4.9/dm-verity-fec-limit-error-correction-recursion.patch queue-4.9/drm-edid-constify-edid-quirk-list.patch queue-4.9/s390-uaccess-get_user-should-zero-on-failure-again.patch queue-4.9/dm-raid-fix-null-pointer-dereference-for-raid1-without-bitmap.patch queue-4.9/random-use-chacha20-for-get_random_int-long.patch queue-4.9/ptrace-fix-ptrace_listen-race-corrupting-task-state.patch queue-4.9/drm-vmwgfx-fix-integer-overflow-in-vmw_surface_define_ioctl.patch queue-4.9/pci-sort-the-list-of-devices-with-d3-delay-quirk-by-id.patch queue-4.9/pci-add-mcfg-quirks-for-x-gene-host-controller.patch queue-4.9/hid-i2c-hid-add-a-simple-quirk-to-fix-device-defects.patch queue-4.9/drm-msm-adreno-move-function-declarations-to-header-file.patch queue-4.9/s390-decompressor-fix-initrd-corruption-caused-by-bss-clear.patch queue-4.9/pci-disable-msi-for-hisilicon-hip06-hip07-root-ports.patch queue-4.9/mips-check-tlb-before-handle_ri_rdhwr-for-loongson-3.patch queue-4.9/pci-add-acs-quirk-for-intel-union-point.patch queue-4.9/asoc-intel-baytrail-add-quirk-for-lenovo-thinkpad-10.patch queue-4.9/can-flexcan-add-quirk-flexcan_quirk_enable_eacen_rrs.patch queue-4.9/metag-usercopy-drop-unused-macros.patch queue-4.9/pci-expand-vpd-access-disabled-quirk-message.patch queue-4.9/drm-i915-more-.is_mobile-cleanups-for-bdw.patch queue-4.9/hid-multitouch-enable-the-surface-4-type-cover-pro-jp-to-report-multitouch-data.patch queue-4.9/iio-bmg160-reset-chip-when-probing.patch queue-4.9/orangefs-move-features-validation-to-fix-filesystem-hang.patch queue-4.9/arm64-mm-unaligned-access-by-user-land-should-be-received-as-sigbus.patch queue-4.9/powerpc-don-t-try-to-fix-up-misaligned-load-with-reservation-instructions.patch queue-4.9/usb-chipidea-msm-rely-on-core-to-override-ahbburst.patch queue-4.9/scsi-ufs-refactor-device-descriptor-reading.patch queue-4.9/asoc-intel-bytcr_rt5640-quirks-for-insyde-devices.patch queue-4.9/mips-lantiq-fix-missing-xbar-kernel-panic.patch queue-4.9/metag-usercopy-zero-rest-of-buffer-from-copy_from_user.patch queue-4.9/xfs-honor-falloc_fl_keep_size-when-punching-ends-of-files.patch queue-4.9/hid-multitouch-enable-the-surface-3-type-cover-to-report-multitouch-data.patch queue-4.9/scsi-ufs-issue-link-starup-2-times-if-device-isn-t-active.patch queue-4.9/asoc-rt5670-add-missing-10ec5072-acpi-id.patch queue-4.9/metag-usercopy-fix-alignment-error-checking.patch queue-4.9/x86-reboot-quirks-add-asus-eeebook-x205ta-reboot-quirk.patch queue-4.9/input-gpio_keys-add-support-for-gpio-descriptors.patch queue-4.9/pci-xgene-fix-double-free-on-init-error.patch queue-4.9/acpi-save-nvs-memory-for-lenovo-g50-45.patch queue-4.9/asoc-intel-cht_bsw_rt5645-harden-acpi-device-detection.patch queue-4.9/sata-ahci-da850-implement-a-workaround-for-the-softreset-quirk.patch queue-4.9/reset-treeid-to-zero-on-smb2-tree_connect.patch queue-4.9/pci-add-acs-quirk-for-qualcomm-qdf2400-and-qdf2432.patch queue-4.9/tools-power-turbostat-decode-baytrail-cc6-and-mc6-demotion-configuration.patch queue-4.9/arm-davinci-pm-support-da8xx-dt-platforms.patch queue-4.9/documentation-stable-kernel-rules-fix-stable-tag-format.patch queue-4.9/drm-mga-remove-device_is_agp-callback.patch queue-4.9/usb-host-xhci-plat-enable-broken_ped-quirk-if-platform-requested.patch queue-4.9/mm-mempolicy.c-fix-error-handling-in-set_mempolicy-and-mbind.patch queue-4.9/pci-add-mcfg-quirks-for-qualcomm-qdf2432-host-controller.patch queue-4.9/amd-xgbe-prepare-for-working-with-more-than-one-type-of-phy.patch queue-4.9/arm-arm64-kvm-take-mmap_sem-in-stage2_unmap_vm.patch queue-4.9/mm-page_alloc.c-fix-print-order-in-show_free_areas.patch queue-4.9/usb-dwc3-host-pass-quirk-broken-port-ped-property-for-known-broken-revisions.patch queue-4.9/hid-usbhid-add-quirk-for-the-futaba-tosd-5711bb-vfd.patch queue-4.9/mmc-sdhci-msm-enable-few-quirks.patch queue-4.9/hid-usbhid-add-quirk-for-mayflash-dragonrise-dolphinbar.patch queue-4.9/arm-smccc-update-hvc-comment-to-describe-new-quirk-parameter.patch queue-4.9/hid-usbhid-add-quirks-for-mayflash-dragonrise-gamecube-and-ps3-adapters.patch queue-4.9/pci-thunder-pem-factor-out-resource-lookup.patch queue-4.9/pci-acpi-extend-pci_mcfg_lookup-to-return-ecam-config-accessors.patch queue-4.9/mips-c-r4k-fix-loongson-3-s-vcache-scache-waysize-calculation.patch queue-4.9/platform-x86-asus-wmi-set-specified-xusb2pr-value-for-x550lb.patch queue-4.9/drm-vmwgfx-avoid-calling-vzalloc-with-a-0-size-in-vmw_get_cap_3d_ioctl.patch queue-4.9/usb-xhci-add-quirk-flag-for-broken-ped-bits.patch queue-4.9/scsi-ufs-ensure-that-host-pa_tactivate-is-higher-than-device.patch queue-4.9/mips-force-o32-fp64-support-on-32bit-mips64r6-kernels.patch queue-4.9/arm-davinci-add-skeleton-for-pdata-quirks.patch queue-4.9/usb-dwc3-gadget-delay-unmap-of-bounced-requests.patch queue-4.9/x86-reboot-quirks-fix-typo-in-asus-eeebook-x205ta-reboot-quirk.patch queue-4.9/mips-add-mips_cpu_ftlb-for-loongson-3a-r2.patch queue-4.9/alsa-usb-audio-add-native-dsd-support-for-teac-501-503-dac.patch queue-4.9/kbuild-use-cc-disable-warning-consistently-for-maybe-uninitialized.patch queue-4.9/arm-omap2-fix-init-for-multiple-quirks-for-the-same-soc.patch queue-4.9/pci-add-mcfg-quirks-for-hisilicon-hip05-06-07-host-controllers.patch queue-4.9/hid-microsoft-add-surface-4-type-cover-pro-4-not-jp-versions.patch queue-4.9/ppdev-fix-registering-same-device-name.patch queue-4.9/pci-add-mcfg-quirks-for-cavium-thunderx-pass2.x-host-controller.patch queue-4.9/x86-reboot-quirks-add-asus-eeebook-x205ta-w-reboot-quirk.patch queue-4.9/acpi-sysfs-provide-quirk-mechanism-to-prevent-gpe-flooding.patch queue-4.9/scsi-ufs-add-quirk-to-increase-host-pa_saveconfigtime.patch queue-4.9/drm-ttm-drm-vmwgfx-relax-permission-checking-when-opening-surfaces.patch queue-4.9/arm64-pci-add-local-struct-device-pointers.patch queue-4.9/drm-vmwgfx-null-pointer-dereference-in-vmw_surface_define_ioctl.patch queue-4.9/asoc-sun4i-i2s-add-quirks-to-handle-a31-compatible.patch