diff options
Diffstat (limited to 'drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c')
-rw-r--r-- | drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c index 9abb78c4e709..e583340aafd2 100644 --- a/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c +++ b/drivers/gpu/drm/imx/mhdp/cdns-mhdp-imx8qm.c @@ -374,6 +374,65 @@ static int imx8qm_ipg_clk_enable(struct imx_mhdp_device *imx_mhdp) return ret; } +static int imx8qm_ipg_clk_disable(struct imx_mhdp_device *imx_mhdp) +{ + int ret; + struct imx_hdp_clks *clks = &imx_mhdp->clks; + struct device *dev = imx_mhdp->mhdp.dev; + + ret = clk_prepare_enable(clks->clk_i2s_bypass); + if (ret < 0) { + dev_err(dev, "%s, pre clk i2s bypass error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_i2s); + if (ret < 0) { + dev_err(dev, "%s, pre clk i2s error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_apb_ctrl); + if (ret < 0) { + dev_err(dev, "%s, pre clk apb ctrl error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_apb_csr); + if (ret < 0) { + dev_err(dev, "%s, pre clk apb csr error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_msi); + if (ret < 0) { + dev_err(dev, "%s, pre clk msierror\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_lis); + if (ret < 0) { + dev_err(dev, "%s, pre clk lis error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->lpcg_apb); + if (ret < 0) { + dev_err(dev, "%s, pre clk apb error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->clk_core); + if (ret < 0) { + dev_err(dev, "%s, pre clk core error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->clk_ipg); + if (ret < 0) { + dev_err(dev, "%s, pre clk_ipg error\n", __func__); + return ret; + } + ret = clk_prepare_enable(clks->dig_pll); + if (ret < 0) { + dev_err(dev, "%s, pre dig pll error\n", __func__); + return ret; + } + return ret; +} + static void imx8qm_ipg_clk_set_rate(struct imx_mhdp_device *imx_mhdp) { struct imx_hdp_clks *clks = &imx_mhdp->clks; @@ -465,6 +524,7 @@ int cdns_mhdp_power_on_imx8qm(struct cdns_mhdp_device *mhdp) { struct imx_mhdp_device *imx_mhdp = container_of(mhdp, struct imx_mhdp_device, mhdp); + /* Power on PM Domains */ imx8qm_attach_pm_domains(imx_mhdp); @@ -488,6 +548,21 @@ int cdns_mhdp_power_on_imx8qm(struct cdns_mhdp_device *mhdp) return 0; } +int cdns_mhdp_power_off_imx8qm(struct cdns_mhdp_device *mhdp) +{ + struct imx_mhdp_device *imx_mhdp = + container_of(mhdp, struct imx_mhdp_device, mhdp); + + imx8qm_phy_reset(0); + imx8qm_pixel_clk_disable(imx_mhdp); + imx8qm_ipg_clk_disable(imx_mhdp); + + /* Power off PM Domains */ + imx8qm_detach_pm_domains(imx_mhdp); + + return 0; +} + void cdns_mhdp_plat_init_imx8qm(struct cdns_mhdp_device *mhdp) { struct imx_mhdp_device *imx_mhdp = |