soc: apple: apple-pmgr-pwrstate: Switch to IRQ-safe mode
authorHector Martin <marcan@marcan.st>
Mon, 23 Jan 2023 06:51:25 +0000 (15:51 +0900)
committerHector Martin <marcan@marcan.st>
Tue, 31 Jan 2023 11:37:07 +0000 (20:37 +0900)
This requires changing the reset path locking primitives to the spinlock
path in genpd, instead of the mutex path.

Reviewed-by: Eric Curtin <ecurtin@redhat.com>
Reviewed-by: Sven Peter <sven@svenpeter.dev>
Signed-off-by: Hector Martin <marcan@marcan.st>
drivers/soc/apple/apple-pmgr-pwrstate.c

index e112228..a3e2bc1 100644 (file)
@@ -116,8 +116,9 @@ static int apple_pmgr_ps_power_off(struct generic_pm_domain *genpd)
 static int apple_pmgr_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
 {
        struct apple_pmgr_ps *ps = rcdev_to_apple_pmgr_ps(rcdev);
+       unsigned long flags;
 
-       mutex_lock(&ps->genpd.mlock);
+       spin_lock_irqsave(&ps->genpd.slock, flags);
 
        if (ps->genpd.status == GENPD_STATE_OFF)
                dev_err(ps->dev, "PS 0x%x: asserting RESET while powered down\n", ps->offset);
@@ -129,7 +130,7 @@ static int apple_pmgr_reset_assert(struct reset_controller_dev *rcdev, unsigned
        regmap_update_bits(ps->regmap, ps->offset, APPLE_PMGR_FLAGS | APPLE_PMGR_RESET,
                           APPLE_PMGR_RESET);
 
-       mutex_unlock(&ps->genpd.mlock);
+       spin_unlock_irqrestore(&ps->genpd.slock, flags);
 
        return 0;
 }
@@ -137,8 +138,9 @@ static int apple_pmgr_reset_assert(struct reset_controller_dev *rcdev, unsigned
 static int apple_pmgr_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
 {
        struct apple_pmgr_ps *ps = rcdev_to_apple_pmgr_ps(rcdev);
+       unsigned long flags;
 
-       mutex_lock(&ps->genpd.mlock);
+       spin_lock_irqsave(&ps->genpd.slock, flags);
 
        dev_dbg(ps->dev, "PS 0x%x: deassert reset\n", ps->offset);
        regmap_update_bits(ps->regmap, ps->offset, APPLE_PMGR_FLAGS | APPLE_PMGR_RESET, 0);
@@ -147,7 +149,7 @@ static int apple_pmgr_reset_deassert(struct reset_controller_dev *rcdev, unsigne
        if (ps->genpd.status == GENPD_STATE_OFF)
                dev_err(ps->dev, "PS 0x%x: RESET was deasserted while powered down\n", ps->offset);
 
-       mutex_unlock(&ps->genpd.mlock);
+       spin_unlock_irqrestore(&ps->genpd.slock, flags);
 
        return 0;
 }
@@ -222,6 +224,7 @@ static int apple_pmgr_ps_probe(struct platform_device *pdev)
                return ret;
        }
 
+       ps->genpd.flags |= GENPD_FLAG_IRQ_SAFE;
        ps->genpd.name = name;
        ps->genpd.power_on = apple_pmgr_ps_power_on;
        ps->genpd.power_off = apple_pmgr_ps_power_off;