#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;
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(…) …;