1*c9b9a66bSLaura Nao // SPDX-License-Identifier: GPL-2.0-only 2*c9b9a66bSLaura Nao /* 3*c9b9a66bSLaura Nao * Copyright (c) 2025 MediaTek Inc. 4*c9b9a66bSLaura Nao * Guangjie Song <guangjie.song@mediatek.com> 5*c9b9a66bSLaura Nao * Copyright (c) 2025 Collabora Ltd. 6*c9b9a66bSLaura Nao * Laura Nao <laura.nao@collabora.com> 7*c9b9a66bSLaura Nao */ 8*c9b9a66bSLaura Nao #include <dt-bindings/clock/mediatek,mt8196-clock.h> 9*c9b9a66bSLaura Nao #include <dt-bindings/reset/mediatek,mt8196-resets.h> 10*c9b9a66bSLaura Nao 11*c9b9a66bSLaura Nao #include <linux/clk-provider.h> 12*c9b9a66bSLaura Nao #include <linux/module.h> 13*c9b9a66bSLaura Nao #include <linux/of_device.h> 14*c9b9a66bSLaura Nao #include <linux/platform_device.h> 15*c9b9a66bSLaura Nao 16*c9b9a66bSLaura Nao #include "clk-gate.h" 17*c9b9a66bSLaura Nao #include "clk-mtk.h" 18*c9b9a66bSLaura Nao #include "reset.h" 19*c9b9a66bSLaura Nao 20*c9b9a66bSLaura Nao #define MT8196_PEXTP_RST0_SET_OFFSET 0x8 21*c9b9a66bSLaura Nao 22*c9b9a66bSLaura Nao static const struct mtk_gate_regs pext_cg_regs = { 23*c9b9a66bSLaura Nao .set_ofs = 0x18, 24*c9b9a66bSLaura Nao .clr_ofs = 0x1c, 25*c9b9a66bSLaura Nao .sta_ofs = 0x14, 26*c9b9a66bSLaura Nao }; 27*c9b9a66bSLaura Nao 28*c9b9a66bSLaura Nao #define GATE_PEXT(_id, _name, _parent, _shift) {\ 29*c9b9a66bSLaura Nao .id = _id, \ 30*c9b9a66bSLaura Nao .name = _name, \ 31*c9b9a66bSLaura Nao .parent_name = _parent, \ 32*c9b9a66bSLaura Nao .regs = &pext_cg_regs, \ 33*c9b9a66bSLaura Nao .shift = _shift, \ 34*c9b9a66bSLaura Nao .ops = &mtk_clk_gate_ops_setclr,\ 35*c9b9a66bSLaura Nao } 36*c9b9a66bSLaura Nao 37*c9b9a66bSLaura Nao static const struct mtk_gate pext_clks[] = { 38*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT_PEXTP_MAC_P0_TL, "pext_pm0_tl", "tl", 0), 39*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT_PEXTP_MAC_P0_REF, "pext_pm0_ref", "clk26m", 1), 40*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT_PEXTP_PHY_P0_MCU_BUS, "pext_pp0_mcu_bus", "clk26m", 6), 41*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT_PEXTP_PHY_P0_PEXTP_REF, "pext_pp0_pextp_ref", "clk26m", 7), 42*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT_PEXTP_MAC_P0_AXI_250, "pext_pm0_axi_250", "ufs_pexpt0_mem_sub", 12), 43*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT_PEXTP_MAC_P0_AHB_APB, "pext_pm0_ahb_apb", "ufs_pextp0_axi", 13), 44*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT_PEXTP_MAC_P0_PL_P, "pext_pm0_pl_p", "clk26m", 14), 45*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT_PEXTP_VLP_AO_P0_LP, "pext_pextp_vlp_ao_p0_lp", "clk26m", 19), 46*c9b9a66bSLaura Nao }; 47*c9b9a66bSLaura Nao 48*c9b9a66bSLaura Nao static u16 pext_rst_ofs[] = { MT8196_PEXTP_RST0_SET_OFFSET }; 49*c9b9a66bSLaura Nao 50*c9b9a66bSLaura Nao static u16 pext_rst_idx_map[] = { 51*c9b9a66bSLaura Nao [MT8196_PEXTP0_RST0_PCIE0_MAC] = 0, 52*c9b9a66bSLaura Nao [MT8196_PEXTP0_RST0_PCIE0_PHY] = 1, 53*c9b9a66bSLaura Nao }; 54*c9b9a66bSLaura Nao 55*c9b9a66bSLaura Nao static const struct mtk_clk_rst_desc pext_rst_desc = { 56*c9b9a66bSLaura Nao .version = MTK_RST_SET_CLR, 57*c9b9a66bSLaura Nao .rst_bank_ofs = pext_rst_ofs, 58*c9b9a66bSLaura Nao .rst_bank_nr = ARRAY_SIZE(pext_rst_ofs), 59*c9b9a66bSLaura Nao .rst_idx_map = pext_rst_idx_map, 60*c9b9a66bSLaura Nao .rst_idx_map_nr = ARRAY_SIZE(pext_rst_idx_map), 61*c9b9a66bSLaura Nao }; 62*c9b9a66bSLaura Nao 63*c9b9a66bSLaura Nao static const struct mtk_clk_desc pext_mcd = { 64*c9b9a66bSLaura Nao .clks = pext_clks, 65*c9b9a66bSLaura Nao .num_clks = ARRAY_SIZE(pext_clks), 66*c9b9a66bSLaura Nao .rst_desc = &pext_rst_desc, 67*c9b9a66bSLaura Nao }; 68*c9b9a66bSLaura Nao 69*c9b9a66bSLaura Nao static const struct mtk_gate pext1_clks[] = { 70*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P1_TL, "pext1_pm1_tl", "tl_p1", 0), 71*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P1_REF, "pext1_pm1_ref", "clk26m", 1), 72*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P2_TL, "pext1_pm2_tl", "tl_p2", 2), 73*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P2_REF, "pext1_pm2_ref", "clk26m", 3), 74*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_PHY_P1_MCU_BUS, "pext1_pp1_mcu_bus", "clk26m", 8), 75*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_PHY_P1_PEXTP_REF, "pext1_pp1_pextp_ref", "clk26m", 9), 76*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_PHY_P2_MCU_BUS, "pext1_pp2_mcu_bus", "clk26m", 10), 77*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_PHY_P2_PEXTP_REF, "pext1_pp2_pextp_ref", "clk26m", 11), 78*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P1_AXI_250, "pext1_pm1_axi_250", 79*c9b9a66bSLaura Nao "pextp1_usb_axi", 16), 80*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P1_AHB_APB, "pext1_pm1_ahb_apb", 81*c9b9a66bSLaura Nao "pextp1_usb_mem_sub", 17), 82*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P1_PL_P, "pext1_pm1_pl_p", "clk26m", 18), 83*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P2_AXI_250, "pext1_pm2_axi_250", 84*c9b9a66bSLaura Nao "pextp1_usb_axi", 19), 85*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P2_AHB_APB, "pext1_pm2_ahb_apb", 86*c9b9a66bSLaura Nao "pextp1_usb_mem_sub", 20), 87*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_MAC_P2_PL_P, "pext1_pm2_pl_p", "clk26m", 21), 88*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_VLP_AO_P1_LP, "pext1_pextp_vlp_ao_p1_lp", "clk26m", 26), 89*c9b9a66bSLaura Nao GATE_PEXT(CLK_PEXT1_PEXTP_VLP_AO_P2_LP, "pext1_pextp_vlp_ao_p2_lp", "clk26m", 27), 90*c9b9a66bSLaura Nao }; 91*c9b9a66bSLaura Nao 92*c9b9a66bSLaura Nao static u16 pext1_rst_idx_map[] = { 93*c9b9a66bSLaura Nao [MT8196_PEXTP1_RST0_PCIE1_MAC] = 0, 94*c9b9a66bSLaura Nao [MT8196_PEXTP1_RST0_PCIE1_PHY] = 1, 95*c9b9a66bSLaura Nao [MT8196_PEXTP1_RST0_PCIE2_MAC] = 8, 96*c9b9a66bSLaura Nao [MT8196_PEXTP1_RST0_PCIE2_PHY] = 9, 97*c9b9a66bSLaura Nao }; 98*c9b9a66bSLaura Nao 99*c9b9a66bSLaura Nao static const struct mtk_clk_rst_desc pext1_rst_desc = { 100*c9b9a66bSLaura Nao .version = MTK_RST_SET_CLR, 101*c9b9a66bSLaura Nao .rst_bank_ofs = pext_rst_ofs, 102*c9b9a66bSLaura Nao .rst_bank_nr = ARRAY_SIZE(pext_rst_ofs), 103*c9b9a66bSLaura Nao .rst_idx_map = pext1_rst_idx_map, 104*c9b9a66bSLaura Nao .rst_idx_map_nr = ARRAY_SIZE(pext1_rst_idx_map), 105*c9b9a66bSLaura Nao }; 106*c9b9a66bSLaura Nao 107*c9b9a66bSLaura Nao static const struct mtk_clk_desc pext1_mcd = { 108*c9b9a66bSLaura Nao .clks = pext1_clks, 109*c9b9a66bSLaura Nao .num_clks = ARRAY_SIZE(pext1_clks), 110*c9b9a66bSLaura Nao .rst_desc = &pext1_rst_desc, 111*c9b9a66bSLaura Nao }; 112*c9b9a66bSLaura Nao 113*c9b9a66bSLaura Nao static const struct of_device_id of_match_clk_mt8196_pextp[] = { 114*c9b9a66bSLaura Nao { .compatible = "mediatek,mt8196-pextp0cfg-ao", .data = &pext_mcd }, 115*c9b9a66bSLaura Nao { .compatible = "mediatek,mt8196-pextp1cfg-ao", .data = &pext1_mcd }, 116*c9b9a66bSLaura Nao { /* sentinel */ } 117*c9b9a66bSLaura Nao }; 118*c9b9a66bSLaura Nao MODULE_DEVICE_TABLE(of, of_match_clk_mt8196_pextp); 119*c9b9a66bSLaura Nao 120*c9b9a66bSLaura Nao static struct platform_driver clk_mt8196_pextp_drv = { 121*c9b9a66bSLaura Nao .probe = mtk_clk_simple_probe, 122*c9b9a66bSLaura Nao .remove = mtk_clk_simple_remove, 123*c9b9a66bSLaura Nao .driver = { 124*c9b9a66bSLaura Nao .name = "clk-mt8196-pextp", 125*c9b9a66bSLaura Nao .of_match_table = of_match_clk_mt8196_pextp, 126*c9b9a66bSLaura Nao }, 127*c9b9a66bSLaura Nao }; 128*c9b9a66bSLaura Nao 129*c9b9a66bSLaura Nao module_platform_driver(clk_mt8196_pextp_drv); 130*c9b9a66bSLaura Nao MODULE_DESCRIPTION("MediaTek MT8196 PCIe transmit phy clocks driver"); 131*c9b9a66bSLaura Nao MODULE_LICENSE("GPL"); 132