Skip to content

Commit

Permalink
soc: apple: apple-pmgr-pwrstate: Switch to IRQ-safe mode
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Hector Martin committed Jan 31, 2023
1 parent 40eaa8c commit c289d5b
Showing 1 changed file with 7 additions and 4 deletions.
11 changes: 7 additions & 4 deletions drivers/soc/apple/apple-pmgr-pwrstate.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -129,16 +130,17 @@ 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;
}

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);
Expand All @@ -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;
}
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit c289d5b

Please sign in to comment.