clk: qcom: clk-rpmh: Add QCOM RPMh clock driver
v6 cover clk: qcom: clk-rpmh: Add QCOM RPMh clock driver
[v6]
* Addressed comments from Rob
* Addressed comments from Stephen
[v5]
* Addressed comments from Stephen
* Introduced a new DT property to take clock divs
[v4]
* Addressed comments from Stephen
[v3]
* Addressed documentation & code review comments from Bjorn
* Addressed bindings comments from Rob
* Updated the patch series order for bindings
[v2]
* Addressed comments from Stephen
* Addressed comments from Evan
This patch series adds a driver and device tree documentation binding for the clock control via Resource Power Manager-hardened (RPMh) on some Qualcomm Technologies, Inc, SoCs such as SDM845. The clock RPMh driver would send requests for the RPMh managed clock resources.
The RPMh clock driver depends upon the RPMh driver [1] and command DB driver [2] which are both still undergoing review.
Thanks,
Taniya
[1]: https://lkml.org/lkml/2018/3/9/979
[2]: https://lkml.org/lkml/2018/3/14/787
Taniya Das (2):
dt-bindings: clock: Introduce QCOM RPMh clock bindings
clk: qcom: clk-rpmh: Add QCOM RPMh clock driver
.../devicetree/bindings/clock/qcom,rpmh-clk.txt | 53 +++ drivers/clk/qcom/Kconfig | 9 + drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/clk-rpmh.c | 368 +++++++++++++++++++++ include/dt-bindings/clock/qcom,rpmh.h | 22 ++ 5 files changed, 453 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,rpmh-clk.txt create mode 100644 drivers/clk/qcom/clk-rpmh.c create mode 100644 include/dt-bindings/clock/qcom,rpmh.h
--
Qualcomm INDIA, on behalf of Qualcomm Innovation Center, Inc.is a member of the Code Aurora Forum, hosted by the Linux Foundation.
PATCH v6 1/2 dt-bindings: clock: Introduce QCOM RPMh clock bindings
Add RPMh clock device bindings for Qualcomm Technology Inc's SoCs. These devices would be used for communicating resource state requests to control the clocks managed by RPMh.
--- .../devicetree/bindings/clock/qcom,rpmh-clk.txt | 46 ++++++++++++++++++++++ include/dt-bindings/clock/qcom,rpmh.h | 22 +++++++++++ 2 files changed, 68 insertions(+) create mode 100644 Documentation/devicetree/bindings/clock/qcom,rpmh-clk.txt create mode 100644 include/dt-bindings/clock/qcom,rpmh.h
Documentation/devicetree/bindings/clock/qcom,rpmh-clk.txt new file +46 -0
@@ -0,0 +1,46 @@ +Qualcomm Technologies, Inc. RPMh Clocks +------------------------------------------------------- + +Resource Power Manager Hardened (RPMh) manages shared resources on +some Qualcomm Technologies Inc. SoCs. It accepts clock requests from +other hardware subsystems via RSC to control clocks. + +Required properties : +- compatible : shall contain "qcom,sdm845-rpmh-clk" + +- #clock-cells : must contain 1 + +Optional properties : + +These below properities would be required in the cases where the parent of the +clocks would be "xo_board_div". The default parent for the clock is "xo_board". + +- assigned-clocks: from the common clock binding; + should be: clock specifier for each output clock of this + provider node + +- assigned-clock-parents: from the common clock binding; + should be: phandle of input clock listed in clocks + property +Example : + +#include <dt-bindings/clock/qcom,rpmh.h> + + &apps_rsc { + rpmhcc: clock-controller { + compatible = "qcom,sdm845-rpmh-clk"; + #clock-cells = <1>; + assigned-clocks = <&clock_rpmh RPMH_CXO_CLK>, + <&clock_rpmh RPMH_CXO_CLK_A>, + <&clock_rpmh RPMH_LN_BB_CLK2>, + <&clock_rpmh RPMH_LN_BB_CLK2_A>, + <&clock_rpmh RPMH_LN_BB_CLK3>, + <&clock_rpmh RPMH_LN_BB_CLK3_A>; + assigned-clock-parents = <&xo_board_div>, + <&xo_board_div>, + <&xo_board_div>, + <&xo_board_div>, + <&xo_board_div>, + <&xo_board_div>, + }; + };
include/dt-bindings/clock/qcom,rpmh.h new file +22 -0
@@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (c) 2018, The Linux Foundation. All rights reserved. */ + + +#ifndef _DT_BINDINGS_CLK_MSM_RPMH_H +#define _DT_BINDINGS_CLK_MSM_RPMH_H + +/* RPMh controlled clocks */ +#define RPMH_CXO_CLK 0 +#define RPMH_CXO_CLK_A 1 +#define RPMH_LN_BB_CLK2 2 +#define RPMH_LN_BB_CLK2_A 3 +#define RPMH_LN_BB_CLK3 4 +#define RPMH_LN_BB_CLK3_A 5 +#define RPMH_RF_CLK1 6 +#define RPMH_RF_CLK1_A 7 +#define RPMH_RF_CLK2 8 +#define RPMH_RF_CLK2_A 9 +#define RPMH_RF_CLK3 10 +#define RPMH_RF_CLK3_A 11 + +#endif
--
Qualcomm INDIA, on behalf of Qualcomm Innovation Center, Inc.is a member of the Code Aurora Forum, hosted by the Linux Foundation.
Stephen Boyd
maintainerRe: [PATCH 1/2] dt-bindings: clock: Introduce QCOM RPMh clock bindings
Quoting Taniya Das (2018-05-02 03:51:16)
Quoted 6 lines
Add RPMh clock device bindings for Qualcomm Technology Inc's SoCs. These devices would be used for communicating resource state requests to control the clocks managed by RPMh.
Signed-off-by Taniya Das <[email protected]>Reviewed-by Rob Herring <[email protected]>
When you change things you shouldn't keep around reviewed-by tags if it significantly changes..
Quoted 10 lines
Documentation/devicetree/bindings/clock/qcom,rpmh-clk.txt new file +10
-0+Example : + +#include <dt-bindings/clock/qcom,rpmh.h> + + &apps_rsc { + rpmhcc: clock-controller { + compatible = "qcom,sdm845-rpmh-clk"; + #clock-cells = <1>; + assigned-clocks = <&clock_rpmh RPMH_CXO_CLK>, + <&clock_rpmh RPMH_CXO_CLK_A>,
Documentation/devicetree/bindings/clock/qcom,rpmh-clk.txt line 44
Quoted 10 lines
Documentation/devicetree/bindings/clock/qcom,rpmh-clk.txt new file +10
-0+ <&clock_rpmh RPMH_LN_BB_CLK2>, + <&clock_rpmh RPMH_LN_BB_CLK2_A>, + <&clock_rpmh RPMH_LN_BB_CLK3>, + <&clock_rpmh RPMH_LN_BB_CLK3_A>; + assigned-clock-parents = <&xo_board_div>, + <&xo_board_div>, + <&xo_board_div>, + <&xo_board_div>, + <&xo_board_div>, + <&xo_board_div>,
There's only one parent, so assigned-clock-parents doesn't really make sense. If anything, we would have 'clocks = ' here and specify the xo board clk and the div 2 clk that live in DT. But I already merged this binding, two patchsets ago. Please look in clk-next.
include/dt-bindings/clock/qcom,rpmh.h line 21
Quoted 6 lines
include/dt-bindings/clock/qcom,rpmh.h new file +6
-0+ }; +#define RPMH_RF_CLK2 8 +#define RPMH_RF_CLK2_A 9 +#define RPMH_RF_CLK3 10 +#define RPMH_RF_CLK3_A 11 +
Ok. I dropped CLK4* from the previous patch you sent and dropped Amit's signed-off-by.
PATCH v6 2/2 clk: qcom: clk-rpmh: Add QCOM RPMh clock driver
In reply to Taniya DasAdd the RPMh clock driver to control the RPMh managed clock resources on some of the Qualcomm Technologies, Inc. SoCs.
--- drivers/clk/qcom/Kconfig | 9 ++ drivers/clk/qcom/Makefile | 1 + drivers/clk/qcom/clk-rpmh.c | 366 ++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 376 insertions(+) create mode 100644 drivers/clk/qcom/clk-rpmh.c
drivers/clk/qcom/Kconfig +9 -0
@@ -59,6 +59,15 @@ config QCOM_CLK_SMD_RPM Say Y if you want to support the clocks exposed by the RPM on platforms such as apq8016, apq8084, msm8974 etc. +config QCOM_CLK_RPMH + tristate "RPMh Clock Driver" + depends on COMMON_CLK_QCOM && QCOM_RPMH + help + RPMh manages shared resources on some Qualcomm Technologies, Inc. + SoCs. It accepts requests from other hardware subsystems via RSC. + Say Y if you want to support the clocks exposed by RPMh on + platforms such as SDM845. + config APQ_GCC_8084 tristate "APQ8084 Global Clock Controller" select QCOM_GDSC
drivers/clk/qcom/Makefile +1 -0
@@ -37,5 +37,6 @@ obj-$(CONFIG_MSM_MMCC_8996) += mmcc-msm8996.o obj-$(CONFIG_QCOM_A53PLL) += a53-pll.o obj-$(CONFIG_QCOM_CLK_APCS_MSM8916) += apcs-msm8916.o obj-$(CONFIG_QCOM_CLK_RPM) += clk-rpm.o +obj-$(CONFIG_QCOM_CLK_RPMH) += clk-rpmh.o obj-$(CONFIG_QCOM_CLK_SMD_RPM) += clk-smd-rpm.o obj-$(CONFIG_SPMI_PMIC_CLKDIV) += clk-spmi-pmic-div.o
drivers/clk/qcom/clk-rpmh.c new file +366 -0
366 lines not on this page · raw message
--
Qualcomm INDIA, on behalf of Qualcomm Innovation Center, Inc.is a member of the Code Aurora Forum, hosted by the Linux Foundation.
Stephen Boyd
maintainerQuoting Taniya Das (2018-05-02 03:51:17)
Quoted 9 lines
drivers/clk/qcom/clk-rpmh.c new file +9
-0+ +static DEFINE_MUTEX (rpmh_clk_lock); + +#define __DEFINE_CLK_RPMH (_platform, _name, _name_active, _res_name, \ + _res_en_offset, _res_on) \ + static struct clk_rpmh _platform##_##_name_active; \ + static struct clk_rpmh _platform##_##_name = { \ + .res_name = _res_name, \ + .res_addr = _res_en_offset, \
drivers/clk/qcom/clk-rpmh.c line 73
Quoted 10 lines
drivers/clk/qcom/clk-rpmh.c new file +10
-0+ .res_on_val = _res_on, \ + .peer = &_platform##_##_name_active, \ + .valid_state_mask = (BIT (RPMH_WAKE_ONLY_STATE ) | \ +BIT (RPMH_ACTIVE_ONLY_STATE ) | \ + BIT(RPMH_SLEEP_STATE)), \ + .hw.init = &(struct clk_init_data ){ \ + .ops = &clk_rpmh_ops, \ + .name = #_name, \ + .parent_names = (const char *[]){"xo_board" , \ +"xo_board_div" }, \
The rpmh clks that do a div 2 can have a recalc_rate function that returns the xo_board clk rate divided by 2 all the time. That may be easier to do. Keep xo_board as parent, but then specify if it does div-2 or div-1 in the SoC specific listing. Then DT can only show 38.4 MHz. The div 2 part is inside the SoC anyway so this seems more accurate too.
Quoted 3 lines
drivers/clk/qcom/clk-rpmh.c new file +3
-0+ .num_parents = 2, \ + }, \ + }; \
Stephen Boyd
maintainerQuoting Taniya Das (2018-05-02 03:51:17)
drivers/clk/qcom/clk-rpmh.c line 310
Quoted 12 lines
drivers/clk/qcom/clk-rpmh.c new file +12
-0+ ret =devm_clk_hw_register (&pdev->dev, hw_clks[i]); +if (ret) { +dev_err (&pdev->dev,"failed to register %s\n" , + hw_clks[i]->init->name); + goto err; + } + + rpmh_clk->dev = &pdev->dev; + } + + ret =devm_of_clk_add_hw_provider (&pdev->dev, of_clk_rpmh_hw_get, + (void *) desc);
Drop the void cast.
Quoted 16 lines
drivers/clk/qcom/clk-rpmh.c new file +16
-0+if (ret) { +dev_err (&pdev->dev,"Failed to add clock provider\n" ); + goto err; + } + +dev_dbg (&pdev->dev,"Registered RPMh clocks\n" ); + +return 0 ; +err: +if (rpmh_client) +rpmh_release (rpmh_client); + +return ret; +} + +static int clk_rpmh_remove (struct platform_device *pdev)
drivers/clk/qcom/clk-rpmh.c line 336
Quoted 10 lines
drivers/clk/qcom/clk-rpmh.c new file +10
-0+{ +const struct clk_rpmh_desc *desc = +of_device_get_match_data (&pdev->dev); +struct clk_hw **hw_clks = desc->clks; +struct clk_rpmh *rpmh_clk =to_clk_rpmh (hw_clks[0 ]); + +rpmh_release (rpmh_clk->rpmh_client); + +return 0 ; +}
I'll review Lina's series again. Still hoping to drop the client thing.
Hello Stephen,
Thanks for review.
Quoted 16 lines · Stephen Boyd
Quoting Taniya Das (2018-05-02 03:51:17)
drivers/clk/qcom/clk-rpmh.c line 310
Quoted 12 lines
drivers/clk/qcom/clk-rpmh.c new file +12
-0+ ret =devm_clk_hw_register (&pdev->dev, hw_clks[i]); +if (ret) { +dev_err (&pdev->dev,"failed to register %s\n" , + hw_clks[i]->init->name); + goto err; + } + + rpmh_clk->dev = &pdev->dev; + } + + ret =devm_of_clk_add_hw_provider (&pdev->dev, of_clk_rpmh_hw_get, + (void *) desc);Drop the void cast.
I see a compiler warning, that is the reason to keep the void cast. /include/linux/clk-provider.h:881:5: note: expected ‘void *’ but argument is of type ‘const struct clk_rpmh_desc *’
Quoted 29 lines
Quoted 16 lines
drivers/clk/qcom/clk-rpmh.c new file +16
-0+if (ret) { +dev_err (&pdev->dev,"Failed to add clock provider\n" ); + goto err; + } + +dev_dbg (&pdev->dev,"Registered RPMh clocks\n" ); + +return 0 ; +err: +if (rpmh_client) +rpmh_release (rpmh_client); + +return ret; +} + +static int clk_rpmh_remove (struct platform_device *pdev)drivers/clk/qcom/clk-rpmh.c line 336
Quoted 10 lines
drivers/clk/qcom/clk-rpmh.c new file +10
-0+{ +const struct clk_rpmh_desc *desc = +of_device_get_match_data (&pdev->dev); +struct clk_hw **hw_clks = desc->clks; +struct clk_rpmh *rpmh_clk =to_clk_rpmh (hw_clks[0 ]); + +rpmh_release (rpmh_clk->rpmh_client); + +return 0 ; +}I'll review Lina's series again. Still hoping to drop the client thing.
Signature · 4 lines
QUALCOMM INDIA, on behalf of Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, hosted by The Linux Foundation. --
Stephen Boyd
maintainerQuoting Taniya Das (2018-05-03 03:33:10)
Quoted 22 lines
Hello Stephen,
Thanks for review.
Quoted 16 lines · Stephen Boyd
Quoting Taniya Das (2018-05-02 03:51:17)
drivers/clk/qcom/clk-rpmh.c line 310
Quoted 12 lines
drivers/clk/qcom/clk-rpmh.c new file +12
-0+ ret =devm_clk_hw_register (&pdev->dev, hw_clks[i]); +if (ret) { +dev_err (&pdev->dev,"failed to register %s\n" , + hw_clks[i]->init->name); + goto err; + } + + rpmh_clk->dev = &pdev->dev; + } + + ret =devm_of_clk_add_hw_provider (&pdev->dev, of_clk_rpmh_hw_get, + (void *) desc);Drop the void cast.
Quoted 3 lines
I see a compiler warning, that is the reason to keep the void cast. /include/linux/clk-provider.h:881:5: note: expected ‘void *’ but argument is of type ‘const struct
clk_rpmh_desc*’
Ok. Casting away const is not good though. Can you pass a pointer to the hw_clks array instead?
Stephen Boyd
maintainerQuoting Taniya Das (2018-05-02 03:51:15)
Quoted 3 lines
[v6]
* Addressed comments from Rob
* Addressed comments from Stephen
Please actually describe what you addressed. Nobody wants to look back at the old emails to figure out what comments you addressed.