clk: sandbox: Adjust clk-divider to emulate reading its value from HW
authorLukasz Majewski <lukma@denx.de>
Mon, 24 Jun 2019 13:50:48 +0000 (15:50 +0200)
committerStefano Babic <sbabic@denx.de>
Fri, 19 Jul 2019 12:50:30 +0000 (14:50 +0200)
The generic divider clock code for CCF requires reading the divider value
from HW registers. As sandbox by design has readl() as no-op it was
necessary to provide this value in the other way.

The new field in the divider structure (accessible only when sandbox is
run) has been introduced for this purpose.

Signed-off-by: Lukasz Majewski <lukma@denx.de>
drivers/clk/clk-divider.c
include/linux/clk-provider.h

index 3348d97829b205bbab148f3776c0ee074fc19c8b..6921c76a48fc149bb81a80aa5e6b1e2e80b57d19 100644 (file)
@@ -74,7 +74,12 @@ static ulong clk_divider_recalc_rate(struct clk *clk)
        unsigned long parent_rate = clk_get_parent_rate(clk);
        unsigned int val;
 
-       val = readl(divider->reg) >> divider->shift;
+#if CONFIG_IS_ENABLED(SANDBOX_CLK_CCF)
+       val = divider->io_divider_val;
+#else
+       val = readl(divider->reg);
+#endif
+       val >>= divider->shift;
        val &= clk_div_mask(divider->width);
 
        return divider_recalc_rate(clk, parent_rate, val, divider->table,
@@ -112,6 +117,9 @@ static struct clk *_register_divider(struct device *dev, const char *name,
        div->width = width;
        div->flags = clk_divider_flags;
        div->table = table;
+#if CONFIG_IS_ENABLED(SANDBOX_CLK_CCF)
+       div->io_divider_val = *(u32 *)reg;
+#endif
 
        /* register the clock */
        clk = &div->clk;
index e06487f07b4c1331063d0cbaadd7a7e1f196a816..53c9c41b90de4f5870b6ca8a3b26284437f27d50 100644 (file)
@@ -75,6 +75,9 @@ struct clk_divider {
        u8              width;
        u8              flags;
        const struct clk_div_table      *table;
+#if CONFIG_IS_ENABLED(SANDBOX_CLK_CCF)
+       u32             io_divider_val;
+#endif
 };
 
 #define clk_div_mask(width)    ((1 << (width)) - 1)