aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firmware/arm_scmi/clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/firmware/arm_scmi/clock.c')
-rw-r--r--drivers/firmware/arm_scmi/clock.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/drivers/firmware/arm_scmi/clock.c b/drivers/firmware/arm_scmi/clock.c
index 4c2227662b26..da04833aaca5 100644
--- a/drivers/firmware/arm_scmi/clock.c
+++ b/drivers/firmware/arm_scmi/clock.c
@@ -194,6 +194,22 @@ err:
return ret;
}
+static int scmi_clock_available_rates(const struct scmi_handle *handle,
+ u32 clk_id, u64 *rates)
+{
+ struct clock_info *cinfo = handle->clk_priv;
+ struct scmi_clock_info *clk = cinfo->clk + clk_id;
+
+ if (!rates)
+ return -EINVAL;
+
+ /* Copy all the rates into user specified buffer */
+ memcpy(rates, &clk->list.rates[0],
+ clk->list.num_rates * sizeof(rates));
+
+ return clk->list.num_rates;
+}
+
static int
scmi_clock_rate_get(const struct scmi_handle *handle, u32 clk_id, u64 *value)
{
@@ -309,6 +325,7 @@ static struct scmi_clk_ops clk_ops = {
.rate_set = scmi_clock_rate_set,
.enable = scmi_clock_enable,
.disable = scmi_clock_disable,
+ .available_rates = scmi_clock_available_rates,
};
static int scmi_clock_protocol_init(struct scmi_handle *handle)