[PATCH v4 10/24] clk: mediatek: pll: Add BAR reset register offsets

From: Louis-Alexis Eyraud

Date: Wed Jul 29 2026 - 06:12:03 EST


Currently, the register offset to handle BAR reset, for PLLs that
support it, is hardcoded to CON0.
On MT8189 SoC, there are separate status, set and clr registers to
handle this, so differents offsets are needed.

Add the new fields for offsets and addresses to the MTK PLL data
structure and modify mtk_clk_register_pll_ops function to compute the
new register addresses so they are available for clock operation usage.

Also, replace reset BAR address computing by its computed address
from MTK PLL data structure in prepare/unprepare callbacks.

Signed-off-by: Louis-Alexis Eyraud <louisalexis.eyraud@xxxxxxxxxxxxx>
---
drivers/clk/mediatek/clk-pll.c | 18 ++++++++++++++----
drivers/clk/mediatek/clk-pll.h | 6 ++++++
2 files changed, 20 insertions(+), 4 deletions(-)

diff --git a/drivers/clk/mediatek/clk-pll.c b/drivers/clk/mediatek/clk-pll.c
index ee478bc64085..4b0f7e2bfc5a 100644
--- a/drivers/clk/mediatek/clk-pll.c
+++ b/drivers/clk/mediatek/clk-pll.c
@@ -249,9 +249,9 @@ int mtk_pll_prepare(struct clk_hw *hw)
udelay(20);

if (pll->data->flags & HAVE_RST_BAR) {
- r = readl(pll->base_addr + REG_CON0);
+ r = readl(pll->rst_bar_addr);
r |= pll->data->rst_bar_mask;
- writel(r, pll->base_addr + REG_CON0);
+ writel(r, pll->rst_bar_addr);
}

return 0;
@@ -263,9 +263,9 @@ void mtk_pll_unprepare(struct clk_hw *hw)
u32 r;

if (pll->data->flags & HAVE_RST_BAR) {
- r = readl(pll->base_addr + REG_CON0);
+ r = readl(pll->rst_bar_addr);
r &= ~pll->data->rst_bar_mask;
- writel(r, pll->base_addr + REG_CON0);
+ writel(r, pll->rst_bar_addr);
}

__mtk_pll_tuner_disable(pll);
@@ -352,6 +352,16 @@ struct clk_hw *mtk_clk_register_pll_ops(struct mtk_clk_pll *pll,
pll->en_set_addr = base + data->en_set_reg;
if (data->en_clr_reg)
pll->en_clr_addr = base + data->en_clr_reg;
+
+ if (data->rst_bar_reg)
+ pll->rst_bar_addr = base + data->rst_bar_reg;
+ else
+ pll->rst_bar_addr = pll->base_addr + REG_CON0;
+ if (data->rst_bar_set_reg)
+ pll->rst_bar_set_addr = base + data->rst_bar_set_reg;
+ if (data->rst_bar_clr_reg)
+ pll->rst_bar_clr_addr = base + data->rst_bar_clr_reg;
+
pll->hw.init = &init;
pll->data = data;

diff --git a/drivers/clk/mediatek/clk-pll.h b/drivers/clk/mediatek/clk-pll.h
index d6d34840c09d..3aaf3a7654b5 100644
--- a/drivers/clk/mediatek/clk-pll.h
+++ b/drivers/clk/mediatek/clk-pll.h
@@ -49,6 +49,9 @@ struct mtk_pll_data {
u32 en_reg;
u32 en_set_reg;
u32 en_clr_reg;
+ u32 rst_bar_reg;
+ u32 rst_bar_set_reg;
+ u32 rst_bar_clr_reg;
u8 pll_en_bit; /* Assume 0, indicates BIT(0) by default */
u8 pcw_chg_bit;
u8 fenc_sta_bit;
@@ -75,6 +78,9 @@ struct mtk_clk_pll {
void __iomem *en_set_addr;
void __iomem *en_clr_addr;
void __iomem *fenc_addr;
+ void __iomem *rst_bar_addr;
+ void __iomem *rst_bar_set_addr;
+ void __iomem *rst_bar_clr_addr;
const struct mtk_pll_data *data;
};


--
2.55.0