xref: /kernel/linux/linux-6.6/drivers/clk/ingenic/pm.c (revision 62306a36)
162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright (C) 2019 Paul Cercueil <paul@crapouillou.net>
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include "cgu.h"
762306a36Sopenharmony_ci#include "pm.h"
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <linux/io.h>
1062306a36Sopenharmony_ci#include <linux/syscore_ops.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#define CGU_REG_LCR		0x04
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define LCR_LOW_POWER_MODE	BIT(0)
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistatic void __iomem * __maybe_unused ingenic_cgu_base;
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_cistatic int __maybe_unused ingenic_cgu_pm_suspend(void)
1962306a36Sopenharmony_ci{
2062306a36Sopenharmony_ci	u32 val = readl(ingenic_cgu_base + CGU_REG_LCR);
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci	writel(val | LCR_LOW_POWER_MODE, ingenic_cgu_base + CGU_REG_LCR);
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	return 0;
2562306a36Sopenharmony_ci}
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_cistatic void __maybe_unused ingenic_cgu_pm_resume(void)
2862306a36Sopenharmony_ci{
2962306a36Sopenharmony_ci	u32 val = readl(ingenic_cgu_base + CGU_REG_LCR);
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	writel(val & ~LCR_LOW_POWER_MODE, ingenic_cgu_base + CGU_REG_LCR);
3262306a36Sopenharmony_ci}
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cistatic struct syscore_ops __maybe_unused ingenic_cgu_pm_ops = {
3562306a36Sopenharmony_ci	.suspend = ingenic_cgu_pm_suspend,
3662306a36Sopenharmony_ci	.resume = ingenic_cgu_pm_resume,
3762306a36Sopenharmony_ci};
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_civoid ingenic_cgu_register_syscore_ops(struct ingenic_cgu *cgu)
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	if (IS_ENABLED(CONFIG_PM_SLEEP)) {
4262306a36Sopenharmony_ci		ingenic_cgu_base = cgu->base;
4362306a36Sopenharmony_ci		register_syscore_ops(&ingenic_cgu_pm_ops);
4462306a36Sopenharmony_ci	}
4562306a36Sopenharmony_ci}
46