linux/drivers/pmdomain/imx/imx93-pd.c

// SPDX-License-Identifier: GPL-2.0
/*
 * Copyright 2022 NXP
 */

#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/iopoll.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/pm_domain.h>

#define MIX_SLICE_SW_CTRL_OFF
#define SLICE_SW_CTRL_PSW_CTRL_OFF_MASK
#define SLICE_SW_CTRL_PDN_SOFT_MASK

#define MIX_FUNC_STAT_OFF

#define FUNC_STAT_PSW_STAT_MASK
#define FUNC_STAT_RST_STAT_MASK
#define FUNC_STAT_ISO_STAT_MASK

struct imx93_power_domain {};

#define to_imx93_pd(_genpd)

static int imx93_pd_on(struct generic_pm_domain *genpd)
{}

static int imx93_pd_off(struct generic_pm_domain *genpd)
{
	struct imx93_power_domain *domain = to_imx93_pd(genpd);
	void __iomem *addr = domain->addr;
	int ret;
	u32 val;

	/* Power off MIX */
	val = readl(addr + MIX_SLICE_SW_CTRL_OFF);
	val |= SLICE_SW_CTRL_PDN_SOFT_MASK;
	writel(val, addr + MIX_SLICE_SW_CTRL_OFF);

	ret = readl_poll_timeout(addr + MIX_FUNC_STAT_OFF, val,
				 val & FUNC_STAT_PSW_STAT_MASK, 1, 1000);
	if (ret) {
		dev_err(domain->dev, "pd_off timeout: name: %s, stat: %x\n", genpd->name, val);
		return ret;
	}

	clk_bulk_disable_unprepare(domain->num_clks, domain->clks);

	return 0;
};

static void imx93_pd_remove(struct platform_device *pdev)
{}

static int imx93_pd_probe(struct platform_device *pdev)
{}

static const struct of_device_id imx93_pd_ids[] =;
MODULE_DEVICE_TABLE(of, imx93_pd_ids);

static struct platform_driver imx93_power_domain_driver =;
module_platform_driver();

MODULE_AUTHOR();
MODULE_DESCRIPTION();
MODULE_LICENSE();