clk: qcom: Add camera clock controller driver for SM8250
cover clk: qcom: Add camera clock controller driver for SM8250
Add support for the camera clock controller found on SM8250.
Jonathan Marek (3):
clk: qcom: clk-alpha-pll: add support for zonda pll
dt-bindings: clock: add QCOM SM8250 camera clock bindings
clk: qcom: Add camera clock controller driver for SM8250
.../bindings/clock/qcom,camcc-sm8250.yaml | 73 + drivers/clk/qcom/Kconfig | 7 + drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/camcc-sm8250.c | 2456 +++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.c | 245 ++ drivers/clk/qcom/clk-alpha-pll.h | 6 + include/dt-bindings/clock/qcom,camcc-sm8250.h | 138 + 7 files changed, 2926 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml create mode 100644 drivers/clk/qcom/camcc-sm8250.c create mode 100644 include/dt-bindings/clock/qcom,camcc-sm8250.h
Signature · 1 line
2.26.1
PATCH 1/3 clk: qcom: clk-alpha-pll: add support for zonda pll
Ported over from the downstream driver. Will be used by SM8250 CAMCC.
--- drivers/clk/qcom/clk-alpha-pll.c | 245 +++++++++++++++++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 6 + 2 files changed, 251 insertions(+)
drivers/clk/qcom/clk-alpha-pll.c +245 -0
@@ -126,6 +126,19 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { [PLL_OFF_TEST_CTL_U] = 0x1c, [PLL_OFF_STATUS] = 0x2c, }, + [CLK_ALPHA_PLL_TYPE_ZONDA] = { + [PLL_OFF_L_VAL] = 0x04, + [PLL_OFF_ALPHA_VAL] = 0x08, + [PLL_OFF_USER_CTL] = 0x0c, + [PLL_OFF_CONFIG_CTL] = 0x10, + [PLL_OFF_CONFIG_CTL_U] = 0x14, + [PLL_OFF_CONFIG_CTL_U1] = 0x18, + [PLL_OFF_TEST_CTL] = 0x1c, + [PLL_OFF_TEST_CTL_U] = 0x20, + [PLL_OFF_TEST_CTL_U1] = 0x24, + [PLL_OFF_OPMODE] = 0x28, + [PLL_OFF_STATUS] = 0x38, + }, };EXPORT_SYMBOL_GPL (clk_alpha_pll_regs);
@@ -162,6 +175,11 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);#define LUCID_5LPE_PLL_LATCH_INPUT BIT(14)#define LUCID_5LPE_ENABLE_VOTE_RUN BIT(21) +/* ZONDA PLL specific */ +#define ZONDA_PLL_OUT_MASK 0xf +#define ZONDA_STAY_IN_CFA BIT(16) +#define ZONDA_PLL_FREQ_LOCK_DET BIT(29) +#define pll_alpha_width (p) \ ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \ ALPHA_REG_BITWIDTH : ALPHA_REG_16BIT_WIDTH)
@@ -208,6 +226,9 @@ static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse,#define wait_for_pll_enable_lock (pll) \ wait_for_pll(pll, PLL_LOCK_DET, 0, "enable") +#define wait_for_zonda_pll_freq_lock (pll) \ + wait_for_pll(pll, ZONDA_PLL_FREQ_LOCK_DET, 0, "freq enable") +#define wait_for_pll_disable (pll) \ wait_for_pll(pll, PLL_ACTIVE_FLAG, 1, "disable")
@@ -1398,6 +1419,13 @@ const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = { };EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_fabia_ops); +const struct clk_ops clk_alpha_pll_postdiv_zonda_ops = { + .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, + .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, + .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_postdiv_zonda_ops); +/** * clk_lucid_pll_configure - configure the lucid pll *
@@ -1777,3 +1805,220 @@ const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { .set_rate = clk_lucid_5lpe_pll_postdiv_set_rate, };EXPORT_SYMBOL (clk_alpha_pll_postdiv_lucid_5lpe_ops); + +void clk_zonda_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config) +{ +if (config->l) +regmap_write (regmap,PLL_L_VAL (pll), config->l); + +if (config->alpha) +regmap_write (regmap,PLL_ALPHA_VAL (pll), config->alpha); + +if (config->config_ctl_val) +regmap_write (regmap,PLL_CONFIG_CTL (pll), + config->config_ctl_val); + +if (config->config_ctl_hi_val) +regmap_write (regmap,PLL_CONFIG_CTL_U (pll), + config->config_ctl_hi_val); + +if (config->config_ctl_hi1_val) +regmap_write (regmap,PLL_CONFIG_CTL_U1 (pll), + config->config_ctl_hi1_val); + +if (config->user_ctl_val) +regmap_write (regmap,PLL_USER_CTL (pll), + config->user_ctl_val); + +if (config->user_ctl_hi_val) +regmap_write (regmap,PLL_USER_CTL_U (pll), + config->user_ctl_hi_val); + +if (config->user_ctl_hi1_val) +regmap_write (regmap,PLL_USER_CTL_U1 (pll), + config->user_ctl_hi1_val); + +if (config->test_ctl_val) +regmap_write (regmap,PLL_TEST_CTL (pll), + config->test_ctl_val); + +if (config->test_ctl_hi_val) +regmap_write (regmap,PLL_TEST_CTL_U (pll), + config->test_ctl_hi_val); + +if (config->test_ctl_hi1_val) +regmap_write (regmap,PLL_TEST_CTL_U1 (pll), + config->test_ctl_hi1_val); + +regmap_update_bits (regmap,PLL_MODE (pll), +PLL_BYPASSNL ,0 ); + +/* Disable PLL output */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Set operation mode to OFF */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_STANDBY ); + +/* PLL should be in OFF mode before continuing */ +wmb (); + +/* Place the PLL in STANDBY mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); +} + +static int clk_zonda_pll_enable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct regmap *regmap = pll->clkr.regmap; +u32 val; +int ret; + + ret =regmap_read (regmap,PLL_MODE (pll), &val); +if (ret) +return ret; + +/* If in FSM mode, just vote for it */ +if (val &PLL_VOTE_FSM_ENA ) { + ret =clk_enable_regmap (hw); +if (ret) +return ret; +return wait_for_pll_enable_active (pll); + } + +/* Get the PLL out of bypass mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_BYPASSNL ,PLL_BYPASSNL ); + +/* +* H/W requires a 1us delay between disabling the bypass and +* de-asserting the reset. +*/ +mb (); +udelay (1 ); + +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); + +/* Set operation mode to RUN */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_RUN ); + + ret =regmap_read (regmap,PLL_TEST_CTL (pll), &val); +if (ret) +return ret; + +/* If cfa mode then poll for freq lock */ +if (val &ZONDA_STAY_IN_CFA ) + ret =wait_for_zonda_pll_freq_lock (pll); +else + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Enable the PLL outputs */ + ret =regmap_update_bits (regmap,PLL_USER_CTL (pll), +ZONDA_PLL_OUT_MASK ,ZONDA_PLL_OUT_MASK ); +if (ret) +return ret; + +/* Enable the global PLL outputs */ + ret =regmap_update_bits (regmap,PLL_MODE (pll), +PLL_OUTCTRL ,PLL_OUTCTRL ); +if (ret) +return ret; + +/* Ensure that the write above goes through before returning. */ +mb (); + +return 0 ; +} + +static void clk_zonda_pll_disable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct regmap *regmap = pll->clkr.regmap; +u32 val; +int ret; + + ret =regmap_read (regmap,PLL_MODE (pll), &val); +if (ret) +return ; + +/* If in FSM mode, just unvote it */ +if (val &PLL_VOTE_FSM_ENA ) { +clk_disable_regmap (hw); +return ; + } + +/* Disable the global PLL output */ + ret =regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Disable the PLL outputs */ +regmap_update_bits (regmap,PLL_USER_CTL (pll),ZONDA_PLL_OUT_MASK ,0 ); + +/* Put the PLL in bypass and reset */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N |PLL_BYPASSNL ,0 ); + +/* Place the PLL mode in OFF state */ +regmap_write (regmap,PLL_OPMODE (pll),0x0 ); +} + +static int clk_zonda_pll_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 test_ctl_val; +u32 l; +u64 a; +int ret; + + rrate =alpha_pll_round_rate (rate, prate, &l, &a,ALPHA_BITWIDTH ); + + ret =alpha_pll_check_rate_margin (hw, rrate, rate); +if (ret <0 ) +return ret; + +regmap_write (pll->clkr.regmap,PLL_ALPHA_VAL (pll), a); +regmap_write (pll->clkr.regmap,PLL_L_VAL (pll), l); + +/* Wait before polling for the frequency latch */ +udelay (5 ); + +/* Read stay in cfa mode */ + ret =regmap_read (pll->clkr.regmap,PLL_TEST_CTL (pll), &test_ctl_val); +if (ret) +return ret; + +/* If cfa mode then poll for freq lock */ +if (test_ctl_val &ZONDA_STAY_IN_CFA ) + ret =wait_for_zonda_pll_freq_lock (pll); +else + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Wait for PLL output to stabilize */ +udelay (100 ); +return 0 ; +} + +static unsigned long +clk_zonda_pll_recalc_rate (struct clk_hw *hw,unsigned long parent_rate) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +u32 l, frac; + +regmap_read (pll->clkr.regmap,PLL_L_VAL (pll), &l); +regmap_read (pll->clkr.regmap,PLL_ALPHA_VAL (pll), &frac); + +return alpha_pll_calc_rate (parent_rate, l, frac,ALPHA_BITWIDTH ); +} + +const struct clk_ops clk_alpha_pll_zonda_ops = { + .enable = clk_zonda_pll_enable, + .disable = clk_zonda_pll_disable, + .is_enabled = clk_trion_pll_is_enabled, + .recalc_rate = clk_zonda_pll_recalc_rate, + .round_rate = clk_alpha_pll_round_rate, + .set_rate = clk_zonda_pll_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_zonda_ops);
drivers/clk/qcom/clk-alpha-pll.h +6 -0
@@ -16,6 +16,7 @@ enum {CLK_ALPHA_PLL_TYPE_TRION ,CLK_ALPHA_PLL_TYPE_LUCID =CLK_ALPHA_PLL_TYPE_TRION ,CLK_ALPHA_PLL_TYPE_AGERA , +CLK_ALPHA_PLL_TYPE_ZONDA , CLK_ALPHA_PLL_TYPE_MAX, };
@@ -148,6 +149,9 @@ 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; +extern const struct clk_ops clk_alpha_pll_zonda_ops; +extern const struct clk_ops clk_alpha_pll_postdiv_zonda_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,
@@ -159,6 +163,8 @@ void clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,#define clk_lucid_pll_configure (pll, regmap, config) \ clk_trion_pll_configure(pll, regmap, config) +void clk_zonda_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config);#endif
Signature · 1 line
2.26.1
Re: [PATCH 1/3] clk: qcom: clk-alpha-pll: add support for zonda pll
Hey Jonathan,
Quoted 313 lines · Jonathan Marek
Ported over from the downstream driver. Will be used by SM8250 CAMCC.
Signed-off-by Jonathan Marek <[email protected]>--- drivers/clk/qcom/clk-alpha-pll.c | 245 +++++++++++++++++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 6 + 2 files changed, 251 insertions(+)drivers/clk/qcom/clk-alpha-pll.c +245
-0@@ -126,6 +126,19 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { [PLL_OFF_TEST_CTL_U] = 0x1c, [PLL_OFF_STATUS] = 0x2c, }, + [CLK_ALPHA_PLL_TYPE_ZONDA] = { + [PLL_OFF_L_VAL] = 0x04, + [PLL_OFF_ALPHA_VAL] = 0x08, + [PLL_OFF_USER_CTL] = 0x0c, + [PLL_OFF_CONFIG_CTL] = 0x10, + [PLL_OFF_CONFIG_CTL_U] = 0x14, + [PLL_OFF_CONFIG_CTL_U1] = 0x18, + [PLL_OFF_TEST_CTL] = 0x1c, + [PLL_OFF_TEST_CTL_U] = 0x20, + [PLL_OFF_TEST_CTL_U1] = 0x24, + [PLL_OFF_OPMODE] = 0x28, + [PLL_OFF_STATUS] = 0x38, + }, };EXPORT_SYMBOL_GPL (clk_alpha_pll_regs);@@ -162,6 +175,11 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);#define LUCID_5LPE_PLL_LATCH_INPUT BIT(14)#define LUCID_5LPE_ENABLE_VOTE_RUN BIT(21) +/* ZONDA PLL specific */ +#define ZONDA_PLL_OUT_MASK 0xf +#define ZONDA_STAY_IN_CFA BIT(16) +#define ZONDA_PLL_FREQ_LOCK_DET BIT(29) +#define pll_alpha_width (p) \ ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \ ALPHA_REG_BITWIDTH : ALPHA_REG_16BIT_WIDTH)@@ -208,6 +226,9 @@ static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse,#define wait_for_pll_enable_lock (pll) \ wait_for_pll(pll, PLL_LOCK_DET, 0, "enable") +#define wait_for_zonda_pll_freq_lock (pll) \ + wait_for_pll(pll, ZONDA_PLL_FREQ_LOCK_DET, 0, "freq enable") +#define wait_for_pll_disable (pll) \ wait_for_pll(pll, PLL_ACTIVE_FLAG, 1, "disable")@@ -1398,6 +1419,13 @@ const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = { };EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_fabia_ops); +const struct clk_ops clk_alpha_pll_postdiv_zonda_ops = { + .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, + .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, + .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_postdiv_zonda_ops); +/** * clk_lucid_pll_configure - configure the lucid pll * @@ -1777,3 +1805,220 @@ const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { .set_rate = clk_lucid_5lpe_pll_postdiv_set_rate, };EXPORT_SYMBOL (clk_alpha_pll_postdiv_lucid_5lpe_ops); + +void clk_zonda_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config) +{ +if (config->l) +regmap_write (regmap,PLL_L_VAL (pll), config->l); + +if (config->alpha) +regmap_write (regmap,PLL_ALPHA_VAL (pll), config->alpha); + +if (config->config_ctl_val) +regmap_write (regmap,PLL_CONFIG_CTL (pll), + config->config_ctl_val); + +if (config->config_ctl_hi_val) +regmap_write (regmap,PLL_CONFIG_CTL_U (pll), + config->config_ctl_hi_val); + +if (config->config_ctl_hi1_val) +regmap_write (regmap,PLL_CONFIG_CTL_U1 (pll), + config->config_ctl_hi1_val); + +if (config->user_ctl_val) +regmap_write (regmap,PLL_USER_CTL (pll), + config->user_ctl_val); + +if (config->user_ctl_hi_val) +regmap_write (regmap,PLL_USER_CTL_U (pll), + config->user_ctl_hi_val); + +if (config->user_ctl_hi1_val) +regmap_write (regmap,PLL_USER_CTL_U1 (pll), + config->user_ctl_hi1_val); + +if (config->test_ctl_val) +regmap_write (regmap,PLL_TEST_CTL (pll), + config->test_ctl_val); + +if (config->test_ctl_hi_val) +regmap_write (regmap,PLL_TEST_CTL_U (pll), + config->test_ctl_hi_val); + +if (config->test_ctl_hi1_val) +regmap_write (regmap,PLL_TEST_CTL_U1 (pll), + config->test_ctl_hi1_val); + +regmap_update_bits (regmap,PLL_MODE (pll), +PLL_BYPASSNL ,0 ); + +/* Disable PLL output */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Set operation mode to OFF */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_STANDBY ); + +/* PLL should be in OFF mode before continuing */ +wmb (); + +/* Place the PLL in STANDBY mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); +} + +static int clk_zonda_pll_enable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct regmap *regmap = pll->clkr.regmap; +u32 val; +int ret; + + ret =regmap_read (regmap,PLL_MODE (pll), &val); +if (ret) +return ret; + +/* If in FSM mode, just vote for it */ +if (val &PLL_VOTE_FSM_ENA ) { + ret =clk_enable_regmap (hw); +if (ret) +return ret; +return wait_for_pll_enable_active (pll); + } + +/* Get the PLL out of bypass mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_BYPASSNL ,PLL_BYPASSNL ); + +/* +* H/W requires a 1us delay between disabling the bypass and +* de-asserting the reset. +*/ +mb (); +udelay (1 ); + +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); + +/* Set operation mode to RUN */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_RUN ); + + ret =regmap_read (regmap,PLL_TEST_CTL (pll), &val); +if (ret) +return ret; + +/* If cfa mode then poll for freq lock */ +if (val &ZONDA_STAY_IN_CFA ) + ret =wait_for_zonda_pll_freq_lock (pll); +else + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Enable the PLL outputs */ + ret =regmap_update_bits (regmap,PLL_USER_CTL (pll), +ZONDA_PLL_OUT_MASK ,ZONDA_PLL_OUT_MASK ); +if (ret) +return ret; + +/* Enable the global PLL outputs */ + ret =regmap_update_bits (regmap,PLL_MODE (pll), +PLL_OUTCTRL ,PLL_OUTCTRL ); +if (ret) +return ret; + +/* Ensure that the write above goes through before returning. */ +mb (); + +return 0 ; +} + +static void clk_zonda_pll_disable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct regmap *regmap = pll->clkr.regmap; +u32 val; +int ret; + + ret =regmap_read (regmap,PLL_MODE (pll), &val); +if (ret) +return ; + +/* If in FSM mode, just unvote it */ +if (val &PLL_VOTE_FSM_ENA ) { +clk_disable_regmap (hw); +return ; + } + +/* Disable the global PLL output */ + ret =regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Disable the PLL outputs */ +regmap_update_bits (regmap,PLL_USER_CTL (pll),ZONDA_PLL_OUT_MASK ,0 ); + +/* Put the PLL in bypass and reset */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N |PLL_BYPASSNL ,0 ); + +/* Place the PLL mode in OFF state */ +regmap_write (regmap,PLL_OPMODE (pll),0x0 ); +} + +static int clk_zonda_pll_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 test_ctl_val; +u32 l; +u64 a; +int ret; + + rrate =alpha_pll_round_rate (rate, prate, &l, &a,ALPHA_BITWIDTH ); + + ret =alpha_pll_check_rate_margin (hw, rrate, rate); +if (ret <0 ) +return ret; + +regmap_write (pll->clkr.regmap,PLL_ALPHA_VAL (pll), a); +regmap_write (pll->clkr.regmap,PLL_L_VAL (pll), l); + +/* Wait before polling for the frequency latch */ +udelay (5 ); + +/* Read stay in cfa mode */ + ret =regmap_read (pll->clkr.regmap,PLL_TEST_CTL (pll), &test_ctl_val); +if (ret) +return ret; + +/* If cfa mode then poll for freq lock */ +if (test_ctl_val &ZONDA_STAY_IN_CFA ) + ret =wait_for_zonda_pll_freq_lock (pll); +else + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Wait for PLL output to stabilize */ +udelay (100 ); +return 0 ; +} + +static unsigned long +clk_zonda_pll_recalc_rate (struct clk_hw *hw,unsigned long parent_rate) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +u32 l, frac; + +regmap_read (pll->clkr.regmap,PLL_L_VAL (pll), &l); +regmap_read (pll->clkr.regmap,PLL_ALPHA_VAL (pll), &frac); + +return alpha_pll_calc_rate (parent_rate, l, frac,ALPHA_BITWIDTH ); +} + +const struct clk_ops clk_alpha_pll_zonda_ops = { + .enable = clk_zonda_pll_enable, + .disable = clk_zonda_pll_disable, + .is_enabled = clk_trion_pll_is_enabled, + .recalc_rate = clk_zonda_pll_recalc_rate, + .round_rate = clk_alpha_pll_round_rate, + .set_rate = clk_zonda_pll_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_zonda_ops);drivers/clk/qcom/clk-alpha-pll.h +4
-0@@ -16,6 +16,7 @@ enum {CLK_ALPHA_PLL_TYPE_TRION ,CLK_ALPHA_PLL_TYPE_LUCID =CLK_ALPHA_PLL_TYPE_TRION ,CLK_ALPHA_PLL_TYPE_AGERA , +CLK_ALPHA_PLL_TYPE_ZONDA , CLK_ALPHA_PLL_TYPE_MAX, };@@ -148,6 +149,9 @@ 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; +extern const struct clk_ops clk_alpha_pll_zonda_ops; +extern const struct clk_ops clk_alpha_pll_postdiv_zonda_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,
drivers/clk/qcom/clk-alpha-pll.h void clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap, · line 170
Quoted 8 lines
drivers/clk/qcom/clk-alpha-pll.h +2
-0@@ -159,6 +163,8 @@ void clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,#define clk_lucid_pll_configure (pll, regmap, config) \ clk_trion_pll_configure(pll, regmap, config) +void clk_zonda_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config);#endif
I'm seeing some checkpatch --strict warnings, with those fixed this patch looks good to me.
Re: [PATCH 1/3] clk: qcom: clk-alpha-pll: add support for zonda pll
In reply to Jonathan MarekQuoted 33 lines · Jonathan Marek
Ported over from the downstream driver. Will be used by SM8250 CAMCC.
Signed-off-by Jonathan Marek <[email protected]>--- drivers/clk/qcom/clk-alpha-pll.c | 245 +++++++++++++++++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 6 + 2 files changed, 251 insertions(+)drivers/clk/qcom/clk-alpha-pll.c +13
-0@@ -126,6 +126,19 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { [PLL_OFF_TEST_CTL_U] = 0x1c, [PLL_OFF_STATUS] = 0x2c, }, + [CLK_ALPHA_PLL_TYPE_ZONDA] = { + [PLL_OFF_L_VAL] = 0x04, + [PLL_OFF_ALPHA_VAL] = 0x08, + [PLL_OFF_USER_CTL] = 0x0c, + [PLL_OFF_CONFIG_CTL] = 0x10, + [PLL_OFF_CONFIG_CTL_U] = 0x14, + [PLL_OFF_CONFIG_CTL_U1] = 0x18, + [PLL_OFF_TEST_CTL] = 0x1c, + [PLL_OFF_TEST_CTL_U] = 0x20, + [PLL_OFF_TEST_CTL_U1] = 0x24, + [PLL_OFF_OPMODE] = 0x28, + [PLL_OFF_STATUS] = 0x38, + }, };EXPORT_SYMBOL_GPL (clk_alpha_pll_regs);
drivers/clk/qcom/clk-alpha-pll.c EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); · line 181
Quoted 7 lines
drivers/clk/qcom/clk-alpha-pll.c +4
-0@@ -162,6 +175,11 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);#define LUCID_5LPE_PLL_LATCH_INPUT BIT(14)#define LUCID_5LPE_ENABLE_VOTE_RUN BIT(21) +/* ZONDA PLL specific */ +#define ZONDA_PLL_OUT_MASK 0xf +#define ZONDA_STAY_IN_CFA BIT(16) +#define ZONDA_PLL_FREQ_LOCK_DET BIT(29)
This seems similar to ALPHA_PLL_ACK_LATCH..?
Quoted 15 lines
drivers/clk/qcom/clk-alpha-pll.c +4
-0+#define pll_alpha_width (p) \ ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \ ALPHA_REG_BITWIDTH : ALPHA_REG_16BIT_WIDTH)@@ -208,6 +226,9 @@ static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse,#define wait_for_pll_enable_lock (pll) \ wait_for_pll(pll, PLL_LOCK_DET, 0, "enable") +#define wait_for_zonda_pll_freq_lock (pll) \ + wait_for_pll(pll, ZONDA_PLL_FREQ_LOCK_DET, 0, "freq enable") +#define wait_for_pll_disable (pll) \ wait_for_pll(pll, PLL_ACTIVE_FLAG, 1, "disable")
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = { · line 1427
Quoted 9 lines
drivers/clk/qcom/clk-alpha-pll.c +6
-0@@ -1398,6 +1419,13 @@ const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = { };EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_fabia_ops); +const struct clk_ops clk_alpha_pll_postdiv_zonda_ops = { + .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, + .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, + .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_postdiv_zonda_ops);
Why add one more ops when we can reuse clk_alpha_pll_postdiv_fabia_ops for this?
Quoted 11 lines
drivers/clk/qcom/clk-alpha-pll.c +4
-0+/** * clk_lucid_pll_configure - configure the lucid pll * @@ -1777,3 +1805,220 @@ const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { .set_rate = clk_lucid_5lpe_pll_postdiv_set_rate, };EXPORT_SYMBOL (clk_alpha_pll_postdiv_lucid_5lpe_ops); + +void clk_zonda_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config)
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 1820
Quoted 10 lines
drivers/clk/qcom/clk-alpha-pll.c +10
-0+{ +if (config->l) +regmap_write (regmap,PLL_L_VAL (pll), config->l); + +if (config->alpha) +regmap_write (regmap,PLL_ALPHA_VAL (pll), config->alpha); + +if (config->config_ctl_val) +regmap_write (regmap,PLL_CONFIG_CTL (pll), + config->config_ctl_val);
this and below can fit in a single line and look neater
Quoted 34 lines
drivers/clk/qcom/clk-alpha-pll.c +34
-0+ +if (config->config_ctl_hi_val) +regmap_write (regmap,PLL_CONFIG_CTL_U (pll), + config->config_ctl_hi_val); + +if (config->config_ctl_hi1_val) +regmap_write (regmap,PLL_CONFIG_CTL_U1 (pll), + config->config_ctl_hi1_val); + +if (config->user_ctl_val) +regmap_write (regmap,PLL_USER_CTL (pll), + config->user_ctl_val); + +if (config->user_ctl_hi_val) +regmap_write (regmap,PLL_USER_CTL_U (pll), + config->user_ctl_hi_val); + +if (config->user_ctl_hi1_val) +regmap_write (regmap,PLL_USER_CTL_U1 (pll), + config->user_ctl_hi1_val); + +if (config->test_ctl_val) +regmap_write (regmap,PLL_TEST_CTL (pll), + config->test_ctl_val); + +if (config->test_ctl_hi_val) +regmap_write (regmap,PLL_TEST_CTL_U (pll), + config->test_ctl_hi_val); + +if (config->test_ctl_hi1_val) +regmap_write (regmap,PLL_TEST_CTL_U1 (pll), + config->test_ctl_hi1_val); + + regmap_update_bits(regmap, PLL_MODE(pll),
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 1864
Quoted 10 lines
drivers/clk/qcom/clk-alpha-pll.c +10
-0+ PLL_BYPASSNL, 0); + +/* Disable PLL output */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Set operation mode to OFF */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_STANDBY ); + +/* PLL should be in OFF mode before continuing */ +wmb ();
Why a barrier?
Quoted 140 lines
drivers/clk/qcom/clk-alpha-pll.c +140
-0+ +/* Place the PLL in STANDBY mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); +} + +static int clk_zonda_pll_enable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct regmap *regmap = pll->clkr.regmap; +u32 val; +int ret; + + ret =regmap_read (regmap,PLL_MODE (pll), &val); +if (ret) +return ret; + +/* If in FSM mode, just vote for it */ +if (val &PLL_VOTE_FSM_ENA ) { + ret =clk_enable_regmap (hw); +if (ret) +return ret; +return wait_for_pll_enable_active (pll); + } + +/* Get the PLL out of bypass mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_BYPASSNL ,PLL_BYPASSNL ); + +/* +* H/W requires a 1us delay between disabling the bypass and +* de-asserting the reset. +*/ +mb (); +udelay (1 ); + +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); + +/* Set operation mode to RUN */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_RUN ); + + ret =regmap_read (regmap,PLL_TEST_CTL (pll), &val); +if (ret) +return ret; + +/* If cfa mode then poll for freq lock */ +if (val &ZONDA_STAY_IN_CFA ) + ret =wait_for_zonda_pll_freq_lock (pll); +else + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Enable the PLL outputs */ + ret =regmap_update_bits (regmap,PLL_USER_CTL (pll), +ZONDA_PLL_OUT_MASK ,ZONDA_PLL_OUT_MASK ); +if (ret) +return ret; + +/* Enable the global PLL outputs */ + ret =regmap_update_bits (regmap,PLL_MODE (pll), +PLL_OUTCTRL ,PLL_OUTCTRL ); +if (ret) +return ret; + +/* Ensure that the write above goes through before returning. */ +mb (); + +return 0 ; +} + +static void clk_zonda_pll_disable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct regmap *regmap = pll->clkr.regmap; +u32 val; +int ret; + + ret =regmap_read (regmap,PLL_MODE (pll), &val); +if (ret) +return ; + +/* If in FSM mode, just unvote it */ +if (val &PLL_VOTE_FSM_ENA ) { +clk_disable_regmap (hw); +return ; + } + +/* Disable the global PLL output */ + ret =regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Disable the PLL outputs */ +regmap_update_bits (regmap,PLL_USER_CTL (pll),ZONDA_PLL_OUT_MASK ,0 ); + +/* Put the PLL in bypass and reset */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N |PLL_BYPASSNL ,0 ); + +/* Place the PLL mode in OFF state */ +regmap_write (regmap,PLL_OPMODE (pll),0x0 ); +} + +static int clk_zonda_pll_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 test_ctl_val; +u32 l; +u64 a; +int ret; + + rrate =alpha_pll_round_rate (rate, prate, &l, &a,ALPHA_BITWIDTH ); + + ret =alpha_pll_check_rate_margin (hw, rrate, rate); +if (ret <0 ) +return ret; + +regmap_write (pll->clkr.regmap,PLL_ALPHA_VAL (pll), a); +regmap_write (pll->clkr.regmap,PLL_L_VAL (pll), l); + +/* Wait before polling for the frequency latch */ +udelay (5 ); + +/* Read stay in cfa mode */ + ret =regmap_read (pll->clkr.regmap,PLL_TEST_CTL (pll), &test_ctl_val); +if (ret) +return ret; + +/* If cfa mode then poll for freq lock */ +if (test_ctl_val &ZONDA_STAY_IN_CFA ) + ret =wait_for_zonda_pll_freq_lock (pll); +else + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Wait for PLL output to stabilize */ +udelay (100 ); +return 0 ; +} + +static unsigned long
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 2014
Quoted 10 lines
drivers/clk/qcom/clk-alpha-pll.c +10
-0+clk_zonda_pll_recalc_rate(struct clk_hw *hw, unsigned long parent_rate) +{ + struct clk_alpha_pll *pll = to_clk_alpha_pll(hw); +u32 l, frac; + +regmap_read (pll->clkr.regmap,PLL_L_VAL (pll), &l); +regmap_read (pll->clkr.regmap,PLL_ALPHA_VAL (pll), &frac); + +return alpha_pll_calc_rate (parent_rate, l, frac,ALPHA_BITWIDTH ); +}
sounds like you could use clk_trion_pll_recalc_rate() instead
Signature · 1 line
~Vinod
Re: [PATCH 1/3] clk: qcom: clk-alpha-pll: add support for zonda pll
Quoted 1 line · Vinod Koul
On 13-05-21, 13:52, Jonathan Marek wrote:
...
Quoted 7 lines
drivers/clk/qcom/clk-alpha-pll.c EXPORT_SYMBOL_GPL(clk_alpha_pll_regs); · line 181
Quoted 4 lines
drivers/clk/qcom/clk-alpha-pll.c +4
-0+/* ZONDA PLL specific */ +#define ZONDA_PLL_OUT_MASK 0xf +#define ZONDA_STAY_IN_CFA BIT(16) +#define ZONDA_PLL_FREQ_LOCK_DET BIT(29)This seems similar to
ALPHA_PLL_ACK_LATCH..?
The bit is the same, and it is also used with wait_for_pll(), but the meaning seems different (the usage pattern is different).
Quoted 10 lines
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = { · line 1427
Quoted 6 lines
drivers/clk/qcom/clk-alpha-pll.c +6
-0+const struct clk_ops clk_alpha_pll_postdiv_zonda_ops = { + .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, + .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, + .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_postdiv_zonda_ops);Why add one more ops when we can reuse
clk_alpha_pll_postdiv_fabia_opsfor this?
No reason (copied from downstream), will fix.
Quoted 9 lines
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 1864
Quoted 6 lines
drivers/clk/qcom/clk-alpha-pll.c +6
-0+ +/* Set operation mode to OFF */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_STANDBY ); + +/* PLL should be in OFF mode before continuing */ +wmb ();Why a barrier?
Again no reason (copied from downstream, but it doesn't make sense to have this barrier).
Quoted 5 lines
Quoted 5 lines
drivers/clk/qcom/clk-alpha-pll.c +5
-0+static unsigned long +clk_zonda_pll_recalc_rate (struct clk_hw *hw,unsigned long parent_rate) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +u32 l, frac;
Quoted 9 lines
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 2014
Quoted 6 lines
drivers/clk/qcom/clk-alpha-pll.c +6
-0+ +regmap_read (pll->clkr.regmap,PLL_L_VAL (pll), &l); +regmap_read (pll->clkr.regmap,PLL_ALPHA_VAL (pll), &frac); + +return alpha_pll_calc_rate (parent_rate, l, frac,ALPHA_BITWIDTH ); +}sounds like you could use
clk_trion_pll_recalc_rate()instead
I had this thought as well, but alpha_width in clk_trion_pll_recalc()_rate is 16, here ALPHA_BITWIDTH is 32, so I just copied this from downstream.
I think changing pll_alpha_width() to return the right value for zonda will work and allow sharing the function, if you think that's a good idea?
Re: [PATCH 1/3] clk: qcom: clk-alpha-pll: add support for zonda pll
Quoted 17 lines · Jonathan Marek
Quoted 5 lines · Vinod Koul
Quoted 5 lines
drivers/clk/qcom/clk-alpha-pll.c +5
-0+static unsigned long +clk_zonda_pll_recalc_rate (struct clk_hw *hw,unsigned long parent_rate) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +u32 l, frac;Quoted 9 lines
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 2014
Quoted 6 lines
drivers/clk/qcom/clk-alpha-pll.c +6
-0+ +regmap_read (pll->clkr.regmap,PLL_L_VAL (pll), &l); +regmap_read (pll->clkr.regmap,PLL_ALPHA_VAL (pll), &frac); + +return alpha_pll_calc_rate (parent_rate, l, frac,ALPHA_BITWIDTH ); +}sounds like you could use
clk_trion_pll_recalc_rate()instead
Quoted 5 lines
I had this thought as well, but
alpha_widthin clk_trion_pll_recalc()_rate is 16, hereALPHA_BITWIDTHis 32, so I just copied this from downstream.I think changing
pll_alpha_width()to return the right value for zonda will work and allow sharing the function, if you think that's a good idea?
Yes I thinking pll_alpha_width() should do the trick here
Thanks
Signature · 1 line
~Vinod
Re: [PATCH 1/3] clk: qcom: clk-alpha-pll: add support for zonda pll
In reply to Jonathan MarekQuoted 69 lines · Jonathan Marek
Ported over from the downstream driver. Will be used by SM8250 CAMCC.
Signed-off-by Jonathan Marek <[email protected]>--- drivers/clk/qcom/clk-alpha-pll.c | 245 +++++++++++++++++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 6 + 2 files changed, 251 insertions(+)drivers/clk/qcom/clk-alpha-pll.c +28
-0@@ -126,6 +126,19 @@ const u8 clk_alpha_pll_regs[][PLL_OFF_MAX_REGS] = { [PLL_OFF_TEST_CTL_U] = 0x1c, [PLL_OFF_STATUS] = 0x2c, }, + [CLK_ALPHA_PLL_TYPE_ZONDA] = { + [PLL_OFF_L_VAL] = 0x04, + [PLL_OFF_ALPHA_VAL] = 0x08, + [PLL_OFF_USER_CTL] = 0x0c, + [PLL_OFF_CONFIG_CTL] = 0x10, + [PLL_OFF_CONFIG_CTL_U] = 0x14, + [PLL_OFF_CONFIG_CTL_U1] = 0x18, + [PLL_OFF_TEST_CTL] = 0x1c, + [PLL_OFF_TEST_CTL_U] = 0x20, + [PLL_OFF_TEST_CTL_U1] = 0x24, + [PLL_OFF_OPMODE] = 0x28, + [PLL_OFF_STATUS] = 0x38, + }, };EXPORT_SYMBOL_GPL (clk_alpha_pll_regs);@@ -162,6 +175,11 @@ EXPORT_SYMBOL_GPL(clk_alpha_pll_regs);#define LUCID_5LPE_PLL_LATCH_INPUT BIT(14)#define LUCID_5LPE_ENABLE_VOTE_RUN BIT(21) +/* ZONDA PLL specific */ +#define ZONDA_PLL_OUT_MASK 0xf +#define ZONDA_STAY_IN_CFA BIT(16) +#define ZONDA_PLL_FREQ_LOCK_DET BIT(29) +#define pll_alpha_width (p) \ ((PLL_ALPHA_VAL_U(p) - PLL_ALPHA_VAL(p) == 4) ? \ ALPHA_REG_BITWIDTH : ALPHA_REG_16BIT_WIDTH)@@ -208,6 +226,9 @@ static int wait_for_pll(struct clk_alpha_pll *pll, u32 mask, bool inverse,#define wait_for_pll_enable_lock (pll) \ wait_for_pll(pll, PLL_LOCK_DET, 0, "enable") +#define wait_for_zonda_pll_freq_lock (pll) \ + wait_for_pll(pll, ZONDA_PLL_FREQ_LOCK_DET, 0, "freq enable") +#define wait_for_pll_disable (pll) \ wait_for_pll(pll, PLL_ACTIVE_FLAG, 1, "disable")@@ -1398,6 +1419,13 @@ const struct clk_ops clk_alpha_pll_postdiv_fabia_ops = { };EXPORT_SYMBOL_GPL (clk_alpha_pll_postdiv_fabia_ops); +const struct clk_ops clk_alpha_pll_postdiv_zonda_ops = { + .recalc_rate = clk_alpha_pll_postdiv_fabia_recalc_rate, + .round_rate = clk_alpha_pll_postdiv_fabia_round_rate, + .set_rate = clk_alpha_pll_postdiv_fabia_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_postdiv_zonda_ops); +/** * clk_lucid_pll_configure - configure the lucid pll *
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 1814
Quoted 10 lines
drivers/clk/qcom/clk-alpha-pll.c +7
-0@@ -1777,3 +1805,220 @@ const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { .set_rate = clk_lucid_5lpe_pll_postdiv_set_rate, };EXPORT_SYMBOL (clk_alpha_pll_postdiv_lucid_5lpe_ops); + +void clk_zonda_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config) +{ +if (config->l) +regmap_write (regmap,PLL_L_VAL (pll), config->l); +
Please useclk_alpha_pll_write_config
clk_alpha_pll_write_config(regmap, PLL_L_VAL(pll), config->l);
clk_alpha_pll_write_config(regmap, PLL_ALPHA_VAL(pll),
config->alpha);
clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL(pll),
config->config_ctl_val);
clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U(pll),
config->config_ctl_hi_val);
clk_alpha_pll_write_config(regmap, PLL_CONFIG_CTL_U1(pll),
config->config_ctl_hi1_val);
clk_alpha_pll_write_config(regmap, PLL_USER_CTL(pll),
config->user_ctl_val);
clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U(pll),
config->user_ctl_hi_val);
clk_alpha_pll_write_config(regmap, PLL_USER_CTL_U1(pll),
config->user_ctl_hi1_val);
clk_alpha_pll_write_config(regmap, PLL_TEST_CTL(pll),
config->test_ctl_val);
clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U(pll),
config->test_ctl_hi_val);
clk_alpha_pll_write_config(regmap, PLL_TEST_CTL_U1(pll),
config->test_ctl_hi1_val);Quoted 146 lines
drivers/clk/qcom/clk-alpha-pll.c +146
-0+if (config->alpha) +regmap_write (regmap,PLL_ALPHA_VAL (pll), config->alpha); + +if (config->config_ctl_val) +regmap_write (regmap,PLL_CONFIG_CTL (pll), + config->config_ctl_val); + +if (config->config_ctl_hi_val) +regmap_write (regmap,PLL_CONFIG_CTL_U (pll), + config->config_ctl_hi_val); + +if (config->config_ctl_hi1_val) +regmap_write (regmap,PLL_CONFIG_CTL_U1 (pll), + config->config_ctl_hi1_val); + +if (config->user_ctl_val) +regmap_write (regmap,PLL_USER_CTL (pll), + config->user_ctl_val); + +if (config->user_ctl_hi_val) +regmap_write (regmap,PLL_USER_CTL_U (pll), + config->user_ctl_hi_val); + +if (config->user_ctl_hi1_val) +regmap_write (regmap,PLL_USER_CTL_U1 (pll), + config->user_ctl_hi1_val); + +if (config->test_ctl_val) +regmap_write (regmap,PLL_TEST_CTL (pll), + config->test_ctl_val); + +if (config->test_ctl_hi_val) +regmap_write (regmap,PLL_TEST_CTL_U (pll), + config->test_ctl_hi_val); + +if (config->test_ctl_hi1_val) +regmap_write (regmap,PLL_TEST_CTL_U1 (pll), + config->test_ctl_hi1_val); + +regmap_update_bits (regmap,PLL_MODE (pll), +PLL_BYPASSNL ,0 ); + +/* Disable PLL output */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Set operation mode to OFF */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_STANDBY ); + +/* PLL should be in OFF mode before continuing */ +wmb (); + +/* Place the PLL in STANDBY mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); +} + +static int clk_zonda_pll_enable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct regmap *regmap = pll->clkr.regmap; +u32 val; +int ret; + + ret =regmap_read (regmap,PLL_MODE (pll), &val); +if (ret) +return ret; + +/* If in FSM mode, just vote for it */ +if (val &PLL_VOTE_FSM_ENA ) { + ret =clk_enable_regmap (hw); +if (ret) +return ret; +return wait_for_pll_enable_active (pll); + } + +/* Get the PLL out of bypass mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_BYPASSNL ,PLL_BYPASSNL ); + +/* +* H/W requires a 1us delay between disabling the bypass and +* de-asserting the reset. +*/ +mb (); +udelay (1 ); + +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); + +/* Set operation mode to RUN */ +regmap_write (regmap,PLL_OPMODE (pll),PLL_RUN ); + + ret =regmap_read (regmap,PLL_TEST_CTL (pll), &val); +if (ret) +return ret; + +/* If cfa mode then poll for freq lock */ +if (val &ZONDA_STAY_IN_CFA ) + ret =wait_for_zonda_pll_freq_lock (pll); +else + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Enable the PLL outputs */ + ret =regmap_update_bits (regmap,PLL_USER_CTL (pll), +ZONDA_PLL_OUT_MASK ,ZONDA_PLL_OUT_MASK ); +if (ret) +return ret; + +/* Enable the global PLL outputs */ + ret =regmap_update_bits (regmap,PLL_MODE (pll), +PLL_OUTCTRL ,PLL_OUTCTRL ); +if (ret) +return ret; + +/* Ensure that the write above goes through before returning. */ +mb (); + +return 0 ; +} + +static void clk_zonda_pll_disable (struct clk_hw *hw) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +struct regmap *regmap = pll->clkr.regmap; +u32 val; +int ret; + + ret =regmap_read (regmap,PLL_MODE (pll), &val); +if (ret) +return ; + +/* If in FSM mode, just unvote it */ +if (val &PLL_VOTE_FSM_ENA ) { +clk_disable_regmap (hw); +return ; + } + +/* Disable the global PLL output */ + ret =regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,0 ); + +/* Disable the PLL outputs */ +regmap_update_bits (regmap,PLL_USER_CTL (pll),ZONDA_PLL_OUT_MASK ,0 ); + +/* Put the PLL in bypass and reset */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N |PLL_BYPASSNL ,0 ); + +/* Place the PLL mode in OFF state */
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 1970
Quoted 10 lines
drivers/clk/qcom/clk-alpha-pll.c +10
-0+regmap_write (regmap,PLL_OPMODE (pll),0x0 ); +} + +static int clk_zonda_pll_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 test_ctl_val; +u32 l;
alpha_width = pll_alpha_width(pll);
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 1975
Quoted 5 lines
drivers/clk/qcom/clk-alpha-pll.c +5
-0+u64 a; +int ret; + + rrate =alpha_pll_round_rate (rate, prate, &l, &a,ALPHA_BITWIDTH ); +
rrate = alpha_pll_round_rate(rate, prate, &l, &a, alpha_width);
Quoted 28 lines
drivers/clk/qcom/clk-alpha-pll.c +28
-0+ ret =alpha_pll_check_rate_margin (hw, rrate, rate); +if (ret <0 ) +return ret; + +regmap_write (pll->clkr.regmap,PLL_ALPHA_VAL (pll), a); +regmap_write (pll->clkr.regmap,PLL_L_VAL (pll), l); + +/* Wait before polling for the frequency latch */ +udelay (5 ); + +/* Read stay in cfa mode */ + ret =regmap_read (pll->clkr.regmap,PLL_TEST_CTL (pll), &test_ctl_val); +if (ret) +return ret; + +/* If cfa mode then poll for freq lock */ +if (test_ctl_val &ZONDA_STAY_IN_CFA ) + ret =wait_for_zonda_pll_freq_lock (pll); +else + ret =wait_for_pll_enable_lock (pll); +if (ret) +return ret; + +/* Wait for PLL output to stabilize */ +udelay (100 ); +return 0 ; +} +
drivers/clk/qcom/clk-alpha-pll.c const struct clk_ops clk_alpha_pll_postdiv_lucid_5lpe_ops = { · line 2013
Quoted 10 lines
drivers/clk/qcom/clk-alpha-pll.c +10
-0+static unsigned long +clk_zonda_pll_recalc_rate (struct clk_hw *hw,unsigned long parent_rate) +{ +struct clk_alpha_pll *pll =to_clk_alpha_pll (hw); +u32 l, frac; + +regmap_read (pll->clkr.regmap,PLL_L_VAL (pll), &l); +regmap_read (pll->clkr.regmap,PLL_ALPHA_VAL (pll), &frac); + +return alpha_pll_calc_rate (parent_rate, l, frac,ALPHA_BITWIDTH );
alpha_width = pll_alpha_width(pll);
Quoted 43 lines
drivers/clk/qcom/clk-alpha-pll.c +11
-0+} + +const struct clk_ops clk_alpha_pll_zonda_ops = { + .enable = clk_zonda_pll_enable, + .disable = clk_zonda_pll_disable, + .is_enabled = clk_trion_pll_is_enabled, + .recalc_rate = clk_zonda_pll_recalc_rate, + .round_rate = clk_alpha_pll_round_rate, + .set_rate = clk_zonda_pll_set_rate, +}; +EXPORT_SYMBOL (clk_alpha_pll_zonda_ops);drivers/clk/qcom/clk-alpha-pll.h +6
-0@@ -16,6 +16,7 @@ enum {CLK_ALPHA_PLL_TYPE_TRION ,CLK_ALPHA_PLL_TYPE_LUCID =CLK_ALPHA_PLL_TYPE_TRION ,CLK_ALPHA_PLL_TYPE_AGERA , +CLK_ALPHA_PLL_TYPE_ZONDA , CLK_ALPHA_PLL_TYPE_MAX, };@@ -148,6 +149,9 @@ 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; +extern const struct clk_ops clk_alpha_pll_zonda_ops; +extern const struct clk_ops clk_alpha_pll_postdiv_zonda_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,@@ -159,6 +163,8 @@ void clk_agera_pll_configure(struct clk_alpha_pll *pll, struct regmap *regmap,#define clk_lucid_pll_configure (pll, regmap, config) \ clk_trion_pll_configure(pll, regmap, config) +void clk_zonda_pll_configure (struct clk_alpha_pll *pll,struct regmap *regmap, +const struct alpha_pll_config *config);#endif
Signature · 4 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation. --
PATCH 2/3 dt-bindings: clock: add QCOM SM8250 camera clock bindings
In reply to Jonathan MarekAdd device tree bindings for camera clock controller for Qualcomm Technology Inc's SM8250 SoC.
--- .../bindings/clock/qcom,camcc-sm8250.yaml | 73 +++++++++ include/dt-bindings/clock/qcom,camcc-sm8250.h | 138 ++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml create mode 100644 include/dt-bindings/clock/qcom,camcc-sm8250.h
Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml new file +73 -0
@@ -0,0 +1,73 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/clock/qcom,camcc-sm8250.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Qualcomm Camera Clock & Reset Controller Binding for SM8250 + +maintainers: + - Jonathan Marek <[email protected]> + +description: | + Qualcomm camera clock control module which supports the clocks, resets and + power domains on SM8250. + + See also dt-bindings/clock/qcom,camcc-sm8250.h + +properties: + compatible: + const: qcom,sm8250-camcc + +properties: + compatible: + enum: + - + + 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 + - reg + - clocks + - clock-names + - '#clock-cells' + - '#reset-cells' + - '#power-domain-cells' + +additionalProperties: false + +examples: + - | + #include <dt-bindings/clock/qcom,rpmh.h> + clock-controller@ad00000 { + compatible = "qcom,sm8250-camcc"; + reg = <0x0ad00000 0x10000>; + clocks = <&rpmhcc RPMH_CXO_CLK>, + <&sleep_clk>; + clock-names = "bi_tcxo", "sleep_clk"; + #clock-cells = <1>; + #reset-cells = <1>; + #power-domain-cells = <1>; + }; +...
include/dt-bindings/clock/qcom,camcc-sm8250.h new file +138 -0
138 lines not on this page · raw message
Signature · 1 line
2.26.1
Rob Herring
maintainerRe: [PATCH 2/3] dt-bindings: clock: add QCOM SM8250 camera clock bindings
Quoted 11 lines · Jonathan Marek
Add device tree bindings for camera clock controller for Qualcomm Technology Inc's SM8250 SoC.
Signed-off-by Jonathan Marek <[email protected]>--- .../bindings/clock/qcom,camcc-sm8250.yaml | 73 +++++++++ include/dt-bindings/clock/qcom,camcc-sm8250.h | 138 ++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml create mode 100644 include/dt-bindings/clock/qcom,camcc-sm8250.h
My bot found errors running 'make DT_CHECKER_FLAGS=-m dt_binding_check' on your patch (DT_CHECKER_FLAGS is new in v5.13):
yamllint warnings/errors:./Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml:22:1: [error] duplication of key "properties" in mapping (key-duplicates)
dtschema/dtc warnings/errors:
make[1]: *** Deleting file 'Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.example.dts' Traceback (most recent call last):
File "/usr/local/bin/dt-extract-example", line 45, in <module>
binding = yaml.load(open(args.yamlfile, encoding='utf-8').read())
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/main.py", line 421, in load
return constructor.get_single_data()
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 111, in get_single_data
return self.construct_document(node)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 121, in construct_document
for _dummy in generator:
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 714, in construct_yaml_map
value = self.construct_mapping(node)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 435, in construct_mapping
return BaseConstructor.construct_mapping(self, node, deep=deep)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 253, in construct_mapping
if self.check_mapping_key(node, key_node, mapping, key, value):
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 284, in check_mapping_key
raise DuplicateKeyError(*args)
ruamel.yaml.constructor.DuplicateKeyError: while constructing a mapping
in "<unicode string>", line 4, column 1
found duplicate key "properties" with value "{}" (original value: "{}")
in "<unicode string>", line 22, column 1
To suppress this check see:
http://yaml.readthedocs.io/en/latest/api.html#duplicate-keys
Duplicate keys will become an error in future releases, and are errors by default when using the new API.
make[1]: *** [Documentation/devicetree/bindings/Makefile:20: Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.example.dts] Error 1 make[1]: *** Waiting for unfinished jobs....
Traceback (most recent call last):
File "/usr/local/bin/dt-doc-validate", line 67, in <module>
ret = check_doc(f)
File "/usr/local/bin/dt-doc-validate", line 25, in check_doc
testtree = dtschema.load(filename, line_number=line_number)
File "/usr/local/lib/python3.8/dist-packages/dtschema/lib.py", line 625, in load
return yaml.load(f.read())
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/main.py", line 421, in load
return constructor.get_single_data()
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 111, in get_single_data
return self.construct_document(node)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 121, in construct_document
for _dummy in generator:
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 714, in construct_yaml_map
value = self.construct_mapping(node)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 435, in construct_mapping
return BaseConstructor.construct_mapping(self, node, deep=deep)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 253, in construct_mapping
if self.check_mapping_key(node, key_node, mapping, key, value):
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 284, in check_mapping_key
raise DuplicateKeyError(*args)
ruamel.yaml.constructor.DuplicateKeyError: while constructing a mapping
in "<unicode string>", line 4, column 1
found duplicate key "properties" with value "{}" (original value: "{}")
in "<unicode string>", line 22, column 1
To suppress this check see:
http://yaml.readthedocs.io/en/latest/api.html#duplicate-keys
Duplicate keys will become an error in future releases, and are errors by default when using the new API.
make[1]: *** Deleting file 'Documentation/devicetree/bindings/processed-schema-examples.json' Traceback (most recent call last):
File "/usr/local/bin/dt-mk-schema", line 38, in <module>
schemas = dtschema.process_schemas(args.schemas, core_schema=(not args.useronly))
File "/usr/local/lib/python3.8/dist-packages/dtschema/lib.py", line 587, in process_schemas
sch = process_schema(os.path.abspath(filename))
File "/usr/local/lib/python3.8/dist-packages/dtschema/lib.py", line 561, in process_schema
schema = load_schema(filename)
File "/usr/local/lib/python3.8/dist-packages/dtschema/lib.py", line 126, in load_schema
return do_load(os.path.join(schema_basedir, schema))
File "/usr/local/lib/python3.8/dist-packages/dtschema/lib.py", line 112, in do_load
return yaml.load(tmp)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/main.py", line 421, in load
return constructor.get_single_data()
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 111, in get_single_data
return self.construct_document(node)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 121, in construct_document
for _dummy in generator:
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 714, in construct_yaml_map
value = self.construct_mapping(node)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 435, in construct_mapping
return BaseConstructor.construct_mapping(self, node, deep=deep)
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 253, in construct_mapping
if self.check_mapping_key(node, key_node, mapping, key, value):
File "/usr/local/lib/python3.8/dist-packages/ruamel/yaml/constructor.py", line 284, in check_mapping_key
raise DuplicateKeyError(*args)
ruamel.yaml.constructor.DuplicateKeyError: while constructing a mapping
in "<unicode string>", line 4, column 1
found duplicate key "properties" with value "{}" (original value: "{}")
in "<unicode string>", line 22, column 1
To suppress this check see:
http://yaml.readthedocs.io/en/latest/api.html#duplicate-keys
Duplicate keys will become an error in future releases, and are errors by default when using the new API.
make[1]: *** [Documentation/devicetree/bindings/Makefile:62: Documentation/devicetree/bindings/processed-schema-examples.json] Error 1
make: *** [Makefile:1416: dt_binding_check] Error 2
See https://patchwork.ozlabs.org/patch/1478165
This check can fail if there are any dependencies. The base for a patch series is generally the most recent rc1.
If you already ran 'make dt_binding_check' and didn't see the above error(s), then make sure 'yamllint' is installed and dt-schema is up to date:
pip3 install dtschema --upgrade
Please check and re-submit.
PATCH 3/3 clk: qcom: Add camera clock controller driver for SM8250
In reply to Jonathan MarekAdd support for the camera clock controller found on SM8250.
Based on the downstream driver.
--- drivers/clk/qcom/Kconfig | 7 + drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/camcc-sm8250.c | 2456 +++++++++++++++++++++++++++++++ 3 files changed, 2464 insertions(+) create mode 100644 drivers/clk/qcom/camcc-sm8250.c
drivers/clk/qcom/Kconfig +7 -0
@@ -483,6 +483,13 @@ config SDX_GCC_55 Say Y if you want to use peripheral devices such as UART, SPI, I2C, USB, SD/UFS, PCIe etc. +config SM_CAMCC_8250 + tristate "SM8250 Camera Clock Controller" + select SM_GCC_8250 + help + Support for the camera clock controller on SM8250 devices. + Say Y if you want to support camera devices and camera functionality. + config SM_DISPCC_8250 tristate "SM8150 and SM8250 Display Clock Controller" depends on SM_GCC_8150 || SM_GCC_8250
drivers/clk/qcom/Makefile +1 -0
@@ -73,6 +73,7 @@ obj-$(CONFIG_SDM_GPUCC_845) += gpucc-sdm845.o obj-$(CONFIG_SDM_LPASSCC_845) += lpasscc-sdm845.o obj-$(CONFIG_SDM_VIDEOCC_845) += videocc-sdm845.o obj-$(CONFIG_SDX_GCC_55) += gcc-sdx55.o +obj-$(CONFIG_SM_CAMCC_8250) += camcc-sm8250.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
drivers/clk/qcom/camcc-sm8250.c new file +2456 -0
2,456 lines not on this page · raw message
Signature · 1 line
2.26.1
drivers/clk/qcom/camcc-sm8250.c line 122
Quoted 6 lines · Jonathan Marek
drivers/clk/qcom/camcc-sm8250.c new file +6
-0+static const struct alpha_pll_config cam_cc_pll1_config = { + .l =0x1F , + .alpha =0x4000 , + .config_ctl_val =0x20485699 , + .config_ctl_hi_val =0x00002261 , + .config_ctl_hi1_val =0x329A699C ,
lower hexes here and few other places as well
drivers/clk/qcom/camcc-sm8250.c line 170
Quoted 4 lines
drivers/clk/qcom/camcc-sm8250.c new file +4
-0+ +static const struct alpha_pll_config cam_cc_pll2_config = { + .l =0x4B , +//.cal_l = 0x4B,
debug artifact?
Signature · 1 line
~Vinod
Hey Jonathan,
Quoted 4 lines
drivers/clk/qcom/camcc-sm8250.c new file +4
-0+static int cam_cc_sm8250_probe (struct platform_device *pdev) +{ +struct regmap *regmap; +
drivers/clk/qcom/camcc-sm8250.c line 2432
Quoted 10 lines
drivers/clk/qcom/camcc-sm8250.c new file +10
-0+ regmap =qcom_cc_map (pdev, &cam_cc_sm8250_desc); +if (IS_ERR (regmap)) +return PTR_ERR (regmap); + +clk_lucid_pll_configure (&cam_cc_pll0, regmap, &cam_cc_pll0_config); +clk_lucid_pll_configure (&cam_cc_pll1, regmap, &cam_cc_pll1_config); +clk_lucid_pll_configure (&cam_cc_pll3, regmap, &cam_cc_pll3_config); +clk_lucid_pll_configure (&cam_cc_pll4, regmap, &cam_cc_pll4_config); + +return qcom_cc_really_probe (pdev, &cam_cc_sm8250_desc, regmap);;
Remove a semicolon.
drivers/clk/qcom/camcc-sm8250.c line 2438
Quoted 6 lines
drivers/clk/qcom/camcc-sm8250.c new file +6
-0+} + +static struct platform_driver cam_cc_sm8250_driver = { + .probe = cam_cc_sm8250_probe, + .driver = { + .name ="cam_cc-sm8250" ,
Maybe conforming with the naming scheme of "sdm845-camcc" is the better way to go.
Quoted 21 lines
drivers/clk/qcom/camcc-sm8250.c new file +18
-1+ .of_match_table = cam_cc_sm8250_match_table, + }, +}; + +static int __init cam_cc_sm8250_init (void ) +{ +return platform_driver_register (&cam_cc_sm8250_driver); +} +subsys_initcall (cam_cc_sm8250_init); + +static void __exit cam_cc_sm8250_exit(void) +{ +platform_driver_unregister (&cam_cc_sm8250_driver); +} +module_exit (cam_cc_sm8250_exit); + +MODULE_DESCRIPTION ("QTI CAMCC SM8250 Driver" ); +MODULE_LICENSE ("GPL v2" ); --2.26.1
Quoted 20 lines · Robert Foss
Hey Jonathan,
Quoted 4 lines
drivers/clk/qcom/camcc-sm8250.c new file +4
-0+static int cam_cc_sm8250_probe (struct platform_device *pdev) +{ +struct regmap *regmap; +drivers/clk/qcom/camcc-sm8250.c line 2432
Quoted 10 lines
drivers/clk/qcom/camcc-sm8250.c new file +10
-0+ regmap =qcom_cc_map (pdev, &cam_cc_sm8250_desc); +if (IS_ERR (regmap)) +return PTR_ERR (regmap); + +clk_lucid_pll_configure (&cam_cc_pll0, regmap, &cam_cc_pll0_config); +clk_lucid_pll_configure (&cam_cc_pll1, regmap, &cam_cc_pll1_config); +clk_lucid_pll_configure (&cam_cc_pll3, regmap, &cam_cc_pll3_config); +clk_lucid_pll_configure (&cam_cc_pll4, regmap, &cam_cc_pll4_config); + +return qcom_cc_really_probe (pdev, &cam_cc_sm8250_desc, regmap);;Remove a semicolon.
Quoted 10 lines
drivers/clk/qcom/camcc-sm8250.c line 2438
Quoted 6 lines
drivers/clk/qcom/camcc-sm8250.c new file +6
-0+} + +static struct platform_driver cam_cc_sm8250_driver = { + .probe = cam_cc_sm8250_probe, + .driver = { + .name ="cam_cc-sm8250" ,Maybe conforming with the naming scheme of "sdm845-camcc" is the better way to go.
On the other hand there is cam_cc-sc7180. But it doesn't matter either way, I will change it.
Quoted 21 lines
Quoted 21 lines
drivers/clk/qcom/camcc-sm8250.c new file +18
-1+ .of_match_table = cam_cc_sm8250_match_table, + }, +}; + +static int __init cam_cc_sm8250_init (void ) +{ +return platform_driver_register (&cam_cc_sm8250_driver); +} +subsys_initcall (cam_cc_sm8250_init); + +static void __exit cam_cc_sm8250_exit(void) +{ +platform_driver_unregister (&cam_cc_sm8250_driver); +} +module_exit (cam_cc_sm8250_exit); + +MODULE_DESCRIPTION ("QTI CAMCC SM8250 Driver" ); +MODULE_LICENSE ("GPL v2" ); --2.26.1
Robert Foss
Reviewed-byQuoted 12 lines
Quoted 11 lines
drivers/clk/qcom/camcc-sm8250.c line 2438
Quoted 7 lines
drivers/clk/qcom/camcc-sm8250.c new file +6
-0+} + +static struct platform_driver cam_cc_sm8250_driver = { + .probe = cam_cc_sm8250_probe, + .driver = { + .name ="cam_cc-sm8250" ,Maybe conforming with the naming scheme of "sdm845-camcc" is the better way to go.
Quoted 3 lines
On the other hand there is cam_cc-sc7180. But it doesn't matter either way, I will change it.
Ah, I only looked at sdm845 for prior art. Either is fine then.
With this fixed & Vinods feedback, feel free to add my r-b.