Patch "pinctrl/amd: save pin registers over suspend/resume" has been added to the 4.4-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
pinctrl/amd: save pin registers over suspend/resume
to the 4.4-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:
pinctrl-amd-save-pin-registers-over-suspend-resume.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
79d2c8bede2c93f9432d7da0bc2f76a195c90fc0Mon Sep 17 00:00:00 2001
From: Daniel Drake <[email protected]>
Date: Mon, 11 Sep 2017 14:11:56 +0800
Subject: pinctrl/amd: save pin registers over suspend/resume
From: Daniel Drake <[email protected]>
commit 79d2c8bede2c93f9432d7da0bc2f76a195c90fc0 upstream.
The touchpad in the Asus laptop models X505BA/BP and X542BA/BP is unresponsive after suspend/resume. The following error appears during resume:
i2c_hid i2c-ELAN1300:00: failed to reset device.
The problem here is that i2c_hid does not notice the interrupt being generated at this point, because the GPIO is no longer configured for interrupts.
Fix this by saving pinctrl-amd pin registers during suspend and restoring them at resume time.
Based on code from pinctrl-intel.
--- drivers/pinctrl/pinctrl-amd.c | 75 ++++++++++++++++++++++++++++++++++++++++++ drivers/pinctrl/pinctrl-amd.h | 1 2 files changed, 76 insertions(+)
drivers/pinctrl/pinctrl-amd.c +75 -0
@@ -32,6 +32,7 @@#include <linux/pinctrl/pinconf.h> #include <linux/pinctrl/pinconf-generic.h> +#include "core.h" #include "pinctrl-utils.h" #include "pinctrl-amd.h"
@@ -708,6 +709,69 @@ static const struct pinconf_ops amd_pinc .pin_config_group_set = amd_pinconf_group_set, }; +#ifdef CONFIG_PM_SLEEP +static bool amd_gpio_should_save (struct amd_gpio *gpio_dev,unsigned int pin) +{ +const struct pin_desc *pd =pin_desc_get (gpio_dev->pctrl, pin); + +if (!pd) +return false; + +/* +* Only restore the pin if it is actually in use by the kernel (or +* by userspace). +*/ +if (pd->mux_owner || pd->gpio_owner || +gpiochip_line_is_irq (&gpio_dev->gc, pin)) +return true; + +return false; +} + +int amd_gpio_suspend (struct device *dev) +{ +struct platform_device *pdev =to_platform_device (dev); +struct amd_gpio *gpio_dev =platform_get_drvdata (pdev); +struct pinctrl_desc *desc = gpio_dev->pctrl->desc; +int i; + +for (i =0 ; i < desc->npins; i++) { +int pin = desc->pins[i].number; + +if (!amd_gpio_should_save (gpio_dev, pin)) +continue ; + + gpio_dev->saved_regs[i] =readl (gpio_dev->base + pin*4 ); + } + +return 0 ; +} + +int amd_gpio_resume (struct device *dev) +{ +struct platform_device *pdev =to_platform_device (dev); +struct amd_gpio *gpio_dev =platform_get_drvdata (pdev); +struct pinctrl_desc *desc = gpio_dev->pctrl->desc; +int i; + +for (i =0 ; i < desc->npins; i++) { +int pin = desc->pins[i].number; + +if (!amd_gpio_should_save (gpio_dev, pin)) +continue ; + +writel (gpio_dev->saved_regs[i], gpio_dev->base + pin*4 ); + } + +return 0 ; +} + +static const struct dev_pm_ops amd_gpio_pm_ops = { +SET_LATE_SYSTEM_SLEEP_PM_OPS (amd_gpio_suspend, + amd_gpio_resume) +}; +#endif +static struct pinctrl_desc amd_pinctrl_desc = { .pins = kerncz_pins, .npins =ARRAY_SIZE (kerncz_pins),
@@ -747,6 +811,14 @@ static int amd_gpio_probe(struct platforreturn -EINVAL ; } +#ifdef CONFIG_PM_SLEEP + gpio_dev->saved_regs =devm_kcalloc (&pdev->dev, amd_pinctrl_desc.npins, +sizeof (*gpio_dev->saved_regs), +GFP_KERNEL ); +if (!gpio_dev->saved_regs) +return -ENOMEM ; +#endif + gpio_dev->pdev = pdev; gpio_dev->gc.direction_input = amd_gpio_direction_input; gpio_dev->gc.direction_output = amd_gpio_direction_output;
@@ -837,6 +909,9 @@ static struct platform_driver amd_gpio_d .driver = { .name = "amd_gpio", .acpi_match_table = ACPI_PTR(amd_gpio_acpi_match), +#ifdef CONFIG_PM_SLEEP + .pm = &amd_gpio_pm_ops, +#endif }, .probe = amd_gpio_probe, .remove = amd_gpio_remove,
drivers/pinctrl/pinctrl-amd.h +1 -0
@@ -95,6 +95,7 @@ struct amd_gpio {struct gpio_chip gc;struct resource *res;struct platform_device *pdev; +u32 *saved_regs; };/* KERNCZ configuration*/
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/pinctrl-amd-save-pin-registers-over-suspend-resume.patch
Greg KH
maintainerQuoted 7 lines · On Thu, Sep 21, 2017 at 01:01:17PM +0200, [email protected] wrote:
This is a note to let you know that I've just added the patch titled
pinctrl/amd: save pin registers over suspend/resume
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
Oops, no, it broke the build :(