Эх сурвалжийг харах

Merge branch 'clk-protected-binding' into clk-fixes

* clk-protected-binding:
  clk: qcom: Support 'protected-clocks' property
  dt-bindings: clk: Introduce 'protected-clocks' property
Stephen Boyd 6 жил өмнө
parent
commit
149964e2d6

+ 16 - 0
Documentation/devicetree/bindings/clock/clock-bindings.txt

@@ -168,3 +168,19 @@ a shared clock is forbidden.
 
 
 Configuration of common clocks, which affect multiple consumer devices can
 Configuration of common clocks, which affect multiple consumer devices can
 be similarly specified in the clock provider node.
 be similarly specified in the clock provider node.
+
+==Protected clocks==
+
+Some platforms or firmwares may not fully expose all the clocks to the OS, such
+as in situations where those clks are used by drivers running in ARM secure
+execution levels. Such a configuration can be specified in device tree with the
+protected-clocks property in the form of a clock specifier list. This property should
+only be specified in the node that is providing the clocks being protected:
+
+   clock-controller@a000f000 {
+        compatible = "vendor,clk95;
+        reg = <0xa000f000 0x1000>
+        #clocks-cells = <1>;
+        ...
+        protected-clocks = <UART3_CLK>, <SPI5_CLK>;
+   };

+ 18 - 0
drivers/clk/qcom/common.c

@@ -191,6 +191,22 @@ int qcom_cc_register_sleep_clk(struct device *dev)
 }
 }
 EXPORT_SYMBOL_GPL(qcom_cc_register_sleep_clk);
 EXPORT_SYMBOL_GPL(qcom_cc_register_sleep_clk);
 
 
+/* Drop 'protected-clocks' from the list of clocks to register */
+static void qcom_cc_drop_protected(struct device *dev, struct qcom_cc *cc)
+{
+	struct device_node *np = dev->of_node;
+	struct property *prop;
+	const __be32 *p;
+	u32 i;
+
+	of_property_for_each_u32(np, "protected-clocks", prop, p, i) {
+		if (i >= cc->num_rclks)
+			continue;
+
+		cc->rclks[i] = NULL;
+	}
+}
+
 static struct clk_hw *qcom_cc_clk_hw_get(struct of_phandle_args *clkspec,
 static struct clk_hw *qcom_cc_clk_hw_get(struct of_phandle_args *clkspec,
 					 void *data)
 					 void *data)
 {
 {
@@ -251,6 +267,8 @@ int qcom_cc_really_probe(struct platform_device *pdev,
 	cc->rclks = rclks;
 	cc->rclks = rclks;
 	cc->num_rclks = num_clks;
 	cc->num_rclks = num_clks;
 
 
+	qcom_cc_drop_protected(dev, cc);
+
 	for (i = 0; i < num_clks; i++) {
 	for (i = 0; i < num_clks; i++) {
 		if (!rclks[i])
 		if (!rclks[i])
 			continue;
 			continue;