drm/fsl-dcu: enable pixel clock when enabling CRTC

The pixel clock should not be on if the CRTC is not in use, hence
move clock enable/disable calls into CRTC callbacks.

Signed-off-by: Stefan Agner <stefan@agner.ch>
Tested-By: Meng Yi <meng.yi@nxp.com>
This commit is contained in:
Stefan Agner 2016-10-04 17:40:29 -07:00
Родитель 9789037695
Коммит 0a70c998d0
2 изменённых файлов: 3 добавлений и 20 удалений

Просмотреть файл

@ -51,6 +51,7 @@ static void fsl_dcu_drm_disable_crtc(struct drm_crtc *crtc)
DCU_MODE_DCU_MODE(DCU_MODE_OFF)); DCU_MODE_DCU_MODE(DCU_MODE_OFF));
regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE, regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
DCU_UPDATE_MODE_READREG); DCU_UPDATE_MODE_READREG);
clk_disable_unprepare(fsl_dev->pix_clk);
} }
static void fsl_dcu_drm_crtc_enable(struct drm_crtc *crtc) static void fsl_dcu_drm_crtc_enable(struct drm_crtc *crtc)
@ -58,6 +59,7 @@ static void fsl_dcu_drm_crtc_enable(struct drm_crtc *crtc)
struct drm_device *dev = crtc->dev; struct drm_device *dev = crtc->dev;
struct fsl_dcu_drm_device *fsl_dev = dev->dev_private; struct fsl_dcu_drm_device *fsl_dev = dev->dev_private;
clk_prepare_enable(fsl_dev->pix_clk);
regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE, regmap_update_bits(fsl_dev->regmap, DCU_DCU_MODE,
DCU_MODE_DCU_MODE_MASK, DCU_MODE_DCU_MODE_MASK,
DCU_MODE_DCU_MODE(DCU_MODE_NORMAL)); DCU_MODE_DCU_MODE(DCU_MODE_NORMAL));

Просмотреть файл

@ -267,12 +267,6 @@ static int fsl_dcu_drm_pm_resume(struct device *dev)
return ret; return ret;
} }
ret = clk_prepare_enable(fsl_dev->pix_clk);
if (ret < 0) {
dev_err(dev, "failed to enable pix clk\n");
goto disable_dcu_clk;
}
if (fsl_dev->tcon) if (fsl_dev->tcon)
fsl_tcon_bypass_enable(fsl_dev->tcon); fsl_tcon_bypass_enable(fsl_dev->tcon);
fsl_dcu_drm_init_planes(fsl_dev->drm); fsl_dcu_drm_init_planes(fsl_dev->drm);
@ -286,10 +280,6 @@ static int fsl_dcu_drm_pm_resume(struct device *dev)
enable_irq(fsl_dev->irq); enable_irq(fsl_dev->irq);
return 0; return 0;
disable_dcu_clk:
clk_disable_unprepare(fsl_dev->clk);
return ret;
} }
#endif #endif
@ -403,18 +393,12 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
goto disable_clk; goto disable_clk;
} }
ret = clk_prepare_enable(fsl_dev->pix_clk);
if (ret < 0) {
dev_err(dev, "failed to enable pix clk\n");
goto unregister_pix_clk;
}
fsl_dev->tcon = fsl_tcon_init(dev); fsl_dev->tcon = fsl_tcon_init(dev);
drm = drm_dev_alloc(driver, dev); drm = drm_dev_alloc(driver, dev);
if (IS_ERR(drm)) { if (IS_ERR(drm)) {
ret = PTR_ERR(drm); ret = PTR_ERR(drm);
goto disable_pix_clk; goto unregister_pix_clk;
} }
fsl_dev->dev = dev; fsl_dev->dev = dev;
@ -435,8 +419,6 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
unref: unref:
drm_dev_unref(drm); drm_dev_unref(drm);
disable_pix_clk:
clk_disable_unprepare(fsl_dev->pix_clk);
unregister_pix_clk: unregister_pix_clk:
clk_unregister(fsl_dev->pix_clk); clk_unregister(fsl_dev->pix_clk);
disable_clk: disable_clk:
@ -449,7 +431,6 @@ static int fsl_dcu_drm_remove(struct platform_device *pdev)
struct fsl_dcu_drm_device *fsl_dev = platform_get_drvdata(pdev); struct fsl_dcu_drm_device *fsl_dev = platform_get_drvdata(pdev);
clk_disable_unprepare(fsl_dev->clk); clk_disable_unprepare(fsl_dev->clk);
clk_disable_unprepare(fsl_dev->pix_clk);
clk_unregister(fsl_dev->pix_clk); clk_unregister(fsl_dev->pix_clk);
drm_put_dev(fsl_dev->drm); drm_put_dev(fsl_dev->drm);