Merge branch 'clk-protected-binding' into clk-fixes
* clk-protected-binding: clk: qcom: Support 'protected-clocks' property dt-bindings: clk: Introduce 'protected-clocks' propertyhifive-unleashed-5.1
commit
149964e2d6
|
@ -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>;
|
||||||
|
};
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue