* [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output
@ 2026-10-10 11:54 Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 1/7] dt-bindings: mediatek: hdmi-phy: Add compatible for mt8167 Luca Leonardo Scorcia
` (6 more replies)
0 siblings, 7 replies; 8+ messages in thread
From: Luca Leonardo Scorcia @ 2026-10-10 11:54 UTC (permalink / raw)
To: linux-mediatek
Cc: Luca Leonardo Scorcia, Chunfeng Yun, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Stephen Boyd, Brian Masney, Jerome Brunet, Chun-Kuang Hu,
Philipp Zabel, David Airlie, Simona Vetter, Nicolas Frattaroli,
Chen-Yu Tsai, Fabien Parent, CK Hu, chunhui dai,
linux-arm-kernel, linux-phy, devicetree, linux-kernel, linux-clk,
dri-devel
The MediaTek mt8167 SoC supports HDMI output via a dedicated HDMI PHY
driven by the DPI1 display block.
Support for HDMI output was partially upstreamed in 2021, but is currently
not functional as it's missing its HDMI PHY driver. The HDMI PHY is
apparently similar to the mt2701 one, but some differences in timings and
in the initialization sequence are better expressed with a separate driver.
* Patch 1, 2 add support for the HDMI PHY.
In addition to the HDMI PHY, a few fixes are required here and there to
actually get HDMI output.
* Patch 3: Some of the HDMI registers are mapped into the apmixedsys
syscon. Since they are manipulated inside the HDMI PHY driver, we change
the apmixedsys memory map to non exclusive by switching it from
devm_platform_ioremap_resource to of_iomap. This approach was copied
from mt8173 apmixedsys syscon.
* Patch 4: Since the DPI1 interface is hardwired to the HDMI PHY, it is
appropriate for the HDMI PHY to control the DPI1 clocks. There is no
effect on DPI0 clocks as they're completely separate.
* Patch 5: Some MediaTek SoCs require a supervisor call to enable HDMI
output. mt8167 is not one of those.
* Patch 6: In the common path for mt2701/mt8167, a register operation that
is meant to enable the HDMI_PSECUR_EN bit is actually touching some
other bits that are set by later operations anyway. The patch makes
more explicit the intent of the operation by setting only the necessary
bit.
* Patch 7: Adds the device tree nodes to the mt8167 dtsi. Since DPI1
is hardwired to HDMI it is possible to bind the input port of the HDMI
node to the output port of DPI1, but the patch that adds the DPI nodes
to the DTSI [1] has not been picked up yet, so we leave it disconnected
for now.
The series was tested at all supported resolutions on the Sony PlayStation
Classic Mini.
[1] https://lore.kernel.org/linux-mediatek/20260921113914.779393-5-l.scorcia@gmail.com/
Luca Leonardo Scorcia (7):
dt-bindings: mediatek: hdmi-phy: Add compatible for mt8167
phy: mediatek: hdmi: Add support for mt8167
clk: mediatek: mt8167: Map apmixedsys iomem as shared
clk: mediatek: mt8167: Correct HDMI-related clock definitions
drm/mediatek: mtk_hdmi: Set tz_disabled for mt8167
drm/mediatek: mtk_hdmi: Improve the secure output bit toggle
arm64: dts: mediatek: mt8167: Add HDMI display nodes
.../bindings/phy/mediatek,hdmi-phy.yaml | 1 +
arch/arm64/boot/dts/mediatek/mt8167.dtsi | 62 +++++
drivers/clk/mediatek/clk-mt8167-apmixedsys.c | 26 ++-
drivers/clk/mediatek/clk-mt8167.c | 6 +-
drivers/gpu/drm/mediatek/mtk_hdmi.c | 3 +-
drivers/gpu/drm/mediatek/mtk_hdmi_regs.h | 1 +
drivers/phy/mediatek/Makefile | 1 +
drivers/phy/mediatek/phy-mtk-hdmi-mt8167.c | 217 ++++++++++++++++++
drivers/phy/mediatek/phy-mtk-hdmi.c | 3 +
drivers/phy/mediatek/phy-mtk-hdmi.h | 1 +
10 files changed, 314 insertions(+), 7 deletions(-)
create mode 100644 drivers/phy/mediatek/phy-mtk-hdmi-mt8167.c
base-commit: a90ee4305c4a5df72c11b31dacfdc76e00fcf78a
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 1/7] dt-bindings: mediatek: hdmi-phy: Add compatible for mt8167
2026-10-10 11:54 [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output Luca Leonardo Scorcia
@ 2026-10-10 11:54 ` Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 2/7] phy: mediatek: hdmi: Add support " Luca Leonardo Scorcia
` (5 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Luca Leonardo Scorcia @ 2026-10-10 11:54 UTC (permalink / raw)
To: linux-mediatek
Cc: Luca Leonardo Scorcia, Chunfeng Yun, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Stephen Boyd, Brian Masney, Jerome Brunet, Chun-Kuang Hu,
Philipp Zabel, David Airlie, Simona Vetter, Nicolas Frattaroli,
Chen-Yu Tsai, Fabien Parent, CK Hu, chunhui dai,
linux-arm-kernel, linux-phy, devicetree, linux-kernel, linux-clk,
dri-devel
The hdmi-phy for the MediaTek mt8167 SoC is not compatible with any of
the existing hdmi-phy. Add a separate compatible to describe it.
Signed-off-by: Luca Leonardo Scorcia <l.scorcia@gmail.com>
---
Documentation/devicetree/bindings/phy/mediatek,hdmi-phy.yaml | 1 +
1 file changed, 1 insertion(+)
diff --git a/Documentation/devicetree/bindings/phy/mediatek,hdmi-phy.yaml b/Documentation/devicetree/bindings/phy/mediatek,hdmi-phy.yaml
index ac93069f4801..f0c8ea2c72b1 100644
--- a/Documentation/devicetree/bindings/phy/mediatek,hdmi-phy.yaml
+++ b/Documentation/devicetree/bindings/phy/mediatek,hdmi-phy.yaml
@@ -31,6 +31,7 @@ properties:
- mediatek,mt8188-hdmi-phy
- const: mediatek,mt8195-hdmi-phy
- const: mediatek,mt2701-hdmi-phy
+ - const: mediatek,mt8167-hdmi-phy
- const: mediatek,mt8173-hdmi-phy
- const: mediatek,mt8195-hdmi-phy
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 2/7] phy: mediatek: hdmi: Add support for mt8167
2026-10-10 11:54 [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 1/7] dt-bindings: mediatek: hdmi-phy: Add compatible for mt8167 Luca Leonardo Scorcia
@ 2026-10-10 11:54 ` Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 3/7] clk: mediatek: mt8167: Map apmixedsys iomem as shared Luca Leonardo Scorcia
` (4 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Luca Leonardo Scorcia @ 2026-10-10 11:54 UTC (permalink / raw)
To: linux-mediatek
Cc: Luca Leonardo Scorcia, Chunfeng Yun, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Stephen Boyd, Brian Masney, Jerome Brunet, Chun-Kuang Hu,
Philipp Zabel, David Airlie, Simona Vetter, Chen-Yu Tsai,
Nicolas Frattaroli, Fabien Parent, CK Hu, chunhui dai,
linux-arm-kernel, linux-phy, devicetree, linux-kernel, linux-clk,
dri-devel
Add support for the HDMI PHY found in MediaTek mt8167.
Signed-off-by: Luca Leonardo Scorcia <l.scorcia@gmail.com>
---
drivers/phy/mediatek/Makefile | 1 +
drivers/phy/mediatek/phy-mtk-hdmi-mt8167.c | 217 +++++++++++++++++++++
drivers/phy/mediatek/phy-mtk-hdmi.c | 3 +
drivers/phy/mediatek/phy-mtk-hdmi.h | 1 +
4 files changed, 222 insertions(+)
create mode 100644 drivers/phy/mediatek/phy-mtk-hdmi-mt8167.c
diff --git a/drivers/phy/mediatek/Makefile b/drivers/phy/mediatek/Makefile
index ed0da708759b..25ede986a1f3 100644
--- a/drivers/phy/mediatek/Makefile
+++ b/drivers/phy/mediatek/Makefile
@@ -12,6 +12,7 @@ obj-$(CONFIG_PHY_MTK_XFI_TPHY) += phy-mtk-xfi-tphy.o
phy-mtk-hdmi-drv-y := phy-mtk-hdmi.o
phy-mtk-hdmi-drv-y += phy-mtk-hdmi-mt2701.o
+phy-mtk-hdmi-drv-y += phy-mtk-hdmi-mt8167.o
phy-mtk-hdmi-drv-y += phy-mtk-hdmi-mt8173.o
phy-mtk-hdmi-drv-y += phy-mtk-hdmi-mt8195.o
obj-$(CONFIG_PHY_MTK_HDMI) += phy-mtk-hdmi-drv.o
diff --git a/drivers/phy/mediatek/phy-mtk-hdmi-mt8167.c b/drivers/phy/mediatek/phy-mtk-hdmi-mt8167.c
new file mode 100644
index 000000000000..2435054d4e17
--- /dev/null
+++ b/drivers/phy/mediatek/phy-mtk-hdmi-mt8167.c
@@ -0,0 +1,217 @@
+// SPDX-License-Identifier: GPL-2.0
+#include "phy-mtk-hdmi.h"
+#include "phy-mtk-io.h"
+
+#define HDMI_CON0 0x00
+#define RG_HDMITX_DRV_IBIAS GENMASK(5, 0)
+#define RG_HDMITX_EN_SER GENMASK(15, 12)
+#define RG_HDMITX_EN_SLDO GENMASK(19, 16)
+#define RG_HDMITX_EN_PRED GENMASK(23, 20)
+#define RG_HDMITX_EN_IMP GENMASK(27, 24)
+#define RG_HDMITX_EN_DRV GENMASK(31, 28)
+
+#define HDMI_CON1 0x04
+#define RG_HDMITX_PRED_IBIAS GENMASK(21, 18)
+#define RG_HDMITX_PRED_IMP BIT(22)
+#define RG_HDMITX_DRV_IMP GENMASK(31, 26)
+
+#define HDMI_CON2 0x08
+#define RG_HDMITX_EN_TX_CKLDO BIT(0)
+#define RG_HDMITX_EN_TX_POSDIV BIT(1)
+#define RG_HDMITX_TX_POSDIV GENMASK(4, 3)
+#define RG_HDMITX_EN_MBIAS BIT(6)
+#define RG_HDMITX_MBIAS_LPF_EN BIT(7)
+
+#define HDMI_CON4 0x10
+#define RG_HDMITX_D0_IMP GENMASK(7, 0)
+#define RG_HDMITX_D1_IMP GENMASK(15, 8)
+#define RG_HDMITX_D2_IMP GENMASK(23, 16)
+
+#define HDMI_CON6 0x18
+#define RG_HTPLL_BR GENMASK(1, 0)
+#define RG_HTPLL_BC GENMASK(3, 2)
+#define RG_HTPLL_BP GENMASK(7, 4)
+#define RG_HTPLL_IR GENMASK(11, 8)
+#define RG_HTPLL_IC GENMASK(15, 12)
+#define RG_HTPLL_POSDIV GENMASK(17, 16)
+#define RG_HTPLL_PREDIV GENMASK(19, 18)
+#define RG_HTPLL_FBKSEL GENMASK(21, 20)
+#define RG_HTPLL_RLH_EN BIT(22)
+#define RG_HTPLL_FBKDIV GENMASK(30, 24)
+#define RG_HTPLL_EN BIT(31)
+
+#define HDMI_CON7 0x1c
+#define RG_HTPLL_AUTOK_EN BIT(23)
+#define RG_HTPLL_DIVEN GENMASK(30, 28)
+
+static int mtk_hdmi_pll_prepare(struct clk_hw *hw)
+{
+ struct mtk_hdmi_phy *hdmi_phy = to_mtk_hdmi_phy(hw);
+ void __iomem *base = hdmi_phy->regs;
+
+ mtk_phy_set_bits(base + HDMI_CON7, RG_HTPLL_AUTOK_EN);
+ mtk_phy_clear_bits(base + HDMI_CON6, RG_HTPLL_RLH_EN);
+ mtk_phy_set_bits(base + HDMI_CON6, RG_HTPLL_POSDIV);
+ mtk_phy_set_bits(base + HDMI_CON2, RG_HDMITX_EN_MBIAS);
+ usleep_range(80, 100);
+ mtk_phy_set_bits(base + HDMI_CON6, RG_HTPLL_EN);
+ mtk_phy_set_bits(base + HDMI_CON2, RG_HDMITX_EN_TX_CKLDO);
+ mtk_phy_set_bits(base + HDMI_CON0, RG_HDMITX_EN_SLDO);
+ usleep_range(80, 100);
+ mtk_phy_set_bits(base + HDMI_CON2, RG_HDMITX_MBIAS_LPF_EN);
+ mtk_phy_set_bits(base + HDMI_CON2, RG_HDMITX_EN_TX_POSDIV);
+
+ return 0;
+}
+
+static void mtk_hdmi_pll_unprepare(struct clk_hw *hw)
+{
+ struct mtk_hdmi_phy *hdmi_phy = to_mtk_hdmi_phy(hw);
+ void __iomem *base = hdmi_phy->regs;
+
+ mtk_phy_clear_bits(base + HDMI_CON2, RG_HDMITX_EN_TX_POSDIV);
+ mtk_phy_clear_bits(base + HDMI_CON2, RG_HDMITX_MBIAS_LPF_EN);
+ usleep_range(80, 100);
+ mtk_phy_clear_bits(base + HDMI_CON0, RG_HDMITX_EN_SLDO);
+ mtk_phy_clear_bits(base + HDMI_CON2, RG_HDMITX_EN_TX_CKLDO);
+ mtk_phy_clear_bits(base + HDMI_CON6, RG_HTPLL_EN);
+ usleep_range(80, 100);
+ mtk_phy_clear_bits(base + HDMI_CON2, RG_HDMITX_EN_MBIAS);
+ mtk_phy_clear_bits(base + HDMI_CON6, RG_HTPLL_POSDIV);
+ mtk_phy_clear_bits(base + HDMI_CON6, RG_HTPLL_RLH_EN);
+ mtk_phy_clear_bits(base + HDMI_CON7, RG_HTPLL_AUTOK_EN);
+ usleep_range(80, 100);
+}
+
+static int mtk_hdmi_pll_determine_rate(struct clk_hw *hw,
+ struct clk_rate_request *req)
+{
+ struct mtk_hdmi_phy *hdmi_phy = to_mtk_hdmi_phy(hw);
+
+ hdmi_phy->pll_rate = req->rate;
+
+ return 0;
+}
+
+static int mtk_hdmi_pll_set_rate(struct clk_hw *hw, unsigned long rate,
+ unsigned long parent_rate)
+{
+ struct mtk_hdmi_phy *hdmi_phy = to_mtk_hdmi_phy(hw);
+ void __iomem *base = hdmi_phy->regs;
+ u32 pos_div;
+ u32 pre_imp_en = 0x0;
+ u32 pre_ibias = 0xd;
+ u32 imp_en = 0x0;
+ u32 imp_clk = 0x1c;
+ u32 imp_d0 = 0x1c;
+ u32 imp_d1 = 0x1c;
+ u32 imp_d2 = 0x1c;
+ u32 drv_ibias = 0xa;
+
+ if (rate <= 27000000)
+ pos_div = 3;
+ else if (rate <= 74250000)
+ pos_div = 2;
+ else
+ pos_div = 1;
+
+ mtk_phy_set_bits(base + HDMI_CON6, RG_HTPLL_PREDIV);
+ mtk_phy_set_bits(base + HDMI_CON6, RG_HTPLL_POSDIV);
+ mtk_phy_update_bits(base + HDMI_CON6,
+ RG_HTPLL_IC | RG_HTPLL_IR,
+ FIELD_PREP(RG_HTPLL_IC, 0x1) |
+ FIELD_PREP(RG_HTPLL_IR, 0x1));
+ mtk_phy_update_field(base + HDMI_CON2, RG_HDMITX_TX_POSDIV, pos_div);
+ mtk_phy_update_field(base + HDMI_CON6, RG_HTPLL_FBKSEL, 1);
+ mtk_phy_update_field(base + HDMI_CON6, RG_HTPLL_FBKDIV, 19);
+ mtk_phy_update_field(base + HDMI_CON7, RG_HTPLL_DIVEN, 0x2);
+ mtk_phy_update_bits(base + HDMI_CON6,
+ RG_HTPLL_BP | RG_HTPLL_BC | RG_HTPLL_BR,
+ FIELD_PREP(RG_HTPLL_BP, 0xc) |
+ FIELD_PREP(RG_HTPLL_BC, 0x2) |
+ FIELD_PREP(RG_HTPLL_BR, 0x1));
+
+ mtk_phy_update_field(base + HDMI_CON1, RG_HDMITX_PRED_IMP, pre_imp_en);
+ mtk_phy_update_field(base + HDMI_CON1, RG_HDMITX_PRED_IBIAS, pre_ibias);
+ mtk_phy_update_field(base + HDMI_CON0, RG_HDMITX_EN_IMP, imp_en);
+ mtk_phy_update_field(base + HDMI_CON1, RG_HDMITX_DRV_IMP, imp_clk);
+ mtk_phy_update_bits(base + HDMI_CON4,
+ RG_HDMITX_D0_IMP | RG_HDMITX_D1_IMP | RG_HDMITX_D2_IMP,
+ FIELD_PREP(RG_HDMITX_D0_IMP, imp_d0) |
+ FIELD_PREP(RG_HDMITX_D1_IMP, imp_d1) |
+ FIELD_PREP(RG_HDMITX_D2_IMP, imp_d2));
+ mtk_phy_update_field(base + HDMI_CON0, RG_HDMITX_DRV_IBIAS, drv_ibias);
+
+ return 0;
+}
+
+static unsigned long mtk_hdmi_pll_recalc_rate(struct clk_hw *hw,
+ unsigned long parent_rate)
+{
+ struct mtk_hdmi_phy *hdmi_phy = to_mtk_hdmi_phy(hw);
+
+ unsigned long out_rate, val;
+ u32 tmp;
+
+ tmp = readl(hdmi_phy->regs + HDMI_CON6);
+ val = FIELD_GET(RG_HTPLL_PREDIV, tmp);
+ switch (val) {
+ case 0x00:
+ out_rate = parent_rate;
+ break;
+ case 0x01:
+ out_rate = parent_rate / 2;
+ break;
+ default:
+ out_rate = parent_rate / 4;
+ break;
+ }
+
+ val = FIELD_GET(RG_HTPLL_FBKDIV, tmp);
+ out_rate *= (val + 1) * 2;
+
+ tmp = readl(hdmi_phy->regs + HDMI_CON2);
+ val = FIELD_GET(RG_HDMITX_TX_POSDIV, tmp);
+ out_rate >>= val;
+
+ if (tmp & RG_HDMITX_EN_TX_POSDIV)
+ out_rate /= 5;
+
+ return out_rate;
+}
+
+static const struct clk_ops mtk_hdmi_phy_pll_ops = {
+ .prepare = mtk_hdmi_pll_prepare,
+ .unprepare = mtk_hdmi_pll_unprepare,
+ .set_rate = mtk_hdmi_pll_set_rate,
+ .determine_rate = mtk_hdmi_pll_determine_rate,
+ .recalc_rate = mtk_hdmi_pll_recalc_rate,
+};
+
+static void mtk_hdmi_phy_enable_tmds(struct mtk_hdmi_phy *hdmi_phy)
+{
+ void __iomem *base = hdmi_phy->regs;
+
+ mtk_phy_set_bits(base + HDMI_CON0,
+ RG_HDMITX_EN_DRV | RG_HDMITX_EN_PRED | RG_HDMITX_EN_SER);
+ usleep_range(80, 100);
+}
+
+static void mtk_hdmi_phy_disable_tmds(struct mtk_hdmi_phy *hdmi_phy)
+{
+ void __iomem *base = hdmi_phy->regs;
+
+ mtk_phy_clear_bits(base + HDMI_CON0,
+ RG_HDMITX_EN_DRV | RG_HDMITX_EN_PRED | RG_HDMITX_EN_SER);
+ usleep_range(80, 100);
+}
+
+struct mtk_hdmi_phy_conf mtk_hdmi_phy_8167_conf = {
+ .flags = CLK_SET_RATE_PARENT | CLK_SET_RATE_GATE,
+ .hdmi_phy_clk_ops = &mtk_hdmi_phy_pll_ops,
+ .hdmi_phy_enable_tmds = mtk_hdmi_phy_enable_tmds,
+ .hdmi_phy_disable_tmds = mtk_hdmi_phy_disable_tmds,
+};
+
+MODULE_DESCRIPTION("MediaTek HDMI PHY Driver");
+MODULE_LICENSE("GPL");
diff --git a/drivers/phy/mediatek/phy-mtk-hdmi.c b/drivers/phy/mediatek/phy-mtk-hdmi.c
index 52a7d525ff9b..4e167a421f0e 100644
--- a/drivers/phy/mediatek/phy-mtk-hdmi.c
+++ b/drivers/phy/mediatek/phy-mtk-hdmi.c
@@ -186,6 +186,9 @@ static const struct of_device_id mtk_hdmi_phy_match[] = {
{ .compatible = "mediatek,mt2701-hdmi-phy",
.data = &mtk_hdmi_phy_2701_conf,
},
+ { .compatible = "mediatek,mt8167-hdmi-phy",
+ .data = &mtk_hdmi_phy_8167_conf,
+ },
{ .compatible = "mediatek,mt8173-hdmi-phy",
.data = &mtk_hdmi_phy_8173_conf,
},
diff --git a/drivers/phy/mediatek/phy-mtk-hdmi.h b/drivers/phy/mediatek/phy-mtk-hdmi.h
index 99d917e0036a..5137d1c3345b 100644
--- a/drivers/phy/mediatek/phy-mtk-hdmi.h
+++ b/drivers/phy/mediatek/phy-mtk-hdmi.h
@@ -49,6 +49,7 @@ struct mtk_hdmi_phy {
struct mtk_hdmi_phy *to_mtk_hdmi_phy(struct clk_hw *hw);
extern struct mtk_hdmi_phy_conf mtk_hdmi_phy_8195_conf;
+extern struct mtk_hdmi_phy_conf mtk_hdmi_phy_8167_conf;
extern struct mtk_hdmi_phy_conf mtk_hdmi_phy_8173_conf;
extern struct mtk_hdmi_phy_conf mtk_hdmi_phy_2701_conf;
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 3/7] clk: mediatek: mt8167: Map apmixedsys iomem as shared
2026-10-10 11:54 [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 1/7] dt-bindings: mediatek: hdmi-phy: Add compatible for mt8167 Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 2/7] phy: mediatek: hdmi: Add support " Luca Leonardo Scorcia
@ 2026-10-10 11:54 ` Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 4/7] clk: mediatek: mt8167: Correct HDMI-related clock definitions Luca Leonardo Scorcia
` (3 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Luca Leonardo Scorcia @ 2026-10-10 11:54 UTC (permalink / raw)
To: linux-mediatek
Cc: Luca Leonardo Scorcia, Chunfeng Yun, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Stephen Boyd, Brian Masney, Jerome Brunet, Chun-Kuang Hu,
Philipp Zabel, David Airlie, Simona Vetter, Nicolas Frattaroli,
Chen-Yu Tsai, Fabien Parent, CK Hu, chunhui dai,
linux-arm-kernel, linux-phy, devicetree, linux-kernel, linux-clk,
dri-devel
The hdmi_phy for mt8167 and the apmixedsys clocks share the same IO
memory region and they both map it using devm_platform_ioremap_resource,
which implies exclusive access. Switch the apmixedsys driver to of_iomap,
like it is done in the mt8173-apmixedsys driver. Also, implement the
remove function while we're at it.
Fixes the following runtime error:
hdmi-phy: error -EBUSY: can't request region for resource
[mem 0x10018300-0x1001831f]
Signed-off-by: Luca Leonardo Scorcia <l.scorcia@gmail.com>
---
drivers/clk/mediatek/clk-mt8167-apmixedsys.c | 24 ++++++++++++++++----
1 file changed, 20 insertions(+), 4 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8167-apmixedsys.c b/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
index fb6c21bbeef8..3e8611991de7 100644
--- a/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
@@ -8,6 +8,7 @@
#include <dt-bindings/clock/mt8167-clk.h>
#include <linux/clk.h>
#include <linux/of.h>
+#include <linux/of_address.h>
#include <linux/platform_device.h>
#include "clk-pll.h"
@@ -97,17 +98,19 @@ static int clk_mt8167_apmixed_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev;
int ret;
- base = devm_platform_ioremap_resource(pdev, 0);
+ base = of_iomap(node, 0);
if (IS_ERR(base))
return PTR_ERR(base);
clk_data = mtk_devm_alloc_clk_data(dev, MT8167_CLK_APMIXED_NR_CLK);
- if (!clk_data)
- return -ENOMEM;
+ if (IS_ERR_OR_NULL(clk_data)) {
+ ret = -ENOMEM;
+ goto unmap_io;
+ }
ret = mtk_clk_register_plls(dev, plls, ARRAY_SIZE(plls), clk_data);
if (ret)
- return ret;
+ goto unmap_io;
ret = mtk_clk_register_dividers(dev, adj_divs, ARRAY_SIZE(adj_divs), base,
&mt8167_apmixed_clk_lock, clk_data);
@@ -124,10 +127,22 @@ static int clk_mt8167_apmixed_probe(struct platform_device *pdev)
mtk_clk_unregister_dividers(adj_divs, ARRAY_SIZE(adj_divs), clk_data);
unregister_plls:
mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
+unmap_io:
+ iounmap(base);
return ret;
}
+static void clk_mt8167_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_dividers(adj_divs, ARRAY_SIZE(adj_divs), clk_data);
+ mtk_clk_unregister_plls(plls, ARRAY_SIZE(plls), clk_data);
+}
+
static const struct of_device_id of_match_clk_mt8167_apmixed[] = {
{ .compatible = "mediatek,mt8167-apmixedsys" },
{ /* sentinel */ }
@@ -136,6 +151,7 @@ MODULE_DEVICE_TABLE(of, of_match_clk_mt8167_apmixed);
static struct platform_driver clk_mt8167_apmixed_drv = {
.probe = clk_mt8167_apmixed_probe,
+ .remove = clk_mt8167_apmixed_remove,
.driver = {
.name = "clk-mt8167-apmixed",
.of_match_table = of_match_clk_mt8167_apmixed,
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 4/7] clk: mediatek: mt8167: Correct HDMI-related clock definitions
2026-10-10 11:54 [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output Luca Leonardo Scorcia
` (2 preceding siblings ...)
2026-10-10 11:54 ` [PATCH 3/7] clk: mediatek: mt8167: Map apmixedsys iomem as shared Luca Leonardo Scorcia
@ 2026-10-10 11:54 ` Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 5/7] drm/mediatek: mtk_hdmi: Set tz_disabled for mt8167 Luca Leonardo Scorcia
` (2 subsequent siblings)
6 siblings, 0 replies; 8+ messages in thread
From: Luca Leonardo Scorcia @ 2026-10-10 11:54 UTC (permalink / raw)
To: linux-mediatek
Cc: Luca Leonardo Scorcia, Chunfeng Yun, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Stephen Boyd, Brian Masney, Jerome Brunet, Chun-Kuang Hu,
Philipp Zabel, David Airlie, Simona Vetter, Nicolas Frattaroli,
Chen-Yu Tsai, Fabien Parent, chunhui dai, CK Hu,
linux-arm-kernel, linux-phy, devicetree, linux-kernel, linux-clk,
dri-devel
On the mt8167 SoC, the tvdpll_ck clock is used to clock the DPI1 pixel
signal that is hardwired to the HDMI interface.
The clocks used by those two blocks must match and they have to be changed
according to the mode clock appropriate for the display resolution. Fix a
couple of issues with the current HDMI clock definitions:
- The hdmi_ref divider references the same register and offset of its
parent tvdpll. Make sure to flag it as a read only divider as its rate
must be set by the DPI driver only.
- Both hdmi_ref and tvdpll_ck derive their clock from the same tvdpll
parent clock, but its rate must be set by the DPI driver only. Unset the
CLK_SET_RATE_PARENT flag that is implicitly set by the FACTOR() macro.
Signed-off-by: Luca Leonardo Scorcia <l.scorcia@gmail.com>
---
drivers/clk/mediatek/clk-mt8167-apmixedsys.c | 2 +-
drivers/clk/mediatek/clk-mt8167.c | 6 +++++-
2 files changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/clk/mediatek/clk-mt8167-apmixedsys.c b/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
index 3e8611991de7..a7d38c194759 100644
--- a/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
+++ b/drivers/clk/mediatek/clk-mt8167-apmixedsys.c
@@ -87,7 +87,7 @@ static const struct mtk_pll_data plls[] = {
static const struct mtk_clk_divider adj_divs[] = {
DIV_ADJ_FLAG(CLK_APMIXED_HDMI_REF, "hdmi_ref", "tvdpll",
- 0x1c4, 24, 3, CLK_DIVIDER_POWER_OF_TWO),
+ 0x1c4, 24, 3, CLK_DIVIDER_POWER_OF_TWO | CLK_DIVIDER_READ_ONLY),
};
static int clk_mt8167_apmixed_probe(struct platform_device *pdev)
diff --git a/drivers/clk/mediatek/clk-mt8167.c b/drivers/clk/mediatek/clk-mt8167.c
index c64d918c37de..a14f0736cdcf 100644
--- a/drivers/clk/mediatek/clk-mt8167.c
+++ b/drivers/clk/mediatek/clk-mt8167.c
@@ -75,7 +75,11 @@ static const struct mtk_fixed_factor top_divs[] = {
FACTOR(CLK_TOP_CLK26M, "clk26m_ck", "clk26m", 1, 1),
FACTOR(CLK_TOP_CLK26M_D2, "clk26m_d2", "clk26m", 1, 2),
FACTOR(CLK_TOP_MIPI_26M, "mipi_26m", "clk26m", 1, 1),
- FACTOR(CLK_TOP_TVDPLL, "tvdpll_ck", "tvdpll", 1, 1),
+ /*
+ * The tvdpll_ck clock should not propagate rate changes to its parent
+ * clock so the dpi driver can have full control over PLL and divider.
+ */
+ FACTOR_FLAGS(CLK_TOP_TVDPLL, "tvdpll_ck", "tvdpll", 1, 1, 0),
FACTOR(CLK_TOP_TVDPLL_D2, "tvdpll_d2", "tvdpll_ck", 1, 2),
FACTOR(CLK_TOP_TVDPLL_D4, "tvdpll_d4", "tvdpll_ck", 1, 4),
FACTOR(CLK_TOP_TVDPLL_D8, "tvdpll_d8", "tvdpll_ck", 1, 8),
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 5/7] drm/mediatek: mtk_hdmi: Set tz_disabled for mt8167
2026-10-10 11:54 [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output Luca Leonardo Scorcia
` (3 preceding siblings ...)
2026-10-10 11:54 ` [PATCH 4/7] clk: mediatek: mt8167: Correct HDMI-related clock definitions Luca Leonardo Scorcia
@ 2026-10-10 11:54 ` Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 6/7] drm/mediatek: mtk_hdmi: Improve the secure output bit toggle Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 7/7] arm64: dts: mediatek: mt8167: Add HDMI display nodes Luca Leonardo Scorcia
6 siblings, 0 replies; 8+ messages in thread
From: Luca Leonardo Scorcia @ 2026-10-10 11:54 UTC (permalink / raw)
To: linux-mediatek
Cc: Luca Leonardo Scorcia, Chunfeng Yun, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Stephen Boyd, Brian Masney, Jerome Brunet, Chun-Kuang Hu,
Philipp Zabel, David Airlie, Simona Vetter, Nicolas Frattaroli,
Chen-Yu Tsai, Fabien Parent, CK Hu, chunhui dai,
linux-arm-kernel, linux-phy, devicetree, linux-kernel, linux-clk,
dri-devel
Just like mt2701, MediaTek mt8167 does not require an ARM supervisor mode
call to toggle HDMI output.
Fixes: 511cf7d12331 ("drm/mediatek: hdmi: Add MT8167 configuration")
Signed-off-by: Luca Leonardo Scorcia <l.scorcia@gmail.com>
---
drivers/gpu/drm/mediatek/mtk_hdmi.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index 738090a47176..9896eaf81e7e 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -1214,6 +1214,7 @@ static const struct mtk_hdmi_conf mtk_hdmi_conf_mt2701 = {
};
static const struct mtk_hdmi_conf mtk_hdmi_conf_mt8167 = {
+ .tz_disabled = true,
.cea_modes_only = true,
.max_mode_clock = 148500,
.ver_conf = &mtk_hdmi_v1_ver_conf
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 6/7] drm/mediatek: mtk_hdmi: Improve the secure output bit toggle
2026-10-10 11:54 [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output Luca Leonardo Scorcia
` (4 preceding siblings ...)
2026-10-10 11:54 ` [PATCH 5/7] drm/mediatek: mtk_hdmi: Set tz_disabled for mt8167 Luca Leonardo Scorcia
@ 2026-10-10 11:54 ` Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 7/7] arm64: dts: mediatek: mt8167: Add HDMI display nodes Luca Leonardo Scorcia
6 siblings, 0 replies; 8+ messages in thread
From: Luca Leonardo Scorcia @ 2026-10-10 11:54 UTC (permalink / raw)
To: linux-mediatek
Cc: Luca Leonardo Scorcia, Chunfeng Yun, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Stephen Boyd, Brian Masney, Jerome Brunet, Chun-Kuang Hu,
Philipp Zabel, David Airlie, Simona Vetter, Nicolas Frattaroli,
Chen-Yu Tsai, Fabien Parent, chunhui dai, CK Hu,
linux-arm-kernel, linux-phy, devicetree, linux-kernel, linux-clk,
dri-devel
The secure output control bit toggle for mt2701/mt8167 currently sets
bit 0 (DEEP_COLOR_EN), 1-2 (DEEP_COLOR_MODE), 15 (HDMI_PSECUR_EN) and 31
(HDMI_PCLK_FREE_RUN_EN) in the same operation, but only bit 15 is actually
controlling the HDMI_PSECUR_EN bit, the rest of them are already being set
in separate operations later. Add a define for bit 15 and clean up the bit
update operation.
Fixes: 0fc721b2968e ("drm/mediatek: add hdmi driver for MT2701 and MT7623")
Signed-off-by: Luca Leonardo Scorcia <l.scorcia@gmail.com>
---
drivers/gpu/drm/mediatek/mtk_hdmi.c | 2 +-
drivers/gpu/drm/mediatek/mtk_hdmi_regs.h | 1 +
2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi.c b/drivers/gpu/drm/mediatek/mtk_hdmi.c
index 9896eaf81e7e..781177a1f190 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi.c
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi.c
@@ -63,7 +63,7 @@ static void mtk_hdmi_hw_make_reg_writable(struct mtk_hdmi *hdmi, bool enable)
if (hdmi->conf && hdmi->conf->tz_disabled)
regmap_update_bits(hdmi->sys_regmap,
hdmi->sys_offset + HDMI_SYS_CFG20,
- 0x80008005, enable ? 0x80000005 : 0x8000);
+ HDMI_PSECUR_EN, enable ? 0 : HDMI_PSECUR_EN);
else
arm_smccc_smc(MTK_SIP_SET_AUTHORIZED_SECURE_REG, 0x14000904,
0x80000000, 0, 0, 0, 0, 0, &res);
diff --git a/drivers/gpu/drm/mediatek/mtk_hdmi_regs.h b/drivers/gpu/drm/mediatek/mtk_hdmi_regs.h
index 2050ba45b23a..e0c35277c553 100644
--- a/drivers/gpu/drm/mediatek/mtk_hdmi_regs.h
+++ b/drivers/gpu/drm/mediatek/mtk_hdmi_regs.h
@@ -219,6 +219,7 @@
#define DEEP_COLOR_EN BIT(0)
#define HDMI_AUDIO_TEST_SEL BIT(8)
#define HDMI2P0_EN BIT(11)
+#define HDMI_PSECUR_EN BIT(15)
#define HDMI_OUT_FIFO_EN BIT(16)
#define HDMI_OUT_FIFO_CLK_INV BIT(17)
#define MHL_MODE_ON BIT(28)
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH 7/7] arm64: dts: mediatek: mt8167: Add HDMI display nodes
2026-10-10 11:54 [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output Luca Leonardo Scorcia
` (5 preceding siblings ...)
2026-10-10 11:54 ` [PATCH 6/7] drm/mediatek: mtk_hdmi: Improve the secure output bit toggle Luca Leonardo Scorcia
@ 2026-10-10 11:54 ` Luca Leonardo Scorcia
6 siblings, 0 replies; 8+ messages in thread
From: Luca Leonardo Scorcia @ 2026-10-10 11:54 UTC (permalink / raw)
To: linux-mediatek
Cc: Luca Leonardo Scorcia, Chunfeng Yun, Vinod Koul, Neil Armstrong,
Manivannan Sadhasivam, Rob Herring, Krzysztof Kozlowski,
Conor Dooley, Matthias Brugger, AngeloGioacchino Del Regno,
Stephen Boyd, Brian Masney, Jerome Brunet, Chun-Kuang Hu,
Philipp Zabel, David Airlie, Simona Vetter, Nicolas Frattaroli,
Chen-Yu Tsai, Fabien Parent, chunhui dai, CK Hu,
linux-arm-kernel, linux-phy, devicetree, linux-kernel, linux-clk,
dri-devel
Add the required nodes to drive HDMI output on the mt8167 SoC.
Signed-off-by: Luca Leonardo Scorcia <l.scorcia@gmail.com>
---
arch/arm64/boot/dts/mediatek/mt8167.dtsi | 62 ++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/arch/arm64/boot/dts/mediatek/mt8167.dtsi b/arch/arm64/boot/dts/mediatek/mt8167.dtsi
index 27cf32d7ae35..ab76e0637eb1 100644
--- a/arch/arm64/boot/dts/mediatek/mt8167.dtsi
+++ b/arch/arm64/boot/dts/mediatek/mt8167.dtsi
@@ -112,6 +112,27 @@ apmixedsys: apmixedsys@10018000 {
#clock-cells = <1>;
};
+ hdmi_phy: hdmi-phy@10018300 {
+ compatible = "mediatek,mt8167-hdmi-phy";
+ reg = <0 0x10018300 0 0x20>;
+ clocks = <&apmixedsys CLK_APMIXED_HDMI_REF>;
+ clock-names = "pll_ref";
+ clock-output-names = "hdmtx_dig_cts";
+ mediatek,ibias = <0xa>;
+ mediatek,ibias_up = <0x1c>;
+ #clock-cells = <0>;
+ #phy-cells = <0>;
+ status = "disabled";
+ };
+
+ cec: cec@1001a000 {
+ compatible = "mediatek,mt8167-cec", "mediatek,mt8173-cec";
+ reg = <0 0x1001a000 0 0xbc>;
+ interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&topckgen CLK_TOP_26M_CEC>;
+ status = "disabled";
+ };
+
iommu: m4u@10203000 {
compatible = "mediatek,mt8167-m4u";
reg = <0 0x10203000 0 0x1000>;
@@ -120,6 +141,15 @@ iommu: m4u@10203000 {
#iommu-cells = <1>;
};
+ hdmiddc: i2c@11011000 {
+ compatible = "mediatek,mt8167-hdmi-ddc", "mediatek,mt8173-hdmi-ddc";
+ reg = <0 0x11011000 0 0x10>;
+ interrupts = <GIC_SPI 110 IRQ_TYPE_LEVEL_LOW>;
+ clocks = <&topckgen CLK_TOP_26M_HDMI_SIFM>;
+ clock-names = "ddc-i2c";
+ status = "disabled";
+ };
+
mmsys: syscon@14000000 {
compatible = "mediatek,mt8167-mmsys", "syscon";
reg = <0 0x14000000 0 0x1000>;
@@ -145,6 +175,38 @@ smi_common: smi@14017000 {
power-domains = <&spm MT8167_POWER_DOMAIN_MM>;
};
+ hdmi: hdmi@1401b000 {
+ compatible = "mediatek,mt8167-hdmi";
+ reg = <0 0x1401b000 0 0x400>;
+ clocks = <&mmsys CLK_MM_HDMI_PXL>,
+ <&mmsys CLK_MM_HDMI_PLL>,
+ <&mmsys CLK_MM_HDMI_ADSP_BCK>,
+ <&mmsys CLK_MM_HDMI_SPDIF>;
+ clock-names = "pixel", "pll", "bclk", "spdif";
+ interrupts = <GIC_SPI 148 IRQ_TYPE_LEVEL_LOW>;
+ phys = <&hdmi_phy>;
+ phy-names = "hdmi";
+ mediatek,syscon-hdmi = <&mmsys 0x900>;
+ status = "disabled";
+
+ ports {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
+ port@0 {
+ reg = <0>;
+
+ hdmi0_in: endpoint { };
+ };
+
+ port@1 {
+ reg = <1>;
+
+ hdmi0_out: endpoint { };
+ };
+ };
+ };
+
imgsys: syscon@15000000 {
compatible = "mediatek,mt8167-imgsys", "syscon";
reg = <0 0x15000000 0 0x1000>;
--
2.43.0
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2026-10-10 11:56 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-10 11:54 [PATCH 0/7] Add support for Mediatek mt8167 HDMI display output Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 1/7] dt-bindings: mediatek: hdmi-phy: Add compatible for mt8167 Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 2/7] phy: mediatek: hdmi: Add support " Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 3/7] clk: mediatek: mt8167: Map apmixedsys iomem as shared Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 4/7] clk: mediatek: mt8167: Correct HDMI-related clock definitions Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 5/7] drm/mediatek: mtk_hdmi: Set tz_disabled for mt8167 Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 6/7] drm/mediatek: mtk_hdmi: Improve the secure output bit toggle Luca Leonardo Scorcia
2026-10-10 11:54 ` [PATCH 7/7] arm64: dts: mediatek: mt8167: Add HDMI display nodes Luca Leonardo Scorcia
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®