Skip to content

Commit

Permalink
clk: scmi: Add support for .is_enabled clk_ops
Browse files Browse the repository at this point in the history
Add support for .is_enabled atomic clk_ops using the related SCMI clock
operation in atomic mode, if available.

Note that the .is_enabled callback will be supported by this SCMI clock
driver only if the configured underlying SCMI transport does support atomic
operations.

CC: Michael Turquette <[email protected]>
CC: Stephen Boyd <[email protected]>
CC: [email protected]
Signed-off-by: Cristian Marussi <[email protected]>
Acked-by: Stephen Boyd <[email protected]>
Link: https://lore.kernel.org/r/[email protected]
Signed-off-by: Sudeep Holla <[email protected]>
  • Loading branch information
freefall75 authored and sudeep-holla committed Sep 20, 2023
1 parent 5b8a8ca commit 1b39ff5
Showing 1 changed file with 20 additions and 3 deletions.
23 changes: 20 additions & 3 deletions drivers/clk/clk-scmi.c
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ static const struct scmi_clk_proto_ops *scmi_proto_clk_ops;

struct scmi_clk {
u32 id;
struct device *dev;
struct clk_hw hw;
const struct scmi_clock_info *info;
const struct scmi_protocol_handle *ph;
Expand Down Expand Up @@ -105,10 +106,24 @@ static void scmi_clk_atomic_disable(struct clk_hw *hw)
scmi_proto_clk_ops->disable(clk->ph, clk->id, ATOMIC);
}

static int scmi_clk_atomic_is_enabled(struct clk_hw *hw)
{
int ret;
bool enabled = false;
struct scmi_clk *clk = to_scmi_clk(hw);

ret = scmi_proto_clk_ops->state_get(clk->ph, clk->id, &enabled, ATOMIC);
if (ret)
dev_warn(clk->dev,
"Failed to get state for clock ID %d\n", clk->id);

return !!enabled;
}

/*
* We can provide enable/disable atomic callbacks only if the underlying SCMI
* transport for an SCMI instance is configured to handle SCMI commands in an
* atomic manner.
* We can provide enable/disable/is_enabled atomic callbacks only if the
* underlying SCMI transport for an SCMI instance is configured to handle
* SCMI commands in an atomic manner.
*
* When no SCMI atomic transport support is available we instead provide only
* the prepare/unprepare API, as allowed by the clock framework when atomic
Expand All @@ -132,6 +147,7 @@ static const struct clk_ops scmi_atomic_clk_ops = {
.set_rate = scmi_clk_set_rate,
.enable = scmi_clk_atomic_enable,
.disable = scmi_clk_atomic_disable,
.is_enabled = scmi_clk_atomic_is_enabled,
};

static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk,
Expand Down Expand Up @@ -221,6 +237,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev)

sclk->id = idx;
sclk->ph = ph;
sclk->dev = dev;

/*
* Note that when transport is atomic but SCMI protocol did not
Expand Down

0 comments on commit 1b39ff5

Please sign in to comment.