Module Name: src Committed By: jmcneill Date: Mon Nov 4 09:38:39 UTC 2019
Modified Files: src/sys/arch/arm/ti: ti_lcdc.c Log Message: Select closest rate to desired pixel clock To generate a diff of this commit: cvs rdiff -u -r1.2 -r1.3 src/sys/arch/arm/ti/ti_lcdc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/ti/ti_lcdc.c diff -u src/sys/arch/arm/ti/ti_lcdc.c:1.2 src/sys/arch/arm/ti/ti_lcdc.c:1.3 --- src/sys/arch/arm/ti/ti_lcdc.c:1.2 Sun Nov 3 23:31:49 2019 +++ src/sys/arch/arm/ti/ti_lcdc.c Mon Nov 4 09:38:38 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: ti_lcdc.c,v 1.2 2019/11/03 23:31:49 jmcneill Exp $ */ +/* $NetBSD: ti_lcdc.c,v 1.3 2019/11/04 09:38:38 jmcneill Exp $ */ /*- * Copyright (c) 2019 Jared D. McNeill <jmcne...@invisible.ca> @@ -27,7 +27,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: ti_lcdc.c,v 1.2 2019/11/03 23:31:49 jmcneill Exp $"); +__KERNEL_RCSID(0, "$NetBSD: ti_lcdc.c,v 1.3 2019/11/04 09:38:38 jmcneill Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -159,8 +159,8 @@ tilcdc_mode_set(struct drm_crtc *crtc, s { struct tilcdc_crtc *mixer_crtc = to_tilcdc_crtc(crtc); struct tilcdc_softc * const sc = mixer_crtc->sc; + int clk_div, div, diff, best_diff; uint32_t val; - u_int clk_div; const u_int hspw = adjusted_mode->crtc_hsync_end - adjusted_mode->crtc_hsync_start; const u_int hbp = adjusted_mode->crtc_htotal - adjusted_mode->crtc_hsync_end; @@ -170,9 +170,16 @@ tilcdc_mode_set(struct drm_crtc *crtc, s const u_int vfp = adjusted_mode->crtc_vsync_start - adjusted_mode->crtc_vdisplay; const u_int rate = clk_get_rate(sc->sc_clk); - for (clk_div = 2; clk_div < 255; clk_div++) { - if (rate / clk_div <= (int)adjusted_mode->crtc_clock * 1000) - break; + + clk_div = 255; + best_diff = -1; + for (div = 2; div < 255; div++) { + const int pixel_clock = (rate / div) / 1000; + diff = abs(adjusted_mode->crtc_clock - pixel_clock); + if (best_diff == -1 || diff < best_diff) { + best_diff = diff; + clk_div = div; + } } if (clk_div == 255) { device_printf(sc->sc_dev, "couldn't configure pixel clock (%u)\n",