clk: qcom: Add camera clock controller driver for SM8250
v2 cover clk: qcom: Add camera clock controller driver for SM8250
v2:
- zonda pll:
- Re-use clk_alpha_pll_postdiv_fabia_ops for postdiv ops
- Use clk_alpha_pll_write_config helper for configure function
- Remove dubious memory barriers that were copied from downstream
- Use pll_alpha_width() for ALPHA_VAL size (downstream uses 32 but it turns out the 16 returned by pll_alpha_width is the correct value)
- Use clk_trion_pll_recalc_rate for recalc_rate function
- Remove error checking on regmap functions (mmio can't fail)
- bindings: fix a copy-paste error
- camcc:
- lowercase hex, remove stray commented out line, fix double semicolon
- add missing call to clk_zonda_pll_configure for pll2
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 | 68 + drivers/clk/qcom/Kconfig | 7 + drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/camcc-sm8250.c | 2456 +++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.c | 174 ++ drivers/clk/qcom/clk-alpha-pll.h | 6 + include/dt-bindings/clock/qcom,camcc-sm8250.h | 138 + 7 files changed, 2850 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 v2 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 | 174 +++++++++++++++++++++++++++++++ drivers/clk/qcom/clk-alpha-pll.h | 6 ++ 2 files changed, 180 insertions(+)
drivers/clk/qcom/clk-alpha-pll.c +174 -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")
@@ -1777,3 +1798,156 @@ 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) +{ +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); + +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 ); + +/* Place the PLL in STANDBY mode */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_RESET_N ,PLL_RESET_N ); +} +EXPORT_SYMBOL_GPL (clk_zonda_pll_configure); + +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; + +regmap_read (regmap,PLL_MODE (pll), &val); + +/* 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. +*/ +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 ); + +regmap_read (regmap,PLL_TEST_CTL (pll), &val); + +/* 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 */ +regmap_update_bits (regmap,PLL_USER_CTL (pll),ZONDA_PLL_OUT_MASK ,ZONDA_PLL_OUT_MASK ); + +/* Enable the global PLL outputs */ +regmap_update_bits (regmap,PLL_MODE (pll),PLL_OUTCTRL ,PLL_OUTCTRL ); + +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; + +regmap_read (regmap,PLL_MODE (pll), &val); + +/* If in FSM mode, just unvote it */ +if (val &PLL_VOTE_FSM_ENA ) { +clk_disable_regmap (hw); +return ; + } + +/* Disable the global PLL output */ +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, alpha_width =pll_alpha_width (pll); +u64 a; +int ret; + + rrate =alpha_pll_round_rate (rate, prate, &l, &a, alpha_width); + + 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 */ +regmap_read (pll->clkr.regmap,PLL_TEST_CTL (pll), &test_ctl_val); + +/* 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 ; +} + +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_trion_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; +#define clk_alpha_pll_postdiv_zonda_ops clk_alpha_pll_postdiv_fabia_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 v2 1/3] clk: qcom: clk-alpha-pll: add support for zonda pll
Quoting Jonathan Marek (2021-06-08 19:20:46)
Quoted 4 lines
Ported over from the downstream driver. Will be used by SM8250 CAMCC.
Signed-off-by Jonathan Marek <[email protected]>---
Applied to clk-next
PATCH v2 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 | 68 +++++++++ include/dt-bindings/clock/qcom,camcc-sm8250.h | 138 ++++++++++++++++++ 2 files changed, 206 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 +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,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 + + 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
Re: [PATCH v2 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 | 68 +++++++++ include/dt-bindings/clock/qcom,camcc-sm8250.h | 138 ++++++++++++++++++ 2 files changed, 206 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,camcc-sm8250.yaml create mode 100644 include/dt-bindings/clock/qcom,camcc-sm8250.h
Re: [PATCH v2 2/3] dt-bindings: clock: add QCOM SM8250 camera clock bindings
In reply to Jonathan MarekQuoting Jonathan Marek (2021-06-08 19:20:47)
Quoted 5 lines
Add device tree bindings for camera clock controller for Qualcomm Technology Inc's SM8250 SoC.
Signed-off-by Jonathan Marek <[email protected]>---
Applied to clk-next
PATCH v2 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
kernel test robot
build botThank you for the patch! Perhaps something to improve:
Hi Jonathan,
Thank you for the patch! Perhaps something to improve:
[auto build test WARNING on clk/clk-next]
[also build test WARNING on v5.13-rc5 next-20210608]
[If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Jonathan-Marek/clk-qcom-Add-camera-clock-controller-driver-for-SM8250/20210609-102342 base: https://git.kernel.org/pub/scm/linux/kernel/git/clk/linux.git clk-next config: arc-allyesconfig (attached as .config) compiler: arceb-elf-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross
# https://github.com/0day-ci/linux/commit/f435ba39bf4e0649f46d9b6a00399000cc6d4170
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Jonathan-Marek/clk-qcom-Add-camera-clock-controller-driver-for-SM8250/20210609-102342 git checkout f435ba39bf4e0649f46d9b6a00399000cc6d4170
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arc
If you fix the issue, kindly add following tag as appropriate
All warnings (new ones prefixed by >>):
>> drivers/clk/qcom/camcc-sm8250.c:40:2: warning: this decimal constant is unsigned only in ISO C90
40 | { 595200000, 3600000000, 0 },
| ^vim +40 drivers/clk/qcom/camcc-sm8250.c
38
39 static struct pll_vco zonda_vco[] = {
> 40 { 595200000, 3600000000, 0 },
41 };
42 ---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
Quoting Jonathan Marek (2021-06-08 19:20:48)
Quoted 7 lines
Add support for the camera clock controller found on SM8250.
Based on the downstream driver.
Signed-off-by Jonathan Marek <[email protected]>Reviewed-by Robert Foss <[email protected]>---
Applied to clk-next