From keita.morisaki at tier4.jp Sun Feb 1 18:45:26 2026 From: keita.morisaki at tier4.jp (Keita Morisaki) Date: Mon, 2 Feb 2026 11:45:26 +0900 Subject: [PATCH] scsi: ufs: mediatek: Fix page faults in ufs_mtk_clk_scale trace event Message-ID: <20260202024526.122515-1-keita.morisaki@tier4.jp> The ufs_mtk_clk_scale trace event currently stores the address of the name string directly via __field(const char *, name). This pointer may become invalid after the module is unloaded, causing page faults when the trace buffer is subsequently accessed. This can occur because the MediaTek UFS driver can be configured as a loadable module (tristate in Kconfig), meaning the name string passed to the trace event may reside in module memory that becomes invalid after module unload. Fix this by using __string() and __assign_str() to copy the string contents into the ring buffer instead of storing the pointer. This ensures the trace data remains valid regardless of module state. This change increases the memory usage for each ftrace entry by a few bytes (clock names are typically 7-15 characters like "ufs_sel" or "ufs_sel_max_src") compared to storing an 8-byte pointer. Note that this change does not affect anything unless all of the following conditions are met: - CONFIG_SCSI_UFS_MEDIATEK is enabled - ftrace tracing is enabled - The ufs_mtk_clk_scale event is enabled in ftrace Signed-off-by: Keita Morisaki --- drivers/ufs/host/ufs-mediatek-trace.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/ufs/host/ufs-mediatek-trace.h b/drivers/ufs/host/ufs-mediatek-trace.h index b5f2ec314..0df8ac843 100644 --- a/drivers/ufs/host/ufs-mediatek-trace.h +++ b/drivers/ufs/host/ufs-mediatek-trace.h @@ -33,19 +33,19 @@ TRACE_EVENT(ufs_mtk_clk_scale, TP_ARGS(name, scale_up, clk_rate), TP_STRUCT__entry( - __field(const char*, name) + __string(name, name) __field(bool, scale_up) __field(unsigned long, clk_rate) ), TP_fast_assign( - __entry->name = name; + __assign_str(name); __entry->scale_up = scale_up; __entry->clk_rate = clk_rate; ), TP_printk("ufs: clk (%s) scaled %s @ %lu", - __entry->name, + __get_str(name), __entry->scale_up ? "up" : "down", __entry->clk_rate) ); base-commit: 18f7fcd5e69a04df57b563360b88be72471d6b62 -- 2.34.1 From ck.hu at mediatek.com Sun Feb 1 22:26:02 2026 From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=) Date: Mon, 2 Feb 2026 06:26:02 +0000 Subject: [PATCH RFC 1/6] drm/mediatek: plane: Remove extra block from AFBC data payload offset In-Reply-To: <20251230-mtk-afbc-fixes-v1-1-6c0247b66e32@collabora.com> References: <20251230-mtk-afbc-fixes-v1-0-6c0247b66e32@collabora.com> <20251230-mtk-afbc-fixes-v1-1-6c0247b66e32@collabora.com> Message-ID: <95aa482f5ee951175ab4a51995da86d49d88c247.camel@mediatek.com> Hi, Nicolas: On Tue, 2025-12-30 at 11:03 -0300, N?colas F. R. A. Prado wrote: > The AFBC data payload is in fact not offset by 1 additional block as the > code and comment suggest, and this causes the buffer to be rendered > offset by one block. Remove this extraneous offset to get the buffer > correctly displayed. Reviewed-by: CK Hu > > Fixes: c410fa9b07c3 ("drm/mediatek: Add AFBC support to Mediatek DRM driver") > Signed-off-by: N?colas F. R. A. Prado > --- > drivers/gpu/drm/mediatek/mtk_plane.c | 3 +-- > 1 file changed, 1 insertion(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_plane.c b/drivers/gpu/drm/mediatek/mtk_plane.c > index 5043e0377270..1214f623859e 100644 > --- a/drivers/gpu/drm/mediatek/mtk_plane.c > +++ b/drivers/gpu/drm/mediatek/mtk_plane.c > @@ -164,10 +164,9 @@ static void mtk_plane_update_new_state(struct drm_plane_state *new_state, > */ > hdr_addr = addr + hdr_offset; > > - /* The data plane is offset by 1 additional block. */ > offset = pitch * y_offset_in_blocks + > AFBC_DATA_BLOCK_WIDTH * AFBC_DATA_BLOCK_HEIGHT * > - fb->format->cpp[0] * (x_offset_in_blocks + 1); > + fb->format->cpp[0] * x_offset_in_blocks; > > /* > * Using dma_addr_t variable to calculate with multiplier of different types, > From ck.hu at mediatek.com Sun Feb 1 22:28:03 2026 From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=) Date: Mon, 2 Feb 2026 06:28:03 +0000 Subject: [PATCH RFC 2/6] drm/mediatek: plane: Correct AFBC alignment definition to 128 In-Reply-To: <20251230-mtk-afbc-fixes-v1-2-6c0247b66e32@collabora.com> References: <20251230-mtk-afbc-fixes-v1-0-6c0247b66e32@collabora.com> <20251230-mtk-afbc-fixes-v1-2-6c0247b66e32@collabora.com> Message-ID: <454a9215a5202c681bca1f38650bb9a8b8ce7393.camel@mediatek.com> Hi, Nicolas: On Tue, 2025-12-30 at 11:03 -0300, N?colas F. R. A. Prado wrote: > The minimum alignment for both the header and data buffers in the AFBC > format for Mali GPUs with archicture version 6 and higher (which > includes MT8195's G57 (v9)) is 128, not 1024 as the MediaTek DRM driver > currently defines. > > Since Mesa defines it as the correct value of 128 [1], when displaying > AFBC buffers, some resolutions will cause the OVL component to be > configured by the driver with a data address that is different from the > address that actually contains the data as set by Mesa, resulting in > corrupted output on display. Reviewed-by: CK Hu > > Fix the AFBC alignment definition for the MediaTek DRM driver. > > [1] https://urldefense.com/v3/__https://gitlab.freedesktop.org/mesa/mesa/-/blob/3848a080534a17ca075e9e95dd3a14abb80139aa/src/panfrost/lib/pan_afbc.h*L364__;Iw!!CTRNKA9wMg0ARbw!hx6VI6pbINcUORdlV1iTi7-tiAXUyQPRPDAvNjq5eaBKlSc8JSe-zQe7WdnWO-GSgLZ__9Kxb6VHhAL1Fxg$ > > Fixes: c410fa9b07c3 ("drm/mediatek: Add AFBC support to Mediatek DRM driver") > Signed-off-by: N?colas F. R. A. Prado > --- > drivers/gpu/drm/mediatek/mtk_plane.h | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_plane.h b/drivers/gpu/drm/mediatek/mtk_plane.h > index 95c5fa5295d8..46be4454bc92 100644 > --- a/drivers/gpu/drm/mediatek/mtk_plane.h > +++ b/drivers/gpu/drm/mediatek/mtk_plane.h > @@ -13,7 +13,7 @@ > #define AFBC_DATA_BLOCK_WIDTH 32 > #define AFBC_DATA_BLOCK_HEIGHT 8 > #define AFBC_HEADER_BLOCK_SIZE 16 > -#define AFBC_HEADER_ALIGNMENT 1024 > +#define AFBC_HEADER_ALIGNMENT 128 > > struct mtk_plane_pending_state { > bool config; > From irving-ch.lin at mediatek.com Sun Feb 1 22:28:09 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:09 +0800 Subject: [PATCH v5 02/18] clk: mediatek: clk-mux: Make sure bypass clk enabled while setting MFG rate In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-3-irving-ch.lin@mediatek.com> From: Irving-CH Lin Enable bypass clock before MFG changing rate, to make sure MFG reference clock available during transient. Fixes: b66add7a74e8 ("clk: mediatek: mux: add clk notifier functions") Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/clk-mux.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/drivers/clk/mediatek/clk-mux.c b/drivers/clk/mediatek/clk-mux.c index c5af6dc078a3..07f1f18b38bc 100644 --- a/drivers/clk/mediatek/clk-mux.c +++ b/drivers/clk/mediatek/clk-mux.c @@ -414,16 +414,21 @@ static int mtk_clk_mux_notifier_cb(struct notifier_block *nb, struct clk_notifier_data *data = _data; struct clk_hw *hw = __clk_get_hw(data->clk); struct mtk_mux_nb *mux_nb = to_mtk_mux_nb(nb); + struct clk_hw *p_hw = clk_hw_get_parent_by_index(hw, mux_nb->bypass_index); int ret = 0; switch (event) { case PRE_RATE_CHANGE: - mux_nb->original_index = mux_nb->ops->get_parent(hw); - ret = mux_nb->ops->set_parent(hw, mux_nb->bypass_index); + ret = clk_prepare_enable(p_hw->clk); + if (ret == 0) { + mux_nb->original_index = mux_nb->ops->get_parent(hw); + ret = mux_nb->ops->set_parent(hw, mux_nb->bypass_index); + } break; case POST_RATE_CHANGE: case ABORT_RATE_CHANGE: ret = mux_nb->ops->set_parent(hw, mux_nb->original_index); + clk_disable_unprepare(p_hw->clk); break; } -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:21 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:21 +0800 Subject: [PATCH v5 14/18] clk: mediatek: Add MT8189 mfg clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-15-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 mfg clock controller, which provides clock gate control for the GPU. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 11 ++++++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-mfg.c | 53 +++++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-mfg.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index bd50e18e48f4..e2eb74d79cfd 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -906,6 +906,17 @@ config COMMON_CLK_MT8189_MDPSYS chipset, ensuring that the display system operates efficiently and effectively. +config COMMON_CLK_MT8189_MFG + tristate "Clock driver for MediaTek MT8189 mfg" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this option to support the manufacturing clocks for the MediaTek + MT8189 chipset. This driver provides the necessary clock framework + integration for manufacturing tests and operations that are specific to + the MT8189 chipset. Enabling this will allow the manufacturing mode of + the chipset to function correctly with the appropriate clock settings. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 9b23e4c5e019..07f11760cf68 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -132,6 +132,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189_DVFSRC) += clk-mt8189-dvfsrc.o obj-$(CONFIG_COMMON_CLK_MT8189_IIC) += clk-mt8189-iic.o obj-$(CONFIG_COMMON_CLK_MT8189_IMG) += clk-mt8189-img.o obj-$(CONFIG_COMMON_CLK_MT8189_MDPSYS) += clk-mt8189-mdpsys.o +obj-$(CONFIG_COMMON_CLK_MT8189_MFG) += clk-mt8189-mfg.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-mfg.c b/drivers/clk/mediatek/clk-mt8189-mfg.c new file mode 100644 index 000000000000..a09bf8f2e017 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-mfg.c @@ -0,0 +1,53 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs mfg_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_MFG(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &mfg_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +static const struct mtk_gate mfg_clks[] = { + GATE_MFG(CLK_MFG_BG3D, "mfg_bg3d", "mfg_sel_mfgpll", 0), +}; + +static const struct mtk_clk_desc mfg_mcd = { + .clks = mfg_clks, + .num_clks = ARRAY_SIZE(mfg_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_mfg[] = { + { .compatible = "mediatek,mt8189-mfgcfg", .data = &mfg_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_mfg); + +static struct platform_driver clk_mt8189_mfg_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-mfg", + .of_match_table = of_match_clk_mt8189_mfg, + }, +}; + +module_platform_driver(clk_mt8189_mfg_drv); +MODULE_DESCRIPTION("MediaTek MT8189 mfg clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:08 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:08 +0800 Subject: [PATCH v5 01/18] dt-bindings: clock: Add MediaTek MT8189 clock In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-2-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add dt schema and IDs for the clocks of MediaTek MT8189 SoC. The MT8189 clock IP provide clock control for main system (apmixedsys, topcksys and vlpcksys) and subsys (eg. peri, mfg, venc/vdec ...). Signed-off-by: Irving-CH Lin (cherry picked from commit e2402a4f2db8db0ef3cf8613f42397aaa199ad29) --- .../bindings/clock/mediatek,apmixedsys.yaml | 1 + .../bindings/clock/mediatek,infracfg.yaml | 1 + .../bindings/clock/mediatek,pericfg.yaml | 1 + .../bindings/clock/mediatek,syscon.yaml | 27 + .../bindings/clock/mediatek,topckgen.yaml | 2 + .../dt-bindings/clock/mediatek,mt8189-clk.h | 580 ++++++++++++++++++ 6 files changed, 612 insertions(+) create mode 100644 include/dt-bindings/clock/mediatek,mt8189-clk.h diff --git a/Documentation/devicetree/bindings/clock/mediatek,apmixedsys.yaml b/Documentation/devicetree/bindings/clock/mediatek,apmixedsys.yaml index 591a9e862c7d..a16909d692e4 100644 --- a/Documentation/devicetree/bindings/clock/mediatek,apmixedsys.yaml +++ b/Documentation/devicetree/bindings/clock/mediatek,apmixedsys.yaml @@ -42,6 +42,7 @@ properties: - mediatek,mt7629-apmixedsys - mediatek,mt8167-apmixedsys - mediatek,mt8183-apmixedsys + - mediatek,mt8189-apmixedsys - const: syscon reg: diff --git a/Documentation/devicetree/bindings/clock/mediatek,infracfg.yaml b/Documentation/devicetree/bindings/clock/mediatek,infracfg.yaml index d1d30700d9b0..7a7495949b7e 100644 --- a/Documentation/devicetree/bindings/clock/mediatek,infracfg.yaml +++ b/Documentation/devicetree/bindings/clock/mediatek,infracfg.yaml @@ -37,6 +37,7 @@ properties: - mediatek,mt8167-infracfg - mediatek,mt8173-infracfg - mediatek,mt8183-infracfg + - mediatek,mt8189-infra-ao - mediatek,mt8516-infracfg - const: syscon - items: diff --git a/Documentation/devicetree/bindings/clock/mediatek,pericfg.yaml b/Documentation/devicetree/bindings/clock/mediatek,pericfg.yaml index b98cf45efe2f..c1e3ff431dd4 100644 --- a/Documentation/devicetree/bindings/clock/mediatek,pericfg.yaml +++ b/Documentation/devicetree/bindings/clock/mediatek,pericfg.yaml @@ -30,6 +30,7 @@ properties: - mediatek,mt8183-pericfg - mediatek,mt8186-pericfg - mediatek,mt8188-pericfg + - mediatek,mt8189-peri-ao - mediatek,mt8195-pericfg - mediatek,mt8516-pericfg - const: syscon diff --git a/Documentation/devicetree/bindings/clock/mediatek,syscon.yaml b/Documentation/devicetree/bindings/clock/mediatek,syscon.yaml index a52f90bfc9f9..c57de1e0f4fa 100644 --- a/Documentation/devicetree/bindings/clock/mediatek,syscon.yaml +++ b/Documentation/devicetree/bindings/clock/mediatek,syscon.yaml @@ -62,6 +62,33 @@ properties: - mediatek,mt8183-mfgcfg - mediatek,mt8183-vdecsys - mediatek,mt8183-vencsys + - mediatek,mt8189-camsys-main + - mediatek,mt8189-camsys-rawa + - mediatek,mt8189-camsys-rawb + - mediatek,mt8189-dbg-ao + - mediatek,mt8189-dem + - mediatek,mt8189-dispsys + - mediatek,mt8189-dvfsrc-top + - mediatek,mt8189-gce-d + - mediatek,mt8189-gce-m + - mediatek,mt8189-iic-wrap-e + - mediatek,mt8189-iic-wrap-en + - mediatek,mt8189-iic-wrap-s + - mediatek,mt8189-iic-wrap-ws + - mediatek,mt8189-imgsys1 + - mediatek,mt8189-imgsys2 + - mediatek,mt8189-ipesys + - mediatek,mt8189-mdpsys + - mediatek,mt8189-mfgcfg + - mediatek,mt8189-mm-infra + - mediatek,mt8189-scp-clk + - mediatek,mt8189-scp-i2c-clk + - mediatek,mt8189-ufscfg-ao + - mediatek,mt8189-ufscfg-pdn + - mediatek,mt8189-vdec-core + - mediatek,mt8189-venc + - mediatek,mt8189-vlp-ao + - mediatek,mt8189-vlpcfg-ao - const: syscon - items: - const: mediatek,mt7623-bdpsys diff --git a/Documentation/devicetree/bindings/clock/mediatek,topckgen.yaml b/Documentation/devicetree/bindings/clock/mediatek,topckgen.yaml index c080fb0a1618..75a841017fb0 100644 --- a/Documentation/devicetree/bindings/clock/mediatek,topckgen.yaml +++ b/Documentation/devicetree/bindings/clock/mediatek,topckgen.yaml @@ -43,6 +43,8 @@ properties: - mediatek,mt7988-topckgen - mediatek,mt8167-topckgen - mediatek,mt8183-topckgen + - mediatek,mt8189-topckgen + - mediatek,mt8189-vlpckgen - const: syscon reg: diff --git a/include/dt-bindings/clock/mediatek,mt8189-clk.h b/include/dt-bindings/clock/mediatek,mt8189-clk.h new file mode 100644 index 000000000000..139db869a3ec --- /dev/null +++ b/include/dt-bindings/clock/mediatek,mt8189-clk.h @@ -0,0 +1,580 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#ifndef _DT_BINDINGS_CLK_MT8189_H +#define _DT_BINDINGS_CLK_MT8189_H + +/* TOPCKGEN */ +#define CLK_TOP_AXI_SEL 0 +#define CLK_TOP_AXI_PERI_SEL 1 +#define CLK_TOP_AXI_U_SEL 2 +#define CLK_TOP_BUS_AXIMEM_SEL 3 +#define CLK_TOP_DISP0_SEL 4 +#define CLK_TOP_MMINFRA_SEL 5 +#define CLK_TOP_UART_SEL 6 +#define CLK_TOP_SPI0_SEL 7 +#define CLK_TOP_SPI1_SEL 8 +#define CLK_TOP_SPI2_SEL 9 +#define CLK_TOP_SPI3_SEL 10 +#define CLK_TOP_SPI4_SEL 11 +#define CLK_TOP_SPI5_SEL 12 +#define CLK_TOP_MSDC_MACRO_0P_SEL 13 +#define CLK_TOP_MSDC50_0_HCLK_SEL 14 +#define CLK_TOP_MSDC50_0_SEL 15 +#define CLK_TOP_AES_MSDCFDE_SEL 16 +#define CLK_TOP_MSDC_MACRO_1P_SEL 17 +#define CLK_TOP_MSDC30_1_SEL 18 +#define CLK_TOP_MSDC30_1_HCLK_SEL 19 +#define CLK_TOP_MSDC_MACRO_2P_SEL 20 +#define CLK_TOP_MSDC30_2_SEL 21 +#define CLK_TOP_MSDC30_2_HCLK_SEL 22 +#define CLK_TOP_AUD_INTBUS_SEL 23 +#define CLK_TOP_ATB_SEL 24 +#define CLK_TOP_DISP_PWM_SEL 25 +#define CLK_TOP_USB_TOP_P0_SEL 26 +#define CLK_TOP_USB_XHCI_P0_SEL 27 +#define CLK_TOP_USB_TOP_P1_SEL 28 +#define CLK_TOP_USB_XHCI_P1_SEL 29 +#define CLK_TOP_USB_TOP_P2_SEL 30 +#define CLK_TOP_USB_XHCI_P2_SEL 31 +#define CLK_TOP_USB_TOP_P3_SEL 32 +#define CLK_TOP_USB_XHCI_P3_SEL 33 +#define CLK_TOP_USB_TOP_P4_SEL 34 +#define CLK_TOP_USB_XHCI_P4_SEL 35 +#define CLK_TOP_I2C_SEL 36 +#define CLK_TOP_SENINF_SEL 37 +#define CLK_TOP_SENINF1_SEL 38 +#define CLK_TOP_AUD_ENGEN1_SEL 39 +#define CLK_TOP_AUD_ENGEN2_SEL 40 +#define CLK_TOP_AES_UFSFDE_SEL 41 +#define CLK_TOP_U_SEL 42 +#define CLK_TOP_U_MBIST_SEL 43 +#define CLK_TOP_AUD_1_SEL 44 +#define CLK_TOP_AUD_2_SEL 45 +#define CLK_TOP_VENC_SEL 46 +#define CLK_TOP_VDEC_SEL 47 +#define CLK_TOP_PWM_SEL 48 +#define CLK_TOP_AUDIO_H_SEL 49 +#define CLK_TOP_MCUPM_SEL 50 +#define CLK_TOP_MEM_SUB_SEL 51 +#define CLK_TOP_MEM_SUB_PERI_SEL 52 +#define CLK_TOP_MEM_SUB_U_SEL 53 +#define CLK_TOP_EMI_N_SEL 54 +#define CLK_TOP_DSI_OCC_SEL 55 +#define CLK_TOP_AP2CONN_HOST_SEL 56 +#define CLK_TOP_IMG1_SEL 57 +#define CLK_TOP_IPE_SEL 58 +#define CLK_TOP_CAM_SEL 59 +#define CLK_TOP_CAMTM_SEL 60 +#define CLK_TOP_DSP_SEL 61 +#define CLK_TOP_SR_PKA_SEL 62 +#define CLK_TOP_DXCC_SEL 63 +#define CLK_TOP_MFG_REF_SEL 64 +#define CLK_TOP_MDP0_SEL 65 +#define CLK_TOP_DP_SEL 66 +#define CLK_TOP_EDP_SEL 67 +#define CLK_TOP_EDP_FAVT_SEL 68 +#define CLK_TOP_ETH_250M_SEL 69 +#define CLK_TOP_ETH_62P4M_PTP_SEL 70 +#define CLK_TOP_ETH_50M_RMII_SEL 71 +#define CLK_TOP_SFLASH_SEL 72 +#define CLK_TOP_GCPU_SEL 73 +#define CLK_TOP_MAC_TL_SEL 74 +#define CLK_TOP_VDSTX_DG_CTS_SEL 75 +#define CLK_TOP_PLL_DPIX_SEL 76 +#define CLK_TOP_ECC_SEL 77 +#define CLK_TOP_APLL_I2SIN0_MCK_SEL 78 +#define CLK_TOP_APLL_I2SIN1_MCK_SEL 79 +#define CLK_TOP_APLL_I2SIN2_MCK_SEL 80 +#define CLK_TOP_APLL_I2SIN3_MCK_SEL 81 +#define CLK_TOP_APLL_I2SIN4_MCK_SEL 82 +#define CLK_TOP_APLL_I2SIN6_MCK_SEL 83 +#define CLK_TOP_APLL_I2SOUT0_MCK_SEL 84 +#define CLK_TOP_APLL_I2SOUT1_MCK_SEL 85 +#define CLK_TOP_APLL_I2SOUT2_MCK_SEL 86 +#define CLK_TOP_APLL_I2SOUT3_MCK_SEL 87 +#define CLK_TOP_APLL_I2SOUT4_MCK_SEL 88 +#define CLK_TOP_APLL_I2SOUT6_MCK_SEL 89 +#define CLK_TOP_APLL_FMI2S_MCK_SEL 90 +#define CLK_TOP_APLL_TDMOUT_MCK_SEL 91 +#define CLK_TOP_MFG_SEL_MFGPLL 92 +#define CLK_TOP_APLL12_CK_DIV_I2SIN0 93 +#define CLK_TOP_APLL12_CK_DIV_I2SIN1 94 +#define CLK_TOP_APLL12_CK_DIV_I2SOUT0 95 +#define CLK_TOP_APLL12_CK_DIV_I2SOUT1 96 +#define CLK_TOP_APLL12_CK_DIV_FMI2S 97 +#define CLK_TOP_APLL12_CK_DIV_TDMOUT_M 98 +#define CLK_TOP_APLL12_CK_DIV_TDMOUT_B 99 +#define CLK_TOP_MAINPLL_D3 100 +#define CLK_TOP_MAINPLL_D4 101 +#define CLK_TOP_MAINPLL_D4_D2 102 +#define CLK_TOP_MAINPLL_D4_D4 103 +#define CLK_TOP_MAINPLL_D4_D8 104 +#define CLK_TOP_MAINPLL_D5 105 +#define CLK_TOP_MAINPLL_D5_D2 106 +#define CLK_TOP_MAINPLL_D5_D4 107 +#define CLK_TOP_MAINPLL_D5_D8 108 +#define CLK_TOP_MAINPLL_D6 109 +#define CLK_TOP_MAINPLL_D6_D2 110 +#define CLK_TOP_MAINPLL_D6_D4 111 +#define CLK_TOP_MAINPLL_D6_D8 112 +#define CLK_TOP_MAINPLL_D7 113 +#define CLK_TOP_MAINPLL_D7_D2 114 +#define CLK_TOP_MAINPLL_D7_D4 115 +#define CLK_TOP_MAINPLL_D7_D8 116 +#define CLK_TOP_MAINPLL_D9 117 +#define CLK_TOP_UNIVPLL_D2 118 +#define CLK_TOP_UNIVPLL_D3 119 +#define CLK_TOP_UNIVPLL_D4 120 +#define CLK_TOP_UNIVPLL_D4_D2 121 +#define CLK_TOP_UNIVPLL_D4_D4 122 +#define CLK_TOP_UNIVPLL_D4_D8 123 +#define CLK_TOP_UNIVPLL_D5 124 +#define CLK_TOP_UNIVPLL_D5_D2 125 +#define CLK_TOP_UNIVPLL_D5_D4 126 +#define CLK_TOP_UNIVPLL_D6 127 +#define CLK_TOP_UNIVPLL_D6_D2 128 +#define CLK_TOP_UNIVPLL_D6_D4 129 +#define CLK_TOP_UNIVPLL_D6_D8 130 +#define CLK_TOP_UNIVPLL_D6_D16 131 +#define CLK_TOP_UNIVPLL_D7 132 +#define CLK_TOP_UNIVPLL_D7_D2 133 +#define CLK_TOP_UNIVPLL_D7_D3 134 +#define CLK_TOP_LVDSTX_DG_CTS 135 +#define CLK_TOP_UNIVPLL_192M 136 +#define CLK_TOP_UNIVPLL_192M_D2 137 +#define CLK_TOP_UNIVPLL_192M_D4 138 +#define CLK_TOP_UNIVPLL_192M_D8 139 +#define CLK_TOP_UNIVPLL_192M_D10 140 +#define CLK_TOP_UNIVPLL_192M_D16 141 +#define CLK_TOP_UNIVPLL_192M_D32 142 +#define CLK_TOP_APLL1_D2 143 +#define CLK_TOP_APLL1_D4 144 +#define CLK_TOP_APLL1_D8 145 +#define CLK_TOP_APLL1_D3 146 +#define CLK_TOP_APLL2_D2 147 +#define CLK_TOP_APLL2_D4 148 +#define CLK_TOP_APLL2_D8 149 +#define CLK_TOP_APLL2_D3 150 +#define CLK_TOP_MMPLL_D4 151 +#define CLK_TOP_MMPLL_D4_D2 152 +#define CLK_TOP_MMPLL_D4_D4 153 +#define CLK_TOP_VPLL_DPIX 154 +#define CLK_TOP_MMPLL_D5 155 +#define CLK_TOP_MMPLL_D5_D2 156 +#define CLK_TOP_MMPLL_D5_D4 157 +#define CLK_TOP_MMPLL_D6 158 +#define CLK_TOP_MMPLL_D6_D2 159 +#define CLK_TOP_MMPLL_D7 160 +#define CLK_TOP_MMPLL_D9 161 +#define CLK_TOP_TVDPLL1_D2 162 +#define CLK_TOP_TVDPLL1_D4 163 +#define CLK_TOP_TVDPLL1_D8 164 +#define CLK_TOP_TVDPLL1_D16 165 +#define CLK_TOP_TVDPLL2_D2 166 +#define CLK_TOP_TVDPLL2_D4 167 +#define CLK_TOP_TVDPLL2_D8 168 +#define CLK_TOP_TVDPLL2_D16 169 +#define CLK_TOP_ETHPLL_D2 170 +#define CLK_TOP_ETHPLL_D8 171 +#define CLK_TOP_ETHPLL_D10 172 +#define CLK_TOP_MSDCPLL_D2 173 +#define CLK_TOP_VOWPLL 174 +#define CLK_TOP_UFSPLL_D2 175 +#define CLK_TOP_F26M_CK_D2 176 +#define CLK_TOP_OSC_D2 177 +#define CLK_TOP_OSC_D4 178 +#define CLK_TOP_OSC_D8 179 +#define CLK_TOP_OSC_D16 180 +#define CLK_TOP_OSC_D3 181 +#define CLK_TOP_OSC_D7 182 +#define CLK_TOP_OSC_D10 183 +#define CLK_TOP_OSC_D20 184 +#define CLK_TOP_FMCNT_P0_EN 185 +#define CLK_TOP_FMCNT_P1_EN 186 +#define CLK_TOP_FMCNT_P2_EN 187 +#define CLK_TOP_FMCNT_P3_EN 188 +#define CLK_TOP_FMCNT_P4_EN 189 +#define CLK_TOP_USB_F26M_CK_EN 190 +#define CLK_TOP_SSPXTP_F26M_CK_EN 191 +#define CLK_TOP_USB2_PHY_RF_P0_EN 192 +#define CLK_TOP_USB2_PHY_RF_P1_EN 193 +#define CLK_TOP_USB2_PHY_RF_P2_EN 194 +#define CLK_TOP_USB2_PHY_RF_P3_EN 195 +#define CLK_TOP_USB2_PHY_RF_P4_EN 196 +#define CLK_TOP_USB2_26M_CK_P0_EN 197 +#define CLK_TOP_USB2_26M_CK_P1_EN 198 +#define CLK_TOP_USB2_26M_CK_P2_EN 199 +#define CLK_TOP_USB2_26M_CK_P3_EN 200 +#define CLK_TOP_USB2_26M_CK_P4_EN 201 +#define CLK_TOP_F26M_CK_EN 202 +#define CLK_TOP_AP2CON_EN 203 +#define CLK_TOP_EINT_N_EN 204 +#define CLK_TOP_TOPCKGEN_FMIPI_CSI_UP26M_CK_EN 205 +#define CLK_TOP_DRAMULP_CK_EN 206 +#define CLK_TOP_EINT_E_EN 207 +#define CLK_TOP_EINT_W_EN 208 +#define CLK_TOP_EINT_S_EN 209 + +/* INFRACFG_AO */ +#define CLK_IFRAO_CQ_DMA_FPC 0 +#define CLK_IFRAO_DEBUGSYS 1 +#define CLK_IFRAO_DBG_TRACE 2 +#define CLK_IFRAO_CQ_DMA 3 + +/* APMIXEDSYS */ +#define CLK_APMIXED_ARMPLL_LL 0 +#define CLK_APMIXED_ARMPLL_BL 1 +#define CLK_APMIXED_CCIPLL 2 +#define CLK_APMIXED_MAINPLL 3 +#define CLK_APMIXED_UNIVPLL 4 +#define CLK_APMIXED_MMPLL 5 +#define CLK_APMIXED_MFGPLL 6 +#define CLK_APMIXED_APLL1 7 +#define CLK_APMIXED_APLL2 8 +#define CLK_APMIXED_EMIPLL 9 +#define CLK_APMIXED_APUPLL2 10 +#define CLK_APMIXED_APUPLL 11 +#define CLK_APMIXED_TVDPLL1 12 +#define CLK_APMIXED_TVDPLL2 13 +#define CLK_APMIXED_ETHPLL 14 +#define CLK_APMIXED_MSDCPLL 15 +#define CLK_APMIXED_UFSPLL 16 + +/* PERICFG_AO */ +#define CLK_PERAO_UART0 0 +#define CLK_PERAO_UART1 1 +#define CLK_PERAO_UART2 2 +#define CLK_PERAO_UART3 3 +#define CLK_PERAO_PWM_H 4 +#define CLK_PERAO_PWM_B 5 +#define CLK_PERAO_PWM_FB1 6 +#define CLK_PERAO_PWM_FB2 7 +#define CLK_PERAO_PWM_FB3 8 +#define CLK_PERAO_PWM_FB4 9 +#define CLK_PERAO_DISP_PWM0 10 +#define CLK_PERAO_DISP_PWM1 11 +#define CLK_PERAO_SPI0_B 12 +#define CLK_PERAO_SPI1_B 13 +#define CLK_PERAO_SPI2_B 14 +#define CLK_PERAO_SPI3_B 15 +#define CLK_PERAO_SPI4_B 16 +#define CLK_PERAO_SPI5_B 17 +#define CLK_PERAO_SPI0_H 18 +#define CLK_PERAO_SPI1_H 19 +#define CLK_PERAO_SPI2_H 20 +#define CLK_PERAO_SPI3_H 21 +#define CLK_PERAO_SPI4_H 22 +#define CLK_PERAO_SPI5_H 23 +#define CLK_PERAO_AXI 24 +#define CLK_PERAO_AHB_APB 25 +#define CLK_PERAO_TL 26 +#define CLK_PERAO_REF 27 +#define CLK_PERAO_I2C 28 +#define CLK_PERAO_DMA_B 29 +#define CLK_PERAO_SSUSB0_REF 30 +#define CLK_PERAO_SSUSB0_FRMCNT 31 +#define CLK_PERAO_SSUSB0_SYS 32 +#define CLK_PERAO_SSUSB0_XHCI 33 +#define CLK_PERAO_SSUSB0_F 34 +#define CLK_PERAO_SSUSB0_H 35 +#define CLK_PERAO_SSUSB1_REF 36 +#define CLK_PERAO_SSUSB1_FRMCNT 37 +#define CLK_PERAO_SSUSB1_SYS 38 +#define CLK_PERAO_SSUSB1_XHCI 39 +#define CLK_PERAO_SSUSB1_F 40 +#define CLK_PERAO_SSUSB1_H 41 +#define CLK_PERAO_SSUSB2_REF 42 +#define CLK_PERAO_SSUSB2_FRMCNT 43 +#define CLK_PERAO_SSUSB2_SYS 44 +#define CLK_PERAO_SSUSB2_XHCI 45 +#define CLK_PERAO_SSUSB2_F 46 +#define CLK_PERAO_SSUSB2_H 47 +#define CLK_PERAO_SSUSB3_REF 48 +#define CLK_PERAO_SSUSB3_FRMCNT 49 +#define CLK_PERAO_SSUSB3_SYS 50 +#define CLK_PERAO_SSUSB3_XHCI 51 +#define CLK_PERAO_SSUSB3_F 52 +#define CLK_PERAO_SSUSB3_H 53 +#define CLK_PERAO_SSUSB4_REF 54 +#define CLK_PERAO_SSUSB4_FRMCNT 55 +#define CLK_PERAO_SSUSB4_SYS 56 +#define CLK_PERAO_SSUSB4_XHCI 57 +#define CLK_PERAO_SSUSB4_F 58 +#define CLK_PERAO_SSUSB4_H 59 +#define CLK_PERAO_MSDC0 60 +#define CLK_PERAO_MSDC0_H 61 +#define CLK_PERAO_MSDC0_FAES 62 +#define CLK_PERAO_MSDC0_MST_F 63 +#define CLK_PERAO_MSDC0_SLV_H 64 +#define CLK_PERAO_MSDC1 65 +#define CLK_PERAO_MSDC1_H 66 +#define CLK_PERAO_MSDC1_MST_F 67 +#define CLK_PERAO_MSDC1_SLV_H 68 +#define CLK_PERAO_MSDC2 69 +#define CLK_PERAO_MSDC2_H 70 +#define CLK_PERAO_MSDC2_MST_F 71 +#define CLK_PERAO_MSDC2_SLV_H 72 +#define CLK_PERAO_SFLASH 73 +#define CLK_PERAO_SFLASH_F 74 +#define CLK_PERAO_SFLASH_H 75 +#define CLK_PERAO_SFLASH_P 76 +#define CLK_PERAO_AUDIO0 77 +#define CLK_PERAO_AUDIO1 78 +#define CLK_PERAO_AUDIO2 79 +#define CLK_PERAO_AUXADC_26M 80 + +/* UFSCFG_AO_REG */ +#define CLK_UFSCFG_AO_REG_UNIPRO_TX_SYM 0 +#define CLK_UFSCFG_AO_REG_UNIPRO_RX_SYM0 1 +#define CLK_UFSCFG_AO_REG_UNIPRO_RX_SYM1 2 +#define CLK_UFSCFG_AO_REG_UNIPRO_SYS 3 +#define CLK_UFSCFG_AO_REG_U_SAP_CFG 4 +#define CLK_UFSCFG_AO_REG_U_PHY_TOP_AHB_S_BUS 5 + +/* UFSCFG_PDN_REG */ +#define CLK_UFSCFG_REG_UFSHCI_UFS 0 +#define CLK_UFSCFG_REG_UFSHCI_AES 1 +#define CLK_UFSCFG_REG_UFSHCI_U_AHB 2 +#define CLK_UFSCFG_REG_UFSHCI_U_AXI 3 + +/* IMP_IIC_WRAP_WS */ +#define CLK_IMPWS_I2C2 0 + +/* IMP_IIC_WRAP_E */ +#define CLK_IMPE_I2C0 0 +#define CLK_IMPE_I2C1 1 + +/* IMP_IIC_WRAP_S */ +#define CLK_IMPS_I2C3 0 +#define CLK_IMPS_I2C4 1 +#define CLK_IMPS_I2C5 2 +#define CLK_IMPS_I2C6 3 + +/* IMP_IIC_WRAP_EN */ +#define CLK_IMPEN_I2C7 0 +#define CLK_IMPEN_I2C8 1 + +/* MFG */ +#define CLK_MFG_BG3D 0 + +/* DISPSYS_CONFIG */ +#define CLK_MM_DISP_OVL0_4L 0 +#define CLK_MM_DISP_OVL1_4L 1 +#define CLK_MM_VPP_RSZ0 2 +#define CLK_MM_VPP_RSZ1 3 +#define CLK_MM_DISP_RDMA0 4 +#define CLK_MM_DISP_RDMA1 5 +#define CLK_MM_DISP_COLOR0 6 +#define CLK_MM_DISP_COLOR1 7 +#define CLK_MM_DISP_CCORR0 8 +#define CLK_MM_DISP_CCORR1 9 +#define CLK_MM_DISP_CCORR2 10 +#define CLK_MM_DISP_CCORR3 11 +#define CLK_MM_DISP_AAL0 12 +#define CLK_MM_DISP_AAL1 13 +#define CLK_MM_DISP_GAMMA0 14 +#define CLK_MM_DISP_GAMMA1 15 +#define CLK_MM_DISP_DITHER0 16 +#define CLK_MM_DISP_DITHER1 17 +#define CLK_MM_DISP_DSC_WRAP0 18 +#define CLK_MM_VPP_MERGE0 19 +#define CLK_MMSYS_0_DISP_DVO 20 +#define CLK_MMSYS_0_DISP_DSI0 21 +#define CLK_MM_DP_INTF0 22 +#define CLK_MM_DPI0 23 +#define CLK_MM_DISP_WDMA0 24 +#define CLK_MM_DISP_WDMA1 25 +#define CLK_MM_DISP_FAKE_ENG0 26 +#define CLK_MM_DISP_FAKE_ENG1 27 +#define CLK_MM_SMI_LARB 28 +#define CLK_MM_DISP_MUTEX0 29 +#define CLK_MM_DIPSYS_CONFIG 30 +#define CLK_MM_DUMMY 31 +#define CLK_MMSYS_1_DISP_DSI0 32 +#define CLK_MMSYS_1_LVDS_ENCODER 33 +#define CLK_MMSYS_1_DPI0 34 +#define CLK_MMSYS_1_DISP_DVO 35 +#define CLK_MM_DP_INTF 36 +#define CLK_MMSYS_1_LVDS_ENCODER_CTS 37 +#define CLK_MMSYS_1_DISP_DVO_AVT 38 + +/* IMGSYS1 */ +#define CLK_IMGSYS1_LARB9 0 +#define CLK_IMGSYS1_LARB11 1 +#define CLK_IMGSYS1_DIP 2 +#define CLK_IMGSYS1_GALS 3 + +/* IMGSYS2 */ +#define CLK_IMGSYS2_LARB9 0 +#define CLK_IMGSYS2_LARB11 1 +#define CLK_IMGSYS2_MFB 2 +#define CLK_IMGSYS2_WPE 3 +#define CLK_IMGSYS2_MSS 4 +#define CLK_IMGSYS2_GALS 5 + +/* VDEC_CORE */ +#define CLK_VDEC_CORE_LARB_CKEN 0 +#define CLK_VDEC_CORE_VDEC_CKEN 1 +#define CLK_VDEC_CORE_VDEC_ACTIVE 2 + +/* VENC_GCON */ +#define CLK_VEN1_CKE0_LARB 0 +#define CLK_VEN1_CKE1_VENC 1 +#define CLK_VEN1_CKE2_JPGENC 2 +#define CLK_VEN1_CKE3_JPGDEC 3 +#define CLK_VEN1_CKE4_JPGDEC_C1 4 +#define CLK_VEN1_CKE5_GALS 5 +#define CLK_VEN1_CKE6_GALS_SRAM 6 + +/* VLPCFG_REG */ +#define CLK_VLPCFG_REG_SCP 0 +#define CLK_VLPCFG_REG_RG_R_APXGPT_26M 1 +#define CLK_VLPCFG_REG_DPMSRCK_TEST 2 +#define CLK_VLPCFG_REG_RG_DPMSRRTC_TEST 3 +#define CLK_VLPCFG_REG_DPMSRULP_TEST 4 +#define CLK_VLPCFG_REG_SPMI_P_MST 5 +#define CLK_VLPCFG_REG_SPMI_P_MST_32K 6 +#define CLK_VLPCFG_REG_PMIF_SPMI_P_SYS 7 +#define CLK_VLPCFG_REG_PMIF_SPMI_P_TMR 8 +#define CLK_VLPCFG_REG_PMIF_SPMI_M_SYS 9 +#define CLK_VLPCFG_REG_PMIF_SPMI_M_TMR 10 +#define CLK_VLPCFG_REG_DVFSRC 11 +#define CLK_VLPCFG_REG_PWM_VLP 12 +#define CLK_VLPCFG_REG_SRCK 13 +#define CLK_VLPCFG_REG_SSPM_F26M 14 +#define CLK_VLPCFG_REG_SSPM_F32K 15 +#define CLK_VLPCFG_REG_SSPM_ULPOSC 16 +#define CLK_VLPCFG_REG_VLP_32K_COM 17 +#define CLK_VLPCFG_REG_VLP_26M_COM 18 + +/* VLP_CKSYS */ +#define CLK_VLP_CK_SCP_SEL 0 +#define CLK_VLP_CK_PWRAP_ULPOSC_SEL 1 +#define CLK_VLP_CK_SPMI_P_MST_SEL 2 +#define CLK_VLP_CK_DVFSRC_SEL 3 +#define CLK_VLP_CK_PWM_VLP_SEL 4 +#define CLK_VLP_CK_AXI_VLP_SEL 5 +#define CLK_VLP_CK_SYSTIMER_26M_SEL 6 +#define CLK_VLP_CK_SSPM_SEL 7 +#define CLK_VLP_CK_SSPM_F26M_SEL 8 +#define CLK_VLP_CK_SRCK_SEL 9 +#define CLK_VLP_CK_SCP_SPI_SEL 10 +#define CLK_VLP_CK_SCP_IIC_SEL 11 +#define CLK_VLP_CK_SCP_SPI_HIGH_SPD_SEL 12 +#define CLK_VLP_CK_SCP_IIC_HIGH_SPD_SEL 13 +#define CLK_VLP_CK_SSPM_ULPOSC_SEL 14 +#define CLK_VLP_CK_APXGPT_26M_SEL 15 +#define CLK_VLP_CK_VADSP_SEL 16 +#define CLK_VLP_CK_VADSP_VOWPLL_SEL 17 +#define CLK_VLP_CK_VADSP_UARTHUB_BCLK_SEL 18 +#define CLK_VLP_CK_CAMTG0_SEL 19 +#define CLK_VLP_CK_CAMTG1_SEL 20 +#define CLK_VLP_CK_CAMTG2_SEL 21 +#define CLK_VLP_CK_AUD_ADC_SEL 22 +#define CLK_VLP_CK_KP_IRQ_GEN_SEL 23 +#define CLK_VLP_CK_VADSYS_VLP_26M_EN 24 +#define CLK_VLP_CK_SEJ_13M_EN 25 +#define CLK_VLP_CK_SEJ_26M_EN 26 +#define CLK_VLP_CK_FMIPI_CSI_UP26M_CK_EN 27 + +/* SCP_IIC */ +#define CLK_SCP_IIC_I2C0_W1S 0 +#define CLK_SCP_IIC_I2C1_W1S 1 + +/* SCP */ +#define CLK_SCP_SET_SPI0 0 +#define CLK_SCP_SET_SPI1 1 + +/* CAMSYS_MAIN */ +#define CLK_CAM_M_LARB13 0 +#define CLK_CAM_M_LARB14 1 +#define CLK_CAM_M_CAMSYS_MAIN_CAM 2 +#define CLK_CAM_M_CAMSYS_MAIN_CAMTG 3 +#define CLK_CAM_M_SENINF 4 +#define CLK_CAM_M_CAMSV1 5 +#define CLK_CAM_M_CAMSV2 6 +#define CLK_CAM_M_CAMSV3 7 +#define CLK_CAM_M_FAKE_ENG 8 +#define CLK_CAM_M_CAM2MM_GALS 9 +#define CLK_CAM_M_CAMSV4 10 +#define CLK_CAM_M_PDA 11 + +/* CAMSYS_RAWA */ +#define CLK_CAM_RA_CAMSYS_RAWA_LARBX 0 +#define CLK_CAM_RA_CAMSYS_RAWA_CAM 1 +#define CLK_CAM_RA_CAMSYS_RAWA_CAMTG 2 + +/* CAMSYS_RAWB */ +#define CLK_CAM_RB_CAMSYS_RAWB_LARBX 0 +#define CLK_CAM_RB_CAMSYS_RAWB_CAM 1 +#define CLK_CAM_RB_CAMSYS_RAWB_CAMTG 2 + +/* IPESYS */ +#define CLK_IPE_LARB19 0 +#define CLK_IPE_LARB20 1 +#define CLK_IPE_SMI_SUBCOM 2 +#define CLK_IPE_FD 3 +#define CLK_IPE_FE 4 +#define CLK_IPE_RSC 5 +#define CLK_IPESYS_GALS 6 + +/* VLPCFG_AO_REG */ +#define CLK_VLPCFG_AO_APEINT_RX 0 + +/* DVFSRC_TOP */ +#define CLK_DVFSRC_TOP_DVFSRC_EN 0 + +/* MMINFRA_CONFIG */ +#define CLK_MMINFRA_GCE_D 0 +#define CLK_MMINFRA_GCE_M 1 +#define CLK_MMINFRA_SMI 2 +#define CLK_MMINFRA_GCE_26M 3 + +/* GCE_D */ +#define CLK_GCE_D_TOP 0 + +/* GCE_M */ +#define CLK_GCE_M_TOP 0 + +/* MDPSYS_CONFIG */ +#define CLK_MDP_MUTEX0 0 +#define CLK_MDP_APB_BUS 1 +#define CLK_MDP_SMI0 2 +#define CLK_MDP_RDMA0 3 +#define CLK_MDP_RDMA2 4 +#define CLK_MDP_HDR0 5 +#define CLK_MDP_AAL0 6 +#define CLK_MDP_RSZ0 7 +#define CLK_MDP_TDSHP0 8 +#define CLK_MDP_COLOR0 9 +#define CLK_MDP_WROT0 10 +#define CLK_MDP_FAKE_ENG0 11 +#define CLK_MDPSYS_CONFIG 12 +#define CLK_MDP_RDMA1 13 +#define CLK_MDP_RDMA3 14 +#define CLK_MDP_HDR1 15 +#define CLK_MDP_AAL1 16 +#define CLK_MDP_RSZ1 17 +#define CLK_MDP_TDSHP1 18 +#define CLK_MDP_COLOR1 19 +#define CLK_MDP_WROT1 20 +#define CLK_MDP_RSZ2 21 +#define CLK_MDP_WROT2 22 +#define CLK_MDP_RSZ3 23 +#define CLK_MDP_WROT3 24 +#define CLK_MDP_BIRSZ0 25 +#define CLK_MDP_BIRSZ1 26 + +/* DBGAO */ +#define CLK_DBGAO_ATB_EN 0 + +/* DEM */ +#define CLK_DEM_ATB_EN 0 +#define CLK_DEM_BUSCLK_EN 1 +#define CLK_DEM_SYSCLK_EN 2 + +#endif /* _DT_BINDINGS_CLK_MT8189_H */ -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:15 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:15 +0800 Subject: [PATCH v5 08/18] clk: mediatek: Add MT8189 cam clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-9-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 cam clock controller, which provides clock gate control for camera. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 11 +++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-cam.c | 108 ++++++++++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-cam.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 47172623f29f..0665255a29fd 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -839,6 +839,17 @@ config COMMON_CLK_MT8189_BUS MT8189 chipset, ensuring that all bus-related components receive the correct clock signals for optimal performance. +config COMMON_CLK_MT8189_CAM + tristate "Clock driver for MediaTek MT8189 cam" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this to support the clock management for the camera interface + on MediaTek MT8189 SoCs. This includes enabling, disabling, and + setting the rate for camera-related clocks. If you have a camera + that relies on this SoC and you want to control its clocks, say Y or M + to include this driver in your kernel build. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index aabfb42cb1b2..95a8f4ae05ee 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -126,6 +126,7 @@ obj-$(CONFIG_COMMON_CLK_MT8188_WPESYS) += clk-mt8188-wpe.o obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o clk-mt8189-topckgen.o \ clk-mt8189-vlpckgen.o clk-mt8189-vlpcfg.o obj-$(CONFIG_COMMON_CLK_MT8189_BUS) += clk-mt8189-bus.o +obj-$(CONFIG_COMMON_CLK_MT8189_CAM) += clk-mt8189-cam.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-cam.c b/drivers/clk/mediatek/clk-mt8189-cam.c new file mode 100644 index 000000000000..d65ac08cedd6 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-cam.c @@ -0,0 +1,108 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs cam_m_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_CAM_M(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &cam_m_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +static const struct mtk_gate cam_m_clks[] = { + GATE_CAM_M(CLK_CAM_M_LARB13, "cam_m_larb13", "cam_sel", 0), + GATE_CAM_M(CLK_CAM_M_LARB14, "cam_m_larb14", "cam_sel", 2), + GATE_CAM_M(CLK_CAM_M_CAMSYS_MAIN_CAM, "cam_m_camsys_main_cam", "cam_sel", 6), + GATE_CAM_M(CLK_CAM_M_CAMSYS_MAIN_CAMTG, "cam_m_camsys_main_camtg", "cam_sel", 7), + GATE_CAM_M(CLK_CAM_M_SENINF, "cam_m_seninf", "cam_sel", 8), + GATE_CAM_M(CLK_CAM_M_CAMSV1, "cam_m_camsv1", "cam_sel", 10), + GATE_CAM_M(CLK_CAM_M_CAMSV2, "cam_m_camsv2", "cam_sel", 11), + GATE_CAM_M(CLK_CAM_M_CAMSV3, "cam_m_camsv3", "cam_sel", 12), + GATE_CAM_M(CLK_CAM_M_FAKE_ENG, "cam_m_fake_eng", "cam_sel", 17), + GATE_CAM_M(CLK_CAM_M_CAM2MM_GALS, "cam_m_cam2mm_gals", "cam_sel", 19), + GATE_CAM_M(CLK_CAM_M_CAMSV4, "cam_m_camsv4", "cam_sel", 20), + GATE_CAM_M(CLK_CAM_M_PDA, "cam_m_pda", "cam_sel", 21), +}; + +static const struct mtk_clk_desc cam_m_mcd = { + .clks = cam_m_clks, + .num_clks = ARRAY_SIZE(cam_m_clks), +}; + +static const struct mtk_gate_regs cam_ra_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_CAM_RA(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &cam_ra_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +static const struct mtk_gate cam_ra_clks[] = { + GATE_CAM_RA(CLK_CAM_RA_CAMSYS_RAWA_LARBX, "cam_ra_camsys_rawa_larbx", "cam_sel", 0), + GATE_CAM_RA(CLK_CAM_RA_CAMSYS_RAWA_CAM, "cam_ra_camsys_rawa_cam", "cam_sel", 1), + GATE_CAM_RA(CLK_CAM_RA_CAMSYS_RAWA_CAMTG, "cam_ra_camsys_rawa_camtg", "cam_sel", 2), +}; + +static const struct mtk_clk_desc cam_ra_mcd = { + .clks = cam_ra_clks, + .num_clks = ARRAY_SIZE(cam_ra_clks), +}; + +static const struct mtk_gate_regs cam_rb_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_CAM_RB(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &cam_rb_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +static const struct mtk_gate cam_rb_clks[] = { + GATE_CAM_RB(CLK_CAM_RB_CAMSYS_RAWB_LARBX, "cam_rb_camsys_rawb_larbx", "cam_sel", 0), + GATE_CAM_RB(CLK_CAM_RB_CAMSYS_RAWB_CAM, "cam_rb_camsys_rawb_cam", "cam_sel", 1), + GATE_CAM_RB(CLK_CAM_RB_CAMSYS_RAWB_CAMTG, "cam_rb_camsys_rawb_camtg", "cam_sel", 2), +}; + +static const struct mtk_clk_desc cam_rb_mcd = { + .clks = cam_rb_clks, + .num_clks = ARRAY_SIZE(cam_rb_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_cam[] = { + { .compatible = "mediatek,mt8189-camsys-main", .data = &cam_m_mcd }, + { .compatible = "mediatek,mt8189-camsys-rawa", .data = &cam_ra_mcd }, + { .compatible = "mediatek,mt8189-camsys-rawb", .data = &cam_rb_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_cam); + +static struct platform_driver clk_mt8189_cam_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-cam", + .of_match_table = of_match_clk_mt8189_cam, + }, +}; + +module_platform_driver(clk_mt8189_cam_drv); +MODULE_DESCRIPTION("MediaTek MT8189 cam clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:07 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:07 +0800 Subject: [PATCH v5 00/18] Add support for MT8189 clock controller Message-ID: <20260202062840.342707-1-irving-ch.lin@mediatek.com> From: Irving-CH Lin Changes since v5: - Remove redundant 'binding', 'definition' in commit message. - Remove MT8189 dt-schema, merged into common (apmixed, topckgen, syscon ...). - Separates power domain patches to another series. Changes since v4: - Fix dt_binding_check warning. - Check prepare_enable before set_parent to ensure our reference clock is ready. - Enable fhctl in apmixed driver. - Refine clock drivers: - Change subsys name, regs base/size (clock related part, instead of whole subsys). - Simply code with GATE_MTK macro. - Add MODULE_DEVICE_TABLE, MODULE_DESCRIPTION - Register remove callback mtk_clk_simple_remove. - Remove most of CLK_OPS_PARENT_ENABLE and CLK_IGNORE_UNUSED which may block bringup, but some subsys will power off before we disable unused clocks, so still need here. changes since v3: - Add power-controller dt-schema to mediatek,power-controller.yaml. - Separates clock commit to small parts (by sub-system). - Change to mtk-pm-domains for new MTK pm framework. changes since v2: - Fix dt-schema checking fails - Merge dt-binding files and dt-schema files into one patch. - Add vendor information to dt-binding file name. - Remove NR define in dt-binding header. - Add struct member description. This series add support for the clock controllers of MediaTek's new SoC, MT8189. With these changes, other modules can easily manage clock resources using standard Linux APIs, such as the Common Clock Framework (CCF). Irving-CH Lin (18): dt-bindings: clock: Add MediaTek MT8189 clock clk: mediatek: clk-mux: Make sure bypass clk enabled while setting MFG rate clk: mediatek: Add MT8189 apmixedsys clock support clk: mediatek: Add MT8189 topckgen clock support clk: mediatek: Add MT8189 vlpckgen clock support clk: mediatek: Add MT8189 vlpcfg clock support clk: mediatek: Add MT8189 bus clock support clk: mediatek: Add MT8189 cam clock support clk: mediatek: Add MT8189 dbgao clock support clk: mediatek: Add MT8189 dvfsrc clock support clk: mediatek: Add MT8189 i2c clock support clk: mediatek: Add MT8189 img clock support clk: mediatek: Add MT8189 mdp clock support clk: mediatek: Add MT8189 mfg clock support clk: mediatek: Add MT8189 dispsys clock support clk: mediatek: Add MT8189 scp clock support clk: mediatek: Add MT8189 ufs clock support clk: mediatek: Add MT8189 vcodec clock support .../bindings/clock/mediatek,apmixedsys.yaml | 1 + .../bindings/clock/mediatek,infracfg.yaml | 1 + .../bindings/clock/mediatek,pericfg.yaml | 1 + .../bindings/clock/mediatek,syscon.yaml | 27 + .../bindings/clock/mediatek,topckgen.yaml | 2 + drivers/clk/mediatek/Kconfig | 146 +++ drivers/clk/mediatek/Makefile | 14 + drivers/clk/mediatek/clk-mt8189-apmixedsys.c | 192 ++++ drivers/clk/mediatek/clk-mt8189-bus.c | 196 ++++ drivers/clk/mediatek/clk-mt8189-cam.c | 108 ++ drivers/clk/mediatek/clk-mt8189-dbgao.c | 94 ++ drivers/clk/mediatek/clk-mt8189-dispsys.c | 172 +++ drivers/clk/mediatek/clk-mt8189-dvfsrc.c | 54 + drivers/clk/mediatek/clk-mt8189-iic.c | 118 ++ drivers/clk/mediatek/clk-mt8189-img.c | 107 ++ drivers/clk/mediatek/clk-mt8189-mdpsys.c | 91 ++ drivers/clk/mediatek/clk-mt8189-mfg.c | 53 + drivers/clk/mediatek/clk-mt8189-scp.c | 73 ++ drivers/clk/mediatek/clk-mt8189-topckgen.c | 1020 +++++++++++++++++ drivers/clk/mediatek/clk-mt8189-ufs.c | 89 ++ drivers/clk/mediatek/clk-mt8189-vcodec.c | 93 ++ drivers/clk/mediatek/clk-mt8189-vlpcfg.c | 111 ++ drivers/clk/mediatek/clk-mt8189-vlpckgen.c | 280 +++++ drivers/clk/mediatek/clk-mux.c | 9 +- .../dt-bindings/clock/mediatek,mt8189-clk.h | 580 ++++++++++ 25 files changed, 3630 insertions(+), 2 deletions(-) create mode 100644 drivers/clk/mediatek/clk-mt8189-apmixedsys.c create mode 100644 drivers/clk/mediatek/clk-mt8189-bus.c create mode 100644 drivers/clk/mediatek/clk-mt8189-cam.c create mode 100644 drivers/clk/mediatek/clk-mt8189-dbgao.c create mode 100644 drivers/clk/mediatek/clk-mt8189-dispsys.c create mode 100644 drivers/clk/mediatek/clk-mt8189-dvfsrc.c create mode 100644 drivers/clk/mediatek/clk-mt8189-iic.c create mode 100644 drivers/clk/mediatek/clk-mt8189-img.c create mode 100644 drivers/clk/mediatek/clk-mt8189-mdpsys.c create mode 100644 drivers/clk/mediatek/clk-mt8189-mfg.c create mode 100644 drivers/clk/mediatek/clk-mt8189-scp.c create mode 100644 drivers/clk/mediatek/clk-mt8189-topckgen.c create mode 100644 drivers/clk/mediatek/clk-mt8189-ufs.c create mode 100644 drivers/clk/mediatek/clk-mt8189-vcodec.c create mode 100644 drivers/clk/mediatek/clk-mt8189-vlpcfg.c create mode 100644 drivers/clk/mediatek/clk-mt8189-vlpckgen.c create mode 100644 include/dt-bindings/clock/mediatek,mt8189-clk.h -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:12 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:12 +0800 Subject: [PATCH v5 05/18] clk: mediatek: Add MT8189 vlpckgen clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-6-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 vlpckgen clock controller, which provides muxes and dividers for clock selection in vlp domain for other IP blocks. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Makefile | 3 +- drivers/clk/mediatek/clk-mt8189-vlpckgen.c | 280 +++++++++++++++++++++ 2 files changed, 282 insertions(+), 1 deletion(-) create mode 100644 drivers/clk/mediatek/clk-mt8189-vlpckgen.c diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 9d3d2983bfb2..3b25df9e7b50 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -123,7 +123,8 @@ obj-$(CONFIG_COMMON_CLK_MT8188_VDOSYS) += clk-mt8188-vdo0.o clk-mt8188-vdo1.o obj-$(CONFIG_COMMON_CLK_MT8188_VENCSYS) += clk-mt8188-venc.o obj-$(CONFIG_COMMON_CLK_MT8188_VPPSYS) += clk-mt8188-vpp0.o clk-mt8188-vpp1.o obj-$(CONFIG_COMMON_CLK_MT8188_WPESYS) += clk-mt8188-wpe.o -obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o clk-mt8189-topckgen.o +obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o clk-mt8189-topckgen.o \ + clk-mt8189-vlpckgen.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-vlpckgen.c b/drivers/clk/mediatek/clk-mt8189-vlpckgen.c new file mode 100644 index 000000000000..950cc1fb73a1 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-vlpckgen.c @@ -0,0 +1,280 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-mux.h" +#include "clk-gate.h" + +#include + +static DEFINE_SPINLOCK(mt8189_vlpclk_lock); + +static const char * const vlp_26m_oscd10_parents[] = { + "clk26m", + "osc_d10" +}; + +static const char * const vlp_vadsp_vowpll_parents[] = { + "clk26m", + "vowpll" +}; + +static const char * const vlp_sspm_ulposc_parents[] = { + "ulposc", + "univpll_d5_d2", + "osc_d10" +}; + +static const char * const vlp_aud_adc_parents[] = { + "clk26m", + "vowpll", + "aud_adc_ext", + "osc_d10" +}; + +static const char * const vlp_scp_iic_spi_parents[] = { + "clk26m", + "mainpll_d5_d4", + "mainpll_d7_d2", + "osc_d10" +}; + +static const char * const vlp_vadsp_uarthub_b_parents[] = { + "clk26m", + "osc_d10", + "univpll_d6_d4", + "univpll_d6_d2" +}; + +static const char * const vlp_axi_kp_parents[] = { + "clk26m", + "osc_d10", + "osc_d2", + "mainpll_d7_d4", + "mainpll_d7_d2" +}; + +static const char * const vlp_sspm_parents[] = { + "clk26m", + "osc_d10", + "mainpll_d5_d2", + "ulposc", + "mainpll_d6" +}; + +static const char * const vlp_pwm_vlp_parents[] = { + "clk26m", + "osc_d4", + "clk32k", + "osc_d10", + "mainpll_d4_d8" +}; + +static const char * const vlp_pwrap_ulposc_parents[] = { + "clk26m", + "osc_d10", + "osc_d7", + "osc_d8", + "osc_d16", + "mainpll_d7_d8" +}; + +static const char * const vlp_vadsp_parents[] = { + "clk26m", + "osc_d20", + "osc_d10", + "osc_d2", + "ulposc", + "mainpll_d4_d2" +}; + +static const char * const vlp_scp_parents[] = { + "clk26m", + "univpll_d4", + "univpll_d3", + "mainpll_d3", + "univpll_d6", + "apll1", + "mainpll_d4", + "mainpll_d6", + "mainpll_d7", + "osc_d10" +}; + +static const char * const vlp_spmi_p_parents[] = { + "clk26m", + "f26m_d2", + "osc_d8", + "osc_d10", + "osc_d16", + "osc_d7", + "clk32k", + "mainpll_d7_d8", + "mainpll_d6_d8", + "mainpll_d5_d8" +}; + +static const char * const vlp_camtg_parents[] = { + "clk26m", + "univpll_192m_d8", + "univpll_d6_d8", + "univpll_192m_d4", + "osc_d16", + "osc_d20", + "osc_d10", + "univpll_d6_d16", + "tvdpll1_d16", + "f26m_d2", + "univpll_192m_d10", + "univpll_192m_d16", + "univpll_192m_d32" +}; + +static const struct mtk_mux vlp_ck_muxes[] = { + /* VLP_CLK_CFG_0 */ + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_SCP_SEL, "vlp_scp_sel", + vlp_scp_parents, 0x008, 0x00c, 0x010, + 0, 4, 7, 0x04, 0), + MUX_CLR_SET_UPD(CLK_VLP_CK_PWRAP_ULPOSC_SEL, "vlp_pwrap_osc_sel", + vlp_pwrap_ulposc_parents, 0x008, 0x00c, 0x010, + 8, 3, 0x04, 1), + MUX_CLR_SET_UPD(CLK_VLP_CK_SPMI_P_MST_SEL, "vlp_spmi_p_sel", + vlp_spmi_p_parents, 0x008, 0x00c, 0x010, + 16, 4, 0x04, 2), + MUX_CLR_SET_UPD(CLK_VLP_CK_DVFSRC_SEL, "vlp_dvfsrc_sel", + vlp_26m_oscd10_parents, 0x008, 0x00c, 0x010, + 24, 1, 0x04, 3), + /* VLP_CLK_CFG_1 */ + MUX_CLR_SET_UPD(CLK_VLP_CK_PWM_VLP_SEL, "vlp_pwm_vlp_sel", + vlp_pwm_vlp_parents, 0x014, 0x018, 0x01c, + 0, 3, 0x04, 4), + MUX_CLR_SET_UPD(CLK_VLP_CK_AXI_VLP_SEL, "vlp_axi_vlp_sel", + vlp_axi_kp_parents, 0x014, 0x018, 0x01c, + 8, 3, 0x04, 5), + MUX_CLR_SET_UPD(CLK_VLP_CK_SYSTIMER_26M_SEL, "vlp_timer_26m_sel", + vlp_26m_oscd10_parents, 0x014, 0x018, 0x01c, + 16, 1, 0x04, 6), + MUX_CLR_SET_UPD(CLK_VLP_CK_SSPM_SEL, "vlp_sspm_sel", + vlp_sspm_parents, 0x014, 0x018, 0x01c, + 24, 3, 0x04, 7), + /* VLP_CLK_CFG_2 */ + MUX_CLR_SET_UPD(CLK_VLP_CK_SSPM_F26M_SEL, "vlp_sspm_f26m_sel", + vlp_26m_oscd10_parents, 0x020, 0x024, 0x028, + 0, 1, 0x04, 8), + MUX_CLR_SET_UPD(CLK_VLP_CK_SRCK_SEL, "vlp_srck_sel", + vlp_26m_oscd10_parents, 0x020, 0x024, 0x028, + 8, 1, 0x04, 9), + MUX_CLR_SET_UPD(CLK_VLP_CK_SCP_SPI_SEL, "vlp_scp_spi_sel", + vlp_scp_iic_spi_parents, 0x020, 0x024, 0x028, + 16, 2, 0x04, 10), + MUX_CLR_SET_UPD(CLK_VLP_CK_SCP_IIC_SEL, "vlp_scp_iic_sel", + vlp_scp_iic_spi_parents, 0x020, 0x024, 0x028, + 24, 2, 0x04, 11), + /* VLP_CLK_CFG_3 */ + MUX_CLR_SET_UPD(CLK_VLP_CK_SCP_SPI_HIGH_SPD_SEL, + "vlp_scp_spi_hs_sel", + vlp_scp_iic_spi_parents, 0x02c, 0x030, 0x034, + 0, 2, 0x04, 12), + MUX_CLR_SET_UPD(CLK_VLP_CK_SCP_IIC_HIGH_SPD_SEL, + "vlp_scp_iic_hs_sel", + vlp_scp_iic_spi_parents, 0x02c, 0x030, 0x034, + 8, 2, 0x04, 13), + MUX_CLR_SET_UPD(CLK_VLP_CK_SSPM_ULPOSC_SEL, "vlp_sspm_ulposc_sel", + vlp_sspm_ulposc_parents, 0x02c, 0x030, 0x034, + 16, 2, 0x04, 14), + MUX_CLR_SET_UPD(CLK_VLP_CK_APXGPT_26M_SEL, "vlp_apxgpt_26m_sel", + vlp_26m_oscd10_parents, 0x02c, 0x030, 0x034, + 24, 1, 0x04, 15), + /* VLP_CLK_CFG_4 */ + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_VADSP_SEL, "vlp_vadsp_sel", + vlp_vadsp_parents, 0x038, 0x03c, 0x040, + 0, 3, 7, 0x04, 16), + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_VADSP_VOWPLL_SEL, + "vlp_vadsp_vowpll_sel", + vlp_vadsp_vowpll_parents, 0x038, 0x03c, 0x040, + 8, 1, 15, 0x04, 17), + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_VADSP_UARTHUB_BCLK_SEL, + "vlp_vadsp_uarthub_b_sel", + vlp_vadsp_uarthub_b_parents, + 0x038, 0x03c, 0x040, 16, 2, 23, 0x04, 18), + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_CAMTG0_SEL, "vlp_camtg0_sel", + vlp_camtg_parents, 0x038, 0x03c, 0x040, + 24, 4, 31, 0x04, 19), + /* VLP_CLK_CFG_5 */ + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_CAMTG1_SEL, "vlp_camtg1_sel", + vlp_camtg_parents, 0x044, 0x048, 0x04c, + 0, 4, 7, 0x04, 20), + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_CAMTG2_SEL, "vlp_camtg2_sel", + vlp_camtg_parents, 0x044, 0x048, 0x04c, + 8, 4, 15, 0x04, 21), + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_AUD_ADC_SEL, "vlp_aud_adc_sel", + vlp_aud_adc_parents, 0x044, 0x048, 0x04c, + 16, 2, 23, 0x04, 22), + MUX_GATE_CLR_SET_UPD(CLK_VLP_CK_KP_IRQ_GEN_SEL, "vlp_kp_irq_sel", + vlp_axi_kp_parents, 0x044, 0x048, 0x04c, + 24, 3, 31, 0x04, 23), +}; + +static const struct mtk_gate_regs vlp_ck_cg_regs = { + .set_ofs = 0x1f4, + .clr_ofs = 0x1f8, + .sta_ofs = 0x1f0, +}; + +#define GATE_VLP_CK_FLAGS(_id, _name, _parent, _shift, _flag) { \ + .id = _id, \ + .name = _name, \ + .parent_name = _parent, \ + .regs = &vlp_ck_cg_regs, \ + .shift = _shift, \ + .flags = _flag, \ + .ops = &mtk_clk_gate_ops_setclr_inv, \ + } + +#define GATE_VLP_CK(_id, _name, _parent, _shift) \ + GATE_VLP_CK_FLAGS(_id, _name, _parent, _shift, 0) + +static const struct mtk_gate vlp_ck_clks[] = { + GATE_VLP_CK(CLK_VLP_CK_VADSYS_VLP_26M_EN, "vlp_vadsys_vlp_26m", "clk26m", 1), + GATE_VLP_CK_FLAGS(CLK_VLP_CK_FMIPI_CSI_UP26M_CK_EN, "VLP_fmipi_csi_up26m", + "osc_d10", 11, CLK_IS_CRITICAL), +}; + +static const struct mtk_clk_desc vlpck_desc = { + .mux_clks = vlp_ck_muxes, + .num_mux_clks = ARRAY_SIZE(vlp_ck_muxes), + .clks = vlp_ck_clks, + .num_clks = ARRAY_SIZE(vlp_ck_clks), + .clk_lock = &mt8189_vlpclk_lock, +}; + +static const struct of_device_id of_match_clk_mt8189_vlpck[] = { + { .compatible = "mediatek,mt8189-vlpckgen", .data = &vlpck_desc }, + { /* sentinel */ } +}; + +static struct platform_driver clk_mt8189_vlpck_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-vlpck", + .of_match_table = of_match_clk_mt8189_vlpck, + }, +}; + +module_platform_driver(clk_mt8189_vlpck_drv); +MODULE_DESCRIPTION("MediaTek MT8189 vlpckgen clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:23 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:23 +0800 Subject: [PATCH v5 16/18] clk: mediatek: Add MT8189 scp clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-17-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 scp clock controller, which provides clock gate control for System Control Processor. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 10 ++++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-scp.c | 73 +++++++++++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-scp.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index cb1b8bc49033..4bf111c9efb5 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -929,6 +929,16 @@ config COMMON_CLK_MT8189_MMSYS ensure that these components receive the correct clock frequencies for proper operation. +config COMMON_CLK_MT8189_SCP + tristate "Clock driver for MediaTek MT8189 scp" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this to support the clock framework for the System Control + Processor (SCP) in the MediaTek MT8189 SoC. This includes clock + management for SCP-related features, ensuring proper clock + distribution and gating for power efficiency and functionality. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 21a9e6264b84..819c67395e1b 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -134,6 +134,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189_IMG) += clk-mt8189-img.o obj-$(CONFIG_COMMON_CLK_MT8189_MDPSYS) += clk-mt8189-mdpsys.o obj-$(CONFIG_COMMON_CLK_MT8189_MFG) += clk-mt8189-mfg.o obj-$(CONFIG_COMMON_CLK_MT8189_MMSYS) += clk-mt8189-dispsys.o +obj-$(CONFIG_COMMON_CLK_MT8189_SCP) += clk-mt8189-scp.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-scp.c b/drivers/clk/mediatek/clk-mt8189-scp.c new file mode 100644 index 000000000000..efa00de90215 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-scp.c @@ -0,0 +1,73 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs scp_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x4, +}; + +#define GATE_SCP(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &scp_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv) + +static const struct mtk_gate scp_clks[] = { + GATE_SCP(CLK_SCP_SET_SPI0, "scp_set_spi0", "clk26m", 0), + GATE_SCP(CLK_SCP_SET_SPI1, "scp_set_spi1", "clk26m", 1), +}; + +static const struct mtk_clk_desc scp_mcd = { + .clks = scp_clks, + .num_clks = ARRAY_SIZE(scp_clks), +}; + +static const struct mtk_gate_regs scp_iic_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0x4, + .sta_ofs = 0x0, +}; + +#define GATE_SCP_IIC(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &scp_iic_cg_regs, _shift, &mtk_clk_gate_ops_setclr_inv) + +static const struct mtk_gate scp_iic_clks[] = { + GATE_SCP_IIC(CLK_SCP_IIC_I2C0_W1S, "scp_iic_i2c0_w1s", "vlp_scp_iic_sel", 0), + GATE_SCP_IIC(CLK_SCP_IIC_I2C1_W1S, "scp_iic_i2c1_w1s", "vlp_scp_iic_sel", 1), +}; + +static const struct mtk_clk_desc scp_iic_mcd = { + .clks = scp_iic_clks, + .num_clks = ARRAY_SIZE(scp_iic_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_scp[] = { + { .compatible = "mediatek,mt8189-scp-clk", .data = &scp_mcd }, + { .compatible = "mediatek,mt8189-scp-i2c-clk", .data = &scp_iic_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_scp); + +static struct platform_driver clk_mt8189_scp_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-scp", + .of_match_table = of_match_clk_mt8189_scp, + }, +}; + +module_platform_driver(clk_mt8189_scp_drv); +MODULE_DESCRIPTION("MediaTek MT8189 scp clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:14 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:14 +0800 Subject: [PATCH v5 07/18] clk: mediatek: Add MT8189 bus clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-8-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 bus clock controller, which provides clock gate control for infra/peri IPs (such as spi, uart, msdc, flashif ...). Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 11 ++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-bus.c | 196 ++++++++++++++++++++++++++ 3 files changed, 208 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-bus.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 80813d7e02af..47172623f29f 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -828,6 +828,17 @@ config COMMON_CLK_MT8189 with the MediaTek MT8189 hardware capabilities, providing efficient management of clock speeds and power consumption. +config COMMON_CLK_MT8189_BUS + tristate "Clock driver for MediaTek MT8189 bus" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this configuration option to support the clock framework for + MediaTek MT8189 SoC bus clocks. It includes the necessary clock + management for bus-related peripherals and interconnects within the + MT8189 chipset, ensuring that all bus-related components receive the + correct clock signals for optimal performance. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index d9279b237b7b..aabfb42cb1b2 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -125,6 +125,7 @@ obj-$(CONFIG_COMMON_CLK_MT8188_VPPSYS) += clk-mt8188-vpp0.o clk-mt8188-vpp1.o obj-$(CONFIG_COMMON_CLK_MT8188_WPESYS) += clk-mt8188-wpe.o obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o clk-mt8189-topckgen.o \ clk-mt8189-vlpckgen.o clk-mt8189-vlpcfg.o +obj-$(CONFIG_COMMON_CLK_MT8189_BUS) += clk-mt8189-bus.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-bus.c b/drivers/clk/mediatek/clk-mt8189-bus.c new file mode 100644 index 000000000000..c9b83fa98590 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-bus.c @@ -0,0 +1,196 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs ifrao0_cg_regs = { + .set_ofs = 0x80, + .clr_ofs = 0x84, + .sta_ofs = 0x90, +}; + +static const struct mtk_gate_regs ifrao1_cg_regs = { + .set_ofs = 0x88, + .clr_ofs = 0x8c, + .sta_ofs = 0x94, +}; + +static const struct mtk_gate_regs ifrao2_cg_regs = { + .set_ofs = 0xa4, + .clr_ofs = 0xa8, + .sta_ofs = 0xac, +}; + +#define GATE_IFRAO0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &ifrao0_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +#define GATE_IFRAO1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &ifrao1_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +#define GATE_IFRAO2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &ifrao2_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate ifrao_clks[] = { + /* IFRAO0 */ + GATE_IFRAO0(CLK_IFRAO_CQ_DMA_FPC, "ifrao_dma", "clk26m", 28), + /* IFRAO1 */ + GATE_IFRAO1(CLK_IFRAO_DEBUGSYS, "ifrao_debugsys", "axi_sel", 24), + GATE_IFRAO1(CLK_IFRAO_DBG_TRACE, "ifrao_dbg_trace", "axi_sel", 29), + /* IFRAO2 */ + GATE_IFRAO2(CLK_IFRAO_CQ_DMA, "ifrao_cq_dma", "axi_sel", 27), +}; + +static const struct mtk_clk_desc ifrao_mcd = { + .clks = ifrao_clks, + .num_clks = ARRAY_SIZE(ifrao_clks), +}; + +static const struct mtk_gate_regs perao0_cg_regs = { + .set_ofs = 0x24, + .clr_ofs = 0x28, + .sta_ofs = 0x10, +}; + +static const struct mtk_gate_regs perao1_cg_regs = { + .set_ofs = 0x2c, + .clr_ofs = 0x30, + .sta_ofs = 0x14, +}; + +static const struct mtk_gate_regs perao2_cg_regs = { + .set_ofs = 0x34, + .clr_ofs = 0x38, + .sta_ofs = 0x18, +}; + +#define GATE_PERAO0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &perao0_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +#define GATE_PERAO1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &perao1_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +#define GATE_PERAO2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &perao2_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate perao_clks[] = { + /* PERAO0 */ + GATE_PERAO0(CLK_PERAO_UART0, "perao_uart0", "uart_sel", 0), + GATE_PERAO0(CLK_PERAO_UART1, "perao_uart1", "uart_sel", 1), + GATE_PERAO0(CLK_PERAO_UART2, "perao_uart2", "uart_sel", 2), + GATE_PERAO0(CLK_PERAO_UART3, "perao_uart3", "uart_sel", 3), + GATE_PERAO0(CLK_PERAO_PWM_H, "perao_pwm_h", "axi_peri_sel", 4), + GATE_PERAO0(CLK_PERAO_PWM_B, "perao_pwm_b", "pwm_sel", 5), + GATE_PERAO0(CLK_PERAO_PWM_FB1, "perao_pwm_fb1", "pwm_sel", 6), + GATE_PERAO0(CLK_PERAO_PWM_FB2, "perao_pwm_fb2", "pwm_sel", 7), + GATE_PERAO0(CLK_PERAO_PWM_FB3, "perao_pwm_fb3", "pwm_sel", 8), + GATE_PERAO0(CLK_PERAO_PWM_FB4, "perao_pwm_fb4", "pwm_sel", 9), + GATE_PERAO0(CLK_PERAO_DISP_PWM0, "perao_disp_pwm0", "disp_pwm_sel", 10), + GATE_PERAO0(CLK_PERAO_DISP_PWM1, "perao_disp_pwm1", "disp_pwm_sel", 11), + GATE_PERAO0(CLK_PERAO_SPI0_B, "perao_spi0_b", "spi0_sel", 12), + GATE_PERAO0(CLK_PERAO_SPI1_B, "perao_spi1_b", "spi1_sel", 13), + GATE_PERAO0(CLK_PERAO_SPI2_B, "perao_spi2_b", "spi2_sel", 14), + GATE_PERAO0(CLK_PERAO_SPI3_B, "perao_spi3_b", "spi3_sel", 15), + GATE_PERAO0(CLK_PERAO_SPI4_B, "perao_spi4_b", "spi4_sel", 16), + GATE_PERAO0(CLK_PERAO_SPI5_B, "perao_spi5_b", "spi5_sel", 17), + GATE_PERAO0(CLK_PERAO_SPI0_H, "perao_spi0_h", "axi_peri_sel", 18), + GATE_PERAO0(CLK_PERAO_SPI1_H, "perao_spi1_h", "axi_peri_sel", 19), + GATE_PERAO0(CLK_PERAO_SPI2_H, "perao_spi2_h", "axi_peri_sel", 20), + GATE_PERAO0(CLK_PERAO_SPI3_H, "perao_spi3_h", "axi_peri_sel", 21), + GATE_PERAO0(CLK_PERAO_SPI4_H, "perao_spi4_h", "axi_peri_sel", 22), + GATE_PERAO0(CLK_PERAO_SPI5_H, "perao_spi5_h", "axi_peri_sel", 23), + GATE_PERAO0(CLK_PERAO_AXI, "perao_axi", "mem_sub_peri_sel", 24), + GATE_PERAO0(CLK_PERAO_AHB_APB, "perao_ahb_apb", "axi_peri_sel", 25), + GATE_PERAO0(CLK_PERAO_TL, "perao_tl", "pcie_mac_tl_sel", 26), + GATE_PERAO0(CLK_PERAO_REF, "perao_ref", "clk26m", 27), + GATE_PERAO0(CLK_PERAO_I2C, "perao_i2c", "axi_peri_sel", 28), + GATE_PERAO0(CLK_PERAO_DMA_B, "perao_dma_b", "axi_peri_sel", 29), + /* PERAO1 */ + GATE_PERAO1(CLK_PERAO_SSUSB0_REF, "perao_ssusb0_ref", "clk26m", 1), + GATE_PERAO1(CLK_PERAO_SSUSB0_FRMCNT, "perao_ssusb0_frmcnt", "univpll_192m_d4", 2), + GATE_PERAO1(CLK_PERAO_SSUSB0_SYS, "perao_ssusb0_sys", "usb_p0_sel", 4), + GATE_PERAO1(CLK_PERAO_SSUSB0_XHCI, "perao_ssusb0_xhci", "ssusb_xhci_p0_sel", 5), + GATE_PERAO1(CLK_PERAO_SSUSB0_F, "perao_ssusb0_f", "axi_peri_sel", 6), + GATE_PERAO1(CLK_PERAO_SSUSB0_H, "perao_ssusb0_h", "axi_peri_sel", 7), + GATE_PERAO1(CLK_PERAO_SSUSB1_REF, "perao_ssusb1_ref", "clk26m", 8), + GATE_PERAO1(CLK_PERAO_SSUSB1_FRMCNT, "perao_ssusb1_frmcnt", "univpll_192m_d4", 9), + GATE_PERAO1(CLK_PERAO_SSUSB1_SYS, "perao_ssusb1_sys", "usb_p1_sel", 11), + GATE_PERAO1(CLK_PERAO_SSUSB1_XHCI, "perao_ssusb1_xhci", "ssusb_xhci_p1_sel", 12), + GATE_PERAO1(CLK_PERAO_SSUSB1_F, "perao_ssusb1_f", "axi_peri_sel", 13), + GATE_PERAO1(CLK_PERAO_SSUSB1_H, "perao_ssusb1_h", "axi_peri_sel", 14), + GATE_PERAO1(CLK_PERAO_SSUSB2_REF, "perao_ssusb2_ref", "clk26m", 15), + GATE_PERAO1(CLK_PERAO_SSUSB2_FRMCNT, "perao_ssusb2_frmcnt", "univpll_192m_d4", 16), + GATE_PERAO1(CLK_PERAO_SSUSB2_SYS, "perao_ssusb2_sys", "usb_p2_sel", 18), + GATE_PERAO1(CLK_PERAO_SSUSB2_XHCI, "perao_ssusb2_xhci", "ssusb_xhci_p2_sel", 19), + GATE_PERAO1(CLK_PERAO_SSUSB2_F, "perao_ssusb2_f", "axi_peri_sel", 20), + GATE_PERAO1(CLK_PERAO_SSUSB2_H, "perao_ssusb2_h", "axi_peri_sel", 21), + GATE_PERAO1(CLK_PERAO_SSUSB3_REF, "perao_ssusb3_ref", "clk26m", 23), + GATE_PERAO1(CLK_PERAO_SSUSB3_FRMCNT, "perao_ssusb3_frmcnt", "univpll_192m_d4", 24), + GATE_PERAO1(CLK_PERAO_SSUSB3_SYS, "perao_ssusb3_sys", "usb_p3_sel", 26), + GATE_PERAO1(CLK_PERAO_SSUSB3_XHCI, "perao_ssusb3_xhci", "ssusb_xhci_p3_sel", 27), + GATE_PERAO1(CLK_PERAO_SSUSB3_F, "perao_ssusb3_f", "axi_peri_sel", 28), + GATE_PERAO1(CLK_PERAO_SSUSB3_H, "perao_ssusb3_h", "axi_peri_sel", 29), + /* PERAO2 */ + GATE_PERAO2(CLK_PERAO_SSUSB4_REF, "perao_ssusb4_ref", "clk26m", 0), + GATE_PERAO2(CLK_PERAO_SSUSB4_FRMCNT, "perao_ssusb4_frmcnt", "univpll_192m_d4", 1), + GATE_PERAO2(CLK_PERAO_SSUSB4_SYS, "perao_ssusb4_sys", "usb_p4_sel", 3), + GATE_PERAO2(CLK_PERAO_SSUSB4_XHCI, "perao_ssusb4_xhci", "ssusb_xhci_p4_sel", 4), + GATE_PERAO2(CLK_PERAO_SSUSB4_F, "perao_ssusb4_f", "axi_peri_sel", 5), + GATE_PERAO2(CLK_PERAO_SSUSB4_H, "perao_ssusb4_h", "axi_peri_sel", 6), + GATE_PERAO2(CLK_PERAO_MSDC0, "perao_msdc0", "msdc50_0_sel", 7), + GATE_PERAO2(CLK_PERAO_MSDC0_H, "perao_msdc0_h", "msdc5hclk_sel", 8), + GATE_PERAO2(CLK_PERAO_MSDC0_FAES, "perao_msdc0_faes", "aes_msdcfde_sel", 9), + GATE_PERAO2(CLK_PERAO_MSDC0_MST_F, "perao_msdc0_mst_f", "axi_peri_sel", 10), + GATE_PERAO2(CLK_PERAO_MSDC0_SLV_H, "perao_msdc0_slv_h", "axi_peri_sel", 11), + GATE_PERAO2(CLK_PERAO_MSDC1, "perao_msdc1", "msdc30_1_sel", 12), + GATE_PERAO2(CLK_PERAO_MSDC1_H, "perao_msdc1_h", "msdc30_1_h_sel", 13), + GATE_PERAO2(CLK_PERAO_MSDC1_MST_F, "perao_msdc1_mst_f", "axi_peri_sel", 14), + GATE_PERAO2(CLK_PERAO_MSDC1_SLV_H, "perao_msdc1_slv_h", "axi_peri_sel", 15), + GATE_PERAO2(CLK_PERAO_MSDC2, "perao_msdc2", "msdc30_2_sel", 16), + GATE_PERAO2(CLK_PERAO_MSDC2_H, "perao_msdc2_h", "msdc30_2_h_sel", 17), + GATE_PERAO2(CLK_PERAO_MSDC2_MST_F, "perao_msdc2_mst_f", "axi_peri_sel", 18), + GATE_PERAO2(CLK_PERAO_MSDC2_SLV_H, "perao_msdc2_slv_h", "axi_peri_sel", 19), + GATE_PERAO2(CLK_PERAO_SFLASH, "perao_sflash", "sflash_sel", 20), + GATE_PERAO2(CLK_PERAO_SFLASH_F, "perao_sflash_f", "axi_peri_sel", 21), + GATE_PERAO2(CLK_PERAO_SFLASH_H, "perao_sflash_h", "axi_peri_sel", 22), + GATE_PERAO2(CLK_PERAO_SFLASH_P, "perao_sflash_p", "axi_peri_sel", 23), + GATE_PERAO2(CLK_PERAO_AUDIO0, "perao_audio0", "axi_peri_sel", 24), + GATE_PERAO2(CLK_PERAO_AUDIO1, "perao_audio1", "axi_peri_sel", 25), + GATE_PERAO2(CLK_PERAO_AUDIO2, "perao_audio2", "aud_intbus_sel", 26), + GATE_PERAO2(CLK_PERAO_AUXADC_26M, "perao_auxadc_26m", "clk26m", 27), +}; + +static const struct mtk_clk_desc perao_mcd = { + .clks = perao_clks, + .num_clks = ARRAY_SIZE(perao_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_bus[] = { + { .compatible = "mediatek,mt8189-infra-ao", .data = &ifrao_mcd }, + { .compatible = "mediatek,mt8189-peri-ao", .data = &perao_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_bus); + +static struct platform_driver clk_mt8189_bus_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-bus", + .of_match_table = of_match_clk_mt8189_bus, + }, +}; + +module_platform_driver(clk_mt8189_bus_drv); +MODULE_DESCRIPTION("MediaTek MT8189 bus/peripheral clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:13 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:13 +0800 Subject: [PATCH v5 06/18] clk: mediatek: Add MT8189 vlpcfg clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-7-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 vlpcfg clock controller, which provides clock gate control for vlp domain IPs. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Makefile | 2 +- drivers/clk/mediatek/clk-mt8189-vlpcfg.c | 111 +++++++++++++++++++++++ 2 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 drivers/clk/mediatek/clk-mt8189-vlpcfg.c diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 3b25df9e7b50..d9279b237b7b 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -124,7 +124,7 @@ obj-$(CONFIG_COMMON_CLK_MT8188_VENCSYS) += clk-mt8188-venc.o obj-$(CONFIG_COMMON_CLK_MT8188_VPPSYS) += clk-mt8188-vpp0.o clk-mt8188-vpp1.o obj-$(CONFIG_COMMON_CLK_MT8188_WPESYS) += clk-mt8188-wpe.o obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o clk-mt8189-topckgen.o \ - clk-mt8189-vlpckgen.o + clk-mt8189-vlpckgen.o clk-mt8189-vlpcfg.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-vlpcfg.c b/drivers/clk/mediatek/clk-mt8189-vlpcfg.c new file mode 100644 index 000000000000..2b9c3101f2b4 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-vlpcfg.c @@ -0,0 +1,111 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs vlpcfg_ao_reg_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x0, + .sta_ofs = 0x0, +}; + +#define GATE_VLPCFG_AO_REG(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &vlpcfg_ao_reg_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr) + +static const struct mtk_gate vlpcfg_ao_reg_clks[] = { + GATE_VLPCFG_AO_REG(CLK_VLPCFG_AO_APEINT_RX, "vlpcfg_ao_apeint_rx", "clk26m", 8), +}; + +static const struct mtk_clk_desc vlpcfg_ao_reg_mcd = { + .clks = vlpcfg_ao_reg_clks, + .num_clks = ARRAY_SIZE(vlpcfg_ao_reg_clks), +}; + +static const struct mtk_gate_regs vlpcfg_reg_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x4, + .sta_ofs = 0x4, +}; + +#define GATE_VLPCFG_REG_FLAGS(_id, _name, _parent, _shift, _flags) \ + GATE_MTK_FLAGS(_id, _name, _parent, &vlpcfg_reg_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr_inv, _flags) + +#define GATE_VLPCFG_REG(_id, _name, _parent, _shift) \ + GATE_VLPCFG_REG_FLAGS(_id, _name, _parent, _shift, 0) + +static const struct mtk_gate vlpcfg_reg_clks[] = { + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_SCP, "vlpcfg_scp", + "vlp_scp_sel", 28, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_RG_R_APXGPT_26M, "vlpcfg_r_apxgpt_26m", + "clk26m", 24, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_DPMSRCK_TEST, "vlpcfg_dpmsrck_test", + "clk26m", 23, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_RG_DPMSRRTC_TEST, "vlpcfg_dpmsrrtc_test", + "clk32k", 22, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_DPMSRULP_TEST, "vlpcfg_dpmsrulp_test", + "osc_d10", 21, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_SPMI_P_MST, "vlpcfg_spmi_p", + "vlp_spmi_p_sel", 20, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_SPMI_P_MST_32K, "vlpcfg_spmi_p_32k", + "clk32k", 18, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_PMIF_SPMI_P_SYS, "vlpcfg_pmif_spmi_p_sys", + "vlp_pwrap_ulposc_sel", 13, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_PMIF_SPMI_P_TMR, "vlpcfg_pmif_spmi_p_tmr", + "vlp_pwrap_ulposc_sel", 12, CLK_IS_CRITICAL), + GATE_VLPCFG_REG(CLK_VLPCFG_REG_PMIF_SPMI_M_SYS, "vlpcfg_pmif_spmi_m_sys", + "vlp_pwrap_ulposc_sel", 11), + GATE_VLPCFG_REG(CLK_VLPCFG_REG_PMIF_SPMI_M_TMR, "vlpcfg_pmif_spmi_m_tmr", + "vlp_pwrap_ulposc_sel", 10), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_DVFSRC, "vlpcfg_dvfsrc", + "vlp_dvfsrc_sel", 9, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_PWM_VLP, "vlpcfg_pwm_vlp", + "vlp_pwm_vlp_sel", 8, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_SRCK, "vlpcfg_srck", + "vlp_srck_sel", 7, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_SSPM_F26M, "vlpcfg_sspm_f26m", + "vlp_sspm_f26m_sel", 4, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_SSPM_F32K, "vlpcfg_sspm_f32k", + "clk32k", 3, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_SSPM_ULPOSC, "vlpcfg_sspm_ulposc", + "vlp_sspm_ulposc_sel", 2, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_VLP_32K_COM, "vlpcfg_vlp_32k_com", + "clk32k", 1, CLK_IS_CRITICAL), + GATE_VLPCFG_REG_FLAGS(CLK_VLPCFG_REG_VLP_26M_COM, "vlpcfg_vlp_26m_com", + "clk26m", 0, CLK_IS_CRITICAL), +}; + +static const struct mtk_clk_desc vlpcfg_reg_mcd = { + .clks = vlpcfg_reg_clks, + .num_clks = ARRAY_SIZE(vlpcfg_reg_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_vlpcfg[] = { + { .compatible = "mediatek,mt8189-vlp-ao", .data = &vlpcfg_ao_reg_mcd }, + { .compatible = "mediatek,mt8189-vlpcfg-ao", .data = &vlpcfg_reg_mcd }, + { /* sentinel */ } +}; + +static struct platform_driver clk_mt8189_vlpcfg_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-vlpcfg", + .of_match_table = of_match_clk_mt8189_vlpcfg, + }, +}; + +module_platform_driver(clk_mt8189_vlpcfg_drv); +MODULE_DESCRIPTION("MediaTek MT8189 vlpcfg clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:11 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:11 +0800 Subject: [PATCH v5 04/18] clk: mediatek: Add MT8189 topckgen clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-5-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 topckgen clock controller, which provides muxes and dividers for clock selection in other IP blocks. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Makefile | 2 +- drivers/clk/mediatek/clk-mt8189-topckgen.c | 1020 ++++++++++++++++++++ 2 files changed, 1021 insertions(+), 1 deletion(-) create mode 100644 drivers/clk/mediatek/clk-mt8189-topckgen.c diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 66577ccb9b93..9d3d2983bfb2 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -123,7 +123,7 @@ obj-$(CONFIG_COMMON_CLK_MT8188_VDOSYS) += clk-mt8188-vdo0.o clk-mt8188-vdo1.o obj-$(CONFIG_COMMON_CLK_MT8188_VENCSYS) += clk-mt8188-venc.o obj-$(CONFIG_COMMON_CLK_MT8188_VPPSYS) += clk-mt8188-vpp0.o clk-mt8188-vpp1.o obj-$(CONFIG_COMMON_CLK_MT8188_WPESYS) += clk-mt8188-wpe.o -obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o +obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o clk-mt8189-topckgen.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-topckgen.c b/drivers/clk/mediatek/clk-mt8189-topckgen.c new file mode 100644 index 000000000000..dcc3c21bf3a4 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-topckgen.c @@ -0,0 +1,1020 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-mux.h" +#include "clk-gate.h" + +#include + +static DEFINE_SPINLOCK(mt8189_clk_lock); + +static const struct mtk_fixed_factor top_divs[] = { + FACTOR(CLK_TOP_MAINPLL_D3, "mainpll_d3", "mainpll", 1, 3), + FACTOR(CLK_TOP_MAINPLL_D4, "mainpll_d4", "mainpll", 1, 4), + FACTOR(CLK_TOP_MAINPLL_D4_D2, "mainpll_d4_d2", "mainpll", 1, 8), + FACTOR(CLK_TOP_MAINPLL_D4_D4, "mainpll_d4_d4", "mainpll", 1, 16), + FACTOR(CLK_TOP_MAINPLL_D4_D8, "mainpll_d4_d8", "mainpll", 43, 1375), + FACTOR(CLK_TOP_MAINPLL_D5, "mainpll_d5", "mainpll", 1, 5), + FACTOR(CLK_TOP_MAINPLL_D5_D2, "mainpll_d5_d2", "mainpll", 1, 10), + FACTOR(CLK_TOP_MAINPLL_D5_D4, "mainpll_d5_d4", "mainpll", 1, 20), + FACTOR(CLK_TOP_MAINPLL_D5_D8, "mainpll_d5_d8", "mainpll", 1, 40), + FACTOR(CLK_TOP_MAINPLL_D6, "mainpll_d6", "mainpll", 1, 6), + FACTOR(CLK_TOP_MAINPLL_D6_D2, "mainpll_d6_d2", "mainpll", 1, 12), + FACTOR(CLK_TOP_MAINPLL_D6_D4, "mainpll_d6_d4", "mainpll", 1, 24), + FACTOR(CLK_TOP_MAINPLL_D6_D8, "mainpll_d6_d8", "mainpll", 1, 48), + FACTOR(CLK_TOP_MAINPLL_D7, "mainpll_d7", "mainpll", 1, 7), + FACTOR(CLK_TOP_MAINPLL_D7_D2, "mainpll_d7_d2", "mainpll", 1, 14), + FACTOR(CLK_TOP_MAINPLL_D7_D4, "mainpll_d7_d4", "mainpll", 1, 28), + FACTOR(CLK_TOP_MAINPLL_D7_D8, "mainpll_d7_d8", "mainpll", 1, 56), + FACTOR(CLK_TOP_MAINPLL_D9, "mainpll_d9", "mainpll", 1, 9), + FACTOR(CLK_TOP_UNIVPLL_D2, "univpll_d2", "univpll", 1, 2), + FACTOR(CLK_TOP_UNIVPLL_D3, "univpll_d3", "univpll", 1, 3), + FACTOR(CLK_TOP_UNIVPLL_D4, "univpll_d4", "univpll", 1, 4), + FACTOR(CLK_TOP_UNIVPLL_D4_D2, "univpll_d4_d2", "univpll", 1, 8), + FACTOR(CLK_TOP_UNIVPLL_D4_D4, "univpll_d4_d4", "univpll", 1, 16), + FACTOR(CLK_TOP_UNIVPLL_D4_D8, "univpll_d4_d8", "univpll", 1, 32), + FACTOR(CLK_TOP_UNIVPLL_D5, "univpll_d5", "univpll", 1, 5), + FACTOR(CLK_TOP_UNIVPLL_D5_D2, "univpll_d5_d2", "univpll", 1, 10), + FACTOR(CLK_TOP_UNIVPLL_D5_D4, "univpll_d5_d4", "univpll", 1, 20), + FACTOR(CLK_TOP_UNIVPLL_D6, "univpll_d6", "univpll", 1, 6), + FACTOR(CLK_TOP_UNIVPLL_D6_D2, "univpll_d6_d2", "univpll", 1, 12), + FACTOR(CLK_TOP_UNIVPLL_D6_D4, "univpll_d6_d4", "univpll", 1, 24), + FACTOR(CLK_TOP_UNIVPLL_D6_D8, "univpll_d6_d8", "univpll", 1, 48), + FACTOR(CLK_TOP_UNIVPLL_D6_D16, "univpll_d6_d16", "univpll", 1, 96), + FACTOR(CLK_TOP_UNIVPLL_D7, "univpll_d7", "univpll", 1, 7), + FACTOR(CLK_TOP_UNIVPLL_D7_D2, "univpll_d7_d2", "univpll", 1, 14), + FACTOR(CLK_TOP_UNIVPLL_D7_D3, "univpll_d7_d3", "univpll", 1, 21), + FACTOR(CLK_TOP_LVDSTX_DG_CTS, "lvdstx_dg_cts", "univpll", 1, 21), + FACTOR(CLK_TOP_UNIVPLL_192M, "univpll_192m", "univpll", 1, 13), + FACTOR(CLK_TOP_UNIVPLL_192M_D2, "univpll_192m_d2", "univpll", 1, 26), + FACTOR(CLK_TOP_UNIVPLL_192M_D4, "univpll_192m_d4", "univpll", 1, 52), + FACTOR(CLK_TOP_UNIVPLL_192M_D8, "univpll_192m_d8", "univpll", 1, 104), + FACTOR(CLK_TOP_UNIVPLL_192M_D10, "univpll_192m_d10", "univpll", 1, 130), + FACTOR(CLK_TOP_UNIVPLL_192M_D16, "univpll_192m_d16", "univpll", 1, 208), + FACTOR(CLK_TOP_UNIVPLL_192M_D32, "univpll_192m_d32", "univpll", 1, 416), + FACTOR(CLK_TOP_APLL1_D2, "apll1_d2", "apll1", 1, 2), + FACTOR(CLK_TOP_APLL1_D4, "apll1_d4", "apll1", 1, 4), + FACTOR(CLK_TOP_APLL1_D8, "apll1_d8", "apll1", 1, 8), + FACTOR(CLK_TOP_APLL1_D3, "apll1_d3", "apll1", 1, 3), + FACTOR(CLK_TOP_APLL2_D2, "apll2_d2", "apll2", 1, 2), + FACTOR(CLK_TOP_APLL2_D4, "apll2_d4", "apll2", 1, 4), + FACTOR(CLK_TOP_APLL2_D8, "apll2_d8", "apll2", 1, 8), + FACTOR(CLK_TOP_APLL2_D3, "apll2_d3", "apll2", 1, 3), + FACTOR(CLK_TOP_MMPLL_D4, "mmpll_d4", "mmpll", 1, 4), + FACTOR(CLK_TOP_MMPLL_D4_D2, "mmpll_d4_d2", "mmpll", 1, 8), + FACTOR(CLK_TOP_MMPLL_D4_D4, "mmpll_d4_d4", "mmpll", 1, 16), + FACTOR(CLK_TOP_VPLL_DPIX, "vpll_dpix", "mmpll", 1, 16), + FACTOR(CLK_TOP_MMPLL_D5, "mmpll_d5", "mmpll", 1, 5), + FACTOR(CLK_TOP_MMPLL_D5_D2, "mmpll_d5_d2", "mmpll", 1, 10), + FACTOR(CLK_TOP_MMPLL_D5_D4, "mmpll_d5_d4", "mmpll", 1, 20), + FACTOR(CLK_TOP_MMPLL_D6, "mmpll_d6", "mmpll", 1, 6), + FACTOR(CLK_TOP_MMPLL_D6_D2, "mmpll_d6_d2", "mmpll", 1, 12), + FACTOR(CLK_TOP_MMPLL_D7, "mmpll_d7", "mmpll", 1, 7), + FACTOR(CLK_TOP_MMPLL_D9, "mmpll_d9", "mmpll", 1, 9), + FACTOR(CLK_TOP_TVDPLL1_D2, "tvdpll1_d2", "tvdpll1", 1, 2), + FACTOR(CLK_TOP_TVDPLL1_D4, "tvdpll1_d4", "tvdpll1", 1, 4), + FACTOR(CLK_TOP_TVDPLL1_D8, "tvdpll1_d8", "tvdpll1", 1, 8), + FACTOR(CLK_TOP_TVDPLL1_D16, "tvdpll1_d16", "tvdpll1", 92, 1473), + FACTOR(CLK_TOP_TVDPLL2_D2, "tvdpll2_d2", "tvdpll2", 1, 2), + FACTOR(CLK_TOP_TVDPLL2_D4, "tvdpll2_d4", "tvdpll2", 1, 4), + FACTOR(CLK_TOP_TVDPLL2_D8, "tvdpll2_d8", "tvdpll2", 1, 8), + FACTOR(CLK_TOP_TVDPLL2_D16, "tvdpll2_d16", "tvdpll2", 92, 1473), + FACTOR(CLK_TOP_ETHPLL_D2, "ethpll_d2", "ethpll", 1, 2), + FACTOR(CLK_TOP_ETHPLL_D8, "ethpll_d8", "ethpll", 1, 8), + FACTOR(CLK_TOP_ETHPLL_D10, "ethpll_d10", "ethpll", 1, 10), + FACTOR(CLK_TOP_MSDCPLL_D2, "msdcpll_d2", "msdcpll", 1, 2), + FACTOR(CLK_TOP_UFSPLL_D2, "ufspll_d2", "ufspll", 1, 2), + FACTOR(CLK_TOP_F26M_CK_D2, "f26m_d2", "clk26m", 1, 2), + FACTOR(CLK_TOP_OSC_D2, "osc_d2", "ulposc", 1, 2), + FACTOR(CLK_TOP_OSC_D4, "osc_d4", "ulposc", 1, 4), + FACTOR(CLK_TOP_OSC_D8, "osc_d8", "ulposc", 1, 8), + FACTOR(CLK_TOP_OSC_D16, "osc_d16", "ulposc", 61, 973), + FACTOR(CLK_TOP_OSC_D3, "osc_d3", "ulposc", 1, 3), + FACTOR(CLK_TOP_OSC_D7, "osc_d7", "ulposc", 1, 7), + FACTOR(CLK_TOP_OSC_D10, "osc_d10", "ulposc", 1, 10), + FACTOR(CLK_TOP_OSC_D20, "osc_d20", "ulposc", 1, 20), +}; + +static const char * const ap2conn_host_parents[] = { + "clk26m", + "mainpll_d7_d4" +}; + +static const char * const apll_m_parents[] = { + "aud_1_sel", + "aud_2_sel" +}; + +static const char * const aud_1_parents[] = { + "clk26m", + "apll1" +}; + +static const char * const aud_2_parents[] = { + "clk26m", + "apll2" +}; + +static const char * const mfg_sel_mfgpll_parents[] = { + "mfg_ref_sel", + "mfgpll" +}; + +static const char * const pwm_parents[] = { + "clk26m", + "univpll_d4_d8" +}; + +static const char * const snps_eth_250m_parents[] = { + "clk26m", + "ethpll_d2" +}; + +static const char * const snps_eth_50m_rmii_parents[] = { + "clk26m", + "ethpll_d10" +}; + +static const char * const uart_parents[] = { + "clk26m", + "univpll_d6_d8" +}; + +static const char * const atb_parents[] = { + "clk26m", + "mainpll_d4_d2", + "mainpll_d5_d2" +}; + +static const char * const aud_intbus_parents[] = { + "clk26m", + "mainpll_d4_d4", + "mainpll_d7_d4" +}; + +static const char * const msdc5hclk_parents[] = { + "clk26m", + "mainpll_d4_d2", + "mainpll_d6_d2" +}; + +static const char * const pcie_mac_tl_parents[] = { + "clk26m", + "mainpll_d4_d4", + "univpll_d5_d4" +}; + +static const char * const pll_dpix_parents[] = { + "clk26m", + "vpll_dpix", + "mmpll_d4_d4" +}; + +static const char * const usb_parents[] = { + "clk26m", + "univpll_d5_d4", + "univpll_d6_d4" +}; + +static const char * const vdstx_dg_cts_parents[] = { + "clk26m", + "lvdstx_dg_cts", + "univpll_d7_d3" +}; + +static const char * const audio_h_parents[] = { + "clk26m", + "univpll_d7_d2", + "apll1", + "apll2" +}; + +static const char * const aud_engen1_parents[] = { + "clk26m", + "apll1_d2", + "apll1_d4", + "apll1_d8" +}; + +static const char * const aud_engen2_parents[] = { + "clk26m", + "apll2_d2", + "apll2_d4", + "apll2_d8" +}; + +static const char * const axi_peri_parents[] = { + "clk26m", + "mainpll_d4_d4", + "mainpll_d7_d2", + "osc_d4" +}; + +static const char * const axi_u_parents[] = { + "clk26m", + "mainpll_d4_d8", + "mainpll_d7_d4", + "osc_d8" +}; + +static const char * const camtm_parents[] = { + "clk26m", + "osc_d2", + "univpll_d6_d2", + "univpll_d6_d4" +}; + +static const char * const dsi_occ_parents[] = { + "clk26m", + "univpll_d6_d2", + "univpll_d5_d2", + "univpll_d4_d2" +}; + +static const char * const dxcc_parents[] = { + "clk26m", + "mainpll_d4_d8", + "mainpll_d4_d4", + "mainpll_d4_d2" +}; + +static const char * const i2c_parents[] = { + "clk26m", + "mainpll_d4_d8", + "univpll_d5_d4", + "mainpll_d4_d4" +}; + +static const char * const mcupm_parents[] = { + "clk26m", + "univpll_d6_d2", + "mainpll_d5_d2", + "mainpll_d6_d2" +}; + +static const char * const mfg_ref_parents[] = { + "clk26m", + "mainpll_d6_d2", + "mainpll_d6", + "mainpll_d5_d2" +}; + +static const char * const msdc30_h_parents[] = { + "clk26m", + "msdcpll_d2", + "mainpll_d4_d4", + "mainpll_d6_d4" +}; + +static const char * const msdc_macro_p_parents[] = { + "clk26m", + "msdcpll", + "mmpll_d5_d4", + "univpll_d4_d2" +}; + +static const char * const snps_eth_62p4m_ptp_parents[] = { + "clk26m", + "ethpll_d8", + "apll1_d3", + "apll2_d3" +}; + +static const char * const ufs_mbist_parents[] = { + "clk26m", + "mainpll_d4_d2", + "univpll_d4_d2", + "ufspll_d2" +}; + +static const char * const aes_msdcfde_parents[] = { + "clk26m", + "mainpll_d4_d2", + "mainpll_d6", + "mainpll_d4_d4", + "msdcpll" +}; + +static const char * const bus_aximem_parents[] = { + "clk26m", + "mainpll_d7_d2", + "mainpll_d5_d2", + "mainpll_d4_d2", + "mainpll_d6" +}; + +static const char * const dp_parents[] = { + "clk26m", + "tvdpll1_d16", + "tvdpll1_d8", + "tvdpll1_d4", + "tvdpll1_d2" +}; + +static const char * const msdc30_parents[] = { + "clk26m", + "univpll_d6_d2", + "mainpll_d6_d2", + "mainpll_d7_d2", + "msdcpll_d2" +}; + +static const char * const ecc_parents[] = { + "clk26m", + "univpll_d6_d2", + "univpll_d4_d2", + "univpll_d6", + "mainpll_d4", + "univpll_d4" +}; + +static const char * const emi_n_parents[] = { + "clk26m", + "osc_d2", + "mainpll_d9", + "mainpll_d6", + "mainpll_d5", + "emipll" +}; + +static const char * const sr_pka_parents[] = { + "clk26m", + "mainpll_d4_d4", + "mainpll_d4_d2", + "mainpll_d7", + "mainpll_d6", + "mainpll_d5" +}; + +static const char * const aes_ufsfde_parents[] = { + "clk26m", + "mainpll_d4", + "mainpll_d4_d2", + "mainpll_d6", + "mainpll_d4_d4", + "univpll_d4_d2", + "univpll_d6" +}; + +static const char * const axi_parents[] = { + "clk26m", + "mainpll_d4_d4", + "mainpll_d7_d2", + "mainpll_d4_d2", + "mainpll_d5_d2", + "mainpll_d6_d2", + "osc_d4" +}; + +static const char * const disp_pwm_parents[] = { + "clk26m", + "univpll_d6_d4", + "osc_d2", + "osc_d4", + "osc_d16", + "univpll_d5_d4", + "mainpll_d4_d4" +}; + +static const char * const edp_parents[] = { + "clk26m", + "tvdpll2_d16", + "tvdpll2_d8", + "tvdpll2_d4", + "tvdpll2_d2" +}; + +static const char * const gcpu_parents[] = { + "clk26m", + "mainpll_d6", + "mainpll_d4_d2", + "univpll_d4_d2", + "univpll_d5_d2", + "univpll_d5_d4", + "univpll_d6" +}; + +static const char * const msdc50_0_parents[] = { + "clk26m", + "msdcpll", + "msdcpll_d2", + "mainpll_d6_d2", + "mainpll_d4_d4", + "mainpll_d6", + "univpll_d4_d4" +}; + +static const char * const ufs_parents[] = { + "clk26m", + "mainpll_d4_d8", + "mainpll_d4_d4", + "mainpll_d5_d2", + "mainpll_d6_d2", + "univpll_d6_d2", + "msdcpll_d2" +}; + +static const char * const dsp_parents[] = { + "clk26m", + "osc_d4", + "osc_d3", + "osc_d2", + "univpll_d7_d2", + "univpll_d6_d2", + "mainpll_d6", + "univpll_d5" +}; + +static const char * const mem_sub_peri_u_parents[] = { + "clk26m", + "univpll_d4_d4", + "mainpll_d5_d2", + "mainpll_d4_d2", + "mainpll_d6", + "mainpll_d5", + "univpll_d5", + "mainpll_d4" +}; + +static const char * const seninf_parents[] = { + "clk26m", + "osc_d2", + "univpll_d6_d2", + "mainpll_d4_d2", + "univpll_d4_d2", + "mmpll_d7", + "univpll_d6", + "univpll_d5" +}; + +static const char * const sflash_parents[] = { + "clk26m", + "mainpll_d7_d8", + "univpll_d6_d8", + "mainpll_d7_d4", + "mainpll_d6_d4", + "univpll_d6_d4", + "univpll_d7_d3", + "univpll_d5_d4" +}; + +static const char * const spi_parents[] = { + "clk26m", + "univpll_d6_d2", + "univpll_192m", + "mainpll_d6_d2", + "univpll_d4_d4", + "mainpll_d4_d4", + "univpll_d5_d4", + "univpll_d6_d4" +}; + +static const char * const img1_parents[] = { + "clk26m", + "univpll_d4", + "mmpll_d5", + "mmpll_d6", + "univpll_d6", + "mmpll_d7", + "mmpll_d4_d2", + "univpll_d4_d2", + "mainpll_d4_d2", + "mmpll_d6_d2", + "mmpll_d5_d2" +}; + +static const char * const ipe_parents[] = { + "clk26m", + "univpll_d4", + "mainpll_d4", + "mmpll_d6", + "univpll_d6", + "mainpll_d6", + "mmpll_d4_d2", + "univpll_d4_d2", + "mainpll_d4_d2", + "mmpll_d6_d2", + "mmpll_d5_d2" +}; + +static const char * const mem_sub_parents[] = { + "clk26m", + "univpll_d4_d4", + "mainpll_d6_d2", + "mainpll_d5_d2", + "mainpll_d4_d2", + "mainpll_d6", + "mmpll_d7", + "mainpll_d5", + "univpll_d5", + "mainpll_d4", + "univpll_d4" +}; + +static const char * const cam_parents[] = { + "clk26m", + "mainpll_d4", + "mmpll_d4", + "univpll_d4", + "univpll_d5", + "mmpll_d7", + "mmpll_d6", + "univpll_d6", + "univpll_d4_d2", + "mmpll_d9", + "mainpll_d4_d2", + "osc_d2" +}; + +static const char * const mmsys_parents[] = { + "clk26m", + "mainpll_d5_d2", + "univpll_d5_d2", + "mainpll_d4_d2", + "univpll_d4_d2", + "mainpll_d6", + "univpll_d6", + "mmpll_d6", + "tvdpll1", + "tvdpll2", + "univpll_d4", + "mmpll_d4" +}; + +static const char * const mminfra_parents[] = { + "clk26m", + "osc_d2", + "mainpll_d5_d2", + "mmpll_d6_d2", + "mainpll_d4_d2", + "mmpll_d4_d2", + "mainpll_d6", + "mmpll_d7", + "univpll_d6", + "mainpll_d5", + "mmpll_d6", + "univpll_d5", + "mainpll_d4", + "univpll_d4", + "mmpll_d4", + "emipll" +}; + +static const char * const vdec_parents[] = { + "clk26m", + "univpll_192m_d2", + "univpll_d5_d4", + "mainpll_d5", + "mainpll_d5_d2", + "mmpll_d6_d2", + "univpll_d5_d2", + "mainpll_d4_d2", + "univpll_d4_d2", + "univpll_d7", + "mmpll_d7", + "mmpll_d6", + "univpll_d6", + "mainpll_d4", + "univpll_d4", + "mmpll_d5_d2" +}; + +static const char * const venc_parents[] = { + "clk26m", + "mmpll_d4_d2", + "mainpll_d6", + "univpll_d4_d2", + "mainpll_d4_d2", + "univpll_d6", + "mmpll_d6", + "mainpll_d5_d2", + "mainpll_d6_d2", + "mmpll_d9", + "mmpll_d4", + "mainpll_d4", + "univpll_d4", + "univpll_d5", + "univpll_d5_d2", + "mainpll_d5" +}; + +static const struct mtk_mux top_muxes[] = { + /* CLK_CFG_0 */ + MUX_CLR_SET_UPD(CLK_TOP_AXI_SEL, "axi_sel", + axi_parents, 0x010, 0x014, 0x018, 0, 3, 0x04, 0), + MUX_CLR_SET_UPD(CLK_TOP_AXI_PERI_SEL, "axi_peri_sel", + axi_peri_parents, 0x010, 0x014, 0x018, + 8, 2, 0x04, 1), + MUX_CLR_SET_UPD(CLK_TOP_AXI_U_SEL, "axi_u_sel", + axi_u_parents, 0x010, 0x014, 0x018, + 16, 2, 0x04, 2), + MUX_CLR_SET_UPD(CLK_TOP_BUS_AXIMEM_SEL, "bus_aximem_sel", + bus_aximem_parents, 0x010, 0x014, 0x018, + 24, 3, 0x04, 3), + /* CLK_CFG_1 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP0_SEL, "disp0_sel", + mmsys_parents, 0x020, 0x024, 0x028, + 0, 4, 7, 0x04, 4), + MUX_CLR_SET_UPD(CLK_TOP_MMINFRA_SEL, "mminfra_sel", + mminfra_parents, 0x020, 0x024, 0x028, + 8, 4, 0x04, 5), + MUX_GATE_CLR_SET_UPD(CLK_TOP_UART_SEL, "uart_sel", + uart_parents, 0x020, 0x024, 0x028, + 16, 1, 23, 0x04, 6), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI0_SEL, "spi0_sel", + spi_parents, 0x020, 0x024, 0x028, + 24, 3, 31, 0x04, 7), + /* CLK_CFG_2 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI1_SEL, "spi1_sel", + spi_parents, 0x030, 0x034, 0x038, + 0, 3, 7, 0x04, 8), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI2_SEL, "spi2_sel", + spi_parents, 0x030, 0x034, 0x038, + 8, 3, 15, 0x04, 9), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI3_SEL, "spi3_sel", + spi_parents, 0x030, 0x034, 0x038, + 16, 3, 23, 0x04, 10), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI4_SEL, "spi4_sel", + spi_parents, 0x030, 0x034, 0x038, + 24, 3, 31, 0x04, 11), + /* CLK_CFG_3 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_SPI5_SEL, "spi5_sel", + spi_parents, 0x040, 0x044, 0x048, + 0, 3, 7, 0x04, 12), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC_MACRO_0P_SEL, "msdc_macro_0p_sel", + msdc_macro_p_parents, 0x040, 0x044, 0x048, + 8, 2, 15, 0x04, 13), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_HCLK_SEL, "msdc5hclk_sel", + msdc5hclk_parents, 0x040, 0x044, 0x048, + 16, 2, 23, 0x04, 14), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC50_0_SEL, "msdc50_0_sel", + msdc50_0_parents, 0x040, 0x044, 0x048, + 24, 3, 31, 0x04, 15), + /* CLK_CFG_4 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_MSDCFDE_SEL, "aes_msdcfde_sel", + aes_msdcfde_parents, 0x050, 0x054, 0x058, + 0, 3, 7, 0x04, 16), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC_MACRO_1P_SEL, "msdc_macro_1p_sel", + msdc_macro_p_parents, 0x050, 0x054, 0x058, + 8, 2, 15, 0x04, 17), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_1_SEL, "msdc30_1_sel", + msdc30_parents, 0x050, 0x054, 0x058, + 16, 3, 23, 0x04, 18), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_1_HCLK_SEL, "msdc30_1_h_sel", + msdc30_h_parents, 0x050, 0x054, 0x058, + 24, 2, 31, 0x04, 19), + /* CLK_CFG_5 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC_MACRO_2P_SEL, "msdc_macro_2p_sel", + msdc_macro_p_parents, 0x060, 0x064, 0x068, + 0, 2, 7, 0x04, 20), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_2_SEL, "msdc30_2_sel", + msdc30_parents, 0x060, 0x064, 0x068, + 8, 3, 15, 0x04, 21), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MSDC30_2_HCLK_SEL, "msdc30_2_h_sel", + msdc30_h_parents, 0x060, 0x064, 0x068, + 16, 2, 23, 0x04, 22), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_INTBUS_SEL, "aud_intbus_sel", + aud_intbus_parents, 0x060, 0x064, 0x068, + 24, 2, 31, 0x04, 23), + /* CLK_CFG_6 */ + MUX_CLR_SET_UPD(CLK_TOP_ATB_SEL, "atb_sel", + atb_parents, 0x070, 0x074, 0x078, 0, 2, 0x04, 24), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DISP_PWM_SEL, "disp_pwm_sel", + disp_pwm_parents, 0x070, 0x074, 0x078, + 8, 3, 15, 0x04, 25), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_P0_SEL, "usb_p0_sel", + usb_parents, 0x070, 0x074, 0x078, + 16, 2, 23, 0x04, 26), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_XHCI_P0_SEL, "ssusb_xhci_p0_sel", + usb_parents, 0x070, 0x074, 0x078, + 24, 2, 31, 0x04, 27), + /* CLK_CFG_7 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_P1_SEL, "usb_p1_sel", + usb_parents, 0x080, 0x084, 0x088, + 0, 2, 7, 0x04, 28), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_XHCI_P1_SEL, "ssusb_xhci_p1_sel", + usb_parents, 0x080, 0x084, 0x088, + 8, 2, 15, 0x04, 29), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_P2_SEL, "usb_p2_sel", + usb_parents, 0x080, 0x084, 0x088, + 16, 2, 23, 0x04, 30), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_XHCI_P2_SEL, "ssusb_xhci_p2_sel", + usb_parents, 0x080, 0x084, 0x088, + 24, 2, 31, 0x08, 0), + /* CLK_CFG_8 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_P3_SEL, "usb_p3_sel", + usb_parents, 0x090, 0x094, 0x098, + 0, 2, 7, 0x08, 1), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_XHCI_P3_SEL, "ssusb_xhci_p3_sel", + usb_parents, 0x090, 0x094, 0x098, + 8, 2, 15, 0x08, 2), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_TOP_P4_SEL, "usb_p4_sel", + usb_parents, 0x090, 0x094, 0x098, + 16, 2, 23, 0x08, 3), + MUX_GATE_CLR_SET_UPD(CLK_TOP_USB_XHCI_P4_SEL, "ssusb_xhci_p4_sel", + usb_parents, 0x090, 0x094, 0x098, + 24, 2, 31, 0x08, 4), + /* CLK_CFG_9 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_I2C_SEL, "i2c_sel", + i2c_parents, 0x0a0, 0x0a4, 0x0a8, + 0, 2, 7, 0x08, 5), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF_SEL, "seninf_sel", + seninf_parents, 0x0a0, 0x0a4, 0x0a8, + 8, 3, 15, 0x08, 6), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SENINF1_SEL, "seninf1_sel", + seninf_parents, 0x0a0, 0x0a4, 0x0a8, + 16, 3, 23, 0x08, 7), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN1_SEL, "aud_engen1_sel", + aud_engen1_parents, 0x0a0, 0x0a4, 0x0a8, + 24, 2, 31, 0x08, 8), + /* CLK_CFG_10 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_ENGEN2_SEL, "aud_engen2_sel", + aud_engen2_parents, 0x0b0, 0x0b4, 0x0b8, + 0, 2, 7, 0x08, 9), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AES_UFSFDE_SEL, "aes_ufsfde_sel", + aes_ufsfde_parents, 0x0b0, 0x0b4, 0x0b8, + 8, 3, 15, 0x08, 10), + MUX_CLR_SET_UPD(CLK_TOP_U_SEL, "ufs_sel", + ufs_parents, 0x0b0, 0x0b4, 0x0b8, + 16, 3, 0x08, 11), + MUX_GATE_CLR_SET_UPD(CLK_TOP_U_MBIST_SEL, "ufs_mbist_sel", + ufs_mbist_parents, 0x0b0, 0x0b4, 0x0b8, + 24, 2, 31, 0x08, 12), + /* CLK_CFG_11 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_1_SEL, "aud_1_sel", + aud_1_parents, 0x0c0, 0x0c4, 0x0c8, + 0, 1, 7, 0x08, 13), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUD_2_SEL, "aud_2_sel", + aud_2_parents, 0x0c0, 0x0c4, 0x0c8, + 8, 1, 15, 0x08, 14), + MUX_GATE_CLR_SET_UPD(CLK_TOP_VENC_SEL, "venc_sel", + venc_parents, 0x0c0, 0x0c4, 0x0c8, + 16, 4, 23, 0x08, 15), + MUX_GATE_CLR_SET_UPD(CLK_TOP_VDEC_SEL, "vdec_sel", + vdec_parents, 0x0c0, 0x0c4, 0x0c8, + 24, 4, 31, 0x08, 16), + /* CLK_CFG_12 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_PWM_SEL, "pwm_sel", + pwm_parents, 0x0d0, 0x0d4, 0x0d8, + 0, 1, 7, 0x08, 17), + MUX_GATE_CLR_SET_UPD(CLK_TOP_AUDIO_H_SEL, "audio_h_sel", + audio_h_parents, 0x0d0, 0x0d4, 0x0d8, + 8, 2, 15, 0x08, 18), + MUX_CLR_SET_UPD(CLK_TOP_MCUPM_SEL, "mcupm_sel", + mcupm_parents, 0x0d0, 0x0d4, 0x0d8, + 16, 2, 0x08, 19), + MUX_CLR_SET_UPD(CLK_TOP_MEM_SUB_SEL, "mem_sub_sel", + mem_sub_parents, 0x0d0, 0x0d4, 0x0d8, + 24, 4, 0x08, 20), + /* CLK_CFG_13 */ + MUX_CLR_SET_UPD(CLK_TOP_MEM_SUB_PERI_SEL, "mem_sub_peri_sel", + mem_sub_peri_u_parents, 0x0e0, 0x0e4, 0x0e8, + 0, 3, 0x08, 21), + MUX_CLR_SET_UPD(CLK_TOP_MEM_SUB_U_SEL, "mem_sub_u_sel", + mem_sub_peri_u_parents, 0x0e0, 0x0e4, 0x0e8, + 8, 3, 0x08, 22), + MUX_CLR_SET_UPD(CLK_TOP_EMI_N_SEL, "emi_n_sel", + emi_n_parents, 0x0e0, 0x0e4, 0x0e8, + 16, 3, 0x08, 23), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DSI_OCC_SEL, "dsi_occ_sel", + dsi_occ_parents, 0x0e0, 0x0e4, 0x0e8, + 24, 2, 31, 0x08, 24), + /* CLK_CFG_14 */ + MUX_CLR_SET_UPD(CLK_TOP_AP2CONN_HOST_SEL, "ap2conn_host_sel", + ap2conn_host_parents, 0x0f0, 0x0f4, 0x0f8, + 0, 1, 0x08, 25), + MUX_GATE_CLR_SET_UPD(CLK_TOP_IMG1_SEL, "img1_sel", + img1_parents, 0x0f0, 0x0f4, 0x0f8, + 8, 4, 15, 0x08, 26), + MUX_GATE_CLR_SET_UPD(CLK_TOP_IPE_SEL, "ipe_sel", + ipe_parents, 0x0f0, 0x0f4, 0x0f8, + 16, 4, 23, 0x08, 27), + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAM_SEL, "cam_sel", + cam_parents, 0x0f0, 0x0f4, 0x0f8, + 24, 4, 31, 0x08, 28), + /* CLK_CFG_15 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_CAMTM_SEL, "camtm_sel", + camtm_parents, 0x100, 0x104, 0x108, + 0, 2, 7, 0x08, 29), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DSP_SEL, "dsp_sel", + dsp_parents, 0x100, 0x104, 0x108, + 8, 3, 15, 0x08, 30), + MUX_GATE_CLR_SET_UPD(CLK_TOP_SR_PKA_SEL, "sr_pka_sel", + sr_pka_parents, 0x100, 0x104, 0x108, + 16, 3, 23, 0x0c, 0), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DXCC_SEL, "dxcc_sel", + dxcc_parents, 0x100, 0x104, 0x108, + 24, 2, 31, 0x0c, 1), + /* CLK_CFG_16 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_MFG_REF_SEL, "mfg_ref_sel", + mfg_ref_parents, 0x110, 0x114, 0x118, + 0, 2, 7, 0x0c, 2), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MDP0_SEL, "mdp0_sel", + mmsys_parents, 0x110, 0x114, 0x118, + 8, 4, 15, 0x0c, 3), + MUX_GATE_CLR_SET_UPD(CLK_TOP_DP_SEL, "dp_sel", + dp_parents, 0x110, 0x114, 0x118, + 16, 3, 23, 0x0c, 4), + MUX_CLR_SET_UPD(CLK_TOP_EDP_SEL, "edp_sel", + edp_parents, 0x110, 0x114, 0x118, + 24, 3, 0x0c, 5), + /* CLK_CFG_17 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_EDP_FAVT_SEL, "edp_favt_sel", + edp_parents, 0x180, 0x184, 0x188, + 0, 3, 7, 0x0c, 6), + MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_250M_SEL, "snps_eth_250m_sel", + snps_eth_250m_parents, 0x180, 0x184, 0x188, + 8, 1, 15, 0x0c, 7), + MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_62P4M_PTP_SEL, + "snps_eth_62p4m_ptp_sel", + snps_eth_62p4m_ptp_parents, + 0x180, 0x184, 0x188, 16, 2, 23, 0x0c, 8), + MUX_GATE_CLR_SET_UPD(CLK_TOP_ETH_50M_RMII_SEL, + "snps_eth_50m_rmii_sel", + snps_eth_50m_rmii_parents, + 0x180, 0x184, 0x188, 24, 1, 31, 0x0c, 9), + /* CLK_CFG_18 */ + MUX_CLR_SET_UPD(CLK_TOP_SFLASH_SEL, "sflash_sel", + sflash_parents, 0x190, 0x194, 0x198, + 0, 3, 0x0c, 10), + MUX_GATE_CLR_SET_UPD(CLK_TOP_GCPU_SEL, "gcpu_sel", + gcpu_parents, 0x190, 0x194, 0x198, + 8, 3, 15, 0x0c, 11), + MUX_GATE_CLR_SET_UPD(CLK_TOP_MAC_TL_SEL, "pcie_mac_tl_sel", + pcie_mac_tl_parents, 0x190, 0x194, 0x198, + 16, 2, 23, 0x0c, 12), + MUX_GATE_CLR_SET_UPD(CLK_TOP_VDSTX_DG_CTS_SEL, "vdstx_dg_cts_sel", + vdstx_dg_cts_parents, 0x190, 0x194, 0x198, + 24, 2, 31, 0x0c, 13), + /* CLK_CFG_19 */ + MUX_GATE_CLR_SET_UPD(CLK_TOP_PLL_DPIX_SEL, "pll_dpix_sel", + pll_dpix_parents, 0x240, 0x244, 0x248, + 0, 2, 7, 0x0c, 14), + MUX_GATE_CLR_SET_UPD(CLK_TOP_ECC_SEL, "ecc_sel", + ecc_parents, 0x240, 0x244, 0x248, + 8, 3, 15, 0x0c, 15), + /* CLK_MISC_CFG_3 */ + GATE_CLR_SET_UPD_FLAGS(CLK_TOP_MFG_SEL_MFGPLL, "mfg_sel_mfgpll", + mfg_sel_mfgpll_parents, + 0x510, 0x514, 0x0518, 16, 1, 0, -1, -1, + CLK_SET_RATE_PARENT | CLK_SET_RATE_NO_REPARENT, + mtk_mux_clr_set_upd_ops) +}; + +static const struct mtk_composite top_composites[] = { + /* CLK_AUDDIV_0 */ + MUX(CLK_TOP_APLL_I2SIN0_MCK_SEL, "apll_i2sin0_m_sel", + apll_m_parents, 0x0320, 16, 1), + MUX(CLK_TOP_APLL_I2SIN1_MCK_SEL, "apll_i2sin1_m_sel", + apll_m_parents, 0x0320, 17, 1), + MUX(CLK_TOP_APLL_I2SIN2_MCK_SEL, "apll_i2sin2_m_sel", + apll_m_parents, 0x0320, 18, 1), + MUX(CLK_TOP_APLL_I2SIN3_MCK_SEL, "apll_i2sin3_m_sel", + apll_m_parents, 0x0320, 19, 1), + MUX(CLK_TOP_APLL_I2SIN4_MCK_SEL, "apll_i2sin4_m_sel", + apll_m_parents, 0x0320, 20, 1), + MUX(CLK_TOP_APLL_I2SIN6_MCK_SEL, "apll_i2sin6_m_sel", + apll_m_parents, 0x0320, 21, 1), + MUX(CLK_TOP_APLL_I2SOUT0_MCK_SEL, "apll_i2sout0_m_sel", + apll_m_parents, 0x0320, 22, 1), + MUX(CLK_TOP_APLL_I2SOUT1_MCK_SEL, "apll_i2sout1_m_sel", + apll_m_parents, 0x0320, 23, 1), + MUX(CLK_TOP_APLL_I2SOUT2_MCK_SEL, "apll_i2sout2_m_sel", + apll_m_parents, 0x0320, 24, 1), + MUX(CLK_TOP_APLL_I2SOUT3_MCK_SEL, "apll_i2sout3_m_sel", + apll_m_parents, 0x0320, 25, 1), + MUX(CLK_TOP_APLL_I2SOUT4_MCK_SEL, "apll_i2sout4_m_sel", + apll_m_parents, 0x0320, 26, 1), + MUX(CLK_TOP_APLL_I2SOUT6_MCK_SEL, "apll_i2sout6_m_sel", + apll_m_parents, 0x0320, 27, 1), + MUX(CLK_TOP_APLL_FMI2S_MCK_SEL, "apll_fmi2s_m_sel", + apll_m_parents, 0x0320, 28, 1), + MUX(CLK_TOP_APLL_TDMOUT_MCK_SEL, "apll_tdmout_m_sel", + apll_m_parents, 0x0320, 29, 1), + /* CLK_AUDDIV_2 */ + DIV_GATE(CLK_TOP_APLL12_CK_DIV_I2SIN0, "apll12_div_i2sin0", + "apll_i2sin0_m_sel", 0x0320, 0, 0x0328, 8, 0), + DIV_GATE(CLK_TOP_APLL12_CK_DIV_I2SIN1, "apll12_div_i2sin1", + "apll_i2sin1_m_sel", 0x0320, 1, 0x0328, 8, 8), + /* CLK_AUDDIV_3 */ + DIV_GATE(CLK_TOP_APLL12_CK_DIV_I2SOUT0, "apll12_div_i2sout0", + "apll_i2sout0_m_sel", 0x0320, 6, 0x0334, 8, 16), + DIV_GATE(CLK_TOP_APLL12_CK_DIV_I2SOUT1, "apll12_div_i2sout1", + "apll_i2sout1_m_sel", 0x0320, 7, 0x0334, 8, 24), + /* CLK_AUDDIV_5 */ + DIV_GATE(CLK_TOP_APLL12_CK_DIV_FMI2S, "apll12_div_fmi2s", + "apll_fmi2s_m_sel", 0x0320, 12, 0x033c, 8, 0), + DIV_GATE(CLK_TOP_APLL12_CK_DIV_TDMOUT_M, "apll12_div_tdmout_m", + "apll_tdmout_m_sel", 0x0320, 13, 0x033c, 8, 8), + DIV_GATE(CLK_TOP_APLL12_CK_DIV_TDMOUT_B, "apll12_div_tdmout_b", + "apll12_div_tdmout_m", 0x0320, 14, 0x033c, 8, 16), +}; + +static const struct mtk_gate_regs top_cg_regs = { + .set_ofs = 0x514, + .clr_ofs = 0x518, + .sta_ofs = 0x510, +}; + +#define GATE_TOP_FLAGS(_id, _name, _parent, _shift, _flag) { \ + .id = _id, \ + .name = _name, \ + .parent_name = _parent, \ + .regs = &top_cg_regs, \ + .shift = _shift, \ + .flags = _flag, \ + .ops = &mtk_clk_gate_ops_setclr_inv, \ + } + +#define GATE_TOP(_id, _name, _parent, _shift) \ + GATE_TOP_FLAGS(_id, _name, _parent, _shift, 0) + +static const struct mtk_gate top_clks[] = { + GATE_TOP_FLAGS(CLK_TOP_FMCNT_P0_EN, "fmcnt_p0_en", "univpll_192m_d4", 0, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_FMCNT_P1_EN, "fmcnt_p1_en", "univpll_192m_d4", 1, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_FMCNT_P2_EN, "fmcnt_p2_en", "univpll_192m_d4", 2, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_FMCNT_P3_EN, "fmcnt_p3_en", "univpll_192m_d4", 3, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_FMCNT_P4_EN, "fmcnt_p4_en", "univpll_192m_d4", 4, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_USB_F26M_CK_EN, "ssusb_f26m", "clk26m", 5, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_SSPXTP_F26M_CK_EN, "sspxtp_f26m", "clk26m", 6, CLK_IS_CRITICAL), + GATE_TOP(CLK_TOP_USB2_PHY_RF_P0_EN, "usb2_phy_rf_p0_en", "clk26m", 7), + GATE_TOP(CLK_TOP_USB2_PHY_RF_P1_EN, "usb2_phy_rf_p1_en", "clk26m", 10), + GATE_TOP(CLK_TOP_USB2_PHY_RF_P2_EN, "usb2_phy_rf_p2_en", "clk26m", 11), + GATE_TOP(CLK_TOP_USB2_PHY_RF_P3_EN, "usb2_phy_rf_p3_en", "clk26m", 12), + GATE_TOP(CLK_TOP_USB2_PHY_RF_P4_EN, "usb2_phy_rf_p4_en", "clk26m", 13), + GATE_TOP_FLAGS(CLK_TOP_USB2_26M_CK_P0_EN, "usb2_26m_p0_en", "clk26m", 14, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_USB2_26M_CK_P1_EN, "usb2_26m_p1_en", "clk26m", 15, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_USB2_26M_CK_P2_EN, "usb2_26m_p2_en", "clk26m", 18, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_USB2_26M_CK_P3_EN, "usb2_26m_p3_en", "clk26m", 19, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_USB2_26M_CK_P4_EN, "usb2_26m_p4_en", "clk26m", 20, CLK_IS_CRITICAL), + GATE_TOP(CLK_TOP_F26M_CK_EN, "pcie_f26m", "clk26m", 21), + GATE_TOP_FLAGS(CLK_TOP_AP2CON_EN, "ap2con", "clk26m", 24, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_EINT_N_EN, "eint_n", "clk26m", 25, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_TOPCKGEN_FMIPI_CSI_UP26M_CK_EN, + "TOPCKGEN_fmipi_csi_up26m", "osc_d10", 26, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_EINT_E_EN, "eint_e", "clk26m", 28, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_EINT_W_EN, "eint_w", "clk26m", 30, CLK_IS_CRITICAL), + GATE_TOP_FLAGS(CLK_TOP_EINT_S_EN, "eint_s", "clk26m", 31, CLK_IS_CRITICAL), +}; + +/* Register mux notifier for MFG mux */ +static int clk_mt8189_reg_mfg_mux_notifier(struct device *dev, + struct clk *clk) +{ + struct mtk_mux_nb *mfg_mux_nb; + + mfg_mux_nb = devm_kzalloc(dev, sizeof(*mfg_mux_nb), GFP_KERNEL); + if (!mfg_mux_nb) + return -ENOMEM; + + mfg_mux_nb->ops = &mtk_mux_clr_set_upd_ops; + mfg_mux_nb->bypass_index = 0; /* Bypass to CLK_TOP_MFG_REF_SEL */ + + return devm_mtk_clk_mux_notifier_register(dev, clk, mfg_mux_nb); +} + +static const struct mtk_clk_desc topck_desc = { + .factor_clks = top_divs, + .num_factor_clks = ARRAY_SIZE(top_divs), + .mux_clks = top_muxes, + .num_mux_clks = ARRAY_SIZE(top_muxes), + .composite_clks = top_composites, + .num_composite_clks = ARRAY_SIZE(top_composites), + .clks = top_clks, + .num_clks = ARRAY_SIZE(top_clks), + .clk_notifier_func = clk_mt8189_reg_mfg_mux_notifier, + .mfg_clk_idx = CLK_TOP_MFG_SEL_MFGPLL, + .clk_lock = &mt8189_clk_lock, +}; + +static const struct of_device_id of_match_clk_mt8189_topck[] = { + { .compatible = "mediatek,mt8189-topckgen", .data = &topck_desc }, + { /* sentinel */ } +}; + +static struct platform_driver clk_mt8189_topck_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-topck", + .of_match_table = of_match_clk_mt8189_topck, + }, +}; + +module_platform_driver(clk_mt8189_topck_drv); +MODULE_DESCRIPTION("MediaTek MT8189 topckgen clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:10 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:10 +0800 Subject: [PATCH v5 03/18] clk: mediatek: Add MT8189 apmixedsys clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-4-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 apmixedsys clock controller, which provides PLLs generated from SoC 26m. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 13 ++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-apmixedsys.c | 192 +++++++++++++++++++ 3 files changed, 206 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-apmixedsys.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 2c09fd729bab..80813d7e02af 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -815,6 +815,19 @@ config COMMON_CLK_MT8188_WPESYS help This driver supports MediaTek MT8188 Warp Engine clocks. +config COMMON_CLK_MT8189 + bool "Clock driver for MediaTek MT8189" + depends on ARM64 || COMPILE_TEST + select COMMON_CLK_MEDIATEK + select COMMON_CLK_MEDIATEK_FHCTL + default ARCH_MEDIATEK + help + Enable this option to support the clock management for MediaTek MT8189 SoC. This + includes handling of all primary clock functions and features specific to the MT8189 + platform. Enabling this driver ensures that the system's clock functionality aligns + with the MediaTek MT8189 hardware capabilities, providing efficient management of + clock speeds and power consumption. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index d8736a060dbd..66577ccb9b93 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -123,6 +123,7 @@ obj-$(CONFIG_COMMON_CLK_MT8188_VDOSYS) += clk-mt8188-vdo0.o clk-mt8188-vdo1.o obj-$(CONFIG_COMMON_CLK_MT8188_VENCSYS) += clk-mt8188-venc.o obj-$(CONFIG_COMMON_CLK_MT8188_VPPSYS) += clk-mt8188-vpp0.o clk-mt8188-vpp1.o obj-$(CONFIG_COMMON_CLK_MT8188_WPESYS) += clk-mt8188-wpe.o +obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-apmixedsys.c b/drivers/clk/mediatek/clk-mt8189-apmixedsys.c new file mode 100644 index 000000000000..9c91b7fed87e --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-apmixedsys.c @@ -0,0 +1,192 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "clk-fhctl.h" +#include "clk-mtk.h" +#include "clk-pll.h" + +#include + +#define MT8189_PLL_FMAX (3800UL * MHZ) +#define MT8189_PLL_FMIN (1500UL * MHZ) +#define MT8189_PLLEN_OFS 0x70 +#define MT8189_INTEGER_BITS 8 + +#define PLL_SETCLR(_id, _name, _reg, _en_setclr_bit, \ + _rstb_setclr_bit, _flags, _pd_reg, \ + _pd_shift, _tuner_reg, _tuner_en_reg, \ + _tuner_en_bit, _pcw_reg, _pcw_shift, \ + _pcwbits) { \ + .id = _id, \ + .name = _name, \ + .en_reg = MT8189_PLLEN_OFS, \ + .reg = _reg, \ + .pll_en_bit = _en_setclr_bit, \ + .rst_bar_mask = BIT(_rstb_setclr_bit), \ + .flags = _flags, \ + .fmax = MT8189_PLL_FMAX, \ + .fmin = MT8189_PLL_FMIN, \ + .pd_reg = _pd_reg, \ + .pd_shift = _pd_shift, \ + .tuner_reg = _tuner_reg, \ + .tuner_en_reg = _tuner_en_reg, \ + .tuner_en_bit = _tuner_en_bit, \ + .pcw_reg = _pcw_reg, \ + .pcw_shift = _pcw_shift, \ + .pcwbits = _pcwbits, \ + .pcwibits = MT8189_INTEGER_BITS, \ + } + +static const struct mtk_pll_data apmixed_plls[] = { + PLL_SETCLR(CLK_APMIXED_ARMPLL_LL, "armpll-ll", 0x204, 18, + 0, PLL_AO, 0x208, 24, 0, 0, 0, 0x208, 0, 22), + PLL_SETCLR(CLK_APMIXED_ARMPLL_BL, "armpll-bl", 0x214, 17, + 0, PLL_AO, 0x218, 24, 0, 0, 0, 0x218, 0, 22), + PLL_SETCLR(CLK_APMIXED_CCIPLL, "ccipll", 0x224, 16, + 0, PLL_AO, 0x228, 24, 0, 0, 0, 0x228, 0, 22), + PLL_SETCLR(CLK_APMIXED_MAINPLL, "mainpll", 0x304, 15, + 23, HAVE_RST_BAR | PLL_AO, + 0x308, 24, 0, 0, 0, 0x308, 0, 22), + PLL_SETCLR(CLK_APMIXED_UNIVPLL, "univpll", 0x314, 14, + 23, HAVE_RST_BAR, 0x318, 24, 0, 0, 0, 0x318, 0, 22), + PLL_SETCLR(CLK_APMIXED_MMPLL, "mmpll", 0x324, 13, + 23, HAVE_RST_BAR, 0x328, 24, 0, 0, 0, 0x328, 0, 22), + PLL_SETCLR(CLK_APMIXED_MFGPLL, "mfgpll", 0x504, 7, + 0, 0, 0x508, 24, 0, 0, 0, 0x508, 0, 22), + PLL_SETCLR(CLK_APMIXED_APLL1, "apll1", 0x404, 11, + 0, 0, 0x408, 24, 0x040, 0x00c, 0, 0x40c, 0, 32), + PLL_SETCLR(CLK_APMIXED_APLL2, "apll2", 0x418, 10, + 0, 0, 0x41c, 24, 0x044, 0x00c, 1, 0x420, 0, 32), + PLL_SETCLR(CLK_APMIXED_EMIPLL, "emipll", 0x334, 12, + 0, PLL_AO, 0x338, 24, 0, 0, 0, 0x338, 0, 22), + PLL_SETCLR(CLK_APMIXED_APUPLL2, "apupll2", 0x614, 2, + 0, 0, 0x618, 24, 0, 0, 0, 0x618, 0, 22), + PLL_SETCLR(CLK_APMIXED_APUPLL, "apupll", 0x604, 3, + 0, 0, 0x608, 24, 0, 0, 0, 0x608, 0, 22), + PLL_SETCLR(CLK_APMIXED_TVDPLL1, "tvdpll1", 0x42c, 9, + 0, 0, 0x430, 24, 0, 0, 0, 0x430, 0, 22), + PLL_SETCLR(CLK_APMIXED_TVDPLL2, "tvdpll2", 0x43c, 8, + 0, 0, 0x440, 24, 0, 0, 0, 0x440, 0, 22), + PLL_SETCLR(CLK_APMIXED_ETHPLL, "ethpll", 0x514, 6, + 0, 0, 0x518, 24, 0, 0, 0, 0x518, 0, 22), + PLL_SETCLR(CLK_APMIXED_MSDCPLL, "msdcpll", 0x524, 5, + 0, 0, 0x528, 24, 0, 0, 0, 0x528, 0, 22), + PLL_SETCLR(CLK_APMIXED_UFSPLL, "ufspll", 0x534, 4, + 0, 0, 0x538, 24, 0, 0, 0, 0x538, 0, 22), +}; + +#define FH(_pllid, _fhid, _offset) { \ + .data = { \ + .pll_id = _pllid, \ + .fh_id = _fhid, \ + .fh_ver = FHCTL_PLLFH_V2, \ + .fhx_offset = _offset, \ + .dds_mask = GENMASK(21, 0), \ + .slope0_value = 0x6003c97, \ + .slope1_value = 0x6003c97, \ + .sfstrx_en = BIT(2), \ + .frddsx_en = BIT(1), \ + .fhctlx_en = BIT(0), \ + .tgl_org = BIT(31), \ + .dvfs_tri = BIT(31), \ + .pcwchg = BIT(31), \ + .dt_val = 0x0, \ + .df_val = 0x9, \ + .updnlmt_shft = 16, \ + .msk_frddsx_dys = GENMASK(23, 20), \ + .msk_frddsx_dts = GENMASK(19, 16), \ + }, \ + } + +static struct mtk_pllfh_data pllfhs[] = { + FH(CLK_APMIXED_ARMPLL_LL, 0, 0x003C), + FH(CLK_APMIXED_ARMPLL_BL, 1, 0x0050), + FH(CLK_APMIXED_CCIPLL, 2, 0x0064), + FH(CLK_APMIXED_MAINPLL, 3, 0x0078), + FH(CLK_APMIXED_MMPLL, 4, 0x008C), + FH(CLK_APMIXED_MFGPLL, 5, 0x00A0), + FH(CLK_APMIXED_EMIPLL, 6, 0x00B4), + FH(CLK_APMIXED_TVDPLL1, 7, 0x00C8), + FH(CLK_APMIXED_TVDPLL2, 8, 0x00DC), + FH(CLK_APMIXED_MSDCPLL, 9, 0x00F0), + FH(CLK_APMIXED_UFSPLL, 10, 0x0104), + FH(CLK_APMIXED_APUPLL, 11, 0x0118), + FH(CLK_APMIXED_APUPLL2, 12, 0x012c), +}; + +static const struct of_device_id of_match_clk_mt8189_apmixed[] = { + { .compatible = "mediatek,mt8189-apmixedsys" }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_apmixed); + +static int clk_mt8189_apmixed_probe(struct platform_device *pdev) +{ + int r; + struct clk_hw_onecell_data *clk_data; + struct device_node *node = pdev->dev.of_node; + const u8 *fhctl_node = "mediatek,mt8189-fhctl"; + + clk_data = mtk_alloc_clk_data(ARRAY_SIZE(apmixed_plls)); + if (!clk_data) + return -ENOMEM; + + fhctl_parse_dt(fhctl_node, pllfhs, ARRAY_SIZE(pllfhs)); + + r = mtk_clk_register_pllfhs(&pdev->dev, apmixed_plls, ARRAY_SIZE(apmixed_plls), + pllfhs, ARRAY_SIZE(pllfhs), clk_data); + if (r) + goto free_apmixed_data; + + r = of_clk_add_hw_provider(node, of_clk_hw_onecell_get, clk_data); + if (r) + goto unregister_plls; + + platform_set_drvdata(pdev, clk_data); + + return 0; + +unregister_plls: + mtk_clk_unregister_plls(apmixed_plls, ARRAY_SIZE(apmixed_plls), + clk_data); +free_apmixed_data: + mtk_free_clk_data(clk_data); + return r; +} + +static void clk_mt8189_apmixed_remove(struct platform_device *pdev) +{ + struct device_node *node = pdev->dev.of_node; + struct clk_hw_onecell_data *clk_data = platform_get_drvdata(pdev); + + of_clk_del_provider(node); + mtk_clk_unregister_pllfhs(apmixed_plls, ARRAY_SIZE(apmixed_plls), pllfhs, + ARRAY_SIZE(pllfhs), clk_data); + mtk_free_clk_data(clk_data); +} + +static struct platform_driver clk_mt8189_apmixed_drv = { + .probe = clk_mt8189_apmixed_probe, + .remove = clk_mt8189_apmixed_remove, + .driver = { + .name = "clk-mt8189-apmixed", + .of_match_table = of_match_clk_mt8189_apmixed, + }, +}; + +module_platform_driver(clk_mt8189_apmixed_drv); +MODULE_DESCRIPTION("MediaTek MT8189 apmixed clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:20 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:20 +0800 Subject: [PATCH v5 13/18] clk: mediatek: Add MT8189 mdp clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-14-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 mdp clock controller, which provides clock gate control for display system. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 12 ++++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-mdpsys.c | 91 ++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-mdpsys.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index e6c5d8a69607..bd50e18e48f4 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -894,6 +894,18 @@ config COMMON_CLK_MT8189_IMG are building a kernel for a device that uses the MT8189 SoC and requires image processing capabilities, say Y or M to include this driver. +config COMMON_CLK_MT8189_MDPSYS + tristate "Clock driver for MediaTek MT8189 mdpsys" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + This driver supports the display system clocks on the MediaTek MT8189 + SoC. By enabling this option, it allows for the control of the clocks + related to the display subsystem. This is crucial for the proper + functionality of the display features on devices powered by the MT8189 + chipset, ensuring that the display system operates efficiently and + effectively. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index a1eaf123f2f0..9b23e4c5e019 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -131,6 +131,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189_DBGAO) += clk-mt8189-dbgao.o obj-$(CONFIG_COMMON_CLK_MT8189_DVFSRC) += clk-mt8189-dvfsrc.o obj-$(CONFIG_COMMON_CLK_MT8189_IIC) += clk-mt8189-iic.o obj-$(CONFIG_COMMON_CLK_MT8189_IMG) += clk-mt8189-img.o +obj-$(CONFIG_COMMON_CLK_MT8189_MDPSYS) += clk-mt8189-mdpsys.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-mdpsys.c b/drivers/clk/mediatek/clk-mt8189-mdpsys.c new file mode 100644 index 000000000000..282bfb77b47d --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-mdpsys.c @@ -0,0 +1,91 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs mdp0_cg_regs = { + .set_ofs = 0x04, + .clr_ofs = 0x08, + .sta_ofs = 0x00, +}; + +static const struct mtk_gate_regs mdp1_cg_regs = { + .set_ofs = 0x14, + .clr_ofs = 0x18, + .sta_ofs = 0x10, +}; + +#define GATE_MDP0(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &mdp0_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +#define GATE_MDP1(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &mdp1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +static const struct mtk_gate mdp_clks[] = { + /* MDP0 */ + GATE_MDP0(CLK_MDP_MUTEX0, "mdp_mutex0", "mdp0_sel", 0), + GATE_MDP0(CLK_MDP_APB_BUS, "mdp_apb_bus", "mdp0_sel", 1), + GATE_MDP0(CLK_MDP_SMI0, "mdp_smi0", "mdp0_sel", 2), + GATE_MDP0(CLK_MDP_RDMA0, "mdp_rdma0", "mdp0_sel", 3), + GATE_MDP0(CLK_MDP_RDMA2, "mdp_rdma2", "mdp0_sel", 4), + GATE_MDP0(CLK_MDP_HDR0, "mdp_hdr0", "mdp0_sel", 5), + GATE_MDP0(CLK_MDP_AAL0, "mdp_aal0", "mdp0_sel", 6), + GATE_MDP0(CLK_MDP_RSZ0, "mdp_rsz0", "mdp0_sel", 7), + GATE_MDP0(CLK_MDP_TDSHP0, "mdp_tdshp0", "mdp0_sel", 8), + GATE_MDP0(CLK_MDP_COLOR0, "mdp_color0", "mdp0_sel", 9), + GATE_MDP0(CLK_MDP_WROT0, "mdp_wrot0", "mdp0_sel", 10), + GATE_MDP0(CLK_MDP_FAKE_ENG0, "mdp_fake_eng0", "mdp0_sel", 11), + GATE_MDP0(CLK_MDPSYS_CONFIG, "mdpsys_config", "mdp0_sel", 14), + GATE_MDP0(CLK_MDP_RDMA1, "mdp_rdma1", "mdp0_sel", 15), + GATE_MDP0(CLK_MDP_RDMA3, "mdp_rdma3", "mdp0_sel", 16), + GATE_MDP0(CLK_MDP_HDR1, "mdp_hdr1", "mdp0_sel", 17), + GATE_MDP0(CLK_MDP_AAL1, "mdp_aal1", "mdp0_sel", 18), + GATE_MDP0(CLK_MDP_RSZ1, "mdp_rsz1", "mdp0_sel", 19), + GATE_MDP0(CLK_MDP_TDSHP1, "mdp_tdshp1", "mdp0_sel", 20), + GATE_MDP0(CLK_MDP_COLOR1, "mdp_color1", "mdp0_sel", 21), + GATE_MDP0(CLK_MDP_WROT1, "mdp_wrot1", "mdp0_sel", 22), + GATE_MDP0(CLK_MDP_RSZ2, "mdp_rsz2", "mdp0_sel", 24), + GATE_MDP0(CLK_MDP_WROT2, "mdp_wrot2", "mdp0_sel", 25), + GATE_MDP0(CLK_MDP_RSZ3, "mdp_rsz3", "mdp0_sel", 28), + GATE_MDP0(CLK_MDP_WROT3, "mdp_wrot3", "mdp0_sel", 29), + /* MDP1 */ + GATE_MDP1(CLK_MDP_BIRSZ0, "mdp_birsz0", "mdp0_sel", 3), + GATE_MDP1(CLK_MDP_BIRSZ1, "mdp_birsz1", "mdp0_sel", 4), +}; + +static const struct mtk_clk_desc mdp_mcd = { + .clks = mdp_clks, + .num_clks = ARRAY_SIZE(mdp_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_mdpsys[] = { + { .compatible = "mediatek,mt8189-mdpsys", .data = &mdp_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_mdpsys); + +static struct platform_driver clk_mt8189_mdpsys_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-mdpsys", + .of_match_table = of_match_clk_mt8189_mdpsys, + }, +}; + +module_platform_driver(clk_mt8189_mdpsys_drv); +MODULE_DESCRIPTION("MediaTek MT8189 mdpsys clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:17 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:17 +0800 Subject: [PATCH v5 10/18] clk: mediatek: Add MT8189 dvfsrc clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-11-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 dvfsrc clock controller, which provides clock gate control for dram dvfs. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 10 +++++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-dvfsrc.c | 54 ++++++++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-dvfsrc.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 89f68cb56bb3..5def42855b62 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -860,6 +860,16 @@ config COMMON_CLK_MT8189_DBGAO vcore debug system clocks. If you want to control its clocks, say Y or M to include this driver in your kernel build. +config COMMON_CLK_MT8189_DVFSRC + tristate "Clock driver for MediaTek MT8189 dvfsrc" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this to support the clock management for the dvfsrc + on MediaTek MT8189 SoCs. This includes enabling and disabling + vcore dvfs clocks. If you want to control its clocks, say Y or M + to include this driver in your kernel build. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index eabe2cab4b8d..3a8dad865c97 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -128,6 +128,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o clk-mt8189-topckgen.o obj-$(CONFIG_COMMON_CLK_MT8189_BUS) += clk-mt8189-bus.o obj-$(CONFIG_COMMON_CLK_MT8189_CAM) += clk-mt8189-cam.o obj-$(CONFIG_COMMON_CLK_MT8189_DBGAO) += clk-mt8189-dbgao.o +obj-$(CONFIG_COMMON_CLK_MT8189_DVFSRC) += clk-mt8189-dvfsrc.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-dvfsrc.c b/drivers/clk/mediatek/clk-mt8189-dvfsrc.c new file mode 100644 index 000000000000..f8ab656af6e6 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-dvfsrc.c @@ -0,0 +1,54 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs dvfsrc_top_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x0, + .sta_ofs = 0x0, +}; + +#define GATE_DVFSRC_TOP_FLAGS(_id, _name, _parent, _shift, _flags) \ + GATE_MTK_FLAGS(_id, _name, _parent, &dvfsrc_top_cg_regs, _shift, \ + &mtk_clk_gate_ops_no_setclr_inv, _flags) + +static const struct mtk_gate dvfsrc_top_clks[] = { + GATE_DVFSRC_TOP_FLAGS(CLK_DVFSRC_TOP_DVFSRC_EN, "dvfsrc_dvfsrc_en", + "clk26m", 0, CLK_IS_CRITICAL), +}; + +static const struct mtk_clk_desc dvfsrc_top_mcd = { + .clks = dvfsrc_top_clks, + .num_clks = ARRAY_SIZE(dvfsrc_top_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_dvfsrc[] = { + { .compatible = "mediatek,mt8189-dvfsrc-top", .data = &dvfsrc_top_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_dvfsrc); + +static struct platform_driver clk_mt8189_dvfsrc_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-dvfsrc", + .of_match_table = of_match_clk_mt8189_dvfsrc, + }, +}; + +module_platform_driver(clk_mt8189_dvfsrc_drv); +MODULE_DESCRIPTION("MediaTek MT8189 dvfsrc clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:22 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:22 +0800 Subject: [PATCH v5 15/18] clk: mediatek: Add MT8189 dispsys clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-16-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 dispsys clock controller, which provides clock gate control for display system. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 12 ++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-dispsys.c | 172 ++++++++++++++++++++++ 3 files changed, 185 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-dispsys.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index e2eb74d79cfd..cb1b8bc49033 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -917,6 +917,18 @@ config COMMON_CLK_MT8189_MFG the MT8189 chipset. Enabling this will allow the manufacturing mode of the chipset to function correctly with the appropriate clock settings. +config COMMON_CLK_MT8189_MMSYS + tristate "Clock driver for MediaTek MT8189 mmsys" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this to support the clock framework for MediaTek MT8189 + multimedia systems (mmsys). This driver is responsible for managing + the clocks for various multimedia components within the SoC, such as + video, audio, and image processing units. Enabling this option will + ensure that these components receive the correct clock frequencies + for proper operation. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 07f11760cf68..21a9e6264b84 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -133,6 +133,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189_IIC) += clk-mt8189-iic.o obj-$(CONFIG_COMMON_CLK_MT8189_IMG) += clk-mt8189-img.o obj-$(CONFIG_COMMON_CLK_MT8189_MDPSYS) += clk-mt8189-mdpsys.o obj-$(CONFIG_COMMON_CLK_MT8189_MFG) += clk-mt8189-mfg.o +obj-$(CONFIG_COMMON_CLK_MT8189_MMSYS) += clk-mt8189-dispsys.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-dispsys.c b/drivers/clk/mediatek/clk-mt8189-dispsys.c new file mode 100644 index 000000000000..4c101cf66f91 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-dispsys.c @@ -0,0 +1,172 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs mm0_cg_regs = { + .set_ofs = 0x04, + .clr_ofs = 0x08, + .sta_ofs = 0x00, +}; + +static const struct mtk_gate_regs mm1_cg_regs = { + .set_ofs = 0x14, + .clr_ofs = 0x18, + .sta_ofs = 0x10, +}; + +#define GATE_MM0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mm0_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +#define GATE_MM1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mm1_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate mm_clks[] = { + /* MM0 */ + GATE_MM0(CLK_MM_DISP_OVL0_4L, "mm_disp_ovl0_4l", "disp0_sel", 0), + GATE_MM0(CLK_MM_DISP_OVL1_4L, "mm_disp_ovl1_4l", "disp0_sel", 1), + GATE_MM0(CLK_MM_VPP_RSZ0, "mm_vpp_rsz0", "disp0_sel", 2), + GATE_MM0(CLK_MM_VPP_RSZ1, "mm_vpp_rsz1", "disp0_sel", 3), + GATE_MM0(CLK_MM_DISP_RDMA0, "mm_disp_rdma0", "disp0_sel", 4), + GATE_MM0(CLK_MM_DISP_RDMA1, "mm_disp_rdma1", "disp0_sel", 5), + GATE_MM0(CLK_MM_DISP_COLOR0, "mm_disp_color0", "disp0_sel", 6), + GATE_MM0(CLK_MM_DISP_COLOR1, "mm_disp_color1", "disp0_sel", 7), + GATE_MM0(CLK_MM_DISP_CCORR0, "mm_disp_ccorr0", "disp0_sel", 8), + GATE_MM0(CLK_MM_DISP_CCORR1, "mm_disp_ccorr1", "disp0_sel", 9), + GATE_MM0(CLK_MM_DISP_CCORR2, "mm_disp_ccorr2", "disp0_sel", 10), + GATE_MM0(CLK_MM_DISP_CCORR3, "mm_disp_ccorr3", "disp0_sel", 11), + GATE_MM0(CLK_MM_DISP_AAL0, "mm_disp_aal0", "disp0_sel", 12), + GATE_MM0(CLK_MM_DISP_AAL1, "mm_disp_aal1", "disp0_sel", 13), + GATE_MM0(CLK_MM_DISP_GAMMA0, "mm_disp_gamma0", "disp0_sel", 14), + GATE_MM0(CLK_MM_DISP_GAMMA1, "mm_disp_gamma1", "disp0_sel", 15), + GATE_MM0(CLK_MM_DISP_DITHER0, "mm_disp_dither0", "disp0_sel", 16), + GATE_MM0(CLK_MM_DISP_DITHER1, "mm_disp_dither1", "disp0_sel", 17), + GATE_MM0(CLK_MM_DISP_DSC_WRAP0, "mm_disp_dsc_wrap0", "disp0_sel", 18), + GATE_MM0(CLK_MM_VPP_MERGE0, "mm_vpp_merge0", "disp0_sel", 19), + GATE_MM0(CLK_MMSYS_0_DISP_DVO, "mmsys_0_disp_dvo", "disp0_sel", 20), + GATE_MM0(CLK_MMSYS_0_DISP_DSI0, "mmsys_0_CLK0", "disp0_sel", 21), + GATE_MM0(CLK_MM_DP_INTF0, "mm_dp_intf0", "disp0_sel", 22), + GATE_MM0(CLK_MM_DPI0, "mm_dpi0", "disp0_sel", 23), + GATE_MM0(CLK_MM_DISP_WDMA0, "mm_disp_wdma0", "disp0_sel", 24), + GATE_MM0(CLK_MM_DISP_WDMA1, "mm_disp_wdma1", "disp0_sel", 25), + GATE_MM0(CLK_MM_DISP_FAKE_ENG0, "mm_disp_fake_eng0", "disp0_sel", 26), + GATE_MM0(CLK_MM_DISP_FAKE_ENG1, "mm_disp_fake_eng1", "disp0_sel", 27), + GATE_MM0(CLK_MM_SMI_LARB, "mm_smi_larb", "disp0_sel", 28), + GATE_MM0(CLK_MM_DISP_MUTEX0, "mm_disp_mutex0", "disp0_sel", 29), + GATE_MM0(CLK_MM_DIPSYS_CONFIG, "mm_dipsys_config", "disp0_sel", 30), + GATE_MM0(CLK_MM_DUMMY, "mm_dummy", "disp0_sel", 31), + /* MM1 */ + GATE_MM1(CLK_MMSYS_1_DISP_DSI0, "mmsys_1_CLK0", "dsi_occ_sel", 0), + GATE_MM1(CLK_MMSYS_1_LVDS_ENCODER, "mmsys_1_lvds_encoder", "pll_dpix_sel", 1), + GATE_MM1(CLK_MMSYS_1_DPI0, "mmsys_1_dpi0", "pll_dpix_sel", 2), + GATE_MM1(CLK_MMSYS_1_DISP_DVO, "mmsys_1_disp_dvo", "edp_sel", 3), + GATE_MM1(CLK_MM_DP_INTF, "mm_dp_intf", "dp_sel", 4), + GATE_MM1(CLK_MMSYS_1_LVDS_ENCODER_CTS, "mmsys_1_lvds_encoder_cts", "vdstx_dg_cts_sel", 5), + GATE_MM1(CLK_MMSYS_1_DISP_DVO_AVT, "mmsys_1_disp_dvo_avt", "edp_favt_sel", 6), +}; + +static const struct mtk_clk_desc mm_mcd = { + .clks = mm_clks, + .num_clks = ARRAY_SIZE(mm_clks), +}; + +static const struct mtk_gate_regs gce_d_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x0, + .sta_ofs = 0x0, +}; + +#define GATE_GCE_D(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &gce_d_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr) + +static const struct mtk_gate gce_d_clks[] = { + GATE_GCE_D(CLK_GCE_D_TOP, "gce_d_top", "mminfra_gce_d", 16), +}; + +static const struct mtk_clk_desc gce_d_mcd = { + .clks = gce_d_clks, + .num_clks = ARRAY_SIZE(gce_d_clks), +}; + +static const struct mtk_gate_regs gce_m_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x0, + .sta_ofs = 0x0, +}; + +#define GATE_GCE_M(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &gce_m_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr) + +static const struct mtk_gate gce_m_clks[] = { + GATE_GCE_M(CLK_GCE_M_TOP, "gce_m_top", "mminfra_gce_m", 16), +}; + +static const struct mtk_clk_desc gce_m_mcd = { + .clks = gce_m_clks, + .num_clks = ARRAY_SIZE(gce_m_clks), +}; + +static const struct mtk_gate_regs mminfra_config0_cg_regs = { + .set_ofs = 0x104, + .clr_ofs = 0x108, + .sta_ofs = 0x100, +}; + +static const struct mtk_gate_regs mminfra_config1_cg_regs = { + .set_ofs = 0x114, + .clr_ofs = 0x118, + .sta_ofs = 0x110, +}; + +#define GATE_MMINFRA_CONFIG0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mminfra_config0_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +#define GATE_MMINFRA_CONFIG1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &mminfra_config1_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate mminfra_config_clks[] = { + /* MMINFRA_CONFIG0 */ + GATE_MMINFRA_CONFIG0(CLK_MMINFRA_GCE_D, "mminfra_gce_d", "mminfra_sel", 0), + GATE_MMINFRA_CONFIG0(CLK_MMINFRA_GCE_M, "mminfra_gce_m", "mminfra_sel", 1), + GATE_MMINFRA_CONFIG0(CLK_MMINFRA_SMI, "mminfra_smi", "mminfra_sel", 2), + /* MMINFRA_CONFIG1 */ + GATE_MMINFRA_CONFIG1(CLK_MMINFRA_GCE_26M, "mminfra_gce_26m", "mminfra_sel", 17), +}; + +static const struct mtk_clk_desc mminfra_config_mcd = { + .clks = mminfra_config_clks, + .num_clks = ARRAY_SIZE(mminfra_config_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_dispsys[] = { + { .compatible = "mediatek,mt8189-dispsys", .data = &mm_mcd }, + { .compatible = "mediatek,mt8189-gce-d", .data = &gce_d_mcd }, + { .compatible = "mediatek,mt8189-gce-m", .data = &gce_m_mcd }, + { .compatible = "mediatek,mt8189-mm-infra", .data = &mminfra_config_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_dispsys); + +static struct platform_driver clk_mt8189_dispsys_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-dispsys", + .of_match_table = of_match_clk_mt8189_dispsys, + }, +}; + +module_platform_driver(clk_mt8189_dispsys_drv); +MODULE_DESCRIPTION("MediaTek MT8189 display clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:24 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:24 +0800 Subject: [PATCH v5 17/18] clk: mediatek: Add MT8189 ufs clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-18-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 ufs clock controller, which provides clock gate control for Universal Flash Storage. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 12 ++++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-ufs.c | 89 +++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-ufs.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 4bf111c9efb5..5f48e7174070 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -939,6 +939,18 @@ config COMMON_CLK_MT8189_SCP management for SCP-related features, ensuring proper clock distribution and gating for power efficiency and functionality. +config COMMON_CLK_MT8189_UFS + tristate "Clock driver for MediaTek MT8189 ufs" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this to support the clock management for the Universal Flash + Storage (UFS) interface on MediaTek MT8189 SoCs. This includes + clock sources, dividers, and gates that are specific to the UFS + feature of the MT8189 platform. It is recommended to enable this + option if the system includes a UFS device that relies on the MT8189 + SoC for clock management. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 819c67395e1b..4179808dba7b 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -135,6 +135,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189_MDPSYS) += clk-mt8189-mdpsys.o obj-$(CONFIG_COMMON_CLK_MT8189_MFG) += clk-mt8189-mfg.o obj-$(CONFIG_COMMON_CLK_MT8189_MMSYS) += clk-mt8189-dispsys.o obj-$(CONFIG_COMMON_CLK_MT8189_SCP) += clk-mt8189-scp.o +obj-$(CONFIG_COMMON_CLK_MT8189_UFS) += clk-mt8189-ufs.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-ufs.c b/drivers/clk/mediatek/clk-mt8189-ufs.c new file mode 100644 index 000000000000..541f9e05d567 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-ufs.c @@ -0,0 +1,89 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs ufscfg_ao_reg_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0xc, + .sta_ofs = 0x4, +}; + +#define GATE_UFSCFG_AO_REG(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &ufscfg_ao_reg_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate ufscfg_ao_reg_clks[] = { + GATE_UFSCFG_AO_REG(CLK_UFSCFG_AO_REG_UNIPRO_TX_SYM, + "ufscfg_ao_unipro_tx_sym", "clk26m", 1), + GATE_UFSCFG_AO_REG(CLK_UFSCFG_AO_REG_UNIPRO_RX_SYM0, + "ufscfg_ao_unipro_rx_sym0", "clk26m", 2), + GATE_UFSCFG_AO_REG(CLK_UFSCFG_AO_REG_UNIPRO_RX_SYM1, + "ufscfg_ao_unipro_rx_sym1", "clk26m", 3), + GATE_UFSCFG_AO_REG(CLK_UFSCFG_AO_REG_UNIPRO_SYS, + "ufscfg_ao_unipro_sys", "ufs_sel", 4), + GATE_UFSCFG_AO_REG(CLK_UFSCFG_AO_REG_U_SAP_CFG, + "ufscfg_ao_u_sap_cfg", "clk26m", 5), + GATE_UFSCFG_AO_REG(CLK_UFSCFG_AO_REG_U_PHY_TOP_AHB_S_BUS, + "ufscfg_ao_u_phy_ahb_s_bus", "axi_u_sel", 6), +}; + +static const struct mtk_clk_desc ufscfg_ao_reg_mcd = { + .clks = ufscfg_ao_reg_clks, + .num_clks = ARRAY_SIZE(ufscfg_ao_reg_clks), +}; + +static const struct mtk_gate_regs ufscfg_pdn_reg_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0xc, + .sta_ofs = 0x4, +}; + +#define GATE_UFSCFG_PDN_REG(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &ufscfg_pdn_reg_cg_regs, _shift, &mtk_clk_gate_ops_setclr) + +static const struct mtk_gate ufscfg_pdn_reg_clks[] = { + GATE_UFSCFG_PDN_REG(CLK_UFSCFG_REG_UFSHCI_UFS, + "ufscfg_ufshci_ufs", "ufs_sel", 0), + GATE_UFSCFG_PDN_REG(CLK_UFSCFG_REG_UFSHCI_AES, + "ufscfg_ufshci_aes", "aes_ufsfde_sel", 1), + GATE_UFSCFG_PDN_REG(CLK_UFSCFG_REG_UFSHCI_U_AHB, + "ufscfg_ufshci_u_ahb", "axi_u_sel", 3), + GATE_UFSCFG_PDN_REG(CLK_UFSCFG_REG_UFSHCI_U_AXI, + "ufscfg_ufshci_u_axi", "mem_sub_u_sel", 5), +}; + +static const struct mtk_clk_desc ufscfg_pdn_reg_mcd = { + .clks = ufscfg_pdn_reg_clks, + .num_clks = ARRAY_SIZE(ufscfg_pdn_reg_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_ufs[] = { + { .compatible = "mediatek,mt8189-ufscfg-ao", .data = &ufscfg_ao_reg_mcd }, + { .compatible = "mediatek,mt8189-ufscfg-pdn", .data = &ufscfg_pdn_reg_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_ufs); + +static struct platform_driver clk_mt8189_ufs_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-ufs", + .of_match_table = of_match_clk_mt8189_ufs, + }, +}; + +module_platform_driver(clk_mt8189_ufs_drv); +MODULE_DESCRIPTION("MediaTek MT8189 ufs clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:19 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:19 +0800 Subject: [PATCH v5 12/18] clk: mediatek: Add MT8189 img clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-13-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 img clock controller, which provides clock gate control for image processing module. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 11 +++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-img.c | 107 ++++++++++++++++++++++++++ 3 files changed, 119 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-img.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 89e85c70d3e6..e6c5d8a69607 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -883,6 +883,17 @@ config COMMON_CLK_MT8189_IIC the MT8189 chipset, improving the overall performance and power efficiency of the device. +config COMMON_CLK_MT8189_IMG + tristate "Clock driver for MediaTek MT8189 img" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this to support the clock framework for MediaTek MT8189 SoC's + image processing units. This includes clocks necessary for the operation + of image-related hardware blocks such as ISP, VENC, and VDEC. If you + are building a kernel for a device that uses the MT8189 SoC and requires + image processing capabilities, say Y or M to include this driver. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 0eed1edf7c63..a1eaf123f2f0 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -130,6 +130,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189_CAM) += clk-mt8189-cam.o obj-$(CONFIG_COMMON_CLK_MT8189_DBGAO) += clk-mt8189-dbgao.o obj-$(CONFIG_COMMON_CLK_MT8189_DVFSRC) += clk-mt8189-dvfsrc.o obj-$(CONFIG_COMMON_CLK_MT8189_IIC) += clk-mt8189-iic.o +obj-$(CONFIG_COMMON_CLK_MT8189_IMG) += clk-mt8189-img.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-img.c b/drivers/clk/mediatek/clk-mt8189-img.c new file mode 100644 index 000000000000..d79f48dbe3e1 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-img.c @@ -0,0 +1,107 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs imgsys1_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_IMGSYS1(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &imgsys1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +static const struct mtk_gate imgsys1_clks[] = { + GATE_IMGSYS1(CLK_IMGSYS1_LARB9, "imgsys1_larb9", "img1_sel", 0), + GATE_IMGSYS1(CLK_IMGSYS1_LARB11, "imgsys1_larb11", "img1_sel", 1), + GATE_IMGSYS1(CLK_IMGSYS1_DIP, "imgsys1_dip", "img1_sel", 2), + GATE_IMGSYS1(CLK_IMGSYS1_GALS, "imgsys1_gals", "img1_sel", 12), +}; + +static const struct mtk_clk_desc imgsys1_mcd = { + .clks = imgsys1_clks, + .num_clks = ARRAY_SIZE(imgsys1_clks), +}; + +static const struct mtk_gate_regs imgsys2_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_IMGSYS2(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &imgsys2_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +static const struct mtk_gate imgsys2_clks[] = { + GATE_IMGSYS2(CLK_IMGSYS2_LARB9, "imgsys2_larb9", "img1_sel", 0), + GATE_IMGSYS2(CLK_IMGSYS2_LARB11, "imgsys2_larb11", "img1_sel", 1), + GATE_IMGSYS2(CLK_IMGSYS2_MFB, "imgsys2_mfb", "img1_sel", 6), + GATE_IMGSYS2(CLK_IMGSYS2_WPE, "imgsys2_wpe", "img1_sel", 7), + GATE_IMGSYS2(CLK_IMGSYS2_MSS, "imgsys2_mss", "img1_sel", 8), + GATE_IMGSYS2(CLK_IMGSYS2_GALS, "imgsys2_gals", "img1_sel", 12), +}; + +static const struct mtk_clk_desc imgsys2_mcd = { + .clks = imgsys2_clks, + .num_clks = ARRAY_SIZE(imgsys2_clks), +}; + +static const struct mtk_gate_regs ipe_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_IPE(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &ipe_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_IGNORE_UNUSED) + +static const struct mtk_gate ipe_clks[] = { + GATE_IPE(CLK_IPE_LARB19, "ipe_larb19", "ipe_sel", 0), + GATE_IPE(CLK_IPE_LARB20, "ipe_larb20", "ipe_sel", 1), + GATE_IPE(CLK_IPE_SMI_SUBCOM, "ipe_smi_subcom", "ipe_sel", 2), + GATE_IPE(CLK_IPE_FD, "ipe_fd", "ipe_sel", 3), + GATE_IPE(CLK_IPE_FE, "ipe_fe", "ipe_sel", 4), + GATE_IPE(CLK_IPE_RSC, "ipe_rsc", "ipe_sel", 5), + GATE_IPE(CLK_IPESYS_GALS, "ipesys_gals", "ipe_sel", 8), +}; + +static const struct mtk_clk_desc ipe_mcd = { + .clks = ipe_clks, + .num_clks = ARRAY_SIZE(ipe_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_img[] = { + { .compatible = "mediatek,mt8189-imgsys1", .data = &imgsys1_mcd }, + { .compatible = "mediatek,mt8189-imgsys2", .data = &imgsys2_mcd }, + { .compatible = "mediatek,mt8189-ipesys", .data = &ipe_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_img); + +static struct platform_driver clk_mt8189_img_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-img", + .of_match_table = of_match_clk_mt8189_img, + }, +}; + +module_platform_driver(clk_mt8189_img_drv); +MODULE_DESCRIPTION("MediaTek MT8189 img clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:16 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:16 +0800 Subject: [PATCH v5 09/18] clk: mediatek: Add MT8189 dbgao clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-10-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 dbgao clock controller, which provides clock gate control for debug-system. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 10 +++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-dbgao.c | 94 +++++++++++++++++++++++++ 3 files changed, 105 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-dbgao.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 0665255a29fd..89f68cb56bb3 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -850,6 +850,16 @@ config COMMON_CLK_MT8189_CAM that relies on this SoC and you want to control its clocks, say Y or M to include this driver in your kernel build. +config COMMON_CLK_MT8189_DBGAO + tristate "Clock driver for MediaTek MT8189 debug ao" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this to support the clock management for the debug function + on MediaTek MT8189 SoCs. This includes enabling and disabling + vcore debug system clocks. If you want to control its clocks, say Y or M + to include this driver in your kernel build. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 95a8f4ae05ee..eabe2cab4b8d 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -127,6 +127,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189) += clk-mt8189-apmixedsys.o clk-mt8189-topckgen.o clk-mt8189-vlpckgen.o clk-mt8189-vlpcfg.o obj-$(CONFIG_COMMON_CLK_MT8189_BUS) += clk-mt8189-bus.o obj-$(CONFIG_COMMON_CLK_MT8189_CAM) += clk-mt8189-cam.o +obj-$(CONFIG_COMMON_CLK_MT8189_DBGAO) += clk-mt8189-dbgao.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-dbgao.c b/drivers/clk/mediatek/clk-mt8189-dbgao.c new file mode 100644 index 000000000000..543321ae5e65 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-dbgao.c @@ -0,0 +1,94 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs dbgao_cg_regs = { + .set_ofs = 0x70, + .clr_ofs = 0x70, + .sta_ofs = 0x70, +}; + +#define GATE_DBGAO(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &dbgao_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv) + +static const struct mtk_gate dbgao_clks[] = { + GATE_DBGAO(CLK_DBGAO_ATB_EN, "dbgao_atb_en", "atb_sel", 0), +}; + +static const struct mtk_clk_desc dbgao_mcd = { + .clks = dbgao_clks, + .num_clks = ARRAY_SIZE(dbgao_clks), +}; + +static const struct mtk_gate_regs dem0_cg_regs = { + .set_ofs = 0x2c, + .clr_ofs = 0x2c, + .sta_ofs = 0x2c, +}; + +static const struct mtk_gate_regs dem1_cg_regs = { + .set_ofs = 0x30, + .clr_ofs = 0x30, + .sta_ofs = 0x30, +}; + +static const struct mtk_gate_regs dem2_cg_regs = { + .set_ofs = 0x70, + .clr_ofs = 0x70, + .sta_ofs = 0x70, +}; + +#define GATE_DEM0(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &dem0_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv) + +#define GATE_DEM1(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &dem1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv) + +#define GATE_DEM2(_id, _name, _parent, _shift) \ + GATE_MTK(_id, _name, _parent, &dem2_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr_inv) + +static const struct mtk_gate dem_clks[] = { + /* DEM0 */ + GATE_DEM0(CLK_DEM_BUSCLK_EN, "dem_busclk_en", "axi_sel", 0), + /* DEM1 */ + GATE_DEM1(CLK_DEM_SYSCLK_EN, "dem_sysclk_en", "axi_sel", 0), + /* DEM2 */ + GATE_DEM2(CLK_DEM_ATB_EN, "dem_atb_en", "atb_sel", 0), +}; + +static const struct mtk_clk_desc dem_mcd = { + .clks = dem_clks, + .num_clks = ARRAY_SIZE(dem_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_dbgao[] = { + { .compatible = "mediatek,mt8189-dbg-ao", .data = &dbgao_mcd }, + { .compatible = "mediatek,mt8189-dem", .data = &dem_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_dbgao); + +static struct platform_driver clk_mt8189_dbgao_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-dbgao", + .of_match_table = of_match_clk_mt8189_dbgao, + }, +}; + +module_platform_driver(clk_mt8189_dbgao_drv); +MODULE_DESCRIPTION("MediaTek MT8189 dbgao system clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:18 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:18 +0800 Subject: [PATCH v5 11/18] clk: mediatek: Add MT8189 i2c clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-12-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 i2c clock controller, which provides clock gate control for i2c. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 13 +++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-iic.c | 118 ++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-iic.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 5def42855b62..89e85c70d3e6 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -870,6 +870,19 @@ config COMMON_CLK_MT8189_DVFSRC vcore dvfs clocks. If you want to control its clocks, say Y or M to include this driver in your kernel build. +config COMMON_CLK_MT8189_IIC + tristate "Clock driver for MediaTek MT8189 iic" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + Enable this option to support the clock framework for MediaTek MT8189 + integrated circuits (iic). This driver is responsible for managing + clock sources, dividers, and gates specifically designed for MT8189 + SoCs. Enabling this driver ensures that the system can correctly + manage clock frequencies and power for various components within + the MT8189 chipset, improving the overall performance and power + efficiency of the device. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 3a8dad865c97..0eed1edf7c63 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -129,6 +129,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189_BUS) += clk-mt8189-bus.o obj-$(CONFIG_COMMON_CLK_MT8189_CAM) += clk-mt8189-cam.o obj-$(CONFIG_COMMON_CLK_MT8189_DBGAO) += clk-mt8189-dbgao.o obj-$(CONFIG_COMMON_CLK_MT8189_DVFSRC) += clk-mt8189-dvfsrc.o +obj-$(CONFIG_COMMON_CLK_MT8189_IIC) += clk-mt8189-iic.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-iic.c b/drivers/clk/mediatek/clk-mt8189-iic.c new file mode 100644 index 000000000000..5feeb6cd83cf --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-iic.c @@ -0,0 +1,118 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs impe_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0x4, + .sta_ofs = 0x0, +}; + +#define GATE_IMPE(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &impe_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_OPS_PARENT_ENABLE) + +static const struct mtk_gate impe_clks[] = { + GATE_IMPE(CLK_IMPE_I2C0, "impe_i2c0", "i2c_sel", 0), + GATE_IMPE(CLK_IMPE_I2C1, "impe_i2c1", "i2c_sel", 1), +}; + +static const struct mtk_clk_desc impe_mcd = { + .clks = impe_clks, + .num_clks = ARRAY_SIZE(impe_clks), +}; + +static const struct mtk_gate_regs impen_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0x4, + .sta_ofs = 0x0, +}; + +#define GATE_IMPEN(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &impen_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_OPS_PARENT_ENABLE) + +static const struct mtk_gate impen_clks[] = { + GATE_IMPEN(CLK_IMPEN_I2C7, "impen_i2c7", "i2c_sel", 0), + GATE_IMPEN(CLK_IMPEN_I2C8, "impen_i2c8", "i2c_sel", 1), +}; + +static const struct mtk_clk_desc impen_mcd = { + .clks = impen_clks, + .num_clks = ARRAY_SIZE(impen_clks), +}; + +static const struct mtk_gate_regs imps_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0x4, + .sta_ofs = 0x0, +}; + +#define GATE_IMPS(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &imps_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_OPS_PARENT_ENABLE) + +static const struct mtk_gate imps_clks[] = { + GATE_IMPS(CLK_IMPS_I2C3, "imps_i2c3", "i2c_sel", 0), + GATE_IMPS(CLK_IMPS_I2C4, "imps_i2c4", "i2c_sel", 1), + GATE_IMPS(CLK_IMPS_I2C5, "imps_i2c5", "i2c_sel", 2), + GATE_IMPS(CLK_IMPS_I2C6, "imps_i2c6", "i2c_sel", 3), +}; + +static const struct mtk_clk_desc imps_mcd = { + .clks = imps_clks, + .num_clks = ARRAY_SIZE(imps_clks), +}; + +static const struct mtk_gate_regs impws_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0x4, + .sta_ofs = 0x0, +}; + +#define GATE_IMPWS(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &impws_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr, CLK_OPS_PARENT_ENABLE) + +static const struct mtk_gate impws_clks[] = { + GATE_IMPWS(CLK_IMPWS_I2C2, "impws_i2c2", "i2c_sel", 0), +}; + +static const struct mtk_clk_desc impws_mcd = { + .clks = impws_clks, + .num_clks = ARRAY_SIZE(impws_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_iic[] = { + { .compatible = "mediatek,mt8189-iic-wrap-e", .data = &impe_mcd }, + { .compatible = "mediatek,mt8189-iic-wrap-en", .data = &impen_mcd }, + { .compatible = "mediatek,mt8189-iic-wrap-s", .data = &imps_mcd }, + { .compatible = "mediatek,mt8189-iic-wrap-ws", .data = &impws_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_iic); + +static struct platform_driver clk_mt8189_iic_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-iic", + .of_match_table = of_match_clk_mt8189_iic, + }, +}; + +module_platform_driver(clk_mt8189_iic_drv); +MODULE_DESCRIPTION("MediaTek MT8189 iic clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:28:25 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:28:25 +0800 Subject: [PATCH v5 18/18] clk: mediatek: Add MT8189 vcodec clock support In-Reply-To: <20260202062840.342707-1-irving-ch.lin@mediatek.com> References: <20260202062840.342707-1-irving-ch.lin@mediatek.com> Message-ID: <20260202062840.342707-19-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add support for the MT8189 vcodec clock controller, which provides clock gate control for video encoder/decoder. Signed-off-by: Irving-CH Lin --- drivers/clk/mediatek/Kconfig | 10 +++ drivers/clk/mediatek/Makefile | 1 + drivers/clk/mediatek/clk-mt8189-vcodec.c | 93 ++++++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 drivers/clk/mediatek/clk-mt8189-vcodec.c diff --git a/drivers/clk/mediatek/Kconfig b/drivers/clk/mediatek/Kconfig index 5f48e7174070..32a0b92180ec 100644 --- a/drivers/clk/mediatek/Kconfig +++ b/drivers/clk/mediatek/Kconfig @@ -951,6 +951,16 @@ config COMMON_CLK_MT8189_UFS option if the system includes a UFS device that relies on the MT8189 SoC for clock management. +config COMMON_CLK_MT8189_VCODEC + tristate "Clock driver for MediaTek MT8189 vcodec" + depends on COMMON_CLK_MT8189 + default COMMON_CLK_MT8189 + help + This driver supports the video codec (VCODEC) clocks on the MediaTek + MT8189 SoCs. Enabling this option will allow the system to manage + clocks required for the operation of hardware video encoding and + decoding features provided by the VCODEC unit of the MT8189 platform. + config COMMON_CLK_MT8192 tristate "Clock driver for MediaTek MT8192" depends on ARM64 || COMPILE_TEST diff --git a/drivers/clk/mediatek/Makefile b/drivers/clk/mediatek/Makefile index 4179808dba7b..614371c92e81 100644 --- a/drivers/clk/mediatek/Makefile +++ b/drivers/clk/mediatek/Makefile @@ -136,6 +136,7 @@ obj-$(CONFIG_COMMON_CLK_MT8189_MFG) += clk-mt8189-mfg.o obj-$(CONFIG_COMMON_CLK_MT8189_MMSYS) += clk-mt8189-dispsys.o obj-$(CONFIG_COMMON_CLK_MT8189_SCP) += clk-mt8189-scp.o obj-$(CONFIG_COMMON_CLK_MT8189_UFS) += clk-mt8189-ufs.o +obj-$(CONFIG_COMMON_CLK_MT8189_VCODEC) += clk-mt8189-vcodec.o obj-$(CONFIG_COMMON_CLK_MT8192) += clk-mt8192-apmixedsys.o clk-mt8192.o obj-$(CONFIG_COMMON_CLK_MT8192_AUDSYS) += clk-mt8192-aud.o obj-$(CONFIG_COMMON_CLK_MT8192_CAMSYS) += clk-mt8192-cam.o diff --git a/drivers/clk/mediatek/clk-mt8189-vcodec.c b/drivers/clk/mediatek/clk-mt8189-vcodec.c new file mode 100644 index 000000000000..87b01e432474 --- /dev/null +++ b/drivers/clk/mediatek/clk-mt8189-vcodec.c @@ -0,0 +1,93 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#include +#include +#include +#include + +#include "clk-mtk.h" +#include "clk-gate.h" + +#include + +static const struct mtk_gate_regs vdec_core0_cg_regs = { + .set_ofs = 0x0, + .clr_ofs = 0x4, + .sta_ofs = 0x0, +}; + +static const struct mtk_gate_regs vdec_core1_cg_regs = { + .set_ofs = 0x8, + .clr_ofs = 0xc, + .sta_ofs = 0x8, +}; + +#define GATE_VDEC_CORE0(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &vdec_core0_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv, CLK_IGNORE_UNUSED) + +#define GATE_VDEC_CORE1(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &vdec_core1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv, CLK_IGNORE_UNUSED) + +static const struct mtk_gate vdec_core_clks[] = { + /* VDEC_CORE0 */ + GATE_VDEC_CORE0(CLK_VDEC_CORE_VDEC_CKEN, "vdec_core_vdec_cken", "vdec_sel", 0), + GATE_VDEC_CORE0(CLK_VDEC_CORE_VDEC_ACTIVE, "vdec_core_vdec_active", "vdec_sel", 4), + /* VDEC_CORE1 */ + GATE_VDEC_CORE1(CLK_VDEC_CORE_LARB_CKEN, "vdec_core_larb_cken", "vdec_sel", 0), +}; + +static const struct mtk_clk_desc vdec_core_mcd = { + .clks = vdec_core_clks, + .num_clks = ARRAY_SIZE(vdec_core_clks), +}; + +static const struct mtk_gate_regs ven1_cg_regs = { + .set_ofs = 0x4, + .clr_ofs = 0x8, + .sta_ofs = 0x0, +}; + +#define GATE_VEN1(_id, _name, _parent, _shift) \ + GATE_MTK_FLAGS(_id, _name, _parent, &ven1_cg_regs, _shift, \ + &mtk_clk_gate_ops_setclr_inv, CLK_IGNORE_UNUSED) + +static const struct mtk_gate ven1_clks[] = { + GATE_VEN1(CLK_VEN1_CKE0_LARB, "ven1_larb", "venc_sel", 0), + GATE_VEN1(CLK_VEN1_CKE1_VENC, "ven1_venc", "venc_sel", 4), + GATE_VEN1(CLK_VEN1_CKE2_JPGENC, "ven1_jpgenc", "venc_sel", 8), + GATE_VEN1(CLK_VEN1_CKE3_JPGDEC, "ven1_jpgdec", "venc_sel", 12), + GATE_VEN1(CLK_VEN1_CKE4_JPGDEC_C1, "ven1_jpgdec_c1", "venc_sel", 16), + GATE_VEN1(CLK_VEN1_CKE5_GALS, "ven1_gals", "venc_sel", 28), + GATE_VEN1(CLK_VEN1_CKE6_GALS_SRAM, "ven1_gals_sram", "venc_sel", 31), +}; + +static const struct mtk_clk_desc ven1_mcd = { + .clks = ven1_clks, + .num_clks = ARRAY_SIZE(ven1_clks), +}; + +static const struct of_device_id of_match_clk_mt8189_vcodec[] = { + { .compatible = "mediatek,mt8189-vdec-core", .data = &vdec_core_mcd }, + { .compatible = "mediatek,mt8189-venc", .data = &ven1_mcd }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, of_match_clk_mt8189_vcodec); + +static struct platform_driver clk_mt8189_vcodec_drv = { + .probe = mtk_clk_simple_probe, + .remove = mtk_clk_simple_remove, + .driver = { + .name = "clk-mt8189-vcodec", + .of_match_table = of_match_clk_mt8189_vcodec, + }, +}; + +module_platform_driver(clk_mt8189_vcodec_drv); +MODULE_DESCRIPTION("MediaTek MT8189 video encoder/decoder clocks driver"); +MODULE_LICENSE("GPL"); -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:48:12 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:48:12 +0800 Subject: [PATCH 0/3] Add support for MT8189 power controller Message-ID: <20260202064820.347550-1-irving-ch.lin@mediatek.com> From: Irving-CH Lin This series add support for the power controllers of MediaTek's new SoC, MT8189. With these changes, other modules can easily manage power resources using standard Linux APIs, such as the pm_runtime API on MT8189 platform. Irving-CH Lin (3): dt-bindings: power: Add MediaTek MT8189 power domain pmdomain: mediatek: Add bus protect control flow for MT8189 pmdomain: mediatek: Add power domain driver for MT8189 SoC .../power/mediatek,power-controller.yaml | 1 + drivers/pmdomain/mediatek/mt8189-pm-domains.h | 485 ++++++++++++++++++ drivers/pmdomain/mediatek/mtk-pm-domains.c | 36 +- drivers/pmdomain/mediatek/mtk-pm-domains.h | 5 + .../dt-bindings/power/mediatek,mt8189-power.h | 38 ++ 5 files changed, 560 insertions(+), 5 deletions(-) create mode 100644 drivers/pmdomain/mediatek/mt8189-pm-domains.h create mode 100644 include/dt-bindings/power/mediatek,mt8189-power.h -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:48:14 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:48:14 +0800 Subject: [PATCH 2/3] pmdomain: mediatek: Add bus protect control flow for MT8189 In-Reply-To: <20260202064820.347550-1-irving-ch.lin@mediatek.com> References: <20260202064820.347550-1-irving-ch.lin@mediatek.com> Message-ID: <20260202064820.347550-3-irving-ch.lin@mediatek.com> From: Irving-CH Lin In MT8189 mminfra power domain, the bus protect policy separates into two parts, one is set before subsys clocks enabled, and another need to enable after subsys clocks enable. Signed-off-by: Irving-CH Lin --- drivers/pmdomain/mediatek/mtk-pm-domains.c | 31 ++++++++++++++++++---- drivers/pmdomain/mediatek/mtk-pm-domains.h | 5 ++++ 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.c b/drivers/pmdomain/mediatek/mtk-pm-domains.c index 0f0662676c07..3eeb0dabf7d7 100644 --- a/drivers/pmdomain/mediatek/mtk-pm-domains.c +++ b/drivers/pmdomain/mediatek/mtk-pm-domains.c @@ -250,7 +250,7 @@ static int scpsys_bus_protect_set(struct scpsys_domain *pd, MTK_POLL_DELAY_US, MTK_POLL_TIMEOUT); } -static int scpsys_bus_protect_enable(struct scpsys_domain *pd) +static int scpsys_bus_protect_enable(struct scpsys_domain *pd, u8 flags) { for (int i = 0; i < SPM_MAX_BUS_PROT_DATA; i++) { const struct scpsys_bus_prot_data *bpd = &pd->data->bp_cfg[i]; @@ -259,6 +259,10 @@ static int scpsys_bus_protect_enable(struct scpsys_domain *pd) if (!bpd->bus_prot_set_clr_mask) break; + if ((bpd->flags & BUS_PROT_IGNORE_SUBCLK) != + (flags & BUS_PROT_IGNORE_SUBCLK)) + continue; + if (bpd->flags & BUS_PROT_INVERTED) ret = scpsys_bus_protect_clear(pd, bpd); else @@ -270,7 +274,7 @@ static int scpsys_bus_protect_enable(struct scpsys_domain *pd) return 0; } -static int scpsys_bus_protect_disable(struct scpsys_domain *pd) +static int scpsys_bus_protect_disable(struct scpsys_domain *pd, u8 flags) { for (int i = SPM_MAX_BUS_PROT_DATA - 1; i >= 0; i--) { const struct scpsys_bus_prot_data *bpd = &pd->data->bp_cfg[i]; @@ -279,6 +283,10 @@ static int scpsys_bus_protect_disable(struct scpsys_domain *pd) if (!bpd->bus_prot_set_clr_mask) continue; + if ((bpd->flags & BUS_PROT_IGNORE_SUBCLK) != + (flags & BUS_PROT_IGNORE_SUBCLK)) + continue; + if (bpd->flags & BUS_PROT_INVERTED) ret = scpsys_bus_protect_set(pd, bpd); else @@ -632,6 +640,15 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) if (ret) goto err_pwr_ack; + /* + * In MT8189 mminfra power domain, the bus protect policy separates + * into two parts, one is set before subsys clocks enabled, and another + * need to enable after subsys clocks enable. + */ + ret = scpsys_bus_protect_disable(pd, BUS_PROT_IGNORE_SUBCLK); + if (ret < 0) + goto err_pwr_ack; + /* * In few Mediatek platforms(e.g. MT6779), the bus protect policy is * stricter, which leads to bus protect release must be prior to bus @@ -648,7 +665,7 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) if (ret < 0) goto err_disable_subsys_clks; - ret = scpsys_bus_protect_disable(pd); + ret = scpsys_bus_protect_disable(pd, 0); if (ret < 0) goto err_disable_sram; @@ -662,7 +679,7 @@ static int scpsys_power_on(struct generic_pm_domain *genpd) return 0; err_enable_bus_protect: - scpsys_bus_protect_enable(pd); + scpsys_bus_protect_enable(pd, 0); err_disable_sram: scpsys_sram_disable(pd); err_disable_subsys_clks: @@ -683,7 +700,7 @@ static int scpsys_power_off(struct generic_pm_domain *genpd) bool tmp; int ret; - ret = scpsys_bus_protect_enable(pd); + ret = scpsys_bus_protect_enable(pd, 0); if (ret < 0) return ret; @@ -697,6 +714,10 @@ static int scpsys_power_off(struct generic_pm_domain *genpd) clk_bulk_disable_unprepare(pd->num_subsys_clks, pd->subsys_clks); + ret = scpsys_bus_protect_enable(pd, BUS_PROT_IGNORE_SUBCLK); + if (ret < 0) + return ret; + if (MTK_SCPD_CAPS(pd, MTK_SCPD_MODEM_PWRSEQ)) scpsys_modem_pwrseq_off(pd); else diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.h b/drivers/pmdomain/mediatek/mtk-pm-domains.h index f608e6ec4744..a5dca24cbc2f 100644 --- a/drivers/pmdomain/mediatek/mtk-pm-domains.h +++ b/drivers/pmdomain/mediatek/mtk-pm-domains.h @@ -56,6 +56,7 @@ enum scpsys_bus_prot_flags { BUS_PROT_REG_UPDATE = BIT(1), BUS_PROT_IGNORE_CLR_ACK = BIT(2), BUS_PROT_INVERTED = BIT(3), + BUS_PROT_IGNORE_SUBCLK = BIT(4), }; enum scpsys_bus_prot_block { @@ -95,6 +96,10 @@ enum scpsys_bus_prot_block { _BUS_PROT(_hwip, _mask, _set, _clr, _mask, _sta, \ BUS_PROT_REG_UPDATE) +#define BUS_PROT_WR_IGN_SUBCLK(_hwip, _mask, _set, _clr, _sta) \ + _BUS_PROT(_hwip, _mask, _set, _clr, _mask, _sta, \ + BUS_PROT_IGNORE_CLR_ACK | BUS_PROT_IGNORE_SUBCLK) + #define BUS_PROT_INFRA_UPDATE_TOPAXI(_mask) \ BUS_PROT_UPDATE(INFRA, _mask, \ INFRA_TOPAXI_PROTECTEN, \ -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:48:15 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:48:15 +0800 Subject: [PATCH 3/3] pmdomain: mediatek: Add power domain driver for MT8189 SoC In-Reply-To: <20260202064820.347550-1-irving-ch.lin@mediatek.com> References: <20260202064820.347550-1-irving-ch.lin@mediatek.com> Message-ID: <20260202064820.347550-4-irving-ch.lin@mediatek.com> From: Irving-CH Lin Introduce a new power domain (pmd) driver for the MediaTek mt8189 SoC. This driver ports and refines the power domain framework, dividing hardware blocks (CPU, GPU, peripherals, etc.) into independent power domains for precise and energy-efficient power management. Signed-off-by: Irving-CH Lin --- drivers/pmdomain/mediatek/mt8189-pm-domains.h | 485 ++++++++++++++++++ drivers/pmdomain/mediatek/mtk-pm-domains.c | 5 + 2 files changed, 490 insertions(+) create mode 100644 drivers/pmdomain/mediatek/mt8189-pm-domains.h diff --git a/drivers/pmdomain/mediatek/mt8189-pm-domains.h b/drivers/pmdomain/mediatek/mt8189-pm-domains.h new file mode 100644 index 000000000000..c28b9460c074 --- /dev/null +++ b/drivers/pmdomain/mediatek/mt8189-pm-domains.h @@ -0,0 +1,485 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#ifndef __SOC_MEDIATEK_MT8189_PM_DOMAINS_H +#define __SOC_MEDIATEK_MT8189_PM_DOMAINS_H + +#include "mtk-pm-domains.h" +#include + +/* + * MT8189 power domain support + */ + +#define MT8189_SPM_PWR_STATUS 0x0f40 +#define MT8189_SPM_PWR_STATUS_2ND 0x0f44 +#define MT8189_SPM_PWR_STATUS_MSB 0x0f48 +#define MT8189_SPM_PWR_STATUS_MSB_2ND 0x0f4c +#define MT8189_SPM_XPU_PWR_STATUS 0x0f50 +#define MT8189_SPM_XPU_PWR_STATUS_2ND 0x0f54 + +#define MT8189_PROT_EN_EMICFG_GALS_SLP_SET 0x0084 +#define MT8189_PROT_EN_EMICFG_GALS_SLP_CLR 0x0088 +#define MT8189_PROT_EN_EMICFG_GALS_SLP_RDY 0x008c +#define MT8189_PROT_EN_MMSYS_STA_0_SET 0x0c14 +#define MT8189_PROT_EN_MMSYS_STA_0_CLR 0x0c18 +#define MT8189_PROT_EN_MMSYS_STA_0_RDY 0x0c1c +#define MT8189_PROT_EN_MMSYS_STA_1_SET 0x0c24 +#define MT8189_PROT_EN_MMSYS_STA_1_CLR 0x0c28 +#define MT8189_PROT_EN_MMSYS_STA_1_RDY 0x0c2c +#define MT8189_PROT_EN_INFRASYS_STA_0_SET 0x0c44 +#define MT8189_PROT_EN_INFRASYS_STA_0_CLR 0x0c48 +#define MT8189_PROT_EN_INFRASYS_STA_0_RDY 0x0c4c +#define MT8189_PROT_EN_INFRASYS_STA_1_SET 0x0c54 +#define MT8189_PROT_EN_INFRASYS_STA_1_CLR 0x0c58 +#define MT8189_PROT_EN_INFRASYS_STA_1_RDY 0x0c5c +#define MT8189_PROT_EN_PERISYS_STA_0_SET 0x0c84 +#define MT8189_PROT_EN_PERISYS_STA_0_CLR 0x0c88 +#define MT8189_PROT_EN_PERISYS_STA_0_RDY 0x0c8c +#define MT8189_PROT_EN_MCU_STA_0_SET 0x0c94 +#define MT8189_PROT_EN_MCU_STA_0_CLR 0x0c98 +#define MT8189_PROT_EN_MCU_STA_0_RDY 0x0c9c +#define MT8189_PROT_EN_MD_STA_0_SET 0x0ca4 +#define MT8189_PROT_EN_MD_STA_0_CLR 0x0ca8 +#define MT8189_PROT_EN_MD_STA_0_RDY 0x0cac + +#define MT8189_PROT_EN_EMISYS_STA_0_MM_INFRA (GENMASK(21, 20)) +#define MT8189_PROT_EN_INFRASYS_STA_0_CONN (BIT(8)) +#define MT8189_PROT_EN_INFRASYS_STA_1_CONN (BIT(12)) +#define MT8189_PROT_EN_INFRASYS_STA_0_MM_INFRA (BIT(16)) +#define MT8189_PROT_EN_INFRASYS_STA_1_MM_INFRA (BIT(11)) +#define MT8189_PROT_EN_INFRASYS_STA_1_MFG1 (BIT(20)) +#define MT8189_PROT_EN_MCU_STA_0_CONN (BIT(1)) +#define MT8189_PROT_EN_MCU_STA_0_CONN_2ND (BIT(0)) +#define MT8189_PROT_EN_MD_STA_0_MFG1 (BIT(0) | BIT(2)) +#define MT8189_PROT_EN_MD_STA_0_MFG1_2ND (BIT(4)) +#define MT8189_PROT_EN_MM_INFRA_IGN (BIT(1)) +#define MT8189_PROT_EN_MM_INFRA_2_IGN (BIT(0)) +#define MT8189_PROT_EN_MMSYS_STA_0_CAM_MAIN (GENMASK(31, 30)) +#define MT8189_PROT_EN_MMSYS_STA_1_CAM_MAIN (GENMASK(10, 9)) +#define MT8189_PROT_EN_MMSYS_STA_0_DISP (GENMASK(1, 0)) +#define MT8189_PROT_EN_MMSYS_STA_0_ISP_IMG1 (BIT(3)) +#define MT8189_PROT_EN_MMSYS_STA_1_ISP_IMG1 (BIT(7)) +#define MT8189_PROT_EN_MMSYS_STA_0_ISP_IPE (BIT(2)) +#define MT8189_PROT_EN_MMSYS_STA_1_ISP_IPE (BIT(8)) +#define MT8189_PROT_EN_MMSYS_STA_0_MDP0 (BIT(18)) +#define MT8189_PROT_EN_MMSYS_STA_1_MM_INFRA (GENMASK(3, 2)) +#define MT8189_PROT_EN_MMSYS_STA_1_MM_INFRA_2ND (GENMASK(15, 7)) +#define MT8189_PROT_EN_MMSYS_STA_0_VDE0 (BIT(20)) +#define MT8189_PROT_EN_MMSYS_STA_1_VDE0 (BIT(13)) +#define MT8189_PROT_EN_MMSYS_STA_0_VEN0 (BIT(12)) +#define MT8189_PROT_EN_MMSYS_STA_1_VEN0 (BIT(12)) +#define MT8189_PROT_EN_PERISYS_STA_0_AUDIO (BIT(6)) +#define MT8189_PROT_EN_PERISYS_STA_0_SSUSB (BIT(7)) +#define MT8189_PROT_EN_EMICFG_GALS_SLP_MFG1 (GENMASK(5, 4)) + +static enum scpsys_bus_prot_block scpsys_bus_prot_blocks_mt8189[] = { + BUS_PROT_BLOCK_INFRA, BUS_PROT_BLOCK_SMI +}; + +static const struct scpsys_domain_data scpsys_domain_data_mt8189[] = { + [MT8189_POWER_DOMAIN_CONN] = { + .name = "conn", + .sta_mask = BIT(1), + .ctl_offs = 0xe04, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MCU_STA_0_CONN, + MT8189_PROT_EN_MCU_STA_0_SET, + MT8189_PROT_EN_MCU_STA_0_CLR, + MT8189_PROT_EN_MCU_STA_0_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_INFRASYS_STA_1_CONN, + MT8189_PROT_EN_INFRASYS_STA_1_SET, + MT8189_PROT_EN_INFRASYS_STA_1_CLR, + MT8189_PROT_EN_INFRASYS_STA_1_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MCU_STA_0_CONN_2ND, + MT8189_PROT_EN_MCU_STA_0_SET, + MT8189_PROT_EN_MCU_STA_0_CLR, + MT8189_PROT_EN_MCU_STA_0_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_INFRASYS_STA_0_CONN, + MT8189_PROT_EN_INFRASYS_STA_0_SET, + MT8189_PROT_EN_INFRASYS_STA_0_CLR, + MT8189_PROT_EN_INFRASYS_STA_0_RDY), + }, + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_AUDIO] = { + .name = "audio", + .sta_mask = BIT(6), + .ctl_offs = 0xe18, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_PERISYS_STA_0_AUDIO, + MT8189_PROT_EN_PERISYS_STA_0_SET, + MT8189_PROT_EN_PERISYS_STA_0_CLR, + MT8189_PROT_EN_PERISYS_STA_0_RDY), + }, + }, + [MT8189_POWER_DOMAIN_ADSP_TOP_DORMANT] = { + .name = "adsp-top-dormant", + .sta_mask = BIT(7), + .ctl_offs = 0xe1c, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(9), + .sram_pdn_ack_bits = BIT(13), + .caps = MTK_SCPD_SRAM_ISO | MTK_SCPD_SRAM_PDN_INVERTED | + MTK_SCPD_ACTIVE_WAKEUP | MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_ADSP_INFRA] = { + .name = "adsp-infra", + .sta_mask = BIT(8), + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .ctl_offs = 0xe20, + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_ADSP_AO] = { + .name = "adsp-ao", + .sta_mask = BIT(9), + .ctl_offs = 0xe24, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + }, + [MT8189_POWER_DOMAIN_ISP_IMG1] = { + .name = "isp-img1", + .sta_mask = BIT(10), + .ctl_offs = 0xe28, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_0_ISP_IMG1, + MT8189_PROT_EN_MMSYS_STA_0_SET, + MT8189_PROT_EN_MMSYS_STA_0_CLR, + MT8189_PROT_EN_MMSYS_STA_0_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_1_ISP_IMG1, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + }, + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_ISP_IMG2] = { + .name = "isp-img2", + .sta_mask = BIT(11), + .ctl_offs = 0xe2c, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_ISP_IPE] = { + .name = "isp-ipe", + .sta_mask = BIT(12), + .ctl_offs = 0xe30, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_0_ISP_IPE, + MT8189_PROT_EN_MMSYS_STA_0_SET, + MT8189_PROT_EN_MMSYS_STA_0_CLR, + MT8189_PROT_EN_MMSYS_STA_0_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_1_ISP_IPE, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + }, + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_VDE0] = { + .name = "vde0", + .sta_mask = BIT(14), + .ctl_offs = 0xe38, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_0_VDE0, + MT8189_PROT_EN_MMSYS_STA_0_SET, + MT8189_PROT_EN_MMSYS_STA_0_CLR, + MT8189_PROT_EN_MMSYS_STA_0_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_1_VDE0, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + }, + }, + [MT8189_POWER_DOMAIN_VEN0] = { + .name = "ven0", + .sta_mask = BIT(16), + .ctl_offs = 0xe40, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_0_VEN0, + MT8189_PROT_EN_MMSYS_STA_0_SET, + MT8189_PROT_EN_MMSYS_STA_0_CLR, + MT8189_PROT_EN_MMSYS_STA_0_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_1_VEN0, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + }, + }, + [MT8189_POWER_DOMAIN_CAM_MAIN] = { + .name = "cam-main", + .sta_mask = BIT(18), + .ctl_offs = 0xe48, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_0_CAM_MAIN, + MT8189_PROT_EN_MMSYS_STA_0_SET, + MT8189_PROT_EN_MMSYS_STA_0_CLR, + MT8189_PROT_EN_MMSYS_STA_0_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_1_CAM_MAIN, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + }, + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_CAM_SUBA] = { + .name = "cam-suba", + .sta_mask = BIT(20), + .ctl_offs = 0xe50, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_CAM_SUBB] = { + .name = "cam-subb", + .sta_mask = BIT(21), + .ctl_offs = 0xe54, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_MDP0] = { + .name = "mdp0", + .sta_mask = BIT(26), + .ctl_offs = 0xe68, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_0_MDP0, + MT8189_PROT_EN_MMSYS_STA_0_SET, + MT8189_PROT_EN_MMSYS_STA_0_CLR, + MT8189_PROT_EN_MMSYS_STA_0_RDY), + }, + }, + [MT8189_POWER_DOMAIN_DISP] = { + .name = "disp", + .sta_mask = BIT(28), + .ctl_offs = 0xe70, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_0_DISP, + MT8189_PROT_EN_MMSYS_STA_0_SET, + MT8189_PROT_EN_MMSYS_STA_0_CLR, + MT8189_PROT_EN_MMSYS_STA_0_RDY), + }, + }, + [MT8189_POWER_DOMAIN_MM_INFRA] = { + .name = "mm-infra", + .sta_mask = BIT(30), + .ctl_offs = 0xe78, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_1_MM_INFRA, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MMSYS_STA_1_MM_INFRA_2ND, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + BUS_PROT_WR_IGN_SUBCLK(INFRA, + MT8189_PROT_EN_MM_INFRA_IGN, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + BUS_PROT_WR_IGN_SUBCLK(INFRA, + MT8189_PROT_EN_MM_INFRA_2_IGN, + MT8189_PROT_EN_MMSYS_STA_1_SET, + MT8189_PROT_EN_MMSYS_STA_1_CLR, + MT8189_PROT_EN_MMSYS_STA_1_RDY), + }, + }, + [MT8189_POWER_DOMAIN_DP_TX] = { + .name = "dp-tx", + .sta_mask = BIT(0), + .ctl_offs = 0xe80, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS_MSB, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_MSB_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + }, + [MT8189_POWER_DOMAIN_CSI_RX] = { + .name = "csi-rx", + .sta_mask = BIT(7), + .ctl_offs = 0xe9c, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS_MSB, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_MSB_2ND, + .caps = MTK_SCPD_KEEP_DEFAULT_OFF, + }, + [MT8189_POWER_DOMAIN_SSUSB] = { + .name = "ssusb", + .sta_mask = BIT(10), + .ctl_offs = 0xea8, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS_MSB, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_MSB_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_PERISYS_STA_0_SSUSB, + MT8189_PROT_EN_PERISYS_STA_0_SET, + MT8189_PROT_EN_PERISYS_STA_0_CLR, + MT8189_PROT_EN_PERISYS_STA_0_RDY), + }, + .caps = MTK_SCPD_ACTIVE_WAKEUP, + }, + [MT8189_POWER_DOMAIN_MFG0] = { + .name = "mfg0", + .sta_mask = BIT(1), + .ctl_offs = 0xeb4, + .pwr_sta_offs = MT8189_SPM_XPU_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_XPU_PWR_STATUS_2ND, + .caps = MTK_SCPD_DOMAIN_SUPPLY, + }, + [MT8189_POWER_DOMAIN_MFG1] = { + .name = "mfg1", + .sta_mask = BIT(2), + .ctl_offs = 0xeb8, + .pwr_sta_offs = MT8189_SPM_XPU_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_XPU_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .bp_cfg = { + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_INFRASYS_STA_1_MFG1, + MT8189_PROT_EN_INFRASYS_STA_1_SET, + MT8189_PROT_EN_INFRASYS_STA_1_CLR, + MT8189_PROT_EN_INFRASYS_STA_1_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MD_STA_0_MFG1, + MT8189_PROT_EN_MD_STA_0_SET, + MT8189_PROT_EN_MD_STA_0_CLR, + MT8189_PROT_EN_MD_STA_0_RDY), + BUS_PROT_WR_IGN(INFRA, + MT8189_PROT_EN_MD_STA_0_MFG1_2ND, + MT8189_PROT_EN_MD_STA_0_SET, + MT8189_PROT_EN_MD_STA_0_CLR, + MT8189_PROT_EN_MD_STA_0_RDY), + BUS_PROT_WR_IGN(SMI, + MT8189_PROT_EN_EMICFG_GALS_SLP_MFG1, + MT8189_PROT_EN_EMICFG_GALS_SLP_SET, + MT8189_PROT_EN_EMICFG_GALS_SLP_CLR, + MT8189_PROT_EN_EMICFG_GALS_SLP_RDY), + }, + .caps = MTK_SCPD_DOMAIN_SUPPLY, + }, + [MT8189_POWER_DOMAIN_MFG2] = { + .name = "mfg2", + .sta_mask = BIT(3), + .ctl_offs = 0xebc, + .pwr_sta_offs = MT8189_SPM_XPU_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_XPU_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + }, + [MT8189_POWER_DOMAIN_MFG3] = { + .name = "mfg3", + .sta_mask = BIT(4), + .ctl_offs = 0xec0, + .pwr_sta_offs = MT8189_SPM_XPU_PWR_STATUS, + .pwr_sta2nd_offs = MT8189_SPM_XPU_PWR_STATUS_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + }, + [MT8189_POWER_DOMAIN_EDP_TX_DORMANT] = { + .name = "edp-tx-dormant", + .sta_mask = BIT(12), + .ctl_offs = 0xf70, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS_MSB, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_MSB_2ND, + .sram_pdn_bits = BIT(9), + .sram_pdn_ack_bits = 0, + .caps = MTK_SCPD_SRAM_ISO | MTK_SCPD_SRAM_PDN_INVERTED, + }, + [MT8189_POWER_DOMAIN_PCIE] = { + .name = "pcie", + .sta_mask = BIT(13), + .ctl_offs = 0xf74, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS_MSB, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_MSB_2ND, + .sram_pdn_bits = BIT(8), + .sram_pdn_ack_bits = BIT(12), + .caps = MTK_SCPD_ACTIVE_WAKEUP, + }, + [MT8189_POWER_DOMAIN_PCIE_PHY] = { + .name = "pcie-phy", + .sta_mask = BIT(14), + .ctl_offs = 0xf78, + .pwr_sta_offs = MT8189_SPM_PWR_STATUS_MSB, + .pwr_sta2nd_offs = MT8189_SPM_PWR_STATUS_MSB_2ND, + }, +}; + +static const struct scpsys_soc_data mt8189_scpsys_data = { + .domains_data = scpsys_domain_data_mt8189, + .num_domains = ARRAY_SIZE(scpsys_domain_data_mt8189), + .bus_prot_blocks = scpsys_bus_prot_blocks_mt8189, + .num_bus_prot_blocks = ARRAY_SIZE(scpsys_bus_prot_blocks_mt8189), +}; + +#endif /* __SOC_MEDIATEK_MT8189_PM_DOMAINS_H */ diff --git a/drivers/pmdomain/mediatek/mtk-pm-domains.c b/drivers/pmdomain/mediatek/mtk-pm-domains.c index 3eeb0dabf7d7..58648f4f689b 100644 --- a/drivers/pmdomain/mediatek/mtk-pm-domains.c +++ b/drivers/pmdomain/mediatek/mtk-pm-domains.c @@ -26,6 +26,7 @@ #include "mt8183-pm-domains.h" #include "mt8186-pm-domains.h" #include "mt8188-pm-domains.h" +#include "mt8189-pm-domains.h" #include "mt8192-pm-domains.h" #include "mt8195-pm-domains.h" #include "mt8196-pm-domains.h" @@ -1171,6 +1172,10 @@ static const struct of_device_id scpsys_of_match[] = { .compatible = "mediatek,mt8188-power-controller", .data = &mt8188_scpsys_data, }, + { + .compatible = "mediatek,mt8189-power-controller", + .data = &mt8189_scpsys_data, + }, { .compatible = "mediatek,mt8192-power-controller", .data = &mt8192_scpsys_data, -- 2.45.2 From irving-ch.lin at mediatek.com Sun Feb 1 22:48:13 2026 From: irving-ch.lin at mediatek.com (irving.ch.lin) Date: Mon, 2 Feb 2026 14:48:13 +0800 Subject: [PATCH 1/3] dt-bindings: power: Add MediaTek MT8189 power domain In-Reply-To: <20260202064820.347550-1-irving-ch.lin@mediatek.com> References: <20260202064820.347550-1-irving-ch.lin@mediatek.com> Message-ID: <20260202064820.347550-2-irving-ch.lin@mediatek.com> From: Irving-CH Lin Add dt schema and IDs for the power domain of MediaTek MT8189 SoC. The MT8189 power domain IP provide power domains control function for subsys (eg. MFG, audio, venc/vdec ...). Signed-off-by: Irving-CH Lin --- .../power/mediatek,power-controller.yaml | 1 + .../dt-bindings/power/mediatek,mt8189-power.h | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 include/dt-bindings/power/mediatek,mt8189-power.h diff --git a/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml b/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml index 9507b342a7ee..07f046277f8a 100644 --- a/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml +++ b/Documentation/devicetree/bindings/power/mediatek,power-controller.yaml @@ -31,6 +31,7 @@ properties: - mediatek,mt8183-power-controller - mediatek,mt8186-power-controller - mediatek,mt8188-power-controller + - mediatek,mt8189-power-controller - mediatek,mt8192-power-controller - mediatek,mt8195-power-controller - mediatek,mt8196-hwv-hfrp-power-controller diff --git a/include/dt-bindings/power/mediatek,mt8189-power.h b/include/dt-bindings/power/mediatek,mt8189-power.h new file mode 100644 index 000000000000..70a8c2113457 --- /dev/null +++ b/include/dt-bindings/power/mediatek,mt8189-power.h @@ -0,0 +1,38 @@ +/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ +/* + * Copyright (c) 2025 MediaTek Inc. + * Author: Qiqi Wang + */ + +#ifndef _DT_BINDINGS_POWER_MT8189_POWER_H +#define _DT_BINDINGS_POWER_MT8189_POWER_H + +/* SPM */ +#define MT8189_POWER_DOMAIN_CONN 0 +#define MT8189_POWER_DOMAIN_AUDIO 1 +#define MT8189_POWER_DOMAIN_ADSP_TOP_DORMANT 2 +#define MT8189_POWER_DOMAIN_ADSP_INFRA 3 +#define MT8189_POWER_DOMAIN_ADSP_AO 4 +#define MT8189_POWER_DOMAIN_MM_INFRA 5 +#define MT8189_POWER_DOMAIN_ISP_IMG1 6 +#define MT8189_POWER_DOMAIN_ISP_IMG2 7 +#define MT8189_POWER_DOMAIN_ISP_IPE 8 +#define MT8189_POWER_DOMAIN_VDE0 9 +#define MT8189_POWER_DOMAIN_VEN0 10 +#define MT8189_POWER_DOMAIN_CAM_MAIN 11 +#define MT8189_POWER_DOMAIN_CAM_SUBA 12 +#define MT8189_POWER_DOMAIN_CAM_SUBB 13 +#define MT8189_POWER_DOMAIN_MDP0 14 +#define MT8189_POWER_DOMAIN_DISP 15 +#define MT8189_POWER_DOMAIN_DP_TX 16 +#define MT8189_POWER_DOMAIN_CSI_RX 17 +#define MT8189_POWER_DOMAIN_SSUSB 18 +#define MT8189_POWER_DOMAIN_MFG0 19 +#define MT8189_POWER_DOMAIN_MFG1 20 +#define MT8189_POWER_DOMAIN_MFG2 21 +#define MT8189_POWER_DOMAIN_MFG3 22 +#define MT8189_POWER_DOMAIN_EDP_TX_DORMANT 23 +#define MT8189_POWER_DOMAIN_PCIE 24 +#define MT8189_POWER_DOMAIN_PCIE_PHY 25 + +#endif /* _DT_BINDINGS_POWER_MT8189_POWER_H */ -- 2.45.2 From shayne.chen at mediatek.com Sun Feb 1 23:53:10 2026 From: shayne.chen at mediatek.com (Shayne Chen) Date: Mon, 2 Feb 2026 15:53:10 +0800 Subject: [PATCH 5/5] wifi: mt76: mt7996: fix queue pause after scan due to wrong channel switch reason In-Reply-To: <20260202075311.365673-1-shayne.chen@mediatek.com> References: <20260202075311.365673-1-shayne.chen@mediatek.com> Message-ID: <20260202075311.365673-5-shayne.chen@mediatek.com> From: StanleyYP Wang Previously, we use the IEEE80211_CONF_IDLE flag to avoid setting the parking channel with the CH_SWITCH_NORMAL reason, which could trigger TX emission before bootup CAC. However, we found that this flag can be set after triggering scanning on a connected station interface, and the reason CH_SWITCH_SCAN_BYPASS_DPD will be used when switching back to the operating channel, which makes the firmware failed to resume paused AC queues. Seems that we should avoid relying on this flag after switching to single multi-radio architecture. Instead, replace it with MT76_STATE_RUNNING. Signed-off-by: StanleyYP Wang Signed-off-by: Shayne Chen --- drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c index 68d698033e43..1d5ea28e7b9b 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c @@ -3925,7 +3925,7 @@ int mt7996_mcu_set_chan_info(struct mt7996_phy *phy, u16 tag) if (phy->mt76->hw->conf.flags & IEEE80211_CONF_MONITOR) req.switch_reason = CH_SWITCH_NORMAL; else if (phy->mt76->offchannel || - phy->mt76->hw->conf.flags & IEEE80211_CONF_IDLE) + !test_bit(MT76_STATE_RUNNING, &phy->mt76->state)) req.switch_reason = CH_SWITCH_SCAN_BYPASS_DPD; else if (!cfg80211_reg_can_beacon(phy->mt76->hw->wiphy, chandef, NL80211_IFTYPE_AP)) -- 2.51.0 From shayne.chen at mediatek.com Sun Feb 1 23:53:06 2026 From: shayne.chen at mediatek.com (Shayne Chen) Date: Mon, 2 Feb 2026 15:53:06 +0800 Subject: [PATCH 1/5] wifi: mt76: fix potential deadlock caused by rx_lock Message-ID: <20260202075311.365673-1-shayne.chen@mediatek.com> A deadlock will occur if both of the following conditions are met, because they each attempt to acquire the rx_lock: - mac80211 receives an unexpected BAR control frame, which triggers a BA deletion - A transmission failure happens due to an abnormality in DMA Since ieee80211_tx_status_ext() is primarily used to address AQL issues, avoid potential deadlocks by restricting calls to ieee80211_tx_status_ext only for data frames. Fixes: 94e4f5794627 ("mt76: dma: use ieee80211_tx_status_ext to free packets when tx fails") Reviewed-by: Money Wang Signed-off-by: Shayne Chen --- drivers/net/wireless/mediatek/mt76/dma.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/dma.c b/drivers/net/wireless/mediatek/mt76/dma.c index 2d133ace7c33..928709f4a206 100644 --- a/drivers/net/wireless/mediatek/mt76/dma.c +++ b/drivers/net/wireless/mediatek/mt76/dma.c @@ -648,6 +648,8 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q, .skb = skb, }; struct mt76_dev *dev = phy->dev; + struct ieee80211_tx_info *info; + struct ieee80211_hdr *hdr; struct ieee80211_hw *hw; int len, n = 0, ret = -ENOMEM; struct mt76_txwi_cache *t; @@ -736,9 +738,16 @@ mt76_dma_tx_queue_skb(struct mt76_phy *phy, struct mt76_queue *q, free_skb: status.skb = tx_info.skb; hw = mt76_tx_status_get_hw(dev, tx_info.skb); - spin_lock_bh(&dev->rx_lock); - ieee80211_tx_status_ext(hw, &status); - spin_unlock_bh(&dev->rx_lock); + hdr = (struct ieee80211_hdr *)tx_info.skb->data; + info = IEEE80211_SKB_CB(tx_info.skb); + if ((info->flags & IEEE80211_TX_CTL_HW_80211_ENCAP) || + ieee80211_is_data(hdr->frame_control)) { + spin_lock_bh(&dev->rx_lock); + ieee80211_tx_status_ext(hw, &status); + spin_unlock_bh(&dev->rx_lock); + } else { + ieee80211_free_txskb(hw, tx_info.skb); + } return ret; } -- 2.51.0 From shayne.chen at mediatek.com Sun Feb 1 23:53:09 2026 From: shayne.chen at mediatek.com (Shayne Chen) Date: Mon, 2 Feb 2026 15:53:09 +0800 Subject: [PATCH 4/5] wifi: mt76: avoid to set ACK for MCU command if wait_resp is not set In-Reply-To: <20260202075311.365673-1-shayne.chen@mediatek.com> References: <20260202075311.365673-1-shayne.chen@mediatek.com> Message-ID: <20260202075311.365673-4-shayne.chen@mediatek.com> From: StanleyYP Wang When wait_resp is not set but the ACK option is enabled in the MCU TXD, the ACK event is enqueued to the MCU event queue without being dequeued by the original MCU command request. Any orphaned ACK events will only be removed from the queue when another MCU command requests a response. Due to sequence index mismatches, these events are discarded one by one until a matching sequence index is found. However, if several MCU commands that do not require a response continue to fill up the event queue, there is a risk that when an MCU command with wait_resp enabled is issued, it may dequeue the wrong event skb, especially if the queue contains events with all possible sequence indices. Signed-off-by: StanleyYP Wang Signed-off-by: Shayne Chen --- drivers/net/wireless/mediatek/mt76/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mcu.c b/drivers/net/wireless/mediatek/mt76/mcu.c index 535c3d8a9cc0..cbfb3bbec503 100644 --- a/drivers/net/wireless/mediatek/mt76/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mcu.c @@ -98,7 +98,7 @@ int mt76_mcu_skb_send_and_get_msg(struct mt76_dev *dev, struct sk_buff *skb, /* orig skb might be needed for retry, mcu_skb_send_msg consumes it */ if (orig_skb) skb_get(orig_skb); - ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb, cmd, &seq); + ret = dev->mcu_ops->mcu_skb_send_msg(dev, skb, cmd, wait_resp ? &seq : NULL); if (ret < 0) goto out; diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c index 285cd83e7117..68d698033e43 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c @@ -322,13 +322,12 @@ mt7996_mcu_send_message(struct mt76_dev *mdev, struct sk_buff *skb, uni_txd->pkt_type = MCU_PKT_ID; uni_txd->seq = seq; - if (cmd & __MCU_CMD_FIELD_QUERY) - uni_txd->option = MCU_CMD_UNI_QUERY_ACK; - else - uni_txd->option = MCU_CMD_UNI_EXT_ACK; + uni_txd->option = MCU_CMD_UNI; + if (!(cmd & __MCU_CMD_FIELD_QUERY)) + uni_txd->option |= MCU_CMD_SET; - if (mcu_cmd == MCU_UNI_CMD_SDO) - uni_txd->option &= ~MCU_CMD_ACK; + if (wait_seq) + uni_txd->option |= MCU_CMD_ACK; if ((cmd & __MCU_CMD_FIELD_WA) && (cmd & __MCU_CMD_FIELD_WM)) uni_txd->s2d_index = MCU_S2D_H2CN; -- 2.51.0 From shayne.chen at mediatek.com Sun Feb 1 23:53:07 2026 From: shayne.chen at mediatek.com (Shayne Chen) Date: Mon, 2 Feb 2026 15:53:07 +0800 Subject: [PATCH 2/5] wifi: mt76: mt7996: fix wrong DMAD length when using MAC TXP In-Reply-To: <20260202075311.365673-1-shayne.chen@mediatek.com> References: <20260202075311.365673-1-shayne.chen@mediatek.com> Message-ID: <20260202075311.365673-2-shayne.chen@mediatek.com> The struct mt76_connac_fw_txp is used for HIF TXP. Change to use the struct mt76_connac_hw_txp to fix the wrong DMAD length for MAC TXP. Fixes: cb6ebbdffef2 ("wifi: mt76: mt7996: support writing MAC TXD for AddBA Request") Signed-off-by: Shayne Chen --- drivers/net/wireless/mediatek/mt76/mt7996/mac.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c index 77a036ac043c..3b09eff216c3 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mac.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mac.c @@ -1099,10 +1099,10 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, * req */ if (le32_to_cpu(ptr[7]) & MT_TXD7_MAC_TXD) { - u32 val; + u32 val, mac_txp_size = sizeof(struct mt76_connac_hw_txp); ptr = (__le32 *)(txwi + MT_TXD_SIZE); - memset((void *)ptr, 0, sizeof(struct mt76_connac_fw_txp)); + memset((void *)ptr, 0, mac_txp_size); val = FIELD_PREP(MT_TXP0_TOKEN_ID0, id) | MT_TXP0_TOKEN_ID0_VALID_MASK; @@ -1121,6 +1121,8 @@ int mt7996_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, tx_info->buf[1].addr >> 32); #endif ptr[3] = cpu_to_le32(val); + + tx_info->buf[0].len = MT_TXD_SIZE + mac_txp_size; } else { struct mt76_connac_txp_common *txp; -- 2.51.0 From shayne.chen at mediatek.com Sun Feb 1 23:53:08 2026 From: shayne.chen at mediatek.com (Shayne Chen) Date: Mon, 2 Feb 2026 15:53:08 +0800 Subject: [PATCH 3/5] wifi: mt76: mt7996: fix struct mt7996_mcu_uni_event In-Reply-To: <20260202075311.365673-1-shayne.chen@mediatek.com> References: <20260202075311.365673-1-shayne.chen@mediatek.com> Message-ID: <20260202075311.365673-3-shayne.chen@mediatek.com> From: StanleyYP Wang The cid field is defined as a two-byte value in the firmware. Fixes: 98686cd21624 ("wifi: mt76: mt7996: add driver for MediaTek Wi-Fi 7 (802.11be) devices") Signed-off-by: StanleyYP Wang Signed-off-by: Shayne Chen --- drivers/net/wireless/mediatek/mt76/mt7996/mcu.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7996/mcu.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c index 8e1c8e1d6a99..285cd83e7117 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.c @@ -242,7 +242,7 @@ mt7996_mcu_parse_response(struct mt76_dev *mdev, int cmd, event = (struct mt7996_mcu_uni_event *)skb->data; ret = le32_to_cpu(event->status); /* skip invalid event */ - if (mcu_cmd != event->cid) + if (mcu_cmd != le16_to_cpu(event->cid)) ret = -EAGAIN; } else { skb_pull(skb, sizeof(struct mt7996_mcu_rxd)); diff --git a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h index d9fb49f7b01b..d70540982983 100644 --- a/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h +++ b/drivers/net/wireless/mediatek/mt76/mt7996/mcu.h @@ -25,8 +25,8 @@ struct mt7996_mcu_rxd { }; struct mt7996_mcu_uni_event { - u8 cid; - u8 __rsv[3]; + __le16 cid; + u8 __rsv[2]; __le32 status; /* 0: success, others: fail */ } __packed; -- 2.51.0 From sven at narfation.org Mon Feb 2 00:14:54 2026 From: sven at narfation.org (Sven Eckelmann) Date: Mon, 02 Feb 2026 09:14:54 +0100 Subject: [PATCH v2] wifi: mt76: fix backoff fields and max_power calculation In-Reply-To: <54627282cfb8e5a89fe753da66552c0a084f6387.1769557863.git.ryder.lee@mediatek.com> References: <54627282cfb8e5a89fe753da66552c0a084f6387.1769557863.git.ryder.lee@mediatek.com> Message-ID: <7906220.EvYhyI6sBW@ripper> On Wednesday, 28 January 2026 00:55:57 CET Ryder Lee wrote: > + case MT76_SKU_BACKOFF: > + backoff_chain_idx += 1; > + fallthrough; > + case MT76_SKU_BACKOFF_BF_OFFSET: > + delta = mt76_tx_power_path_delta(n_chains); > + backoff_n_chains = mt76_backoff_n_chains(dev, backoff_chain_idx); > + backoff_delta = mt76_tx_power_path_delta(backoff_n_chains); > + break; > + default: Please double check whether the "case"s for MT76_SKU_BACKOFF_BF_OFFSET and MT76_SKU_BACKOFF should actually be swapped. I think I've originally introduced this mistake when trying to demonstrate different ways to write the switch block. > + /* For connac2 devices, > + * - paths-ru = RU26, RU52, RU106, BW20, BW40, BW80, BW160 > + * - paths-ru-bf = RU26, RU52, RU106, BW20, BW40, BW80, BW160 > + * Only the first three entries use 1T1ss and do not need index > + * adjustment; the remaining four require index offset. > + */ Hm, I doubt that anyone can understand this (same for the commit message). You basically just showed a list of two equal "array"s. Actually important here is that, RU26, RU52, RU106, ... stand here for 10 different values: 1T1ss, 2T1ss, 3T1ss, 4T1ss, 2T2ss, 3T2ss, 4T2ss, 3T3ss, 4T3ss, 4T4ss For paths-ru-bf, also 10 values are stored in the DT for each of these (RU26, ..., BW160) - but only the non-1T1ss are relevant for this calculation for BW20, ..., BW160. These 1T1ss beamforming values for BW20, ..., BW160 were (if I understand it correctly) removed for connac3. If you introduce some change in the DT interpretation, then you must also inform the DT maintainers (Rob Herring , Saravana Kannan , devicetree at vger.kernel.org) while updatingDocumentation/devicetree/bindings/net/wireless/mediatek%2Cmt76.yaml. The latter is currently still expecting 1 ("rates multiplier") + 10 values (limits). And DTs with only 1 + 9 values per rate would therefore fail to be validated. At the moment, your connac3 code is basically conflicting with the devicetree documentation. I will leave it to the experts to figure out if the devicetree should have two different interpretations for the same property or whether the property should be the same and the code must handle the differences before sending these values to the HW. Regards, Sven -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 228 bytes Desc: This is a digitally signed message part. URL: From peter.wang at mediatek.com Mon Feb 2 00:14:57 2026 From: peter.wang at mediatek.com (=?utf-8?B?UGV0ZXIgV2FuZyAo546L5L+h5Y+LKQ==?=) Date: Mon, 2 Feb 2026 08:14:57 +0000 Subject: [PATCH] scsi: ufs: mediatek: Fix page faults in ufs_mtk_clk_scale trace event In-Reply-To: <20260202024526.122515-1-keita.morisaki@tier4.jp> References: <20260202024526.122515-1-keita.morisaki@tier4.jp> Message-ID: On Mon, 2026-02-02 at 11:45 +0900, Keita Morisaki wrote: > The ufs_mtk_clk_scale trace event currently stores the address of the > name string directly via __field(const char *, name). This pointer > may > become invalid after the module is unloaded, causing page faults when > the trace buffer is subsequently accessed. > > This can occur because the MediaTek UFS driver can be configured as a > loadable module (tristate in Kconfig), meaning the name string passed > to the trace event may reside in module memory that becomes invalid > after module unload. > > Fix this by using __string() and __assign_str() to copy the string > contents into the ring buffer instead of storing the pointer. This > ensures the trace data remains valid regardless of module state. > > This change increases the memory usage for each ftrace entry by a few > bytes (clock names are typically 7-15 characters like "ufs_sel" or > "ufs_sel_max_src") compared to storing an 8-byte pointer. > > Note that this change does not affect anything unless all of the > following conditions are met: > - CONFIG_SCSI_UFS_MEDIATEK is enabled > - ftrace tracing is enabled > - The ufs_mtk_clk_scale event is enabled in ftrace > > Signed-off-by: Keita Morisaki > --- > ?drivers/ufs/host/ufs-mediatek-trace.h | 6 +++--- > ?1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/drivers/ufs/host/ufs-mediatek-trace.h > b/drivers/ufs/host/ufs-mediatek-trace.h > index b5f2ec314..0df8ac843 100644 > --- a/drivers/ufs/host/ufs-mediatek-trace.h > +++ b/drivers/ufs/host/ufs-mediatek-trace.h > @@ -33,19 +33,19 @@ TRACE_EVENT(ufs_mtk_clk_scale, > ??????? TP_ARGS(name, scale_up, clk_rate), > > ??????? TP_STRUCT__entry( > -?????????????? __field(const char*, name) > +?????????????? __string(name, name) > ??????????????? __field(bool, scale_up) > ??????????????? __field(unsigned long, clk_rate) > ??????? ), > > ??????? TP_fast_assign( > -?????????????? __entry->name = name; > +?????????????? __assign_str(name); > ??????????????? __entry->scale_up = scale_up; > ??????????????? __entry->clk_rate = clk_rate; > ??????? ), > > ??????? TP_printk("ufs: clk (%s) scaled %s @ %lu", > -???????????????? __entry->name, > +???????????????? __get_str(name), > ????????????????? __entry->scale_up ? "up" : "down", > ????????????????? __entry->clk_rate) > ?); > Hi Keita Morisaki, Thank you for fixing this bug. Reviewed-by: Peter Wang From ck.hu at mediatek.com Mon Feb 2 00:46:21 2026 From: ck.hu at mediatek.com (=?utf-8?B?Q0sgSHUgKOiDoeS/iuWFiSk=?=) Date: Mon, 2 Feb 2026 08:46:21 +0000 Subject: [PATCH RFC 3/6] drm/mediatek: ovl: Fix misaligned layer source size on AFBC mode In-Reply-To: <20251230-mtk-afbc-fixes-v1-3-6c0247b66e32@collabora.com> References: <20251230-mtk-afbc-fixes-v1-0-6c0247b66e32@collabora.com> <20251230-mtk-afbc-fixes-v1-3-6c0247b66e32@collabora.com> Message-ID: On Tue, 2025-12-30 at 11:03 -0300, N?colas F. R. A. Prado wrote: > From: Ariel D'Alessandro > > In AFBC mode, OVL_SRC_SIZE must be block aligned. Due to this limitation > of the AFBC format, OVL_CLIP needs to be used to achieve the desired > output size of the layer while still meeting the alignment constraints. > Failure to do this will result in vblank timeouts and no rendered output > when the AFBC data source isn't aligned to the AFBC block (32x8). > > Configure OVL_CLIP so unaligned AFBC layers can be displayed. > > The following illustrates how the alignment is achieved through the clip > settings for the horizontal coordinates, the vertical coordinates are > analogous: > > /------------------------------------------------\ > > | > > ........................ | > > ........................ | > > ........................ | > > ........................ | > > | > \------------------------------------------------/ > | | | | > | src.x1 src.x2 | > | | | | > | |<-------------------->| | > | src_width | This patch looks to me. But "In AFBC mode, OVL_SRC_SIZE must be block aligned", so this graph should show as: | src.x1 src.x2 | | | | | | | | | N * AFBC_DATA_BLOCK_WIDTH | M * AFBC_DATA_BLOCK_WIDTH | | | | |<----->| |<----->| |clip_left clip_right | | |<------------------------------------>| | src_width | Regards, CK > | | > N * AFBC_DATA_BLOCK_WIDTH M * AFBC_DATA_BLOCK_WIDTH > | | > |<----->| |<----->| > clip_left clip_right > > Signed-off-by: Ariel D'Alessandro > Co-developed-by: N?colas F. R. A. Prado > Signed-off-by: N?colas F. R. A. Prado > --- > drivers/gpu/drm/mediatek/mtk_disp_ovl.c | 35 ++++++++++++++++++++++++++++----- > drivers/gpu/drm/mediatek/mtk_plane.c | 21 ++++++++++++++++++++ > drivers/gpu/drm/mediatek/mtk_plane.h | 4 ++++ > 3 files changed, 55 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > index 8e20b45411fc..c6a00c2256dd 100644 > --- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > +++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c > @@ -39,6 +39,11 @@ > #define OVL_PITCH_MSB_2ND_SUBBUF BIT(16) > #define DISP_REG_OVL_PITCH(n) (0x0044 + 0x20 * (n)) > #define OVL_CONST_BLEND BIT(28) > +#define DISP_REG_OVL_CLIP(n) (0x004C + 0x20 * (n)) > +#define OVL_CLIP_LEFT GENMASK(7, 0) > +#define OVL_CLIP_RIGHT GENMASK(15, 8) > +#define OVL_CLIP_TOP GENMASK(23, 16) > +#define OVL_CLIP_BOTTOM GENMASK(31, 24) > #define DISP_REG_OVL_RDMA_CTRL(n) (0x00c0 + 0x20 * (n)) > #define DISP_REG_OVL_RDMA_GMC(n) (0x00c8 + 0x20 * (n)) > #define DISP_REG_OVL_ADDR_MT2701 0x0040 > @@ -499,13 +504,14 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx, > struct mtk_plane_pending_state *pending = &state->pending; > unsigned int addr = pending->addr; > unsigned int pitch_lsb = pending->pitch & GENMASK(15, 0); > + unsigned long long modifier = pending->modifier; > unsigned int fmt = pending->format; > unsigned int rotation = pending->rotation; > unsigned int offset = (pending->y << 16) | pending->x; > - unsigned int src_size = (pending->height << 16) | pending->width; > unsigned int blend_mode = state->base.pixel_blend_mode; > unsigned int ignore_pixel_alpha = 0; > - unsigned int con; > + unsigned int src_size, con, src_width, src_height; > + unsigned int clip = 0; > > if (!pending->enable) { > mtk_ovl_layer_off(dev, idx, cmdq_pkt); > @@ -550,9 +556,26 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx, > addr += pending->pitch - 1; > } > > - if (ovl->data->supports_afbc) > - mtk_ovl_set_afbc(ovl, cmdq_pkt, idx, > - pending->modifier != DRM_FORMAT_MOD_LINEAR); > + if (ovl->data->supports_afbc && (modifier != DRM_FORMAT_MOD_LINEAR)) { > + /* > + * In AFBC mode, OVL_SRC_SIZE must be block aligned. Due to this > + * limitation of the AFBC format, OVL_CLIP is used to adjust the > + * output size of the layer. > + */ > + clip = FIELD_PREP(OVL_CLIP_BOTTOM, pending->clip_bottom) | > + FIELD_PREP(OVL_CLIP_TOP, pending->clip_top) | > + FIELD_PREP(OVL_CLIP_RIGHT, pending->clip_right) | > + FIELD_PREP(OVL_CLIP_LEFT, pending->clip_left); > + src_height = pending->height + pending->clip_top + pending->clip_bottom; > + src_width = pending->width + pending->clip_left + pending->clip_right; > + mtk_ovl_set_afbc(ovl, cmdq_pkt, idx, true); > + } else { > + src_height = pending->height; > + src_width = pending->width; > + mtk_ovl_set_afbc(ovl, cmdq_pkt, idx, false); > + } > + > + src_size = (src_height << 16) | src_width; > > mtk_ddp_write_relaxed(cmdq_pkt, con, &ovl->cmdq_reg, ovl->regs, > DISP_REG_OVL_CON(idx)); > @@ -560,6 +583,8 @@ void mtk_ovl_layer_config(struct device *dev, unsigned int idx, > &ovl->cmdq_reg, ovl->regs, DISP_REG_OVL_PITCH(idx)); > mtk_ddp_write_relaxed(cmdq_pkt, src_size, &ovl->cmdq_reg, ovl->regs, > DISP_REG_OVL_SRC_SIZE(idx)); > + mtk_ddp_write_relaxed(cmdq_pkt, clip, &ovl->cmdq_reg, ovl->regs, > + DISP_REG_OVL_CLIP(idx)); > mtk_ddp_write_relaxed(cmdq_pkt, offset, &ovl->cmdq_reg, ovl->regs, > DISP_REG_OVL_OFFSET(idx)); > mtk_ddp_write_relaxed(cmdq_pkt, addr, &ovl->cmdq_reg, ovl->regs, > diff --git a/drivers/gpu/drm/mediatek/mtk_plane.c b/drivers/gpu/drm/mediatek/mtk_plane.c > index 1214f623859e..8fb08768e8ce 100644 > --- a/drivers/gpu/drm/mediatek/mtk_plane.c > +++ b/drivers/gpu/drm/mediatek/mtk_plane.c > @@ -114,6 +114,7 @@ static void mtk_plane_update_new_state(struct drm_plane_state *new_state, > struct mtk_plane_state *mtk_plane_state) > { > struct drm_framebuffer *fb = new_state->fb; > + unsigned int clip_left = 0, clip_top = 0, clip_right = 0, clip_bottom = 0; > struct drm_gem_object *gem; > struct mtk_gem_obj *mtk_gem; > unsigned int pitch, format; > @@ -148,6 +149,22 @@ static void mtk_plane_update_new_state(struct drm_plane_state *new_state, > int x_offset_in_blocks = (new_state->src.x1 >> 16) / AFBC_DATA_BLOCK_WIDTH; > int y_offset_in_blocks = (new_state->src.y1 >> 16) / AFBC_DATA_BLOCK_HEIGHT; > int hdr_size, hdr_offset; > + int src_width = drm_rect_width(&new_state->src) >> 16; > + int src_height = drm_rect_height(&new_state->src) >> 16; > + unsigned int remainder_right, remainder_bottom; > + > + /* > + * In AFBC mode, the source size configured needs to be a > + * multiple of the AFBC data block size. Compute and save the > + * necessary clips so the indeded x, y, width and height are > + * obtained in the output despite this constraint. > + */ > + clip_left = (new_state->src.x1 >> 16) % AFBC_DATA_BLOCK_WIDTH; > + clip_top = (new_state->src.y1 >> 16) % AFBC_DATA_BLOCK_HEIGHT; > + remainder_right = (src_width + clip_left) % AFBC_DATA_BLOCK_WIDTH; > + clip_right = remainder_right ? AFBC_DATA_BLOCK_WIDTH - remainder_right : 0; > + remainder_bottom = (src_height + clip_top) % AFBC_DATA_BLOCK_HEIGHT; > + clip_bottom = remainder_bottom ? AFBC_DATA_BLOCK_HEIGHT - remainder_bottom : 0; > > hdr_pitch = width_in_blocks * AFBC_HEADER_BLOCK_SIZE; > pitch = width_in_blocks * AFBC_DATA_BLOCK_WIDTH * > @@ -187,6 +204,10 @@ static void mtk_plane_update_new_state(struct drm_plane_state *new_state, > mtk_plane_state->pending.y = new_state->dst.y1; > mtk_plane_state->pending.width = drm_rect_width(&new_state->dst); > mtk_plane_state->pending.height = drm_rect_height(&new_state->dst); > + mtk_plane_state->pending.clip_left = clip_left; > + mtk_plane_state->pending.clip_top = clip_top; > + mtk_plane_state->pending.clip_right = clip_right; > + mtk_plane_state->pending.clip_bottom = clip_bottom; > mtk_plane_state->pending.rotation = new_state->rotation; > mtk_plane_state->pending.color_encoding = new_state->color_encoding; > } > diff --git a/drivers/gpu/drm/mediatek/mtk_plane.h b/drivers/gpu/drm/mediatek/mtk_plane.h > index 46be4454bc92..a9cfb2ee5859 100644 > --- a/drivers/gpu/drm/mediatek/mtk_plane.h > +++ b/drivers/gpu/drm/mediatek/mtk_plane.h > @@ -28,6 +28,10 @@ struct mtk_plane_pending_state { > unsigned int y; > unsigned int width; > unsigned int height; > + unsigned int clip_left; > + unsigned int clip_top; > + unsigned int clip_right; > + unsigned int clip_bottom; > unsigned int rotation; > bool dirty; > bool async_dirty; > From nbd at nbd.name Mon Feb 2 00:52:50 2026 From: nbd at nbd.name (Felix Fietkau) Date: Mon, 2 Feb 2026 09:52:50 +0100 Subject: [PATCH 1/5] wifi: mt76: fix potential deadlock caused by rx_lock In-Reply-To: <20260202075311.365673-1-shayne.chen@mediatek.com> References: <20260202075311.365673-1-shayne.chen@mediatek.com> Message-ID: On 02.02.26 08:53, Shayne Chen wrote: > A deadlock will occur if both of the following conditions are met, > because they each attempt to acquire the rx_lock: > - mac80211 receives an unexpected BAR control frame, which triggers > a BA deletion > - A transmission failure happens due to an abnormality in DMA > > Since ieee80211_tx_status_ext() is primarily used to address AQL issues, > avoid potential deadlocks by restricting calls to ieee80211_tx_status_ext > only for data frames. First of all, ieee80211_tx_status_ext is not primarily used to address AQL, ieee80211_free_txskb handles it as well. The reason for it is tx status handling, e.g. for management frames sent by hostapd that require an ACK status report, so limiting the status calls for data frames seems wrong to me. I don't really understand how the scenario you're describing leads to a deadlock. From my understanding, if something in the mac80211 rx path triggers a tx, it should end up calling mt76_tx(), which queues the skb to wcid->tx_list and triggers the tx worker. So the actual dma tx callls are expected to come from the worker kthread. How does this lead to a deadlock on rx_lock? - Felix From nbd at nbd.name Mon Feb 2 01:01:16 2026 From: nbd at nbd.name (Felix Fietkau) Date: Mon, 2 Feb 2026 10:01:16 +0100 Subject: [PATCH 5/5] wifi: mt76: mt7996: fix queue pause after scan due to wrong channel switch reason In-Reply-To: <20260202075311.365673-5-shayne.chen@mediatek.com> References: <20260202075311.365673-1-shayne.chen@mediatek.com> <20260202075311.365673-5-shayne.chen@mediatek.com> Message-ID: On 02.02.26 08:53, Shayne Chen wrote: > From: StanleyYP Wang > > Previously, we use the IEEE80211_CONF_IDLE flag to avoid setting the > parking channel with the CH_SWITCH_NORMAL reason, which could trigger TX > emission before bootup CAC. > > However, we found that this flag can be set after triggering scanning on a > connected station interface, and the reason CH_SWITCH_SCAN_BYPASS_DPD will > be used when switching back to the operating channel, which makes the > firmware failed to resume paused AC queues. > > Seems that we should avoid relying on this flag after switching to single > multi-radio architecture. Instead, replace it with MT76_STATE_RUNNING. I don't see how the conditions are comparable at all. I also don't see how this function can be called with MT76_STATE_RUNNING unset. Maybe a better replacement would be to check for a chanctx on the phy? - Felix From arnd at kernel.org Mon Feb 2 01:50:18 2026 From: arnd at kernel.org (Arnd Bergmann) Date: Mon, 2 Feb 2026 10:50:18 +0100 Subject: [PATCH] scsi: ufs: host: mediatek: require CONFIG_PM Message-ID: <20260202095052.1232703-1-arnd@kernel.org> From: Arnd Bergmann The added print statement from a recent fix causes the driver to fail building when CONFIG_PM is disabled: drivers/ufs/host/ufs-mediatek.c: In function 'ufs_mtk_resume': drivers/ufs/host/ufs-mediatek.c:1890:40: error: 'struct dev_pm_info' has no member named 'request' 1890 | hba->dev->power.request, It seems unlikely that the driver can work at all without CONFIG_PM, so just add a dependency and remove the existing ifdef checks, rather than adding another ifdef. Fixes: 15ef3f5aa822 ("scsi: ufs: host: mediatek: Enhance recovery on resume failure") Signed-off-by: Arnd Bergmann --- drivers/ufs/host/Kconfig | 1 + drivers/ufs/host/ufs-mediatek.c | 12 +++--------- include/ufs/ufshcd.h | 4 ---- 3 files changed, 4 insertions(+), 13 deletions(-) diff --git a/drivers/ufs/host/Kconfig b/drivers/ufs/host/Kconfig index 7d5117b2dab4..964ae70e7390 100644 --- a/drivers/ufs/host/Kconfig +++ b/drivers/ufs/host/Kconfig @@ -72,6 +72,7 @@ config SCSI_UFS_QCOM config SCSI_UFS_MEDIATEK tristate "Mediatek specific hooks to UFS controller platform driver" depends on SCSI_UFSHCD_PLATFORM && ARCH_MEDIATEK + depends on PM depends on RESET_CONTROLLER select PHY_MTK_UFS select RESET_TI_SYSCON diff --git a/drivers/ufs/host/ufs-mediatek.c b/drivers/ufs/host/ufs-mediatek.c index 66b11cc0703b..b3daaa07e925 100644 --- a/drivers/ufs/host/ufs-mediatek.c +++ b/drivers/ufs/host/ufs-mediatek.c @@ -2437,7 +2437,6 @@ static void ufs_mtk_remove(struct platform_device *pdev) ufshcd_pltfrm_remove(pdev); } -#ifdef CONFIG_PM_SLEEP static int ufs_mtk_system_suspend(struct device *dev) { struct ufs_hba *hba = dev_get_drvdata(dev); @@ -2484,9 +2483,7 @@ static int ufs_mtk_system_resume(struct device *dev) return ret; } -#endif -#ifdef CONFIG_PM static int ufs_mtk_runtime_suspend(struct device *dev) { struct ufs_hba *hba = dev_get_drvdata(dev); @@ -2525,13 +2522,10 @@ static int ufs_mtk_runtime_resume(struct device *dev) return ufshcd_runtime_resume(dev); } -#endif static const struct dev_pm_ops ufs_mtk_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(ufs_mtk_system_suspend, - ufs_mtk_system_resume) - SET_RUNTIME_PM_OPS(ufs_mtk_runtime_suspend, - ufs_mtk_runtime_resume, NULL) + SYSTEM_SLEEP_PM_OPS(ufs_mtk_system_suspend, ufs_mtk_system_resume) + RUNTIME_PM_OPS(ufs_mtk_runtime_suspend, ufs_mtk_runtime_resume, NULL) .prepare = ufshcd_suspend_prepare, .complete = ufshcd_resume_complete, }; @@ -2541,7 +2535,7 @@ static struct platform_driver ufs_mtk_pltform = { .remove = ufs_mtk_remove, .driver = { .name = "ufshcd-mtk", - .pm = &ufs_mtk_pm_ops, + .pm = pm_ptr(&ufs_mtk_pm_ops), .of_match_table = ufs_mtk_of_match, }, }; diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h index a64c19563b03..8563b6648976 100644 --- a/include/ufs/ufshcd.h +++ b/include/ufs/ufshcd.h @@ -1344,17 +1344,13 @@ static inline void *ufshcd_get_variant(struct ufs_hba *hba) return hba->priv; } -#ifdef CONFIG_PM extern int ufshcd_runtime_suspend(struct device *dev); extern int ufshcd_runtime_resume(struct device *dev); -#endif -#ifdef CONFIG_PM_SLEEP extern int ufshcd_system_suspend(struct device *dev); extern int ufshcd_system_resume(struct device *dev); extern int ufshcd_system_freeze(struct device *dev); extern int ufshcd_system_thaw(struct device *dev); extern int ufshcd_system_restore(struct device *dev); -#endif extern int ufshcd_dme_reset(struct ufs_hba *hba); extern int ufshcd_dme_enable(struct ufs_hba *hba); -- 2.39.5 From angelogioacchino.delregno at collabora.com Mon Feb 2 03:42:33 2026 From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno) Date: Mon, 2 Feb 2026 12:42:33 +0100 Subject: [PATCH] scsi: ufs: host: mediatek: require CONFIG_PM In-Reply-To: <20260202095052.1232703-1-arnd@kernel.org> References: <20260202095052.1232703-1-arnd@kernel.org> Message-ID: <845cca9d-1912-4f00-8245-3d5293f164db@collabora.com> Il 02/02/26 10:50, Arnd Bergmann ha scritto: > From: Arnd Bergmann > > The added print statement from a recent fix causes the > driver to fail building when CONFIG_PM is disabled: > > drivers/ufs/host/ufs-mediatek.c: In function 'ufs_mtk_resume': > drivers/ufs/host/ufs-mediatek.c:1890:40: error: 'struct dev_pm_info' has no member named 'request' > 1890 | hba->dev->power.request, > > It seems unlikely that the driver can work at all without > CONFIG_PM, so just add a dependency and remove the existing > ifdef checks, rather than adding another ifdef. > > Fixes: 15ef3f5aa822 ("scsi: ufs: host: mediatek: Enhance recovery on resume failure") > Signed-off-by: Arnd Bergmann Reviewed-by: AngeloGioacchino Del Regno From shayne.chen at mediatek.com Mon Feb 2 03:46:06 2026 From: shayne.chen at mediatek.com (Shayne Chen) Date: Mon, 2 Feb 2026 19:46:06 +0800 Subject: [PATCH 1/5] wifi: mt76: fix potential deadlock caused by rx_lock In-Reply-To: References: <20260202075311.365673-1-shayne.chen@mediatek.com> Message-ID: <1d327fad53675a7193c81e9c0ae2e91c2aa4e74d.camel@mediatek.com> On Mon, 2026-02-02 at 09:52 +0100, Felix Fietkau wrote: > On 02.02.26 08:53, Shayne Chen wrote: > > A deadlock will occur if both of the following conditions are met, > > because they each attempt to acquire the rx_lock: > > - mac80211 receives an unexpected BAR control frame, which triggers > > ?? a BA deletion > > - A transmission failure happens due to an abnormality in DMA > > > > Since ieee80211_tx_status_ext() is primarily used to address AQL > > issues, > > avoid potential deadlocks by restricting calls to > > ieee80211_tx_status_ext > > only for data frames. > > First of all, ieee80211_tx_status_ext is not primarily used to > address > AQL, ieee80211_free_txskb handles it as well. The reason for it is tx > status handling, e.g. for management frames sent by hostapd that > require > an ACK status report, so limiting the status calls for data frames > seems > wrong to me. > > I don't really understand how the scenario you're describing leads to > a > deadlock. From my understanding, if something in the mac80211 rx path > triggers a tx, it should end up calling mt76_tx(), which queues the > skb > to wcid->tx_list and triggers the tx worker. So the actual dma tx > callls > are expected to come from the worker kthread. > How does this lead to a deadlock on rx_lock? Hi Felix, Thanks for the explanation. I've re-checked the codebase used by the customer when the issue was reported, and I found that the wcid->tx_list structure was not present in that version. So yes, this problem should not occur in the current codebase. Will drop this patch in v2. Thanks, Shayne > > - Felix From shayne.chen at mediatek.com Mon Feb 2 03:52:33 2026 From: shayne.chen at mediatek.com (Shayne Chen) Date: Mon, 2 Feb 2026 19:52:33 +0800 Subject: [PATCH 5/5] wifi: mt76: mt7996: fix queue pause after scan due to wrong channel switch reason In-Reply-To: References: <20260202075311.365673-1-shayne.chen@mediatek.com> <20260202075311.365673-5-shayne.chen@mediatek.com> Message-ID: <41b9111e696c0b0a9a3ad4d8728cf9819aa64708.camel@mediatek.com> On Mon, 2026-02-02 at 10:01 +0100, Felix Fietkau wrote: > On 02.02.26 08:53, Shayne Chen wrote: > > From: StanleyYP Wang > > > > Previously, we use the IEEE80211_CONF_IDLE flag to avoid setting > > the > > parking channel with the CH_SWITCH_NORMAL reason, which could > > trigger TX > > emission before bootup CAC. > > > > However, we found that this flag can be set after triggering > > scanning on a > > connected station interface, and the reason > > CH_SWITCH_SCAN_BYPASS_DPD will > > be used when switching back to the operating channel, which makes > > the > > firmware failed to resume paused AC queues. > > > > Seems that we should avoid relying on this flag after switching to > > single > > multi-radio architecture. Instead, replace it with > > MT76_STATE_RUNNING. > > I don't see how the conditions are comparable at all. I also don't > see > how this function can be called with MT76_STATE_RUNNING unset. > The condition is used to prevent mt7996_mcu_set_chan_info() (in mt7996_run()) from triggering TX emission. > Maybe a better replacement would be to check for a chanctx on the > phy? > Will do some tests on this and send v2. Thanks, Shayne > - Felix From angelogioacchino.delregno at collabora.com Mon Feb 2 04:02:04 2026 From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno) Date: Mon, 2 Feb 2026 13:02:04 +0100 Subject: [PATCH 3/3] pmdomain: mediatek: Add power domain driver for MT8189 SoC In-Reply-To: <20260202064820.347550-4-irving-ch.lin@mediatek.com> References: <20260202064820.347550-1-irving-ch.lin@mediatek.com> <20260202064820.347550-4-irving-ch.lin@mediatek.com> Message-ID: Il 02/02/26 07:48, irving.ch.lin ha scritto: > From: Irving-CH Lin > > Introduce a new power domain (pmd) driver for the MediaTek mt8189 SoC. > This driver ports and refines the power domain framework, dividing > hardware blocks (CPU, GPU, peripherals, etc.) into independent power > domains for precise and energy-efficient power management. > > Signed-off-by: Irving-CH Lin Reviewed-by: AngeloGioacchino Del Regno From angelogioacchino.delregno at collabora.com Mon Feb 2 04:02:06 2026 From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno) Date: Mon, 2 Feb 2026 13:02:06 +0100 Subject: [PATCH 2/3] pmdomain: mediatek: Add bus protect control flow for MT8189 In-Reply-To: <20260202064820.347550-3-irving-ch.lin@mediatek.com> References: <20260202064820.347550-1-irving-ch.lin@mediatek.com> <20260202064820.347550-3-irving-ch.lin@mediatek.com> Message-ID: <5742bfd3-d08d-4d45-968d-5cef9ec060f4@collabora.com> Il 02/02/26 07:48, irving.ch.lin ha scritto: > From: Irving-CH Lin > > In MT8189 mminfra power domain, the bus protect policy separates > into two parts, one is set before subsys clocks enabled, and another > need to enable after subsys clocks enable. > > Signed-off-by: Irving-CH Lin Reviewed-by: AngeloGioacchino Del Regno From angelogioacchino.delregno at collabora.com Mon Feb 2 04:02:08 2026 From: angelogioacchino.delregno at collabora.com (AngeloGioacchino Del Regno) Date: Mon, 2 Feb 2026 13:02:08 +0100 Subject: [PATCH 1/3] dt-bindings: power: Add MediaTek MT8189 power domain In-Reply-To: <20260202064820.347550-2-irving-ch.lin@mediatek.com> References: <20260202064820.347550-1-irving-ch.lin@mediatek.com> <20260202064820.347550-2-irving-ch.lin@mediatek.com> Message-ID: <7727490a-16bf-4774-84a0-4fcf3b34f393@collabora.com> Il 02/02/26 07:48, irving.ch.lin ha scritto: > From: Irving-CH Lin > > Add dt schema and IDs for the power domain of MediaTek MT8189 SoC. > The MT8189 power domain IP provide power domains control function > for subsys (eg. MFG, audio, venc/vdec ...). > > Signed-off-by: Irving-CH Lin Reviewed-by: AngeloGioacchino Del Regno From nbd at nbd.name Mon Feb 2 04:22:53 2026 From: nbd at nbd.name (Felix Fietkau) Date: Mon, 2 Feb 2026 13:22:53 +0100 Subject: [PATCH 5/5] wifi: mt76: mt7996: fix queue pause after scan due to wrong channel switch reason In-Reply-To: <41b9111e696c0b0a9a3ad4d8728cf9819aa64708.camel@mediatek.com> References: <20260202075311.365673-1-shayne.chen@mediatek.com> <20260202075311.365673-5-shayne.chen@mediatek.com> <41b9111e696c0b0a9a3ad4d8728cf9819aa64708.camel@mediatek.com> Message-ID: <0df57be5-a8ed-4dc4-856a-a45fe4f4466d@nbd.name> On 02.02.26 12:52, Shayne Chen wrote: > On Mon, 2026-02-02 at 10:01 +0100, Felix Fietkau wrote: >> On 02.02.26 08:53, Shayne Chen wrote: >> > From: StanleyYP Wang >> > >> > Previously, we use the IEEE80211_CONF_IDLE flag to avoid setting >> > the >> > parking channel with the CH_SWITCH_NORMAL reason, which could >> > trigger TX >> > emission before bootup CAC. >> > >> > However, we found that this flag can be set after triggering >> > scanning on a >> > connected station interface, and the reason >> > CH_SWITCH_SCAN_BYPASS_DPD will >> > be used when switching back to the operating channel, which makes >> > the >> > firmware failed to resume paused AC queues. >> > >> > Seems that we should avoid relying on this flag after switching to >> > single >> > multi-radio architecture. Instead, replace it with >> > MT76_STATE_RUNNING. >> >> I don't see how the conditions are comparable at all. I also don't >> see >> how this function can be called with MT76_STATE_RUNNING unset. >> > The condition is used to prevent mt7996_mcu_set_chan_info() (in > mt7996_run()) from triggering TX emission. Makes sense. >> Maybe a better replacement would be to check for a chanctx on the >> phy? >> > Will do some tests on this and send v2. Thanks. - Felix