1*e5682c95STaniya Das // SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2*e5682c95STaniya Das /* 3*e5682c95STaniya Das * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. 4*e5682c95STaniya Das */ 5*e5682c95STaniya Das 6*e5682c95STaniya Das #include <linux/clk-provider.h> 7*e5682c95STaniya Das #include <linux/module.h> 8*e5682c95STaniya Das #include <linux/of.h> 9*e5682c95STaniya Das #include <linux/platform_device.h> 10*e5682c95STaniya Das #include <linux/regmap.h> 11*e5682c95STaniya Das 12*e5682c95STaniya Das #include <dt-bindings/clock/qcom,sm8750-tcsr.h> 13*e5682c95STaniya Das 14*e5682c95STaniya Das #include "clk-branch.h" 15*e5682c95STaniya Das #include "clk-regmap.h" 16*e5682c95STaniya Das #include "clk-regmap-divider.h" 17*e5682c95STaniya Das #include "clk-regmap-mux.h" 18*e5682c95STaniya Das #include "common.h" 19*e5682c95STaniya Das 20*e5682c95STaniya Das enum { 21*e5682c95STaniya Das DT_BI_TCXO_PAD, 22*e5682c95STaniya Das }; 23*e5682c95STaniya Das 24*e5682c95STaniya Das static struct clk_branch tcsr_pcie_0_clkref_en = { 25*e5682c95STaniya Das .halt_reg = 0x15044, 26*e5682c95STaniya Das .halt_check = BRANCH_HALT_DELAY, 27*e5682c95STaniya Das .clkr = { 28*e5682c95STaniya Das .enable_reg = 0x15044, 29*e5682c95STaniya Das .enable_mask = BIT(0), 30*e5682c95STaniya Das .hw.init = &(const struct clk_init_data) { 31*e5682c95STaniya Das .name = "tcsr_pcie_0_clkref_en", 32*e5682c95STaniya Das .ops = &clk_branch2_ops, 33*e5682c95STaniya Das }, 34*e5682c95STaniya Das }, 35*e5682c95STaniya Das }; 36*e5682c95STaniya Das 37*e5682c95STaniya Das static struct clk_branch tcsr_usb3_clkref_en = { 38*e5682c95STaniya Das .halt_reg = 0x1504c, 39*e5682c95STaniya Das .halt_check = BRANCH_HALT_DELAY, 40*e5682c95STaniya Das .clkr = { 41*e5682c95STaniya Das .enable_reg = 0x1504c, 42*e5682c95STaniya Das .enable_mask = BIT(0), 43*e5682c95STaniya Das .hw.init = &(const struct clk_init_data) { 44*e5682c95STaniya Das .name = "tcsr_usb3_clkref_en", 45*e5682c95STaniya Das .parent_data = &(const struct clk_parent_data){ 46*e5682c95STaniya Das .index = DT_BI_TCXO_PAD, 47*e5682c95STaniya Das }, 48*e5682c95STaniya Das .num_parents = 1, 49*e5682c95STaniya Das .ops = &clk_branch2_ops, 50*e5682c95STaniya Das }, 51*e5682c95STaniya Das }, 52*e5682c95STaniya Das }; 53*e5682c95STaniya Das 54*e5682c95STaniya Das static struct clk_branch tcsr_ufs_clkref_en = { 55*e5682c95STaniya Das .halt_reg = 0x15054, 56*e5682c95STaniya Das .halt_check = BRANCH_HALT_DELAY, 57*e5682c95STaniya Das .clkr = { 58*e5682c95STaniya Das .enable_reg = 0x15054, 59*e5682c95STaniya Das .enable_mask = BIT(0), 60*e5682c95STaniya Das .hw.init = &(const struct clk_init_data) { 61*e5682c95STaniya Das .name = "tcsr_ufs_clkref_en", 62*e5682c95STaniya Das .parent_data = &(const struct clk_parent_data){ 63*e5682c95STaniya Das .index = DT_BI_TCXO_PAD, 64*e5682c95STaniya Das }, 65*e5682c95STaniya Das .num_parents = 1, 66*e5682c95STaniya Das .ops = &clk_branch2_ops, 67*e5682c95STaniya Das }, 68*e5682c95STaniya Das }, 69*e5682c95STaniya Das }; 70*e5682c95STaniya Das 71*e5682c95STaniya Das static struct clk_branch tcsr_usb2_clkref_en = { 72*e5682c95STaniya Das .halt_reg = 0x1505c, 73*e5682c95STaniya Das .halt_check = BRANCH_HALT_DELAY, 74*e5682c95STaniya Das .clkr = { 75*e5682c95STaniya Das .enable_reg = 0x1505c, 76*e5682c95STaniya Das .enable_mask = BIT(0), 77*e5682c95STaniya Das .hw.init = &(const struct clk_init_data) { 78*e5682c95STaniya Das .name = "tcsr_usb2_clkref_en", 79*e5682c95STaniya Das .parent_data = &(const struct clk_parent_data){ 80*e5682c95STaniya Das .index = DT_BI_TCXO_PAD, 81*e5682c95STaniya Das }, 82*e5682c95STaniya Das .num_parents = 1, 83*e5682c95STaniya Das .ops = &clk_branch2_ops, 84*e5682c95STaniya Das }, 85*e5682c95STaniya Das }, 86*e5682c95STaniya Das }; 87*e5682c95STaniya Das 88*e5682c95STaniya Das static struct clk_regmap *tcsr_cc_kaanapali_clocks[] = { 89*e5682c95STaniya Das [TCSR_PCIE_0_CLKREF_EN] = &tcsr_pcie_0_clkref_en.clkr, 90*e5682c95STaniya Das [TCSR_UFS_CLKREF_EN] = &tcsr_ufs_clkref_en.clkr, 91*e5682c95STaniya Das [TCSR_USB2_CLKREF_EN] = &tcsr_usb2_clkref_en.clkr, 92*e5682c95STaniya Das [TCSR_USB3_CLKREF_EN] = &tcsr_usb3_clkref_en.clkr, 93*e5682c95STaniya Das }; 94*e5682c95STaniya Das 95*e5682c95STaniya Das static const struct regmap_config tcsr_cc_kaanapali_regmap_config = { 96*e5682c95STaniya Das .reg_bits = 32, 97*e5682c95STaniya Das .reg_stride = 4, 98*e5682c95STaniya Das .val_bits = 32, 99*e5682c95STaniya Das .max_register = 0x3d000, 100*e5682c95STaniya Das .fast_io = true, 101*e5682c95STaniya Das }; 102*e5682c95STaniya Das 103*e5682c95STaniya Das static const struct qcom_cc_desc tcsr_cc_kaanapali_desc = { 104*e5682c95STaniya Das .config = &tcsr_cc_kaanapali_regmap_config, 105*e5682c95STaniya Das .clks = tcsr_cc_kaanapali_clocks, 106*e5682c95STaniya Das .num_clks = ARRAY_SIZE(tcsr_cc_kaanapali_clocks), 107*e5682c95STaniya Das }; 108*e5682c95STaniya Das 109*e5682c95STaniya Das static const struct of_device_id tcsr_cc_kaanapali_match_table[] = { 110*e5682c95STaniya Das { .compatible = "qcom,kaanapali-tcsr" }, 111*e5682c95STaniya Das { } 112*e5682c95STaniya Das }; 113*e5682c95STaniya Das MODULE_DEVICE_TABLE(of, tcsr_cc_kaanapali_match_table); 114*e5682c95STaniya Das 115*e5682c95STaniya Das static int tcsr_cc_kaanapali_probe(struct platform_device *pdev) 116*e5682c95STaniya Das { 117*e5682c95STaniya Das return qcom_cc_probe(pdev, &tcsr_cc_kaanapali_desc); 118*e5682c95STaniya Das } 119*e5682c95STaniya Das 120*e5682c95STaniya Das static struct platform_driver tcsr_cc_kaanapali_driver = { 121*e5682c95STaniya Das .probe = tcsr_cc_kaanapali_probe, 122*e5682c95STaniya Das .driver = { 123*e5682c95STaniya Das .name = "tcsr_cc-kaanapali", 124*e5682c95STaniya Das .of_match_table = tcsr_cc_kaanapali_match_table, 125*e5682c95STaniya Das }, 126*e5682c95STaniya Das }; 127*e5682c95STaniya Das 128*e5682c95STaniya Das static int __init tcsr_cc_kaanapali_init(void) 129*e5682c95STaniya Das { 130*e5682c95STaniya Das return platform_driver_register(&tcsr_cc_kaanapali_driver); 131*e5682c95STaniya Das } 132*e5682c95STaniya Das subsys_initcall(tcsr_cc_kaanapali_init); 133*e5682c95STaniya Das 134*e5682c95STaniya Das static void __exit tcsr_cc_kaanapali_exit(void) 135*e5682c95STaniya Das { 136*e5682c95STaniya Das platform_driver_unregister(&tcsr_cc_kaanapali_driver); 137*e5682c95STaniya Das } 138*e5682c95STaniya Das module_exit(tcsr_cc_kaanapali_exit); 139*e5682c95STaniya Das 140*e5682c95STaniya Das MODULE_DESCRIPTION("QTI TCSR_CC Kaanapali Driver"); 141*e5682c95STaniya Das MODULE_LICENSE("GPL"); 142