Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 62020f23 authored by Tony Lindgren's avatar Tony Lindgren
Browse files

bus: ti-sysc: Add suspend and resume handling



This allows us to idle the module on suspend after the children
are suspended.

Signed-off-by: default avatarTony Lindgren <tony@atomide.com>
parent 2c355ff6
Loading
Loading
Loading
Loading
+34 −0
Original line number Original line Diff line number Diff line
@@ -58,6 +58,7 @@ static const char * const clock_names[] = { "fck", "ick", };
 * @cfg: interconnect target module configuration
 * @cfg: interconnect target module configuration
 * @name: name if available
 * @name: name if available
 * @revision: interconnect target module revision
 * @revision: interconnect target module revision
 * @needs_resume: runtime resume needed on resume from suspend
 */
 */
struct sysc {
struct sysc {
	struct device *dev;
	struct device *dev;
@@ -71,6 +72,8 @@ struct sysc {
	struct sysc_config cfg;
	struct sysc_config cfg;
	const char *name;
	const char *name;
	u32 revision;
	u32 revision;
	bool enabled;
	bool needs_resume;
};
};


static u32 sysc_read(struct sysc *ddata, int offset)
static u32 sysc_read(struct sysc *ddata, int offset)
@@ -497,7 +500,38 @@ static int __maybe_unused sysc_runtime_resume(struct device *dev)
	return 0;
	return 0;
}
}


#ifdef CONFIG_PM_SLEEP
static int sysc_suspend(struct device *dev)
{
	struct sysc *ddata;

	ddata = dev_get_drvdata(dev);

	if (!ddata->enabled)
		return 0;

	ddata->needs_resume = true;

	return sysc_runtime_suspend(dev);
}

static int sysc_resume(struct device *dev)
{
	struct sysc *ddata;

	ddata = dev_get_drvdata(dev);
	if (ddata->needs_resume) {
		ddata->needs_resume = false;

		return sysc_runtime_resume(dev);
	}

	return 0;
}
#endif

static const struct dev_pm_ops sysc_pm_ops = {
static const struct dev_pm_ops sysc_pm_ops = {
	SET_SYSTEM_SLEEP_PM_OPS(sysc_suspend, sysc_resume)
	SET_RUNTIME_PM_OPS(sysc_runtime_suspend,
	SET_RUNTIME_PM_OPS(sysc_runtime_suspend,
			   sysc_runtime_resume,
			   sysc_runtime_resume,
			   NULL)
			   NULL)