Source-Changes-HG archive

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

[src/trunk]: src/sys/arch/arm/sunxi - sunxi_ccu_lcdxch1_set_rate(): enable pa...



details:   https://anonhg.NetBSD.org/src/rev/e18a7e7f48b9
branches:  trunk
changeset: 321733:e18a7e7f48b9
user:      bouyer <bouyer%NetBSD.org@localhost>
date:      Mon Apr 02 20:55:49 2018 +0000

description:
- sunxi_ccu_lcdxch1_set_rate(): enable parent before calling
  sunxi_ccu_div_set_rate(). If it's not enabled get_rate() will return 0 and
  sunxi_ccu_div_set_rate() will fail.
- rework sunxi_ccu_lcdxch0_set_rate() to actually really select the best
  parent.

diffstat:

 sys/arch/arm/sunxi/sunxi_ccu_display.c |  36 ++++++++++++++++++++++++---------
 1 files changed, 26 insertions(+), 10 deletions(-)

diffs (68 lines):

diff -r 0b2e76993ede -r e18a7e7f48b9 sys/arch/arm/sunxi/sunxi_ccu_display.c
--- a/sys/arch/arm/sunxi/sunxi_ccu_display.c    Mon Apr 02 20:54:47 2018 +0000
+++ b/sys/arch/arm/sunxi/sunxi_ccu_display.c    Mon Apr 02 20:55:49 2018 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: sunxi_ccu_display.c,v 1.1 2018/04/01 21:19:17 bouyer Exp $ */
+/* $NetBSD: sunxi_ccu_display.c,v 1.2 2018/04/02 20:55:49 bouyer Exp $ */
 
 /*-
  * Copyright (c) 2018 Manuel Bouyer <bouyer%antioche.eu.org@localhost>
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu_display.c,v 1.1 2018/04/01 21:19:17 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunxi_ccu_display.c,v 1.2 2018/04/02 20:55:49 bouyer Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -46,18 +46,32 @@
 {
        struct clk *clkp;
        int error;
+       int diff, diff_x2;
+       int rate, rate_x2;
 
        clkp = &pllclk->base;
-       error = clk_set_rate(clkp, new_rate);
-       if (error) {
+       rate = clk_round_rate(clkp, new_rate);
+       diff = abs(new_rate - rate);
+
+       rate_x2 = (clk_round_rate(clkp, new_rate / 2) * 2);
+       diff_x2 = abs(new_rate - rate_x2);
+
+       if (rate == 0 && rate_x2 == 0)
+               return ERANGE;
+
+       if (diff_x2 < diff) {
                error = clk_set_rate(clkp, new_rate / 2);
-               if (error != 0)
-                       return error;
-               clkp = &pllclk_x2->base;
+               KASSERT(error == 0);
+               error = clk_set_parent(&clk->base, &pllclk_x2->base);
+               KASSERT(error == 0);
+       } else {
+               error = clk_set_rate(clkp, new_rate);
+               KASSERT(error == 0);
+               error = clk_set_parent(&clk->base, clkp);
+               KASSERT(error == 0);
        }
-       error = clk_set_parent(&clk->base, clkp);
-       KASSERT(error == 0);
-       return error;
+       (void)error;
+       return 0;
 }
 
 u_int
@@ -122,6 +136,8 @@
        KASSERT(error == 0);
        error = clk_set_parent(&clk->base, clkp);
        KASSERT(error == 0);
+       error = clk_enable(clkp);
+       KASSERT(error == 0);
        error = sunxi_ccu_div_set_rate(sc, clk, new_rate);
        KASSERT(error == 0);
        return error;



Home | Main Index | Thread Index | Old Index