clk: scmi: Port driver to the new scmi_clk_proto_ops interface
[linux-2.6-microblaze.git] / drivers / clk / clk-scmi.c
index c754dfb..1e357d3 100644 (file)
@@ -2,7 +2,7 @@
 /*
  * System Control and Power Interface (SCMI) Protocol based clock driver
  *
- * Copyright (C) 2018 ARM Ltd.
+ * Copyright (C) 2018-2021 ARM Ltd.
  */
 
 #include <linux/clk-provider.h>
 #include <linux/scmi_protocol.h>
 #include <asm/div64.h>
 
+static const struct scmi_clk_proto_ops *scmi_proto_clk_ops;
+
 struct scmi_clk {
        u32 id;
        struct clk_hw hw;
        const struct scmi_clock_info *info;
-       const struct scmi_handle *handle;
+       const struct scmi_protocol_handle *ph;
 };
 
 #define to_scmi_clk(clk) container_of(clk, struct scmi_clk, hw)
@@ -29,7 +31,7 @@ static unsigned long scmi_clk_recalc_rate(struct clk_hw *hw,
        u64 rate;
        struct scmi_clk *clk = to_scmi_clk(hw);
 
-       ret = clk->handle->clk_ops->rate_get(clk->handle, clk->id, &rate);
+       ret = scmi_proto_clk_ops->rate_get(clk->ph, clk->id, &rate);
        if (ret)
                return 0;
        return rate;
@@ -69,21 +71,21 @@ static int scmi_clk_set_rate(struct clk_hw *hw, unsigned long rate,
 {
        struct scmi_clk *clk = to_scmi_clk(hw);
 
-       return clk->handle->clk_ops->rate_set(clk->handle, clk->id, rate);
+       return scmi_proto_clk_ops->rate_set(clk->ph, clk->id, rate);
 }
 
 static int scmi_clk_enable(struct clk_hw *hw)
 {
        struct scmi_clk *clk = to_scmi_clk(hw);
 
-       return clk->handle->clk_ops->enable(clk->handle, clk->id);
+       return scmi_proto_clk_ops->enable(clk->ph, clk->id);
 }
 
 static void scmi_clk_disable(struct clk_hw *hw)
 {
        struct scmi_clk *clk = to_scmi_clk(hw);
 
-       clk->handle->clk_ops->disable(clk->handle, clk->id);
+       scmi_proto_clk_ops->disable(clk->ph, clk->id);
 }
 
 static const struct clk_ops scmi_clk_ops = {
@@ -142,11 +144,17 @@ static int scmi_clocks_probe(struct scmi_device *sdev)
        struct device *dev = &sdev->dev;
        struct device_node *np = dev->of_node;
        const struct scmi_handle *handle = sdev->handle;
+       struct scmi_protocol_handle *ph;
 
-       if (!handle || !handle->clk_ops)
+       if (!handle)
                return -ENODEV;
 
-       count = handle->clk_ops->count_get(handle);
+       scmi_proto_clk_ops =
+               handle->devm_protocol_get(sdev, SCMI_PROTOCOL_CLOCK, &ph);
+       if (IS_ERR(scmi_proto_clk_ops))
+               return PTR_ERR(scmi_proto_clk_ops);
+
+       count = scmi_proto_clk_ops->count_get(ph);
        if (count < 0) {
                dev_err(dev, "%pOFn: invalid clock output count\n", np);
                return -EINVAL;
@@ -167,14 +175,14 @@ static int scmi_clocks_probe(struct scmi_device *sdev)
                if (!sclk)
                        return -ENOMEM;
 
-               sclk->info = handle->clk_ops->info_get(handle, idx);
+               sclk->info = scmi_proto_clk_ops->info_get(ph, idx);
                if (!sclk->info) {
                        dev_dbg(dev, "invalid clock info for idx %d\n", idx);
                        continue;
                }
 
                sclk->id = idx;
-               sclk->handle = handle;
+               sclk->ph = ph;
 
                err = scmi_clk_ops_init(dev, sclk);
                if (err) {