return 0;
}
+static ulong mtk_ext_clock_get_rate(const struct mtk_clk_tree *tree, int id)
+{
+ if (!tree->ext_clk_rates || id >= tree->num_ext_clks)
+ return -ENOENT;
+
+ return tree->ext_clk_rates[id];
+}
+
/*
* In case the rate change propagation to parent clocks is undesirable,
* this function is recursively called to find the parent to calculate
break;
case CLK_PARENT_XTAL:
return priv->tree->xtal_rate;
+ case CLK_PARENT_EXT:
+ return mtk_ext_clock_get_rate(priv->tree, parent);
default:
parent_dev = NULL;
break;
case CLK_PARENT_XTAL:
parent_type_str = "xtal";
break;
+ case CLK_PARENT_EXT:
+ parent_type_str = "ext";
+ break;
case CLK_PARENT_MIXED:
parent_type_str = "mixed";
break;
*/
} else if (gate->flags & CLK_PARENT_XTAL) {
return priv->tree->xtal_rate;
+ } else if (gate->flags & CLK_PARENT_EXT) {
+ return mtk_ext_clock_get_rate(priv->tree, gate->parent);
}
return mtk_clk_find_parent_rate(clk, gate->parent, parent);
#define CLK_PARENT_TOPCKGEN BIT(5)
#define CLK_PARENT_INFRASYS BIT(6)
#define CLK_PARENT_XTAL BIT(7)
+#define CLK_PARENT_EXT BIT(8)
/*
* For CLK_PARENT_MIXED to correctly work, is required to
* define in clk_tree flags the clk type using the alias.
*/
-#define CLK_PARENT_MIXED BIT(8)
-#define CLK_PARENT_MASK GENMASK(8, 4)
+#define CLK_PARENT_MIXED BIT(9)
+#define CLK_PARENT_MASK GENMASK(9, 4)
#define ETHSYS_HIFSYS_RST_CTRL_OFS 0x34
struct mtk_clk_tree {
unsigned long xtal_rate;
unsigned long xtal2_rate;
+ /* External fixed clocks - excluded from mapping. */
+ const ulong *ext_clk_rates;
+ const int num_ext_clks;
/*
* Clock IDs may be remapped with an auxiliary table. Enable this by
* defining .id_offs_map and .id_offs_map_size. This is needed e.g. when