Message ID | 20230206141558.20916-1-andriy.shevchenko@linux.intel.com |
---|---|
State | Accepted |
Commit | a8520be3ffef3d25b53bf171a7ebe17ee0154175 |
Headers | show |
Series | [v1,1/1] pinctrl: intel: Restore the pins that used to be in Direct IRQ mode | expand |
On Mon, Feb 6, 2023 at 3:16 PM Andy Shevchenko <andriy.shevchenko@linux.intel.com> wrote: > If the firmware mangled the register contents too much, > check the saved value for the Direct IRQ mode. If it > matches, we will restore the pin state. > > Reported-by: Jim Minter <jimminter@microsoft.com> > Fixes: 6989ea4881c8 ("pinctrl: intel: Save and restore pins in "direct IRQ" mode") > Tested-by: Jim Minter <jimminter@microsoft.com> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Patch applied for fixes. Yours, Linus Walleij
On Mon, Feb 6, 2023 at 3:16 PM Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> wrote: > If the firmware mangled the register contents too much, > check the saved value for the Direct IRQ mode. If it > matches, we will restore the pin state. > > Reported-by: Jim Minter <jimminter@xxxxxxxxxxxxx> > Fixes: 6989ea4881c8 ("pinctrl: intel: Save and restore pins in "direct IRQ" mode") > Tested-by: Jim Minter <jimminter@xxxxxxxxxxxxx> > Signed-off-by: Andy Shevchenko <andriy.shevchenko@xxxxxxxxxxxxxxx> > --- > > Jim, this is a bit simplified version than what you tested. But it shouldn't > be a functional changes. Anyway, it would be nice if you have a chance to give > this a try. Andy, I retested this simplified patch and it worked fine for me. Many thanks, Jim
diff --git a/drivers/pinctrl/intel/pinctrl-intel.c b/drivers/pinctrl/intel/pinctrl-intel.c index cc3aaba24188..e49f271de936 100644 --- a/drivers/pinctrl/intel/pinctrl-intel.c +++ b/drivers/pinctrl/intel/pinctrl-intel.c @@ -1709,6 +1709,12 @@ const struct intel_pinctrl_soc_data *intel_pinctrl_get_soc_data(struct platform_ EXPORT_SYMBOL_GPL(intel_pinctrl_get_soc_data); #ifdef CONFIG_PM_SLEEP +static bool __intel_gpio_is_direct_irq(u32 value) +{ + return (value & PADCFG0_GPIROUTIOXAPIC) && (value & PADCFG0_GPIOTXDIS) && + (__intel_gpio_get_gpio_mode(value) == PADCFG0_PMODE_GPIO); +} + static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int pin) { const struct pin_desc *pd = pin_desc_get(pctrl->pctldev, pin); @@ -1742,8 +1748,7 @@ static bool intel_pinctrl_should_save(struct intel_pinctrl *pctrl, unsigned int * See https://bugzilla.kernel.org/show_bug.cgi?id=214749. */ value = readl(intel_get_padcfg(pctrl, pin, PADCFG0)); - if ((value & PADCFG0_GPIROUTIOXAPIC) && (value & PADCFG0_GPIOTXDIS) && - (__intel_gpio_get_gpio_mode(value) == PADCFG0_PMODE_GPIO)) + if (__intel_gpio_is_direct_irq(value)) return true; return false; @@ -1873,7 +1878,12 @@ int intel_pinctrl_resume_noirq(struct device *dev) for (i = 0; i < pctrl->soc->npins; i++) { const struct pinctrl_pin_desc *desc = &pctrl->soc->pins[i]; - if (!intel_pinctrl_should_save(pctrl, desc->number)) + if (!(intel_pinctrl_should_save(pctrl, desc->number) || + /* + * If the firmware mangled the register contents too much, + * check the saved value for the Direct IRQ mode. + */ + __intel_gpio_is_direct_irq(pads[i].padcfg0))) continue; intel_restore_padcfg(pctrl, desc->number, PADCFG0, pads[i].padcfg0);