| From b4cf6dd9f5e0a3c4786e7f0e32da6e32fb54eddf Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 18 Dec 2019 14:28:25 +0200 |
| Subject: drm: atmel-hlcdc: enable clock before configuring timing engine |
| |
| From: Claudiu Beznea <claudiu.beznea@microchip.com> |
| |
| [ Upstream commit 2c1fb9d86f6820abbfaa38a6836157c76ccb4e7b ] |
| |
| Changing pixel clock source without having this clock source enabled |
| will block the timing engine and the next operations after (in this case |
| setting ATMEL_HLCDC_CFG(5) settings in atmel_hlcdc_crtc_mode_set_nofb() |
| will fail). It is recomended (although in datasheet this is not present) |
| to actually enabled pixel clock source before doing any changes on timing |
| enginge (only SAM9X60 datasheet specifies that the peripheral clock and |
| pixel clock must be enabled before using LCD controller). |
| |
| Fixes: 1a396789f65a ("drm: add Atmel HLCDC Display Controller support") |
| Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com> |
| Signed-off-by: Sam Ravnborg <sam@ravnborg.org> |
| Cc: Boris Brezillon <boris.brezillon@free-electrons.com> |
| Cc: <stable@vger.kernel.org> # v4.0+ |
| Link: https://patchwork.freedesktop.org/patch/msgid/1576672109-22707-3-git-send-email-claudiu.beznea@microchip.com |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c | 8 +++++++- |
| 1 file changed, 7 insertions(+), 1 deletion(-) |
| |
| diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c |
| index d73281095faca..976109c20d493 100644 |
| --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c |
| +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c |
| @@ -79,7 +79,11 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) |
| struct videomode vm; |
| unsigned long prate; |
| unsigned int cfg; |
| - int div; |
| + int div, ret; |
| + |
| + ret = clk_prepare_enable(crtc->dc->hlcdc->sys_clk); |
| + if (ret) |
| + return; |
| |
| vm.vfront_porch = adj->crtc_vsync_start - adj->crtc_vdisplay; |
| vm.vback_porch = adj->crtc_vtotal - adj->crtc_vsync_end; |
| @@ -138,6 +142,8 @@ static void atmel_hlcdc_crtc_mode_set_nofb(struct drm_crtc *c) |
| ATMEL_HLCDC_VSPSU | ATMEL_HLCDC_VSPHO | |
| ATMEL_HLCDC_GUARDTIME_MASK | ATMEL_HLCDC_MODE_MASK, |
| cfg); |
| + |
| + clk_disable_unprepare(crtc->dc->hlcdc->sys_clk); |
| } |
| |
| static enum drm_mode_status |
| -- |
| 2.20.1 |
| |