clk: mediatek: Warn if clk IDs are duplicated
The Mediatek clk driver library handles duplicate clock IDs in two different ways: either ignoring the duplicate entry, or overwriting the old clk. Either way may cause unexpected behavior, and the latter also causes an orphan clk that cannot be cleaned up. Align the behavior so that later duplicate entries are ignored, and a warning printed. The warning will also aid in making the issue noticeable. Signed-off-by: Chen-Yu Tsai <wenst@chromium.org> Reviewed-by: Miles Chen <miles.chen@mediatek.com> Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> Link: https://lore.kernel.org/r/20220208124034.414635-32-wenst@chromium.org Signed-off-by: Stephen Boyd <sboyd@kernel.org>
This commit is contained in:
parent
cf8a482afc
commit
d54bb86b89
|
@ -120,6 +120,12 @@ int mtk_clk_register_cpumuxes(struct device_node *node,
|
|||
for (i = 0; i < num; i++) {
|
||||
const struct mtk_composite *mux = &clks[i];
|
||||
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[mux->id])) {
|
||||
pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
|
||||
node, mux->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = mtk_clk_register_cpumux(mux, regmap);
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("Failed to register clk %s: %pe\n", mux->name, clk);
|
||||
|
|
|
@ -224,8 +224,11 @@ int mtk_clk_register_gates_with_dev(struct device_node *node,
|
|||
for (i = 0; i < num; i++) {
|
||||
const struct mtk_gate *gate = &clks[i];
|
||||
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[gate->id]))
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[gate->id])) {
|
||||
pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
|
||||
node, gate->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = mtk_clk_register_gate(gate->name, gate->parent_name,
|
||||
regmap,
|
||||
|
|
|
@ -65,8 +65,10 @@ int mtk_clk_register_fixed_clks(const struct mtk_fixed_clk *clks, int num,
|
|||
for (i = 0; i < num; i++) {
|
||||
const struct mtk_fixed_clk *rc = &clks[i];
|
||||
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[rc->id]))
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[rc->id])) {
|
||||
pr_warn("Trying to register duplicate clock ID: %d\n", rc->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = clk_register_fixed_rate(NULL, rc->name, rc->parent, 0,
|
||||
rc->rate);
|
||||
|
@ -128,8 +130,10 @@ int mtk_clk_register_factors(const struct mtk_fixed_factor *clks, int num,
|
|||
for (i = 0; i < num; i++) {
|
||||
const struct mtk_fixed_factor *ff = &clks[i];
|
||||
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[ff->id]))
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[ff->id])) {
|
||||
pr_warn("Trying to register duplicate clock ID: %d\n", ff->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = clk_register_fixed_factor(NULL, ff->name, ff->parent_name,
|
||||
CLK_SET_RATE_PARENT, ff->mult, ff->div);
|
||||
|
@ -305,8 +309,11 @@ int mtk_clk_register_composites(const struct mtk_composite *mcs, int num,
|
|||
for (i = 0; i < num; i++) {
|
||||
const struct mtk_composite *mc = &mcs[i];
|
||||
|
||||
if (clk_data && !IS_ERR_OR_NULL(clk_data->clks[mc->id]))
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[mc->id])) {
|
||||
pr_warn("Trying to register duplicate clock ID: %d\n",
|
||||
mc->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = mtk_clk_register_composite(mc, base, lock);
|
||||
|
||||
|
@ -368,8 +375,11 @@ int mtk_clk_register_dividers(const struct mtk_clk_divider *mcds, int num,
|
|||
for (i = 0; i < num; i++) {
|
||||
const struct mtk_clk_divider *mcd = &mcds[i];
|
||||
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[mcd->id]))
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[mcd->id])) {
|
||||
pr_warn("Trying to register duplicate clock ID: %d\n",
|
||||
mcd->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = clk_register_divider(NULL, mcd->name, mcd->parent_name,
|
||||
mcd->flags, base + mcd->div_reg, mcd->div_shift,
|
||||
|
|
|
@ -208,8 +208,11 @@ int mtk_clk_register_muxes(const struct mtk_mux *muxes,
|
|||
for (i = 0; i < num; i++) {
|
||||
const struct mtk_mux *mux = &muxes[i];
|
||||
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[mux->id]))
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[mux->id])) {
|
||||
pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
|
||||
node, mux->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = mtk_clk_register_mux(mux, regmap, lock);
|
||||
|
||||
|
|
|
@ -394,6 +394,12 @@ int mtk_clk_register_plls(struct device_node *node,
|
|||
for (i = 0; i < num_plls; i++) {
|
||||
const struct mtk_pll_data *pll = &plls[i];
|
||||
|
||||
if (!IS_ERR_OR_NULL(clk_data->clks[pll->id])) {
|
||||
pr_warn("%pOF: Trying to register duplicate clock ID: %d\n",
|
||||
node, pll->id);
|
||||
continue;
|
||||
}
|
||||
|
||||
clk = mtk_clk_register_pll(pll, base);
|
||||
|
||||
if (IS_ERR(clk)) {
|
||||
|
|
Loading…
Reference in New Issue