1*21277990SLaura Nao // SPDX-License-Identifier: GPL-2.0-only 2*21277990SLaura Nao /* 3*21277990SLaura Nao * Copyright (c) 2025 MediaTek Inc. 4*21277990SLaura Nao * Guangjie Song <guangjie.song@mediatek.com> 5*21277990SLaura Nao * Copyright (c) 2025 Collabora Ltd. 6*21277990SLaura Nao * Laura Nao <laura.nao@collabora.com> 7*21277990SLaura Nao */ 8*21277990SLaura Nao #include <dt-bindings/clock/mediatek,mt8196-clock.h> 9*21277990SLaura Nao 10*21277990SLaura Nao #include <linux/clk-provider.h> 11*21277990SLaura Nao #include <linux/module.h> 12*21277990SLaura Nao #include <linux/of_device.h> 13*21277990SLaura Nao #include <linux/platform_device.h> 14*21277990SLaura Nao 15*21277990SLaura Nao #include "clk-gate.h" 16*21277990SLaura Nao #include "clk-mtk.h" 17*21277990SLaura Nao 18*21277990SLaura Nao static const struct mtk_gate_regs peri_ao0_cg_regs = { 19*21277990SLaura Nao .set_ofs = 0x24, 20*21277990SLaura Nao .clr_ofs = 0x28, 21*21277990SLaura Nao .sta_ofs = 0x10, 22*21277990SLaura Nao }; 23*21277990SLaura Nao 24*21277990SLaura Nao static const struct mtk_gate_regs peri_ao1_cg_regs = { 25*21277990SLaura Nao .set_ofs = 0x2c, 26*21277990SLaura Nao .clr_ofs = 0x30, 27*21277990SLaura Nao .sta_ofs = 0x14, 28*21277990SLaura Nao }; 29*21277990SLaura Nao 30*21277990SLaura Nao static const struct mtk_gate_regs peri_ao1_hwv_regs = { 31*21277990SLaura Nao .set_ofs = 0x0008, 32*21277990SLaura Nao .clr_ofs = 0x000c, 33*21277990SLaura Nao .sta_ofs = 0x2c04, 34*21277990SLaura Nao }; 35*21277990SLaura Nao 36*21277990SLaura Nao static const struct mtk_gate_regs peri_ao2_cg_regs = { 37*21277990SLaura Nao .set_ofs = 0x34, 38*21277990SLaura Nao .clr_ofs = 0x38, 39*21277990SLaura Nao .sta_ofs = 0x18, 40*21277990SLaura Nao }; 41*21277990SLaura Nao 42*21277990SLaura Nao #define GATE_PERI_AO0(_id, _name, _parent, _shift) { \ 43*21277990SLaura Nao .id = _id, \ 44*21277990SLaura Nao .name = _name, \ 45*21277990SLaura Nao .parent_name = _parent, \ 46*21277990SLaura Nao .regs = &peri_ao0_cg_regs, \ 47*21277990SLaura Nao .shift = _shift, \ 48*21277990SLaura Nao .ops = &mtk_clk_gate_ops_setclr, \ 49*21277990SLaura Nao } 50*21277990SLaura Nao 51*21277990SLaura Nao #define GATE_PERI_AO1(_id, _name, _parent, _shift) { \ 52*21277990SLaura Nao .id = _id, \ 53*21277990SLaura Nao .name = _name, \ 54*21277990SLaura Nao .parent_name = _parent, \ 55*21277990SLaura Nao .regs = &peri_ao1_cg_regs, \ 56*21277990SLaura Nao .shift = _shift, \ 57*21277990SLaura Nao .ops = &mtk_clk_gate_ops_setclr, \ 58*21277990SLaura Nao } 59*21277990SLaura Nao 60*21277990SLaura Nao #define GATE_HWV_PERI_AO1(_id, _name, _parent, _shift) {\ 61*21277990SLaura Nao .id = _id, \ 62*21277990SLaura Nao .name = _name, \ 63*21277990SLaura Nao .parent_name = _parent, \ 64*21277990SLaura Nao .regs = &peri_ao1_cg_regs, \ 65*21277990SLaura Nao .hwv_regs = &peri_ao1_hwv_regs, \ 66*21277990SLaura Nao .shift = _shift, \ 67*21277990SLaura Nao .ops = &mtk_clk_gate_hwv_ops_setclr, \ 68*21277990SLaura Nao } 69*21277990SLaura Nao 70*21277990SLaura Nao #define GATE_PERI_AO2(_id, _name, _parent, _shift) { \ 71*21277990SLaura Nao .id = _id, \ 72*21277990SLaura Nao .name = _name, \ 73*21277990SLaura Nao .parent_name = _parent, \ 74*21277990SLaura Nao .regs = &peri_ao2_cg_regs, \ 75*21277990SLaura Nao .shift = _shift, \ 76*21277990SLaura Nao .ops = &mtk_clk_gate_ops_setclr, \ 77*21277990SLaura Nao } 78*21277990SLaura Nao 79*21277990SLaura Nao static const struct mtk_gate peri_ao_clks[] = { 80*21277990SLaura Nao /* PERI_AO0 */ 81*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_UART0_BCLK, "peri_ao_uart0_bclk", "uart", 0), 82*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_UART1_BCLK, "peri_ao_uart1_bclk", "uart", 1), 83*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_UART2_BCLK, "peri_ao_uart2_bclk", "uart", 2), 84*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_UART3_BCLK, "peri_ao_uart3_bclk", "uart", 3), 85*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_UART4_BCLK, "peri_ao_uart4_bclk", "uart", 4), 86*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_UART5_BCLK, "peri_ao_uart5_bclk", "uart", 5), 87*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_PWM_X16W_HCLK, "peri_ao_pwm_x16w", "p_axi", 12), 88*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_PWM_X16W_BCLK, "peri_ao_pwm_x16w_bclk", "pwm", 13), 89*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_PWM_PWM_BCLK0, "peri_ao_pwm_pwm_bclk0", "pwm", 14), 90*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_PWM_PWM_BCLK1, "peri_ao_pwm_pwm_bclk1", "pwm", 15), 91*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_PWM_PWM_BCLK2, "peri_ao_pwm_pwm_bclk2", "pwm", 16), 92*21277990SLaura Nao GATE_PERI_AO0(CLK_PERI_AO_PWM_PWM_BCLK3, "peri_ao_pwm_pwm_bclk3", "pwm", 17), 93*21277990SLaura Nao /* PERI_AO1 */ 94*21277990SLaura Nao GATE_HWV_PERI_AO1(CLK_PERI_AO_SPI0_BCLK, "peri_ao_spi0_bclk", "spi0_b", 0), 95*21277990SLaura Nao GATE_HWV_PERI_AO1(CLK_PERI_AO_SPI1_BCLK, "peri_ao_spi1_bclk", "spi1_b", 2), 96*21277990SLaura Nao GATE_HWV_PERI_AO1(CLK_PERI_AO_SPI2_BCLK, "peri_ao_spi2_bclk", "spi2_b", 3), 97*21277990SLaura Nao GATE_HWV_PERI_AO1(CLK_PERI_AO_SPI3_BCLK, "peri_ao_spi3_bclk", "spi3_b", 4), 98*21277990SLaura Nao GATE_HWV_PERI_AO1(CLK_PERI_AO_SPI4_BCLK, "peri_ao_spi4_bclk", "spi4_b", 5), 99*21277990SLaura Nao GATE_HWV_PERI_AO1(CLK_PERI_AO_SPI5_BCLK, "peri_ao_spi5_bclk", "spi5_b", 6), 100*21277990SLaura Nao GATE_HWV_PERI_AO1(CLK_PERI_AO_SPI6_BCLK, "peri_ao_spi6_bclk", "spi6_b", 7), 101*21277990SLaura Nao GATE_HWV_PERI_AO1(CLK_PERI_AO_SPI7_BCLK, "peri_ao_spi7_bclk", "spi7_b", 8), 102*21277990SLaura Nao GATE_PERI_AO1(CLK_PERI_AO_FLASHIF_FLASH, "peri_ao_flashif_flash", "peri_ao_flashif_27m", 103*21277990SLaura Nao 18), 104*21277990SLaura Nao GATE_PERI_AO1(CLK_PERI_AO_FLASHIF_27M, "peri_ao_flashif_27m", "sflash", 19), 105*21277990SLaura Nao GATE_PERI_AO1(CLK_PERI_AO_FLASHIF_DRAM, "peri_ao_flashif_dram", "p_axi", 20), 106*21277990SLaura Nao GATE_PERI_AO1(CLK_PERI_AO_FLASHIF_AXI, "peri_ao_flashif_axi", "peri_ao_flashif_dram", 21), 107*21277990SLaura Nao GATE_PERI_AO1(CLK_PERI_AO_FLASHIF_BCLK, "peri_ao_flashif_bclk", "p_axi", 22), 108*21277990SLaura Nao GATE_PERI_AO1(CLK_PERI_AO_AP_DMA_X32W_BCLK, "peri_ao_ap_dma_x32w_bclk", "p_axi", 26), 109*21277990SLaura Nao /* PERI_AO2 */ 110*21277990SLaura Nao GATE_PERI_AO2(CLK_PERI_AO_MSDC1_MSDC_SRC, "peri_ao_msdc1_msdc_src", "msdc30_1", 1), 111*21277990SLaura Nao GATE_PERI_AO2(CLK_PERI_AO_MSDC1_HCLK, "peri_ao_msdc1", "peri_ao_msdc1_axi", 2), 112*21277990SLaura Nao GATE_PERI_AO2(CLK_PERI_AO_MSDC1_AXI, "peri_ao_msdc1_axi", "p_axi", 3), 113*21277990SLaura Nao GATE_PERI_AO2(CLK_PERI_AO_MSDC1_HCLK_WRAP, "peri_ao_msdc1_h_wrap", "peri_ao_msdc1", 4), 114*21277990SLaura Nao GATE_PERI_AO2(CLK_PERI_AO_MSDC2_MSDC_SRC, "peri_ao_msdc2_msdc_src", "msdc30_2", 10), 115*21277990SLaura Nao GATE_PERI_AO2(CLK_PERI_AO_MSDC2_HCLK, "peri_ao_msdc2", "peri_ao_msdc2_axi", 11), 116*21277990SLaura Nao GATE_PERI_AO2(CLK_PERI_AO_MSDC2_AXI, "peri_ao_msdc2_axi", "p_axi", 12), 117*21277990SLaura Nao GATE_PERI_AO2(CLK_PERI_AO_MSDC2_HCLK_WRAP, "peri_ao_msdc2_h_wrap", "peri_ao_msdc2", 13), 118*21277990SLaura Nao }; 119*21277990SLaura Nao 120*21277990SLaura Nao static const struct mtk_clk_desc peri_ao_mcd = { 121*21277990SLaura Nao .clks = peri_ao_clks, 122*21277990SLaura Nao .num_clks = ARRAY_SIZE(peri_ao_clks), 123*21277990SLaura Nao }; 124*21277990SLaura Nao 125*21277990SLaura Nao static const struct of_device_id of_match_clk_mt8196_peri_ao[] = { 126*21277990SLaura Nao { .compatible = "mediatek,mt8196-pericfg-ao", .data = &peri_ao_mcd }, 127*21277990SLaura Nao { /* sentinel */ } 128*21277990SLaura Nao }; 129*21277990SLaura Nao MODULE_DEVICE_TABLE(of, of_match_clk_mt8196_peri_ao); 130*21277990SLaura Nao 131*21277990SLaura Nao static struct platform_driver clk_mt8196_peri_ao_drv = { 132*21277990SLaura Nao .probe = mtk_clk_simple_probe, 133*21277990SLaura Nao .remove = mtk_clk_simple_remove, 134*21277990SLaura Nao .driver = { 135*21277990SLaura Nao .name = "clk-mt8196-peri-ao", 136*21277990SLaura Nao .of_match_table = of_match_clk_mt8196_peri_ao, 137*21277990SLaura Nao }, 138*21277990SLaura Nao }; 139*21277990SLaura Nao 140*21277990SLaura Nao MODULE_DESCRIPTION("MediaTek MT8196 pericfg_ao clock controller driver"); 141*21277990SLaura Nao module_platform_driver(clk_mt8196_peri_ao_drv); 142*21277990SLaura Nao MODULE_LICENSE("GPL"); 143