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

Commit 262d67e7 authored by Sandeep Sheriker Mallikarjun's avatar Sandeep Sheriker Mallikarjun Committed by Sam Ravnborg
Browse files

drm: atmel-hlcdc: enable sys_clk during initalization.



For SAM9X60 SoC, sys_clk is through lcd_gclk clock source and this
needs to be enabled before enabling lcd_clk.

Signed-off-by: default avatarSandeep Sheriker Mallikarjun <sandeepsheriker.mallikarjun@microchip.com>
[claudiu.beznea@microchip.com: add fixed_clksrc checks]
Signed-off-by: default avatarClaudiu Beznea <claudiu.beznea@microchip.com>
Reviewed-by: default avatarSam Ravnborg <sam@ravnborg.org>
Signed-off-by: default avatarSam Ravnborg <sam@ravnborg.org>
Link: https://patchwork.freedesktop.org/patch/msgid/1556195748-11106-5-git-send-email-claudiu.beznea@microchip.com
parent e1dc68a4
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -625,10 +625,18 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)
	dc->hlcdc = dev_get_drvdata(dev->dev->parent);
	dev->dev_private = dc;

	if (dc->desc->fixed_clksrc) {
		ret = clk_prepare_enable(dc->hlcdc->sys_clk);
		if (ret) {
			dev_err(dev->dev, "failed to enable sys_clk\n");
			goto err_destroy_wq;
		}
	}

	ret = clk_prepare_enable(dc->hlcdc->periph_clk);
	if (ret) {
		dev_err(dev->dev, "failed to enable periph_clk\n");
		goto err_destroy_wq;
		goto err_sys_clk_disable;
	}

	pm_runtime_enable(dev->dev);
@@ -664,6 +672,9 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)
err_periph_clk_disable:
	pm_runtime_disable(dev->dev);
	clk_disable_unprepare(dc->hlcdc->periph_clk);
err_sys_clk_disable:
	if (dc->desc->fixed_clksrc)
		clk_disable_unprepare(dc->hlcdc->sys_clk);

err_destroy_wq:
	destroy_workqueue(dc->wq);
@@ -688,6 +699,8 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev)

	pm_runtime_disable(dev->dev);
	clk_disable_unprepare(dc->hlcdc->periph_clk);
	if (dc->desc->fixed_clksrc)
		clk_disable_unprepare(dc->hlcdc->sys_clk);
	destroy_workqueue(dc->wq);
}

@@ -805,6 +818,8 @@ static int atmel_hlcdc_dc_drm_suspend(struct device *dev)
	regmap_read(regmap, ATMEL_HLCDC_IMR, &dc->suspend.imr);
	regmap_write(regmap, ATMEL_HLCDC_IDR, dc->suspend.imr);
	clk_disable_unprepare(dc->hlcdc->periph_clk);
	if (dc->desc->fixed_clksrc)
		clk_disable_unprepare(dc->hlcdc->sys_clk);

	return 0;
}
@@ -814,6 +829,8 @@ static int atmel_hlcdc_dc_drm_resume(struct device *dev)
	struct drm_device *drm_dev = dev_get_drvdata(dev);
	struct atmel_hlcdc_dc *dc = drm_dev->dev_private;

	if (dc->desc->fixed_clksrc)
		clk_prepare_enable(dc->hlcdc->sys_clk);
	clk_prepare_enable(dc->hlcdc->periph_clk);
	regmap_write(dc->hlcdc->regmap, ATMEL_HLCDC_IER, dc->suspend.imr);