162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (c) 2018 MediaTek Inc. 462306a36Sopenharmony_ci * Author: Ryder Lee <ryder.lee@mediatek.com> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/clk-provider.h> 862306a36Sopenharmony_ci#include <linux/of.h> 962306a36Sopenharmony_ci#include <linux/of_address.h> 1062306a36Sopenharmony_ci#include <linux/of_platform.h> 1162306a36Sopenharmony_ci#include <linux/platform_device.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include "clk-mtk.h" 1462306a36Sopenharmony_ci#include "clk-gate.h" 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <dt-bindings/clock/mt2701-clk.h> 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_ci#define GATE_AUDIO0(_id, _name, _parent, _shift) \ 1962306a36Sopenharmony_ci GATE_MTK(_id, _name, _parent, &audio0_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr) 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci#define GATE_AUDIO1(_id, _name, _parent, _shift) \ 2262306a36Sopenharmony_ci GATE_MTK(_id, _name, _parent, &audio1_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr) 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci#define GATE_AUDIO2(_id, _name, _parent, _shift) \ 2562306a36Sopenharmony_ci GATE_MTK(_id, _name, _parent, &audio2_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr) 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci#define GATE_AUDIO3(_id, _name, _parent, _shift) \ 2862306a36Sopenharmony_ci GATE_MTK(_id, _name, _parent, &audio3_cg_regs, _shift, &mtk_clk_gate_ops_no_setclr) 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic const struct mtk_gate_regs audio0_cg_regs = { 3162306a36Sopenharmony_ci .set_ofs = 0x0, 3262306a36Sopenharmony_ci .clr_ofs = 0x0, 3362306a36Sopenharmony_ci .sta_ofs = 0x0, 3462306a36Sopenharmony_ci}; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic const struct mtk_gate_regs audio1_cg_regs = { 3762306a36Sopenharmony_ci .set_ofs = 0x10, 3862306a36Sopenharmony_ci .clr_ofs = 0x10, 3962306a36Sopenharmony_ci .sta_ofs = 0x10, 4062306a36Sopenharmony_ci}; 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_cistatic const struct mtk_gate_regs audio2_cg_regs = { 4362306a36Sopenharmony_ci .set_ofs = 0x14, 4462306a36Sopenharmony_ci .clr_ofs = 0x14, 4562306a36Sopenharmony_ci .sta_ofs = 0x14, 4662306a36Sopenharmony_ci}; 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_cistatic const struct mtk_gate_regs audio3_cg_regs = { 4962306a36Sopenharmony_ci .set_ofs = 0x634, 5062306a36Sopenharmony_ci .clr_ofs = 0x634, 5162306a36Sopenharmony_ci .sta_ofs = 0x634, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistatic const struct mtk_gate audio_clks[] = { 5562306a36Sopenharmony_ci GATE_DUMMY(CLK_DUMMY, "aud_dummy"), 5662306a36Sopenharmony_ci /* AUDIO0 */ 5762306a36Sopenharmony_ci GATE_AUDIO0(CLK_AUD_AFE, "audio_afe", "aud_intbus_sel", 2), 5862306a36Sopenharmony_ci GATE_AUDIO0(CLK_AUD_HDMI, "audio_hdmi", "audpll_sel", 20), 5962306a36Sopenharmony_ci GATE_AUDIO0(CLK_AUD_SPDF, "audio_spdf", "audpll_sel", 21), 6062306a36Sopenharmony_ci GATE_AUDIO0(CLK_AUD_SPDF2, "audio_spdf2", "audpll_sel", 22), 6162306a36Sopenharmony_ci GATE_AUDIO0(CLK_AUD_APLL, "audio_apll", "audpll_sel", 23), 6262306a36Sopenharmony_ci /* AUDIO1 */ 6362306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SIN1, "audio_i2sin1", "aud_mux1_sel", 0), 6462306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SIN2, "audio_i2sin2", "aud_mux1_sel", 1), 6562306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SIN3, "audio_i2sin3", "aud_mux1_sel", 2), 6662306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SIN4, "audio_i2sin4", "aud_mux1_sel", 3), 6762306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SIN5, "audio_i2sin5", "aud_mux1_sel", 4), 6862306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SIN6, "audio_i2sin6", "aud_mux1_sel", 5), 6962306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SO1, "audio_i2so1", "aud_mux1_sel", 6), 7062306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SO2, "audio_i2so2", "aud_mux1_sel", 7), 7162306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SO3, "audio_i2so3", "aud_mux1_sel", 8), 7262306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SO4, "audio_i2so4", "aud_mux1_sel", 9), 7362306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SO5, "audio_i2so5", "aud_mux1_sel", 10), 7462306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_I2SO6, "audio_i2so6", "aud_mux1_sel", 11), 7562306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_ASRCI1, "audio_asrci1", "asm_h_sel", 12), 7662306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_ASRCI2, "audio_asrci2", "asm_h_sel", 13), 7762306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_ASRCO1, "audio_asrco1", "asm_h_sel", 14), 7862306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_ASRCO2, "audio_asrco2", "asm_h_sel", 15), 7962306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_INTDIR, "audio_intdir", "intdir_sel", 20), 8062306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_A1SYS, "audio_a1sys", "aud_mux1_sel", 21), 8162306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_A2SYS, "audio_a2sys", "aud_mux2_sel", 22), 8262306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_AFE_CONN, "audio_afe_conn", "aud_mux1_sel", 23), 8362306a36Sopenharmony_ci GATE_AUDIO1(CLK_AUD_AFE_MRGIF, "audio_afe_mrgif", "aud_mux1_sel", 25), 8462306a36Sopenharmony_ci /* AUDIO2 */ 8562306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_UL1, "audio_ul1", "aud_mux1_sel", 0), 8662306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_UL2, "audio_ul2", "aud_mux1_sel", 1), 8762306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_UL3, "audio_ul3", "aud_mux1_sel", 2), 8862306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_UL4, "audio_ul4", "aud_mux1_sel", 3), 8962306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_UL5, "audio_ul5", "aud_mux1_sel", 4), 9062306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_UL6, "audio_ul6", "aud_mux1_sel", 5), 9162306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_DL1, "audio_dl1", "aud_mux1_sel", 6), 9262306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_DL2, "audio_dl2", "aud_mux1_sel", 7), 9362306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_DL3, "audio_dl3", "aud_mux1_sel", 8), 9462306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_DL4, "audio_dl4", "aud_mux1_sel", 9), 9562306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_DL5, "audio_dl5", "aud_mux1_sel", 10), 9662306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_DL6, "audio_dl6", "aud_mux1_sel", 11), 9762306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_DLMCH, "audio_dlmch", "aud_mux1_sel", 12), 9862306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_ARB1, "audio_arb1", "aud_mux1_sel", 13), 9962306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_AWB1, "audio_awb", "aud_mux1_sel", 14), 10062306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_AWB2, "audio_awb2", "aud_mux1_sel", 15), 10162306a36Sopenharmony_ci GATE_AUDIO2(CLK_AUD_MMIF_DAI, "audio_dai", "aud_mux1_sel", 16), 10262306a36Sopenharmony_ci /* AUDIO3 */ 10362306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_ASRCI3, "audio_asrci3", "asm_h_sel", 2), 10462306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_ASRCI4, "audio_asrci4", "asm_h_sel", 3), 10562306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_ASRCI5, "audio_asrci5", "asm_h_sel", 4), 10662306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_ASRCI6, "audio_asrci6", "asm_h_sel", 5), 10762306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_ASRCO3, "audio_asrco3", "asm_h_sel", 6), 10862306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_ASRCO4, "audio_asrco4", "asm_h_sel", 7), 10962306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_ASRCO5, "audio_asrco5", "asm_h_sel", 8), 11062306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_ASRCO6, "audio_asrco6", "asm_h_sel", 9), 11162306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_MEM_ASRC1, "audio_mem_asrc1", "asm_h_sel", 10), 11262306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_MEM_ASRC2, "audio_mem_asrc2", "asm_h_sel", 11), 11362306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_MEM_ASRC3, "audio_mem_asrc3", "asm_h_sel", 12), 11462306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_MEM_ASRC4, "audio_mem_asrc4", "asm_h_sel", 13), 11562306a36Sopenharmony_ci GATE_AUDIO3(CLK_AUD_MEM_ASRC5, "audio_mem_asrc5", "asm_h_sel", 14), 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cistatic const struct mtk_clk_desc audio_desc = { 11962306a36Sopenharmony_ci .clks = audio_clks, 12062306a36Sopenharmony_ci .num_clks = ARRAY_SIZE(audio_clks), 12162306a36Sopenharmony_ci}; 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_cistatic const struct of_device_id of_match_clk_mt2701_aud[] = { 12462306a36Sopenharmony_ci { .compatible = "mediatek,mt2701-audsys", .data = &audio_desc }, 12562306a36Sopenharmony_ci { /* sentinel */ } 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ciMODULE_DEVICE_TABLE(of, of_match_clk_mt2701_aud); 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistatic int clk_mt2701_aud_probe(struct platform_device *pdev) 13062306a36Sopenharmony_ci{ 13162306a36Sopenharmony_ci int r; 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci r = mtk_clk_simple_probe(pdev); 13462306a36Sopenharmony_ci if (r) { 13562306a36Sopenharmony_ci dev_err(&pdev->dev, 13662306a36Sopenharmony_ci "could not register clock provider: %s: %d\n", 13762306a36Sopenharmony_ci pdev->name, r); 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci return r; 14062306a36Sopenharmony_ci } 14162306a36Sopenharmony_ci 14262306a36Sopenharmony_ci r = devm_of_platform_populate(&pdev->dev); 14362306a36Sopenharmony_ci if (r) 14462306a36Sopenharmony_ci goto err_plat_populate; 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci return 0; 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cierr_plat_populate: 14962306a36Sopenharmony_ci mtk_clk_simple_remove(pdev); 15062306a36Sopenharmony_ci return r; 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistatic void clk_mt2701_aud_remove(struct platform_device *pdev) 15462306a36Sopenharmony_ci{ 15562306a36Sopenharmony_ci of_platform_depopulate(&pdev->dev); 15662306a36Sopenharmony_ci mtk_clk_simple_remove(pdev); 15762306a36Sopenharmony_ci} 15862306a36Sopenharmony_ci 15962306a36Sopenharmony_cistatic struct platform_driver clk_mt2701_aud_drv = { 16062306a36Sopenharmony_ci .probe = clk_mt2701_aud_probe, 16162306a36Sopenharmony_ci .remove_new = clk_mt2701_aud_remove, 16262306a36Sopenharmony_ci .driver = { 16362306a36Sopenharmony_ci .name = "clk-mt2701-aud", 16462306a36Sopenharmony_ci .of_match_table = of_match_clk_mt2701_aud, 16562306a36Sopenharmony_ci }, 16662306a36Sopenharmony_ci}; 16762306a36Sopenharmony_cimodule_platform_driver(clk_mt2701_aud_drv); 16862306a36Sopenharmony_ciMODULE_LICENSE("GPL"); 169