Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0a70c998 authored by Stefan Agner's avatar Stefan Agner
Browse files

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: default avatarStefan Agner <stefan@agner.ch>
Tested-By: default avatarMeng Yi <meng.yi@nxp.com>
parent 97890376
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ static void fsl_dcu_drm_disable_crtc(struct drm_crtc *crtc)
			   DCU_MODE_DCU_MODE(DCU_MODE_OFF));
	regmap_write(fsl_dev->regmap, DCU_UPDATE_MODE,
		     DCU_UPDATE_MODE_READREG);
	clk_disable_unprepare(fsl_dev->pix_clk);
}

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 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,
			   DCU_MODE_DCU_MODE_MASK,
			   DCU_MODE_DCU_MODE(DCU_MODE_NORMAL));
+1 −20
Original line number Diff line number Diff line
@@ -267,12 +267,6 @@ static int fsl_dcu_drm_pm_resume(struct device *dev)
		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)
		fsl_tcon_bypass_enable(fsl_dev->tcon);
	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);

	return 0;

disable_dcu_clk:
	clk_disable_unprepare(fsl_dev->clk);
	return ret;
}
#endif

@@ -403,18 +393,12 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)
		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);

	drm = drm_dev_alloc(driver, dev);
	if (IS_ERR(drm)) {
		ret = PTR_ERR(drm);
		goto disable_pix_clk;
		goto unregister_pix_clk;
	}

	fsl_dev->dev = dev;
@@ -435,8 +419,6 @@ static int fsl_dcu_drm_probe(struct platform_device *pdev)

unref:
	drm_dev_unref(drm);
disable_pix_clk:
	clk_disable_unprepare(fsl_dev->pix_clk);
unregister_pix_clk:
	clk_unregister(fsl_dev->pix_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);

	clk_disable_unprepare(fsl_dev->clk);
	clk_disable_unprepare(fsl_dev->pix_clk);
	clk_unregister(fsl_dev->pix_clk);
	drm_put_dev(fsl_dev->drm);