|
@@ -253,7 +253,7 @@ static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
|
|
|
{
|
|
|
struct clk *clk = NULL, *parent;
|
|
|
struct device *dev = priv->dev;
|
|
|
- unsigned int id = core->id;
|
|
|
+ unsigned int id = core->id, div = core->div;
|
|
|
const char *parent_name;
|
|
|
|
|
|
WARN_DEBUG(id >= priv->num_core_clks);
|
|
@@ -266,6 +266,7 @@ static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
|
|
|
|
|
|
case CLK_TYPE_FF:
|
|
|
case CLK_TYPE_DIV6P1:
|
|
|
+ case CLK_TYPE_DIV6_RO:
|
|
|
WARN_DEBUG(core->parent >= priv->num_core_clks);
|
|
|
parent = priv->clks[core->parent];
|
|
|
if (IS_ERR(parent)) {
|
|
@@ -274,13 +275,18 @@ static void __init cpg_mssr_register_core_clk(const struct cpg_core_clk *core,
|
|
|
}
|
|
|
|
|
|
parent_name = __clk_get_name(parent);
|
|
|
- if (core->type == CLK_TYPE_FF) {
|
|
|
- clk = clk_register_fixed_factor(NULL, core->name,
|
|
|
- parent_name, 0,
|
|
|
- core->mult, core->div);
|
|
|
- } else {
|
|
|
+
|
|
|
+ if (core->type == CLK_TYPE_DIV6_RO)
|
|
|
+ /* Multiply with the DIV6 register value */
|
|
|
+ div *= (readl(priv->base + core->offset) & 0x3f) + 1;
|
|
|
+
|
|
|
+ if (core->type == CLK_TYPE_DIV6P1) {
|
|
|
clk = cpg_div6_register(core->name, 1, &parent_name,
|
|
|
priv->base + core->offset);
|
|
|
+ } else {
|
|
|
+ clk = clk_register_fixed_factor(NULL, core->name,
|
|
|
+ parent_name, 0,
|
|
|
+ core->mult, div);
|
|
|
}
|
|
|
break;
|
|
|
|