pinctrl: samsung: add dedicated SoC eint suspend/resume callbacks
[ Upstream commit 77ac6b742eba063a5b6600cda67834a7a212281a ] Refactor the existing platform specific suspend/resume callback so that each SoC variant has it's own callback containing the SoC specific logic. This allows exynosautov920 to have a dedicated function for using eint_con_offset and eint_mask_offset. Also it is easily extendable for gs101 which will need dedicated logic for handling the varying register offset of fltcon0 via eint_fltcon_offset. Reviewed-by: André Draszik <andre.draszik@linaro.org> Signed-off-by: Peter Griffin <peter.griffin@linaro.org> Link: https://lore.kernel.org/r/20250402-pinctrl-fltcon-suspend-v6-2-78ce0d4eb30c@linaro.org Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org> Stable-dep-of: bdbe0a0f7100 ("pinctrl: samsung: add gs101 specific eint suspend/resume callbacks") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
d5d5193dde
commit
f33266ec35
@@ -809,8 +809,8 @@ static const struct samsung_pin_ctrl exynosautov920_pin_ctrl[] = {
|
|||||||
.pin_banks = exynosautov920_pin_banks0,
|
.pin_banks = exynosautov920_pin_banks0,
|
||||||
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks0),
|
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks0),
|
||||||
.eint_wkup_init = exynos_eint_wkup_init,
|
.eint_wkup_init = exynos_eint_wkup_init,
|
||||||
.suspend = exynos_pinctrl_suspend,
|
.suspend = exynosautov920_pinctrl_suspend,
|
||||||
.resume = exynos_pinctrl_resume,
|
.resume = exynosautov920_pinctrl_resume,
|
||||||
.retention_data = &exynosautov920_retention_data,
|
.retention_data = &exynosautov920_retention_data,
|
||||||
}, {
|
}, {
|
||||||
/* pin-controller instance 1 AUD data */
|
/* pin-controller instance 1 AUD data */
|
||||||
@@ -821,43 +821,43 @@ static const struct samsung_pin_ctrl exynosautov920_pin_ctrl[] = {
|
|||||||
.pin_banks = exynosautov920_pin_banks2,
|
.pin_banks = exynosautov920_pin_banks2,
|
||||||
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks2),
|
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks2),
|
||||||
.eint_gpio_init = exynos_eint_gpio_init,
|
.eint_gpio_init = exynos_eint_gpio_init,
|
||||||
.suspend = exynos_pinctrl_suspend,
|
.suspend = exynosautov920_pinctrl_suspend,
|
||||||
.resume = exynos_pinctrl_resume,
|
.resume = exynosautov920_pinctrl_resume,
|
||||||
}, {
|
}, {
|
||||||
/* pin-controller instance 3 HSI1 data */
|
/* pin-controller instance 3 HSI1 data */
|
||||||
.pin_banks = exynosautov920_pin_banks3,
|
.pin_banks = exynosautov920_pin_banks3,
|
||||||
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks3),
|
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks3),
|
||||||
.eint_gpio_init = exynos_eint_gpio_init,
|
.eint_gpio_init = exynos_eint_gpio_init,
|
||||||
.suspend = exynos_pinctrl_suspend,
|
.suspend = exynosautov920_pinctrl_suspend,
|
||||||
.resume = exynos_pinctrl_resume,
|
.resume = exynosautov920_pinctrl_resume,
|
||||||
}, {
|
}, {
|
||||||
/* pin-controller instance 4 HSI2 data */
|
/* pin-controller instance 4 HSI2 data */
|
||||||
.pin_banks = exynosautov920_pin_banks4,
|
.pin_banks = exynosautov920_pin_banks4,
|
||||||
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks4),
|
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks4),
|
||||||
.eint_gpio_init = exynos_eint_gpio_init,
|
.eint_gpio_init = exynos_eint_gpio_init,
|
||||||
.suspend = exynos_pinctrl_suspend,
|
.suspend = exynosautov920_pinctrl_suspend,
|
||||||
.resume = exynos_pinctrl_resume,
|
.resume = exynosautov920_pinctrl_resume,
|
||||||
}, {
|
}, {
|
||||||
/* pin-controller instance 5 HSI2UFS data */
|
/* pin-controller instance 5 HSI2UFS data */
|
||||||
.pin_banks = exynosautov920_pin_banks5,
|
.pin_banks = exynosautov920_pin_banks5,
|
||||||
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks5),
|
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks5),
|
||||||
.eint_gpio_init = exynos_eint_gpio_init,
|
.eint_gpio_init = exynos_eint_gpio_init,
|
||||||
.suspend = exynos_pinctrl_suspend,
|
.suspend = exynosautov920_pinctrl_suspend,
|
||||||
.resume = exynos_pinctrl_resume,
|
.resume = exynosautov920_pinctrl_resume,
|
||||||
}, {
|
}, {
|
||||||
/* pin-controller instance 6 PERIC0 data */
|
/* pin-controller instance 6 PERIC0 data */
|
||||||
.pin_banks = exynosautov920_pin_banks6,
|
.pin_banks = exynosautov920_pin_banks6,
|
||||||
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks6),
|
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks6),
|
||||||
.eint_gpio_init = exynos_eint_gpio_init,
|
.eint_gpio_init = exynos_eint_gpio_init,
|
||||||
.suspend = exynos_pinctrl_suspend,
|
.suspend = exynosautov920_pinctrl_suspend,
|
||||||
.resume = exynos_pinctrl_resume,
|
.resume = exynosautov920_pinctrl_resume,
|
||||||
}, {
|
}, {
|
||||||
/* pin-controller instance 7 PERIC1 data */
|
/* pin-controller instance 7 PERIC1 data */
|
||||||
.pin_banks = exynosautov920_pin_banks7,
|
.pin_banks = exynosautov920_pin_banks7,
|
||||||
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks7),
|
.nr_banks = ARRAY_SIZE(exynosautov920_pin_banks7),
|
||||||
.eint_gpio_init = exynos_eint_gpio_init,
|
.eint_gpio_init = exynos_eint_gpio_init,
|
||||||
.suspend = exynos_pinctrl_suspend,
|
.suspend = exynosautov920_pinctrl_suspend,
|
||||||
.resume = exynos_pinctrl_resume,
|
.resume = exynosautov920_pinctrl_resume,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -761,105 +761,115 @@ __init int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exynos_pinctrl_suspend_bank(struct samsung_pin_bank *bank)
|
static void exynos_set_wakeup(struct samsung_pin_bank *bank)
|
||||||
{
|
{
|
||||||
struct exynos_eint_gpio_save *save = bank->soc_priv;
|
struct exynos_irq_chip *irq_chip;
|
||||||
const void __iomem *regs = bank->eint_base;
|
|
||||||
|
|
||||||
save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
|
if (bank->irq_chip) {
|
||||||
+ bank->eint_offset);
|
irq_chip = bank->irq_chip;
|
||||||
save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
irq_chip->set_eint_wakeup_mask(bank->drvdata, irq_chip);
|
||||||
+ 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void exynosauto_pinctrl_suspend_bank(struct samsung_pin_bank *bank)
|
|
||||||
{
|
|
||||||
struct exynos_eint_gpio_save *save = bank->soc_priv;
|
|
||||||
const void __iomem *regs = bank->eint_base;
|
|
||||||
|
|
||||||
save->eint_con = readl(regs + bank->pctl_offset + bank->eint_con_offset);
|
|
||||||
save->eint_mask = readl(regs + bank->pctl_offset + bank->eint_mask_offset);
|
|
||||||
|
|
||||||
pr_debug("%s: save con %#010x\n", bank->name, save->eint_con);
|
|
||||||
pr_debug("%s: save mask %#010x\n", bank->name, save->eint_mask);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void exynos_pinctrl_suspend(struct samsung_pin_bank *bank)
|
void exynos_pinctrl_suspend(struct samsung_pin_bank *bank)
|
||||||
{
|
{
|
||||||
struct exynos_irq_chip *irq_chip = NULL;
|
struct exynos_eint_gpio_save *save = bank->soc_priv;
|
||||||
|
const void __iomem *regs = bank->eint_base;
|
||||||
|
|
||||||
if (bank->eint_type == EINT_TYPE_GPIO) {
|
if (bank->eint_type == EINT_TYPE_GPIO) {
|
||||||
if (bank->eint_con_offset)
|
save->eint_con = readl(regs + EXYNOS_GPIO_ECON_OFFSET
|
||||||
exynosauto_pinctrl_suspend_bank(bank);
|
+ bank->eint_offset);
|
||||||
else
|
save->eint_fltcon0 = readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
||||||
exynos_pinctrl_suspend_bank(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);
|
||||||
} else if (bank->eint_type == EINT_TYPE_WKUP) {
|
} else if (bank->eint_type == EINT_TYPE_WKUP) {
|
||||||
if (!irq_chip) {
|
exynos_set_wakeup(bank);
|
||||||
irq_chip = bank->irq_chip;
|
|
||||||
irq_chip->set_eint_wakeup_mask(bank->drvdata, irq_chip);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void exynos_pinctrl_resume_bank(struct samsung_pin_bank *bank)
|
void exynosautov920_pinctrl_suspend(struct samsung_pin_bank *bank)
|
||||||
{
|
{
|
||||||
struct exynos_eint_gpio_save *save = bank->soc_priv;
|
struct exynos_eint_gpio_save *save = bank->soc_priv;
|
||||||
void __iomem *regs = bank->eint_base;
|
const void __iomem *regs = bank->eint_base;
|
||||||
|
|
||||||
pr_debug("%s: con %#010x => %#010x\n", bank->name,
|
|
||||||
readl(regs + EXYNOS_GPIO_ECON_OFFSET
|
|
||||||
+ bank->eint_offset), save->eint_con);
|
|
||||||
pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name,
|
|
||||||
readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
|
||||||
+ 2 * bank->eint_offset), save->eint_fltcon0);
|
|
||||||
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);
|
|
||||||
writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
|
||||||
+ 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void exynosauto_pinctrl_resume_bank(struct samsung_pin_bank *bank)
|
|
||||||
{
|
|
||||||
struct exynos_eint_gpio_save *save = bank->soc_priv;
|
|
||||||
void __iomem *regs = bank->eint_base;
|
|
||||||
|
|
||||||
pr_debug("%s: con %#010x => %#010x\n", bank->name,
|
|
||||||
readl(regs + bank->pctl_offset + bank->eint_con_offset), save->eint_con);
|
|
||||||
pr_debug("%s: mask %#010x => %#010x\n", bank->name,
|
|
||||||
readl(regs + bank->pctl_offset + bank->eint_mask_offset), save->eint_mask);
|
|
||||||
|
|
||||||
writel(save->eint_con, regs + bank->pctl_offset + bank->eint_con_offset);
|
|
||||||
writel(save->eint_mask, regs + bank->pctl_offset + bank->eint_mask_offset);
|
|
||||||
|
|
||||||
|
if (bank->eint_type == EINT_TYPE_GPIO) {
|
||||||
|
save->eint_con = readl(regs + bank->pctl_offset +
|
||||||
|
bank->eint_con_offset);
|
||||||
|
save->eint_mask = readl(regs + bank->pctl_offset +
|
||||||
|
bank->eint_mask_offset);
|
||||||
|
pr_debug("%s: save con %#010x\n",
|
||||||
|
bank->name, save->eint_con);
|
||||||
|
pr_debug("%s: save mask %#010x\n",
|
||||||
|
bank->name, save->eint_mask);
|
||||||
|
} else if (bank->eint_type == EINT_TYPE_WKUP) {
|
||||||
|
exynos_set_wakeup(bank);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void exynos_pinctrl_resume(struct samsung_pin_bank *bank)
|
void exynos_pinctrl_resume(struct samsung_pin_bank *bank)
|
||||||
{
|
{
|
||||||
|
struct exynos_eint_gpio_save *save = bank->soc_priv;
|
||||||
|
void __iomem *regs = bank->eint_base;
|
||||||
|
|
||||||
if (bank->eint_type == EINT_TYPE_GPIO) {
|
if (bank->eint_type == EINT_TYPE_GPIO) {
|
||||||
if (bank->eint_con_offset)
|
pr_debug("%s: con %#010x => %#010x\n", bank->name,
|
||||||
exynosauto_pinctrl_resume_bank(bank);
|
readl(regs + EXYNOS_GPIO_ECON_OFFSET
|
||||||
else
|
+ bank->eint_offset), save->eint_con);
|
||||||
exynos_pinctrl_resume_bank(bank);
|
pr_debug("%s: fltcon0 %#010x => %#010x\n", bank->name,
|
||||||
|
readl(regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
||||||
|
+ 2 * bank->eint_offset), save->eint_fltcon0);
|
||||||
|
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);
|
||||||
|
writel(save->eint_fltcon0, regs + EXYNOS_GPIO_EFLTCON_OFFSET
|
||||||
|
+ 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 exynosautov920_pinctrl_resume(struct samsung_pin_bank *bank)
|
||||||
|
{
|
||||||
|
struct exynos_eint_gpio_save *save = bank->soc_priv;
|
||||||
|
void __iomem *regs = bank->eint_base;
|
||||||
|
|
||||||
|
if (bank->eint_type == EINT_TYPE_GPIO) {
|
||||||
|
/* exynosautov920 has eint_con_offset for all but one bank */
|
||||||
|
if (!bank->eint_con_offset)
|
||||||
|
exynos_pinctrl_resume(bank);
|
||||||
|
|
||||||
|
pr_debug("%s: con %#010x => %#010x\n", bank->name,
|
||||||
|
readl(regs + bank->pctl_offset + bank->eint_con_offset),
|
||||||
|
save->eint_con);
|
||||||
|
pr_debug("%s: mask %#010x => %#010x\n", bank->name,
|
||||||
|
readl(regs + bank->pctl_offset +
|
||||||
|
bank->eint_mask_offset), save->eint_mask);
|
||||||
|
|
||||||
|
writel(save->eint_con,
|
||||||
|
regs + bank->pctl_offset + bank->eint_con_offset);
|
||||||
|
writel(save->eint_mask,
|
||||||
|
regs + bank->pctl_offset + bank->eint_mask_offset);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -211,6 +211,8 @@ struct exynos_muxed_weint_data {
|
|||||||
|
|
||||||
int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d);
|
int exynos_eint_gpio_init(struct samsung_pinctrl_drv_data *d);
|
||||||
int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d);
|
int exynos_eint_wkup_init(struct samsung_pinctrl_drv_data *d);
|
||||||
|
void exynosautov920_pinctrl_resume(struct samsung_pin_bank *bank);
|
||||||
|
void exynosautov920_pinctrl_suspend(struct samsung_pin_bank *bank);
|
||||||
void exynos_pinctrl_suspend(struct samsung_pin_bank *bank);
|
void exynos_pinctrl_suspend(struct samsung_pin_bank *bank);
|
||||||
void exynos_pinctrl_resume(struct samsung_pin_bank *bank);
|
void exynos_pinctrl_resume(struct samsung_pin_bank *bank);
|
||||||
struct samsung_retention_ctrl *
|
struct samsung_retention_ctrl *
|
||||||
|
|||||||
Reference in New Issue
Block a user