mirror of
https://github.com/torvalds/linux.git
synced 2026-04-18 06:44:00 -04:00
mfd: sec: Use chained IRQs for s2mpg10
On S2MPG10 (and similar like S2MPG11), top-level interrupt status and mask registers exist which need to be unmasked to get the PMIC interrupts. This additional status doesn't seem to exist on other PMICs in the S2MP* family, and the S2MPG10 driver is manually dealing with masking and unmasking currently. The correct approach here is to register this hierarchy as chained interrupts, though, without any additional manual steps. Doing so will also simplify addition of other, similar, PMICs (like S2MPG11) in the future. Update the driver to do just that. Signed-off-by: André Draszik <andre.draszik@linaro.org> Link: https://patch.msgid.link/20251114-s2mpg10-chained-irq-v1-1-34ddfa49c4cd@linaro.org Signed-off-by: Lee Jones <lee@kernel.org>
This commit is contained in:
@@ -325,11 +325,6 @@ static struct regmap *sec_pmic_acpm_regmap_init(struct device *dev,
|
||||
return regmap;
|
||||
}
|
||||
|
||||
static void sec_pmic_acpm_mask_common_irqs(void *regmap_common)
|
||||
{
|
||||
regmap_write(regmap_common, S2MPG10_COMMON_INT_MASK, S2MPG10_COMMON_INT_SRC);
|
||||
}
|
||||
|
||||
static int sec_pmic_acpm_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct regmap *regmap_common, *regmap_pmic, *regmap;
|
||||
@@ -360,15 +355,10 @@ static int sec_pmic_acpm_probe(struct platform_device *pdev)
|
||||
shared_ctx->speedy_channel = pdata->speedy_channel;
|
||||
|
||||
regmap_common = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_COMMON,
|
||||
pdata->regmap_cfg_common, false);
|
||||
pdata->regmap_cfg_common, true);
|
||||
if (IS_ERR(regmap_common))
|
||||
return PTR_ERR(regmap_common);
|
||||
|
||||
/* Mask all interrupts from 'common' block, until successful init */
|
||||
ret = regmap_write(regmap_common, S2MPG10_COMMON_INT_MASK, S2MPG10_COMMON_INT_SRC);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "failed to mask common block interrupts\n");
|
||||
|
||||
regmap_pmic = sec_pmic_acpm_regmap_init(dev, shared_ctx, SEC_PMIC_ACPM_ACCESSTYPE_PMIC,
|
||||
pdata->regmap_cfg_pmic, false);
|
||||
if (IS_ERR(regmap_pmic))
|
||||
@@ -391,17 +381,6 @@ static int sec_pmic_acpm_probe(struct platform_device *pdev)
|
||||
if (device_property_read_bool(dev, "wakeup-source"))
|
||||
devm_device_init_wakeup(dev);
|
||||
|
||||
/* Unmask PMIC interrupt from 'common' block, now that everything is in place. */
|
||||
ret = regmap_clear_bits(regmap_common, S2MPG10_COMMON_INT_MASK,
|
||||
S2MPG10_COMMON_INT_SRC_PMIC);
|
||||
if (ret)
|
||||
return dev_err_probe(dev, ret, "failed to unmask PMIC interrupt\n");
|
||||
|
||||
/* Mask all interrupts from 'common' block on shutdown */
|
||||
ret = devm_add_action_or_reset(dev, sec_pmic_acpm_mask_common_irqs, regmap_common);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user