Skip to contentSkip to conversation

clk: qcom: clk-rpmh: Add QCOM RPMh clock driver

PATCH Superseded Taniya Das 2 participants 9 messages May 2, 2018 – May 3, 2018

Subsystems (4)

v6 of 9 Superseded Latest is v9 →

lore
Share & tools
lore

Taniya Das

author
#0 lore raw

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.

author
#1 lore raw

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
new file mode 100644
index 0000000..2632cae
@@ -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
new file mode 100644
index 0000000..f48fbd6
@@ -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.

maintainer
#2 lore raw

Re: [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.

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.

author
#3 lore raw

PATCH v6 2/2 clk: qcom: clk-rpmh: Add QCOM RPMh clock driver

In reply to Taniya Das

Add 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
index e42e1af..627e6e1 100644
@@ -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
index 7c09ab1..246a721 100644
@@ -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.

maintainer
#4 lore raw

Quoting 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,                               \
+               },                                                      \
+       };                                                              \
maintainer
#5 lore raw
In reply to Taniya Das

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 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.

author
#6 lore raw

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.

--
maintainer
#7 lore raw

Quoting 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?

maintainer
#8 lore raw
In reply to Taniya Das

Quoting 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.