clk: qcom: Add support to LPASS AON_CC Glitch Free Mux clocks
authorSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Mon, 26 Oct 2020 12:02:21 +0000 (12:02 +0000)
committerStephen Boyd <sboyd@kernel.org>
Thu, 5 Nov 2020 02:34:54 +0000 (18:34 -0800)
LPASS Always ON Clock controller has one GFM mux to control VA
and TX clocks to codec macro on LPASS.
This patch adds support to this mux.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20201026120221.18984-5-srinivas.kandagatla@linaro.org
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/qcom/lpass-gfm-sm8250.c

index 48a73dd..d366c7c 100644 (file)
@@ -18,6 +18,7 @@
 #include <linux/platform_device.h>
 #include <linux/of_device.h>
 #include <dt-bindings/clock/qcom,sm8250-lpass-audiocc.h>
+#include <dt-bindings/clock/qcom,sm8250-lpass-aoncc.h>
 
 struct lpass_gfm {
        struct device *dev;
@@ -65,6 +66,46 @@ static const struct clk_ops clk_gfm_ops = {
        .determine_rate = __clk_mux_determine_rate,
 };
 
+static struct clk_gfm lpass_gfm_va_mclk = {
+       .mux_reg = 0x20000,
+       .mux_mask = BIT(0),
+       .hw.init = &(struct clk_init_data) {
+               .name = "VA_MCLK",
+               .ops = &clk_gfm_ops,
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .num_parents = 2,
+               .parent_data = (const struct clk_parent_data[]){
+                       {
+                               .index = 0,
+                               .fw_name = "LPASS_CLK_ID_TX_CORE_MCLK",
+                       }, {
+                               .index = 1,
+                               .fw_name = "LPASS_CLK_ID_VA_CORE_MCLK",
+                       },
+               },
+       },
+};
+
+static struct clk_gfm lpass_gfm_tx_npl = {
+       .mux_reg = 0x20000,
+       .mux_mask = BIT(0),
+       .hw.init = &(struct clk_init_data) {
+               .name = "TX_NPL",
+               .ops = &clk_gfm_ops,
+               .flags = CLK_SET_RATE_PARENT | CLK_OPS_PARENT_ENABLE,
+               .parent_data = (const struct clk_parent_data[]){
+                       {
+                               .index = 0,
+                               .fw_name = "LPASS_CLK_ID_TX_CORE_NPL_MCLK",
+                       }, {
+                               .index = 1,
+                               .fw_name = "LPASS_CLK_ID_VA_CORE_2X_MCLK",
+                       },
+               },
+               .num_parents = 2,
+       },
+};
+
 static struct clk_gfm lpass_gfm_wsa_mclk = {
        .mux_reg = 0x220d8,
        .mux_mask = BIT(0),
@@ -145,6 +186,19 @@ static struct clk_gfm lpass_gfm_rx_npl = {
        },
 };
 
+static struct clk_gfm *aoncc_gfm_clks[] = {
+       [LPASS_CDC_VA_MCLK]             = &lpass_gfm_va_mclk,
+       [LPASS_CDC_TX_NPL]              = &lpass_gfm_tx_npl,
+};
+
+static struct clk_hw_onecell_data aoncc_hw_onecell_data = {
+       .hws = {
+               [LPASS_CDC_VA_MCLK]     = &lpass_gfm_va_mclk.hw,
+               [LPASS_CDC_TX_NPL]      = &lpass_gfm_tx_npl.hw,
+       },
+       .num = ARRAY_SIZE(aoncc_gfm_clks),
+};
+
 static struct clk_gfm *audiocc_gfm_clks[] = {
        [LPASS_CDC_WSA_NPL]             = &lpass_gfm_wsa_npl,
        [LPASS_CDC_WSA_MCLK]            = &lpass_gfm_wsa_mclk,
@@ -172,6 +226,11 @@ static struct lpass_gfm_data audiocc_data = {
        .gfm_clks = audiocc_gfm_clks,
 };
 
+static struct lpass_gfm_data aoncc_data = {
+       .onecell_data = &aoncc_hw_onecell_data,
+       .gfm_clks = aoncc_gfm_clks,
+};
+
 static int lpass_gfm_clk_driver_probe(struct platform_device *pdev)
 {
        const struct lpass_gfm_data *data;
@@ -234,6 +293,10 @@ pm_clk_err:
 
 static const struct of_device_id lpass_gfm_clk_match_table[] = {
        {
+               .compatible = "qcom,sm8250-lpass-aoncc",
+               .data = &aoncc_data,
+       },
+       {
                .compatible = "qcom,sm8250-lpass-audiocc",
                .data = &audiocc_data,
        },