Merge tag 'pinctrl-v6.3-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[linux-block.git] / drivers / pinctrl / intel / pinctrl-intel.c
index 1bb2a0bb65dbb69be1865340646b4d4bda156364..c7a71c49df0a7cea1934c2f4e688fc5662bc3d54 100644 (file)
@@ -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);