| From 3f5682d174d4762e8fe2fd5d1600949de1408223 Mon Sep 17 00:00:00 2001 |
| From: Claudiu Beznea <claudiu.beznea@microchip.com> |
| Date: Wed, 18 Dec 2019 14:28:25 +0200 |
| Subject: [PATCH] drm: atmel-hlcdc: enable clock before configuring timing |
| engine |
| |
| commit 2c1fb9d86f6820abbfaa38a6836157c76ccb4e7b upstream. |
| |
| 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: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c |
| index a128400593a9..ee10e77ab80f 100644 |
| --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c |
| +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_crtc.c |
| @@ -68,7 +68,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; |
| @@ -143,6 +147,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.7.4 |
| |