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

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
...@@ -625,10 +625,18 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) ...@@ -625,10 +625,18 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)
dc->hlcdc = dev_get_drvdata(dev->dev->parent); dc->hlcdc = dev_get_drvdata(dev->dev->parent);
dev->dev_private = dc; 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); ret = clk_prepare_enable(dc->hlcdc->periph_clk);
if (ret) { if (ret) {
dev_err(dev->dev, "failed to enable periph_clk\n"); dev_err(dev->dev, "failed to enable periph_clk\n");
goto err_destroy_wq; goto err_sys_clk_disable;
} }
pm_runtime_enable(dev->dev); pm_runtime_enable(dev->dev);
...@@ -664,6 +672,9 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev) ...@@ -664,6 +672,9 @@ static int atmel_hlcdc_dc_load(struct drm_device *dev)
err_periph_clk_disable: err_periph_clk_disable:
pm_runtime_disable(dev->dev); pm_runtime_disable(dev->dev);
clk_disable_unprepare(dc->hlcdc->periph_clk); 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: err_destroy_wq:
destroy_workqueue(dc->wq); destroy_workqueue(dc->wq);
...@@ -688,6 +699,8 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev) ...@@ -688,6 +699,8 @@ static void atmel_hlcdc_dc_unload(struct drm_device *dev)
pm_runtime_disable(dev->dev); pm_runtime_disable(dev->dev);
clk_disable_unprepare(dc->hlcdc->periph_clk); clk_disable_unprepare(dc->hlcdc->periph_clk);
if (dc->desc->fixed_clksrc)
clk_disable_unprepare(dc->hlcdc->sys_clk);
destroy_workqueue(dc->wq); destroy_workqueue(dc->wq);
} }
...@@ -805,6 +818,8 @@ static int atmel_hlcdc_dc_drm_suspend(struct device *dev) ...@@ -805,6 +818,8 @@ static int atmel_hlcdc_dc_drm_suspend(struct device *dev)
regmap_read(regmap, ATMEL_HLCDC_IMR, &dc->suspend.imr); regmap_read(regmap, ATMEL_HLCDC_IMR, &dc->suspend.imr);
regmap_write(regmap, ATMEL_HLCDC_IDR, dc->suspend.imr); regmap_write(regmap, ATMEL_HLCDC_IDR, dc->suspend.imr);
clk_disable_unprepare(dc->hlcdc->periph_clk); clk_disable_unprepare(dc->hlcdc->periph_clk);
if (dc->desc->fixed_clksrc)
clk_disable_unprepare(dc->hlcdc->sys_clk);
return 0; return 0;
} }
...@@ -814,6 +829,8 @@ static int atmel_hlcdc_dc_drm_resume(struct device *dev) ...@@ -814,6 +829,8 @@ static int atmel_hlcdc_dc_drm_resume(struct device *dev)
struct drm_device *drm_dev = dev_get_drvdata(dev); struct drm_device *drm_dev = dev_get_drvdata(dev);
struct atmel_hlcdc_dc *dc = drm_dev->dev_private; 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); clk_prepare_enable(dc->hlcdc->periph_clk);
regmap_write(dc->hlcdc->regmap, ATMEL_HLCDC_IER, dc->suspend.imr); regmap_write(dc->hlcdc->regmap, ATMEL_HLCDC_IER, dc->suspend.imr);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment