Skip to content

Commit

Permalink
bus: simple-pm-bus: fix forced runtime PM use
Browse files Browse the repository at this point in the history
The simple-pm-bus driver only enables runtime PM for some buses
('simple-pm-bus') yet has started calling pm_runtime_force_suspend() and
pm_runtime_force_resume() during system suspend unconditionally.

This currently works, but that is not obvious and depends on
implementation details which may change at some point.

Add dedicated system sleep ops and only call pm_runtime_force_suspend()
and pm_runtime_force_resume() for buses that use runtime PM to avoid any
future surprises.

Fixes: c458393 ("drivers: bus: simple-pm-bus: Use clocks")
Cc: Liu Ying <victor.liu@nxp.com>
Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Acked-by: Liu Ying <victor.liu@nxp.com>
Acked-by: Rafael J. Wysocki <rafael@kernel.org>
Reviewed-by: Geert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/20250214102130.3000-1-johan+linaro@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Johan Hovold authored and Greg Kroah-Hartman committed Feb 20, 2025
1 parent 6d991f5 commit 32ce5d8
Showing 1 changed file with 21 additions and 1 deletion.
22 changes: 21 additions & 1 deletion drivers/bus/simple-pm-bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,9 +109,29 @@ static int simple_pm_bus_runtime_resume(struct device *dev)
return 0;
}

static int simple_pm_bus_suspend(struct device *dev)
{
struct simple_pm_bus *bus = dev_get_drvdata(dev);

if (!bus)
return 0;

return pm_runtime_force_suspend(dev);
}

static int simple_pm_bus_resume(struct device *dev)
{
struct simple_pm_bus *bus = dev_get_drvdata(dev);

if (!bus)
return 0;

return pm_runtime_force_resume(dev);
}

static const struct dev_pm_ops simple_pm_bus_pm_ops = {
RUNTIME_PM_OPS(simple_pm_bus_runtime_suspend, simple_pm_bus_runtime_resume, NULL)
NOIRQ_SYSTEM_SLEEP_PM_OPS(pm_runtime_force_suspend, pm_runtime_force_resume)
NOIRQ_SYSTEM_SLEEP_PM_OPS(simple_pm_bus_suspend, simple_pm_bus_resume)
};

#define ONLY_BUS ((void *) 1) /* Match if the device is only a bus. */
Expand Down

0 comments on commit 32ce5d8

Please sign in to comment.