14c02c9afSAngeloGioacchino Del Regno // SPDX-License-Identifier: GPL-2.0-only 24c02c9afSAngeloGioacchino Del Regno /* 34c02c9afSAngeloGioacchino Del Regno * Copyright (c) 2022 Collabora Ltd. 44c02c9afSAngeloGioacchino Del Regno * Author: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com> 54c02c9afSAngeloGioacchino Del Regno */ 64c02c9afSAngeloGioacchino Del Regno 74c02c9afSAngeloGioacchino Del Regno #include <dt-bindings/clock/mt8173-clk.h> 84c02c9afSAngeloGioacchino Del Regno #include <linux/module.h> 94c02c9afSAngeloGioacchino Del Regno #include <linux/platform_device.h> 104c02c9afSAngeloGioacchino Del Regno #include "clk-gate.h" 114c02c9afSAngeloGioacchino Del Regno #include "clk-mtk.h" 124c02c9afSAngeloGioacchino Del Regno #include "reset.h" 134c02c9afSAngeloGioacchino Del Regno 144c02c9afSAngeloGioacchino Del Regno #define GATE_PERI0(_id, _name, _parent, _shift) \ 154c02c9afSAngeloGioacchino Del Regno GATE_MTK(_id, _name, _parent, &peri0_cg_regs, \ 164c02c9afSAngeloGioacchino Del Regno _shift, &mtk_clk_gate_ops_setclr) 174c02c9afSAngeloGioacchino Del Regno 184c02c9afSAngeloGioacchino Del Regno #define GATE_PERI1(_id, _name, _parent, _shift) \ 194c02c9afSAngeloGioacchino Del Regno GATE_MTK(_id, _name, _parent, &peri1_cg_regs, \ 204c02c9afSAngeloGioacchino Del Regno _shift, &mtk_clk_gate_ops_setclr) 214c02c9afSAngeloGioacchino Del Regno 224c02c9afSAngeloGioacchino Del Regno static DEFINE_SPINLOCK(mt8173_clk_lock); 234c02c9afSAngeloGioacchino Del Regno 244c02c9afSAngeloGioacchino Del Regno static const struct mtk_gate_regs peri0_cg_regs = { 254c02c9afSAngeloGioacchino Del Regno .set_ofs = 0x0008, 264c02c9afSAngeloGioacchino Del Regno .clr_ofs = 0x0010, 274c02c9afSAngeloGioacchino Del Regno .sta_ofs = 0x0018, 284c02c9afSAngeloGioacchino Del Regno }; 294c02c9afSAngeloGioacchino Del Regno 304c02c9afSAngeloGioacchino Del Regno static const struct mtk_gate_regs peri1_cg_regs = { 314c02c9afSAngeloGioacchino Del Regno .set_ofs = 0x000c, 324c02c9afSAngeloGioacchino Del Regno .clr_ofs = 0x0014, 334c02c9afSAngeloGioacchino Del Regno .sta_ofs = 0x001c, 344c02c9afSAngeloGioacchino Del Regno }; 354c02c9afSAngeloGioacchino Del Regno 364c02c9afSAngeloGioacchino Del Regno static const char * const uart_ck_sel_parents[] = { 374c02c9afSAngeloGioacchino Del Regno "clk26m", 384c02c9afSAngeloGioacchino Del Regno "uart_sel", 394c02c9afSAngeloGioacchino Del Regno }; 404c02c9afSAngeloGioacchino Del Regno 414c02c9afSAngeloGioacchino Del Regno static const struct mtk_composite peri_clks[] = { 424c02c9afSAngeloGioacchino Del Regno MUX(CLK_PERI_UART0_SEL, "uart0_ck_sel", uart_ck_sel_parents, 0x40c, 0, 1), 434c02c9afSAngeloGioacchino Del Regno MUX(CLK_PERI_UART1_SEL, "uart1_ck_sel", uart_ck_sel_parents, 0x40c, 1, 1), 444c02c9afSAngeloGioacchino Del Regno MUX(CLK_PERI_UART2_SEL, "uart2_ck_sel", uart_ck_sel_parents, 0x40c, 2, 1), 454c02c9afSAngeloGioacchino Del Regno MUX(CLK_PERI_UART3_SEL, "uart3_ck_sel", uart_ck_sel_parents, 0x40c, 3, 1), 464c02c9afSAngeloGioacchino Del Regno }; 474c02c9afSAngeloGioacchino Del Regno 484c02c9afSAngeloGioacchino Del Regno static const struct mtk_gate peri_gates[] = { 49e4078219SAngeloGioacchino Del Regno GATE_DUMMY(CLK_DUMMY, "peri_gate_dummy"), 504c02c9afSAngeloGioacchino Del Regno /* PERI0 */ 514c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_NFI, "peri_nfi", "axi_sel", 0), 524c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_THERM, "peri_therm", "axi_sel", 1), 534c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_PWM1, "peri_pwm1", "axi_sel", 2), 544c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_PWM2, "peri_pwm2", "axi_sel", 3), 554c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_PWM3, "peri_pwm3", "axi_sel", 4), 564c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_PWM4, "peri_pwm4", "axi_sel", 5), 574c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_PWM5, "peri_pwm5", "axi_sel", 6), 584c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_PWM6, "peri_pwm6", "axi_sel", 7), 594c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_PWM7, "peri_pwm7", "axi_sel", 8), 604c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_PWM, "peri_pwm", "axi_sel", 9), 614c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_USB0, "peri_usb0", "usb20_sel", 10), 624c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_USB1, "peri_usb1", "usb20_sel", 11), 634c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_AP_DMA, "peri_ap_dma", "axi_sel", 12), 644c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_MSDC30_0, "peri_msdc30_0", "msdc50_0_sel", 13), 654c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_MSDC30_1, "peri_msdc30_1", "msdc30_1_sel", 14), 664c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_MSDC30_2, "peri_msdc30_2", "msdc30_2_sel", 15), 674c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_MSDC30_3, "peri_msdc30_3", "msdc30_3_sel", 16), 684c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_NLI_ARB, "peri_nli_arb", "axi_sel", 17), 694c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_IRDA, "peri_irda", "irda_sel", 18), 704c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_UART0, "peri_uart0", "axi_sel", 19), 714c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_UART1, "peri_uart1", "axi_sel", 20), 724c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_UART2, "peri_uart2", "axi_sel", 21), 734c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_UART3, "peri_uart3", "axi_sel", 22), 744c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_I2C0, "peri_i2c0", "axi_sel", 23), 754c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_I2C1, "peri_i2c1", "axi_sel", 24), 764c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_I2C2, "peri_i2c2", "axi_sel", 25), 774c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_I2C3, "peri_i2c3", "axi_sel", 26), 784c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_I2C4, "peri_i2c4", "axi_sel", 27), 794c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_AUXADC, "peri_auxadc", "clk26m", 28), 804c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_SPI0, "peri_spi0", "spi_sel", 29), 814c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_I2C5, "peri_i2c5", "axi_sel", 30), 824c02c9afSAngeloGioacchino Del Regno GATE_PERI0(CLK_PERI_NFIECC, "peri_nfiecc", "axi_sel", 31), 834c02c9afSAngeloGioacchino Del Regno /* PERI1 */ 844c02c9afSAngeloGioacchino Del Regno GATE_PERI1(CLK_PERI_SPI, "peri_spi", "spi_sel", 0), 854c02c9afSAngeloGioacchino Del Regno GATE_PERI1(CLK_PERI_IRRX, "peri_irrx", "spi_sel", 1), 864c02c9afSAngeloGioacchino Del Regno GATE_PERI1(CLK_PERI_I2C6, "peri_i2c6", "axi_sel", 2), 874c02c9afSAngeloGioacchino Del Regno }; 884c02c9afSAngeloGioacchino Del Regno 894c02c9afSAngeloGioacchino Del Regno static u16 pericfg_rst_ofs[] = { 0x0, 0x4 }; 904c02c9afSAngeloGioacchino Del Regno 914c02c9afSAngeloGioacchino Del Regno static const struct mtk_clk_rst_desc clk_rst_desc = { 924c02c9afSAngeloGioacchino Del Regno .version = MTK_RST_SIMPLE, 934c02c9afSAngeloGioacchino Del Regno .rst_bank_ofs = pericfg_rst_ofs, 944c02c9afSAngeloGioacchino Del Regno .rst_bank_nr = ARRAY_SIZE(pericfg_rst_ofs), 954c02c9afSAngeloGioacchino Del Regno }; 964c02c9afSAngeloGioacchino Del Regno 97e4078219SAngeloGioacchino Del Regno static const struct mtk_clk_desc peri_desc = { 98e4078219SAngeloGioacchino Del Regno .clks = peri_gates, 99e4078219SAngeloGioacchino Del Regno .num_clks = ARRAY_SIZE(peri_gates), 100e4078219SAngeloGioacchino Del Regno .composite_clks = peri_clks, 101e4078219SAngeloGioacchino Del Regno .num_composite_clks = ARRAY_SIZE(peri_clks), 102e4078219SAngeloGioacchino Del Regno .clk_lock = &mt8173_clk_lock, 103e4078219SAngeloGioacchino Del Regno .rst_desc = &clk_rst_desc, 1044c02c9afSAngeloGioacchino Del Regno }; 1054c02c9afSAngeloGioacchino Del Regno 106e4078219SAngeloGioacchino Del Regno static const struct of_device_id of_match_clk_mt8173_pericfg[] = { 107e4078219SAngeloGioacchino Del Regno { .compatible = "mediatek,mt8173-pericfg", .data = &peri_desc }, 108e4078219SAngeloGioacchino Del Regno { /* sentinel */ } 109e4078219SAngeloGioacchino Del Regno }; 110*65c9ad77SAngeloGioacchino Del Regno MODULE_DEVICE_TABLE(of, of_match_clk_mt8173_pericfg); 1114c02c9afSAngeloGioacchino Del Regno 1124c02c9afSAngeloGioacchino Del Regno static struct platform_driver clk_mt8173_pericfg_drv = { 1134c02c9afSAngeloGioacchino Del Regno .driver = { 1144c02c9afSAngeloGioacchino Del Regno .name = "clk-mt8173-pericfg", 1154c02c9afSAngeloGioacchino Del Regno .of_match_table = of_match_clk_mt8173_pericfg, 1164c02c9afSAngeloGioacchino Del Regno }, 117e4078219SAngeloGioacchino Del Regno .probe = mtk_clk_simple_probe, 118e4078219SAngeloGioacchino Del Regno .remove_new = mtk_clk_simple_remove, 1194c02c9afSAngeloGioacchino Del Regno }; 1204c02c9afSAngeloGioacchino Del Regno module_platform_driver(clk_mt8173_pericfg_drv); 1214c02c9afSAngeloGioacchino Del Regno 1224c02c9afSAngeloGioacchino Del Regno MODULE_DESCRIPTION("MediaTek MT8173 pericfg clocks driver"); 1234c02c9afSAngeloGioacchino Del Regno MODULE_LICENSE("GPL"); 124