Add clock drivers for SM8350
cover Add clock drivers for SM8350
This add rpmhcc and gcc clock controller drivers for the controllers found in SM8350 SoC
Vinod Koul (3):
dt-bindings: clock: Add RPMHCC bindings for SM8350
clk: qcom: rpmh: add support for SM8350 rpmh clocks
dt-bindings: clock: Add SM8350 GCC clock bindings
Vivek Aknurwar (2):
clk: qcom: clk-alpha-pll: Add support for Lucid 5LPE PLL
clk: qcom: gcc: Add clock driver for SM8350
.../bindings/clock/qcom,gcc-sm8350.yaml | 68 + .../bindings/clock/qcom,rpmhcc.yaml | 1 + drivers/clk/qcom/Kconfig | 9 + drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/clk-alpha-pll.c | 223 + drivers/clk/qcom/clk-alpha-pll.h | 4 + drivers/clk/qcom/clk-rpmh.c | 34 + drivers/clk/qcom/gcc-sm8350.c | 3959 +++++++++++++++++ include/dt-bindings/clock/qcom,gcc-sm8350.h | 261 ++ include/dt-bindings/clock/qcom,rpmh.h | 8 + 10 files changed, 4568 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,gcc-sm8350.yaml create mode 100644 drivers/clk/qcom/gcc-sm8350.c create mode 100644 include/dt-bindings/clock/qcom,gcc-sm8350.h
Signature · 1 line
2.26.2
PATCH 1/5 dt-bindings: clock: Add RPMHCC bindings for SM8350
Add bindings and update documentation for clock rpmh driver on SM8350.
--- Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml | 1 + 1 file changed, 1 insertion(+)
Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml +1 -0
@@ -21,6 +21,7 @@ properties: - qcom,sdm845-rpmh-clk - qcom,sm8150-rpmh-clk - qcom,sm8250-rpmh-clk + - qcom,sm8350-rpmh-clk clocks: maxItems: 1
Signature · 1 line
2.26.2
Re: [PATCH 1/5] dt-bindings: clock: Add RPMHCC bindings for SM8350
Quoted 3 lines · Vinod Koul
Add bindings and update documentation for clock rpmh driver on SM8350.
Signed-off-by Vinod Koul <[email protected]>
Quoted 19 lines
--- Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml | 1 + 1 file changed, 1 insertion(+)Documentation/devicetree/bindings/clock/qcom,rpmhcc.yaml +1
-0@@ -21,6 +21,7 @@ properties: - qcom,sdm845-rpmh-clk - qcom,sm8150-rpmh-clk - qcom,sm8250-rpmh-clk + - qcom,sm8350-rpmh-clk clocks: maxItems: 1Signature · 1 line
2.26.2
PATCH 2/5 clk: qcom: rpmh: add support for SM8350 rpmh clocks
In reply to Vinod KoulThis adds the RPMH clocks present in SM8350 SoC
--- drivers/clk/qcom/clk-rpmh.c | 34 +++++++++++++++++++++++++++ include/dt-bindings/clock/qcom,rpmh.h | 8 +++++++ 2 files changed, 42 insertions(+)
drivers/clk/qcom/clk-rpmh.c +34 -0
@@ -432,6 +432,39 @@ static const struct clk_rpmh_desc clk_rpmh_sm8250 = { .num_clks = ARRAY_SIZE(sm8250_rpmh_clocks), }; +DEFINE_CLK_RPMH_VRM (sm8350, div_clk1, div_clk1_ao,"divclka1" ,2 ); +DEFINE_CLK_RPMH_VRM (sm8350, rf_clk4, rf_clk4_ao,"rfclka4" ,1 ); +DEFINE_CLK_RPMH_VRM (sm8350, rf_clk5, rf_clk5_ao,"rfclka5" ,1 ); +DEFINE_CLK_RPMH_BCM (sm8350, pka,"PKA0" ); +DEFINE_CLK_RPMH_BCM (sm8350, hwkm,"HK0" ); + +static struct clk_hw *sm8350_rpmh_clocks[] = { + [RPMH_CXO_CLK ] = &sdm845_bi_tcxo.hw, + [RPMH_CXO_CLK_A ] = &sdm845_bi_tcxo_ao.hw, + [RPMH_DIV_CLK1 ] = &sm8350_div_clk1.hw, + [RPMH_DIV_CLK1_A ] = &sm8350_div_clk1_ao.hw, + [RPMH_LN_BB_CLK1 ] = &sm8250_ln_bb_clk1.hw, + [RPMH_LN_BB_CLK1_A ] = &sm8250_ln_bb_clk1_ao.hw, + [RPMH_LN_BB_CLK2 ] = &sdm845_ln_bb_clk2.hw, + [RPMH_LN_BB_CLK2_A ] = &sdm845_ln_bb_clk2_ao.hw, + [RPMH_RF_CLK1 ] = &sdm845_rf_clk1.hw, + [RPMH_RF_CLK1_A ] = &sdm845_rf_clk1_ao.hw, + [RPMH_RF_CLK3 ] = &sdm845_rf_clk3.hw, + [RPMH_RF_CLK3_A ] = &sdm845_rf_clk3_ao.hw, + [RPMH_RF_CLK4 ] = &sm8350_rf_clk4.hw, + [RPMH_RF_CLK4_A ] = &sm8350_rf_clk4_ao.hw, + [RPMH_RF_CLK5 ] = &sm8350_rf_clk5.hw, + [RPMH_RF_CLK5_A ] = &sm8350_rf_clk5_ao.hw, + [RPMH_IPA_CLK ] = &sdm845_ipa.hw, + [RPMH_PKA_CLK ] = &sm8350_pka.hw, + [RPMH_HWKM_CLK ] = &sm8350_hwkm.hw, +}; + +static const struct clk_rpmh_desc clk_rpmh_sm8350 = { + .clks = sm8350_rpmh_clocks, + .num_clks =ARRAY_SIZE (sm8350_rpmh_clocks), +}; +static struct clk_hw *of_clk_rpmh_hw_get (struct of_phandle_args *clkspec,void *data) {
@@ -519,6 +552,7 @@ static const struct of_device_id clk_rpmh_match_table[] = { { .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845}, { .compatible = "qcom,sm8150-rpmh-clk", .data = &clk_rpmh_sm8150}, { .compatible = "qcom,sm8250-rpmh-clk", .data = &clk_rpmh_sm8250}, + { .compatible = "qcom,sm8350-rpmh-clk", .data = &clk_rpmh_sm8350}, { } };MODULE_DEVICE_TABLE (of, clk_rpmh_match_table);
include/dt-bindings/clock/qcom,rpmh.h +8 -0
@@ -21,5 +21,13 @@#define RPMH_IPA_CLK 12#define RPMH_LN_BB_CLK1 13#define RPMH_LN_BB_CLK1_A 14 +#define RPMH_DIV_CLK1 15 +#define RPMH_DIV_CLK1_A 16 +#define RPMH_RF_CLK4 17 +#define RPMH_RF_CLK4_A 18 +#define RPMH_RF_CLK5 19 +#define RPMH_RF_CLK5_A 20 +#define RPMH_PKA_CLK 21 +#define RPMH_HWKM_CLK 22#endif
Signature · 1 line
2.26.2
Re: [PATCH 2/5] clk: qcom: rpmh: add support for SM8350 rpmh clocks
Quoted 3 lines · Vinod Koul
This adds the RPMH clocks present in SM8350 SoC
Signed-off-by Vinod Koul <[email protected]>
Regards,
Bjorn
Quoted 78 lines
--- drivers/clk/qcom/clk-rpmh.c | 34 +++++++++++++++++++++++++++ include/dt-bindings/clock/qcom,rpmh.h | 8 +++++++ 2 files changed, 42 insertions(+)drivers/clk/qcom/clk-rpmh.c +34
-0@@ -432,6 +432,39 @@ static const struct clk_rpmh_desc clk_rpmh_sm8250 = { .num_clks = ARRAY_SIZE(sm8250_rpmh_clocks), }; +DEFINE_CLK_RPMH_VRM (sm8350, div_clk1, div_clk1_ao,"divclka1" ,2 ); +DEFINE_CLK_RPMH_VRM (sm8350, rf_clk4, rf_clk4_ao,"rfclka4" ,1 ); +DEFINE_CLK_RPMH_VRM (sm8350, rf_clk5, rf_clk5_ao,"rfclka5" ,1 ); +DEFINE_CLK_RPMH_BCM (sm8350, pka,"PKA0" ); +DEFINE_CLK_RPMH_BCM (sm8350, hwkm,"HK0" ); + +static struct clk_hw *sm8350_rpmh_clocks[] = { + [RPMH_CXO_CLK ] = &sdm845_bi_tcxo.hw, + [RPMH_CXO_CLK_A ] = &sdm845_bi_tcxo_ao.hw, + [RPMH_DIV_CLK1 ] = &sm8350_div_clk1.hw, + [RPMH_DIV_CLK1_A ] = &sm8350_div_clk1_ao.hw, + [RPMH_LN_BB_CLK1 ] = &sm8250_ln_bb_clk1.hw, + [RPMH_LN_BB_CLK1_A ] = &sm8250_ln_bb_clk1_ao.hw, + [RPMH_LN_BB_CLK2 ] = &sdm845_ln_bb_clk2.hw, + [RPMH_LN_BB_CLK2_A ] = &sdm845_ln_bb_clk2_ao.hw, + [RPMH_RF_CLK1 ] = &sdm845_rf_clk1.hw, + [RPMH_RF_CLK1_A ] = &sdm845_rf_clk1_ao.hw, + [RPMH_RF_CLK3 ] = &sdm845_rf_clk3.hw, + [RPMH_RF_CLK3_A ] = &sdm845_rf_clk3_ao.hw, + [RPMH_RF_CLK4 ] = &sm8350_rf_clk4.hw, + [RPMH_RF_CLK4_A ] = &sm8350_rf_clk4_ao.hw, + [RPMH_RF_CLK5 ] = &sm8350_rf_clk5.hw, + [RPMH_RF_CLK5_A ] = &sm8350_rf_clk5_ao.hw, + [RPMH_IPA_CLK ] = &sdm845_ipa.hw, + [RPMH_PKA_CLK ] = &sm8350_pka.hw, + [RPMH_HWKM_CLK ] = &sm8350_hwkm.hw, +}; + +static const struct clk_rpmh_desc clk_rpmh_sm8350 = { + .clks = sm8350_rpmh_clocks, + .num_clks =ARRAY_SIZE (sm8350_rpmh_clocks), +}; +static struct clk_hw *of_clk_rpmh_hw_get (struct of_phandle_args *clkspec,void *data) {@@ -519,6 +552,7 @@ static const struct of_device_id clk_rpmh_match_table[] = { { .compatible = "qcom,sdm845-rpmh-clk", .data = &clk_rpmh_sdm845}, { .compatible = "qcom,sm8150-rpmh-clk", .data = &clk_rpmh_sm8150}, { .compatible = "qcom,sm8250-rpmh-clk", .data = &clk_rpmh_sm8250}, + { .compatible = "qcom,sm8350-rpmh-clk", .data = &clk_rpmh_sm8350}, { } };MODULE_DEVICE_TABLE (of, clk_rpmh_match_table);include/dt-bindings/clock/qcom,rpmh.h +8
-0@@ -21,5 +21,13 @@#define RPMH_IPA_CLK 12#define RPMH_LN_BB_CLK1 13#define RPMH_LN_BB_CLK1_A 14 +#define RPMH_DIV_CLK1 15 +#define RPMH_DIV_CLK1_A 16 +#define RPMH_RF_CLK4 17 +#define RPMH_RF_CLK4_A 18 +#define RPMH_RF_CLK5 19 +#define RPMH_RF_CLK5_A 20 +#define RPMH_PKA_CLK 21 +#define RPMH_HWKM_CLK 22#endif Signature · 1 line
2.26.2
PATCH 3/5 dt-bindings: clock: Add SM8350 GCC clock bindings
In reply to Vinod KoulAdd device tree bindings for global clock controller on SM8350 SoCs.
--- .../bindings/clock/qcom,gcc-sm8350.yaml | 68 +++++ include/dt-bindings/clock/qcom,gcc-sm8350.h | 261 ++++++++++++++++++ 2 files changed, 329 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,gcc-sm8350.yaml create mode 100644 include/dt-bindings/clock/qcom,gcc-sm8350.h
Documentation/devicetree/bindings/clock/qcom,gcc-sm8350.yaml new file +68 -0
@@ -0,0 +1,68 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/clock/qcom,gcc-sm8350.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm Global Clock & Reset Controller Binding for SM8350 + +maintainers: + - Vinod Koul <[email protected]> + +description: | + Qualcomm global clock control module which supports the clocks, resets and + power domains on SM8350. + + See also: + - dt-bindings/clock/qcom,gcc-sm8350.h + +properties: + compatible: + const: qcom,gcc-sm8350 + + clocks: + items: + - description: Board XO source + - description: Sleep clock source + + clock-names: + items: + - const: bi_tcxo + - const: sleep_clk + + '#clock-cells': + const: 1 + + '#reset-cells': + const: 1 + + '#power-domain-cells': + const: 1 + + reg: + maxItems: 1 + +required: + - compatible + - clocks + - clock-names + - reg + - '#clock-cells' + - '#reset-cells' + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/qcom,rpmh.h> + clock-controller@100000 { + compatible = "qcom,gcc-sm8350"; + reg = <0x00100000 0x1f0000>; + clocks = <&rpmhcc RPMH_CXO_CLK>, + <&sleep_clk>; + clock-names = "bi_tcxo", "sleep_clk"; + #clock-cells = <1>; + #reset-cells = <1>; + }; + +...
include/dt-bindings/clock/qcom,gcc-sm8350.h new file +261 -0
261 lines not on this page · raw message
Signature · 1 line
2.26.2
PATCH 4/5 clk: qcom: clk-alpha-pll: Add support for Lucid 5LPE PLL
In reply to Vinod KoulFrom: Vivek Aknurwar <[email protected]>
Lucid 5LPE is a slightly different Lucid PLL with different offsets and porgramming sequence so add support for these
--- drivers/clk/qcom/clk-alpha-pll.c | 223 +++++++++++++++++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 4 + 2 files changed, 227 insertions(+)
drivers/clk/qcom/clk-alpha-pll.c +223 -0
@@ -146,6 +146,12 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);/* LUCID PLL specific settings and offsets */ #define LUCID_PCAL_DONE BIT(27) +/* LUCID 5LPE PLL specific settings and offsets */ +#define LUCID_5LPE_PCAL_DONE BIT(11) +#define LUCID_5LPE_ENABLE_VOTE_RUN BIT(21) +#define LUCID_5LPE_PLL_LATCH_INPUT BIT(14) +#define LUCID_5LPE_ALPHA_PLL_ACK_LATCH BIT(13) +#define pll_alpha_width (p) \ ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \ ALPHA_REG_BITWIDTH : ALPHA_REG_16BIT_WIDTH)
@@ -1561,3 +1567,220 @@ const struct clk_ops clk_alpha_pll_postdiv_lucid_ops = { .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, };EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_lucid_ops); + +static int alpha_pll_lucid_5lpe_enable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +u32 val; +int ret; + + ret =regmap_read (pll->clkr.regmap,PLL_USER_CTL (pll), &val); +if (ret) +return ret; + +/* If in FSM mode, just vote for it */ +if (val &LUCID_5LPE_ENABLE_VOTE_RUN ) { + ret =clk_enable_regmap (hw); +if (ret) +return ret; +return wait_for_pll_enable_lock (pll); + } + +/* Check if PLL is already enabled */ + ret =trion_pll_is_enabled (pll, pll->clkr.regmap); +if (ret <0 ) +return ret; + + ret =regmap_update_bits (pll->clkr.regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); +if (ret) +return ret; + +/* Set operation mode to RUN */ +regmap_write (pll->clkr.regmap,PLL_OPMODE (pll),PLL_RUN ); + + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Enable the PLL outputs */ + ret =regmap_update_bits (pll->clkr.regmap,PLL_USER_CTL (pll),PLL_OUT_MASK ,PLL_OUT_MASK ); +if (ret) +return ret; + +/* Enable the global PLL outputs */ + ret =regmap_update_bits (pll->clkr.regmap,PLL_MODE (pll),PLL_OUTCTRL ,PLL_OUTCTRL ); +if (ret) +return ret; + +/* Ensure that the write above goes through before returning. */ +mb (); +return ret; +} + +static void alpha_pll_lucid_5lpe_disable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +u32 val; +int ret; + + ret =regmap_read (pll->clkr.regmap,PLL_USER_CTL (pll), &val); +if (ret) +return ; + +/* If in FSM mode, just unvote it */ +if (val &LUCID_5LPE_ENABLE_VOTE_RUN ) { +clk_disable_regmap (hw); +return ; + } + +/* Disable the global PLL output */ + ret =regmap_update_bits (pll->clkr.regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); +if (ret) +return ; + +/* Disable the PLL outputs */ + ret =regmap_update_bits (pll->clkr.regmap,PLL_USER_CTL (pll),PLL_OUT_MASK ,0 ); +if (ret) +return ; + +/* Place the PLL mode in STANDBY */ +regmap_write (pll->clkr.regmap,PLL_OPMODE (pll),PLL_STANDBY ); +} + +/* +* The Lucid 5LPE PLL requires a power-on self-calibration which happens +* when the PLL comes out of reset. Calibrate in case it is not completed. +*/ +static int alpha_pll_lucid_5lpe_prepare (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct clk_hw *p; +u32 regval; +int ret; + +/* Return early if calibration is not needed. */ +regmap_read (pll->clkr.regmap,PLL_MODE (pll), ®val); +if (regval &LUCID_5LPE_PCAL_DONE ) +return 0 ; + + p =clk_hw_get_parent (hw); +if (!p) +return -EINVAL ; + + ret =alpha_pll_lucid_5lpe_enable (hw); +if (ret) +return ret; + +alpha_pll_lucid_5lpe_disable (hw); + +return 0 ; +} + +static int alpha_pll_lucid_5lpe_set_rate (struct clk_hw *hw,unsigned long rate, +unsigned long prate) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +unsigned long rrate; +u32 regval, l; +u64 a; +int ret; + + rrate =alpha_pll_round_rate (rate, prate, &l, &a,ALPHA_REG_16BIT_WIDTH ); + +/* +* Due to a limited number of bits for fractional rate programming, the +* rounded up rate could be marginally higher than the requested rate. +*/ +if (rrate > (rate +PLL_RATE_MARGIN ) || rrate < rate) { +pr_err ("Call set rate on the PLL with rounded rates!\n" ); +return -EINVAL ; + } + +regmap_write (pll->clkr.regmap,PLL_L_VAL (pll), l); +regmap_write (pll->clkr.regmap,PLL_ALPHA_VAL (pll), a); + +/* Latch the PLL input */ + ret =regmap_update_bits (pll->clkr.regmap,PLL_MODE (pll), +LUCID_5LPE_PLL_LATCH_INPUT ,LUCID_5LPE_PLL_LATCH_INPUT ); +if (ret) +return ret; + +/* Wait for 2 reference cycles before checking the ACK bit. */ +udelay (1 ); +regmap_read (pll->clkr.regmap,PLL_MODE (pll), ®val); +if (!(regval &LUCID_5LPE_ALPHA_PLL_ACK_LATCH )) { +pr_err ("Lucid 5LPE PLL latch failed. Output may be unstable!\n" ); +return -EINVAL ; + } + +/* Return the latch input to 0 */ + ret =regmap_update_bits (pll->clkr.regmap,PLL_MODE (pll),LUCID_5LPE_PLL_LATCH_INPUT ,0 ); +if (ret) +return ret; + +if (clk_hw_is_enabled (hw)) { + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + } + +/* Wait for PLL output to stabilize */ +udelay (100 ); +return 0 ; +} + +static int clk_lucid_5lpe_pll_postdiv_set_rate (struct clk_hw *hw,unsigned long rate, +unsigned long parent_rate) +{ +struct clk_alpha_pll_postdiv *pll =to_clk_alpha_pll_postdiv (hw); +int i, val =0 , div, ret; + +/* +* If the PLL is in FSM mode, then treat set_rate callback as a +* no-operation. +*/ + ret =regmap_read (pll->clkr.regmap,PLL_USER_CTL (pll), &val); +if (ret) +return ret; + +if (val &LUCID_5LPE_ENABLE_VOTE_RUN ) +return 0 ; + +if (!pll->post_div_table) { +pr_err ("Missing the post_div_table for the PLL\n" ); +return -EINVAL ; + } + + div =DIV_ROUND_UP_ULL ((u64 )parent_rate, rate); +for (i =0 ; i < pll->num_post_div; i++) { +if (pll->post_div_table[i].div == div) { + val = pll->post_div_table[i].val; +break ; + } + } + +return regmap_update_bits (pll->clkr.regmap,PLL_USER_CTL (pll), + (BIT (pll->width) -1 ) << pll->post_div_shift, + val << pll->post_div_shift); +} + +const struct clk_ops clk_alpha_pll_lucid_5lpe_ops = { + .prepare = alpha_pll_lucid_5lpe_prepare, + .enable = alpha_pll_lucid_5lpe_enable, + .disable = alpha_pll_lucid_5lpe_disable, + .set_rate = alpha_pll_lucid_5lpe_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_lucid_5lpe_ops); + +const struct clk_ops clk_alpha_pll_fixed_lucid_5lpe_ops = { + .enable = alpha_pll_lucid_5lpe_enable, + .disable = alpha_pll_lucid_5lpe_disable, +}; +EXPORT_SYMBOL (clk_alpha_pll_fixed_lucid_5lpe_ops); + +const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { + .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, + .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, + .set_rate = clk_lucid_5lpe_pll_postdiv_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_postdiv_lucid_5lpe_ops);
drivers/clk/qcom/clk-alpha-pll.h +4 -0
@@ -142,6 +142,10 @@ extern const struct clk_ops clk_alpha_pll_lucid_ops;#define clk_alpha_pll_fixed_lucid_ops clk_alpha_pll_fixed_trion_opsextern const struct clk_ops clk_alpha_pll_postdiv_lucid_ops; +extern const struct clk_ops clk_alpha_pll_lucid_5lpe_ops; +extern const struct clk_ops clk_alpha_pll_fixed_lucid_5lpe_ops; +extern const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops; +void clk_alpha_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap,const struct alpha_pll_config *config); void clk_fabia_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,
Signature · 1 line
2.26.2
PATCH 5/5 clk: qcom: gcc: Add clock driver for SM8350
In reply to Vinod KoulFrom: Vivek Aknurwar <[email protected]>
This adds Global Clock controller (GCC) driver for SM8350 SoC
--- drivers/clk/qcom/Kconfig | 9 + drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/gcc-sm8350.c | 3959 +++++++++++++++++++++++++++++++++ 3 files changed, 3969 insertions(+) create mode 100644 drivers/clk/qcom/gcc-sm8350.c
drivers/clk/qcom/Kconfig +9 -0
@@ -437,6 +437,15 @@ config SM_GCC_8250 Say Y if you want to use peripheral devices such as UART, SPI, I2C, USB, SD/UFS, PCIe etc. +config SM_GCC_8350 + tristate "SM8350 Global Clock Controller" + select QCOM_GDSC + help + Support for the global clock controller on SM8350 devices. + Say Y if you want to use peripheral devices such as UART, + SPI, I2C, USB, SD/UFS, PCIe etc. + + config SM_GPUCC_8150 tristate "SM8150 Graphics Clock Controller" select SM_GCC_8150
drivers/clk/qcom/Makefile +1 -0
@@ -67,6 +67,7 @@ obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o obj-$(CONFIG_SM_DISPCC_8250) += dispcc-sm8250.o obj-$(CONFIG_SM_GCC_8150) += gcc-sm8150.o obj-$(CONFIG_SM_GCC_8250) += gcc-sm8250.o +obj-$(CONFIG_SM_GCC_8350) += gcc-sm8350.o obj-$(CONFIG_SM_GPUCC_8150) += gpucc-sm8150.o obj-$(CONFIG_SM_GPUCC_8250) += gpucc-sm8250.o obj-$(CONFIG_SM_VIDEOCC_8150) += videocc-sm8150.o
drivers/clk/qcom/gcc-sm8350.c new file +3959 -0
2,978 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.26.2
Part of the diff is not shown here. View the raw message.
Re: [PATCH 5/5] clk: qcom: gcc: Add clock driver for SM8350
Quoted 1 line · Vinod Koul
drivers/clk/qcom/gcc-sm8350.c +0
-0
[..]
Quoted 18 lines
drivers/clk/qcom/gcc-sm8350.c +18
-0+static int gcc_sm8350_probe (struct platform_device *pdev) +{ +struct regmap *regmap; +int ret; + + regmap =qcom_cc_map (pdev, &gcc_sm8350_desc); +if (IS_ERR (regmap)) { +dev_err (&pdev->dev,"Failed to map gcc registers\n" ); +return PTR_ERR (regmap); + } + + ret =qcom_cc_register_rcg_dfs (regmap, gcc_dfs_clocks,ARRAY_SIZE (gcc_dfs_clocks)); +if (ret) +return ret; + +/* FORCE_MEM_CORE_ON for ufs phy ice core clocks */ +regmap_update_bits (regmap, gcc_ufs_phy_ice_core_clk.halt_reg,BIT (14 ),BIT (14 )); +
drivers/clk/qcom/gcc-sm8350.c line 3930
Quoted 10 lines
drivers/clk/qcom/gcc-sm8350.c +10
-0+/* +* Enable clocks required by the i2c-connected pm8008 regulators. Don't +* register them with the clock framework so that client requests are +* short-circuited before grabbing the enable/prepare locks. This +* prevents deadlocks between the clk/regulator frameworks. +* +* gcc_qupv3_wrap_1_m_ahb_clk +* gcc_qupv3_wrap_1_s_ahb_clk +* gcc_qupv3_wrap1_s5_clk +*/
Isn't this a workaround inherited from the downstream control of regulators from within the clock core? Does this still apply upstream?
Regards,
Bjorn
Quoted 32 lines
drivers/clk/qcom/gcc-sm8350.c +29
-0+regmap_update_bits (regmap,0x52008 ,BIT (20 ),BIT (20 )); +regmap_update_bits (regmap,0x52008 ,BIT (21 ),BIT (21 )); +regmap_update_bits (regmap,0x52008 ,BIT (27 ),BIT (27 )); + +return qcom_cc_really_probe (pdev, &gcc_sm8350_desc, regmap); +} + +static struct platform_driver gcc_sm8350_driver = { + .probe = gcc_sm8350_probe, + .driver = { + .name ="sm8350-gcc" , + .of_match_table = gcc_sm8350_match_table, + }, +}; + +static int __init gcc_sm8350_init (void ) +{ +return platform_driver_register (&gcc_sm8350_driver); +} +subsys_initcall (gcc_sm8350_init); + +static void __exit gcc_sm8350_exit(void) +{ +platform_driver_unregister (&gcc_sm8350_driver); +} +module_exit (gcc_sm8350_exit); + +MODULE_DESCRIPTION ("QTI GCC SM8350 Driver" ); +MODULE_LICENSE ("GPL v2" );Signature · 1 line
2.26.2
Re: [PATCH 5/5] clk: qcom: gcc: Add clock driver for SM8350
Hi Bjorn,
Quoted 26 lines · Bjorn Andersson
Quoted 1 line · Vinod Koul
drivers/clk/qcom/gcc-sm8350.c +0
-0[..]
Quoted 23 lines
drivers/clk/qcom/gcc-sm8350.c +23
-0+static int gcc_sm8350_probe (struct platform_device *pdev) +{ +struct regmap *regmap; +int ret; + + regmap =qcom_cc_map (pdev, &gcc_sm8350_desc); +if (IS_ERR (regmap)) { +dev_err (&pdev->dev,"Failed to map gcc registers\n" ); +return PTR_ERR (regmap); + } + + ret =qcom_cc_register_rcg_dfs (regmap, gcc_dfs_clocks,ARRAY_SIZE (gcc_dfs_clocks)); +if (ret) +return ret; + +/* FORCE_MEM_CORE_ON for ufs phy ice core clocks */ +regmap_update_bits (regmap, gcc_ufs_phy_ice_core_clk.halt_reg,BIT (14 ),BIT (14 )); + +/* +* Enable clocks required by the i2c-connected pm8008 regulators. Don't +* register them with the clock framework so that client requests are +* short-circuited before grabbing the enable/prepare locks. This +* prevents deadlocks between the clk/regulator frameworks.
Quoted 8 lines
drivers/clk/qcom/gcc-sm8350.c line 3930
Quoted 5 lines
drivers/clk/qcom/gcc-sm8350.c +5
-0+* +* gcc_qupv3_wrap_1_m_ahb_clk +* gcc_qupv3_wrap_1_s_ahb_clk +* gcc_qupv3_wrap1_s5_clk +*/ Isn't this a workaround inherited from the downstream control of regulators from within the clock core? Does this still apply upstream?
Let me check on this bit...
Thanks
Signature · 1 line
~Vinod
Re: [PATCH 5/5] clk: qcom: gcc: Add clock driver for SM8350
Hi Vinod,
Quoted 38 lines · Vinod Koul
Hi Bjorn,
Quoted 26 lines · Bjorn Andersson
Quoted 1 line · Vinod Koul
drivers/clk/qcom/gcc-sm8350.c +0
-0[..]
Quoted 23 lines
drivers/clk/qcom/gcc-sm8350.c +23
-0+static int gcc_sm8350_probe (struct platform_device *pdev) +{ +struct regmap *regmap; +int ret; + + regmap =qcom_cc_map (pdev, &gcc_sm8350_desc); +if (IS_ERR (regmap)) { +dev_err (&pdev->dev,"Failed to map gcc registers\n" ); +return PTR_ERR (regmap); + } + + ret =qcom_cc_register_rcg_dfs (regmap, gcc_dfs_clocks,ARRAY_SIZE (gcc_dfs_clocks)); +if (ret) +return ret; + +/* FORCE_MEM_CORE_ON for ufs phy ice core clocks */ +regmap_update_bits (regmap, gcc_ufs_phy_ice_core_clk.halt_reg,BIT (14 ),BIT (14 )); + +/* +* Enable clocks required by the i2c-connected pm8008 regulators. Don't +* register them with the clock framework so that client requests are +* short-circuited before grabbing the enable/prepare locks. This +* prevents deadlocks between the clk/regulator frameworks. Quoted 8 lines
drivers/clk/qcom/gcc-sm8350.c line 3930
Quoted 5 lines
drivers/clk/qcom/gcc-sm8350.c +5
-0+* +* gcc_qupv3_wrap_1_m_ahb_clk +* gcc_qupv3_wrap_1_s_ahb_clk +* gcc_qupv3_wrap1_s5_clk +*/ Isn't this a workaround inherited from the downstream control of regulators from within the clock core? Does this still apply upstream?
Quoted 4 lines
Let me check on this bit...
Thanks
No it should not apply.
Signature · 4 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation. --
Re: [PATCH 5/5] clk: qcom: gcc: Add clock driver for SM8350
Hi Taniya,
Quoted 37 lines · Taniya Das
Quoted 36 lines · Vinod Koul
Quoted 34 lines · Bjorn Andersson
Quoted 1 line · Vinod Koul
drivers/clk/qcom/gcc-sm8350.c +0
-0[..]
Quoted 18 lines
drivers/clk/qcom/gcc-sm8350.c +18
-0+static int gcc_sm8350_probe (struct platform_device *pdev) +{ +struct regmap *regmap; +int ret; + + regmap =qcom_cc_map (pdev, &gcc_sm8350_desc); +if (IS_ERR (regmap)) { +dev_err (&pdev->dev,"Failed to map gcc registers\n" ); +return PTR_ERR (regmap); + } + + ret =qcom_cc_register_rcg_dfs (regmap, gcc_dfs_clocks,ARRAY_SIZE (gcc_dfs_clocks)); +if (ret) +return ret; + +/* FORCE_MEM_CORE_ON for ufs phy ice core clocks */ +regmap_update_bits (regmap, gcc_ufs_phy_ice_core_clk.halt_reg,BIT (14 ),BIT (14 )); +drivers/clk/qcom/gcc-sm8350.c line 3930
Quoted 10 lines
drivers/clk/qcom/gcc-sm8350.c +10
-0+/* +* Enable clocks required by the i2c-connected pm8008 regulators. Don't +* register them with the clock framework so that client requests are +* short-circuited before grabbing the enable/prepare locks. This +* prevents deadlocks between the clk/regulator frameworks. +* +* gcc_qupv3_wrap_1_m_ahb_clk +* gcc_qupv3_wrap_1_s_ahb_clk +* gcc_qupv3_wrap1_s5_clk +*/ Isn't this a workaround inherited from the downstream control of regulators from within the clock core? Does this still apply upstream?
Quoted 6 lines
Quoted 4 lines
Let me check on this bit...
Thanks
No it should not apply.
Thanks for confirmation, removed now. Will send v2
Signature · 1 line
~Vinod