Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/arch/arm/ti Select closest rate to desired pixel clock



details:   https://anonhg.NetBSD.org/src/rev/3aba506c6093
branches:  trunk
changeset: 1004601:3aba506c6093
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Mon Nov 04 09:38:38 2019 +0000

description:
Select closest rate to desired pixel clock

diffstat:

 sys/arch/arm/ti/ti_lcdc.c |  19 +++++++++++++------
 1 files changed, 13 insertions(+), 6 deletions(-)

diffs (48 lines):

diff -r 5692a3a80fb5 -r 3aba506c6093 sys/arch/arm/ti/ti_lcdc.c
--- a/sys/arch/arm/ti/ti_lcdc.c Mon Nov 04 09:37:51 2019 +0000
+++ b/sys/arch/arm/ti/ti_lcdc.c Mon Nov 04 09:38:38 2019 +0000
@@ -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 <jmcneill%invisible.ca@localhost>
@@ -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 @@
 {
        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 @@
        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",



Home | Main Index | Thread Index | Old Index