pinctrl: samsung: Save/restore eint_mask over suspend for EINT_TYPE GPIOs
Currently, for EINT_TYPE GPIOs, the CON and FLTCON registers are saved and restored over a suspend/resume cycle. However, the EINT_MASK registers are not. On S5PV210 at the very least, these registers are not retained over suspend, leading to the interrupts remaining masked upon resume and therefore no interrupts being triggered for the device. There should be no effect on any SoCs that do retain these registers as theoretically we would just be re-writing what was already there. Fixes: 7ccbc60cd9c2 ("pinctrl: exynos: Handle suspend/resume of GPIO EINT registers") Cc: <stable@vger.kernel.org> Signed-off-by: Jonathan Bakker <xc-racer2@live.ca> Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
This commit is contained in:
committed by
Krzysztof Kozlowski
parent
b577a27991
commit
f354157a7d
@ -267,6 +267,7 @@ struct exynos_eint_gpio_save {
|
||||
u32 eint_con;
|
||||
u32 eint_fltcon0;
|
||||
u32 eint_fltcon1;
|
||||
u32 eint_mask;
|
||||
};
|
||||
|
||||
/*
|
||||
@ -633,10 +634,13 @@ static void exynos_pinctrl_suspend_bank(
|
||||
+ 2 * bank->eint_offset);
|
||||
save->eint_fltcon1 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
||||
+ 2 * bank->eint_offset + 4);
|
||||
save->eint_mask = readl(regs + bank->irq_chip->eint_mask
|
||||
+ bank->eint_offset);
|
||||
|
||||
pr_debug("%s: save con %#010x\n", bank->name, save->eint_con);
|
||||
pr_debug("%s: save fltcon0 %#010x\n", bank->name, save->eint_fltcon0);
|
||||
pr_debug("%s: save fltcon1 %#010x\n", bank->name, save->eint_fltcon1);
|
||||
pr_debug("%s: save mask %#010x\n", bank->name, save->eint_mask);
|
||||
}
|
||||
|
||||
void exynos_pinctrl_suspend(struct samsung_pinctrl_drv_data *drvdata)
|
||||
@ -678,6 +682,9 @@ static void exynos_pinctrl_resume_bank(
|
||||
pr_debug("%s: fltcon1 %#010x => %#010x\n", bank->name,
|
||||
readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
||||
+ 2 * bank->eint_offset + 4), save->eint_fltcon1);
|
||||
pr_debug("%s: mask %#010x => %#010x\n", bank->name,
|
||||
readl(regs + bank->irq_chip->eint_mask
|
||||
+ bank->eint_offset), save->eint_mask);
|
||||
|
||||
writel(save->eint_con, regs + EXYNOS_GPIO_ECON_OFFSET
|
||||
+ bank->eint_offset);
|
||||
@ -685,6 +692,8 @@ static void exynos_pinctrl_resume_bank(
|
||||
+ 2 * bank->eint_offset);
|
||||
writel(save->eint_fltcon1, regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
||||
+ 2 * bank->eint_offset + 4);
|
||||
writel(save->eint_mask, regs + bank->irq_chip->eint_mask
|
||||
+ bank->eint_offset);
|
||||
}
|
||||
|
||||
void exynos_pinctrl_resume(struct samsung_pinctrl_drv_data *drvdata)
|
||||
|
Reference in New Issue
Block a user