From: Cristian Marussi <cristian.marussi@arm.com> To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: sudeep.holla@arm.com, james.quinlan@broadcom.com, Jonathan.Cameron@Huawei.com, f.fainelli@gmail.com, etienne.carriere@linaro.org, vincent.guittot@linaro.org, souvik.chakravarty@arm.com, cristian.marussi@arm.com, Michael Turquette <mturquette@baylibre.com>, Stephen Boyd <sboyd@kernel.org>, linux-clk@vger.kernel.org Subject: [PATCH v7 16/16] clk: scmi: Support atomic clock enable/disable API Date: Mon, 29 Nov 2021 19:11:56 +0000 [thread overview] Message-ID: <20211129191156.29322-17-cristian.marussi@arm.com> (raw) In-Reply-To: <20211129191156.29322-1-cristian.marussi@arm.com> Support also atomic enable/disable clk_ops beside the bare non-atomic one (prepare/unprepare) when the underlying SCMI transport is configured to support atomic transactions for synchronous commands. Cc: Michael Turquette <mturquette@baylibre.com> Cc: Stephen Boyd <sboyd@kernel.org> Cc: linux-clk@vger.kernel.org Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> --- V5 --> V6 - add concurrent availability of atomic and non atomic reqs --- drivers/clk/clk-scmi.c | 56 +++++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/drivers/clk/clk-scmi.c b/drivers/clk/clk-scmi.c index 1e357d364ca2..50033d873dde 100644 --- a/drivers/clk/clk-scmi.c +++ b/drivers/clk/clk-scmi.c @@ -88,21 +88,53 @@ static void scmi_clk_disable(struct clk_hw *hw) scmi_proto_clk_ops->disable(clk->ph, clk->id); } +static int scmi_clk_atomic_enable(struct clk_hw *hw) +{ + struct scmi_clk *clk = to_scmi_clk(hw); + + return scmi_proto_clk_ops->enable_atomic(clk->ph, clk->id); +} + +static void scmi_clk_atomic_disable(struct clk_hw *hw) +{ + struct scmi_clk *clk = to_scmi_clk(hw); + + scmi_proto_clk_ops->disable_atomic(clk->ph, clk->id); +} + +/* + * 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. + * + * When no SCMI atomic transport support is available we instead provide only + * the prepare/unprepare API, as allowed by the clock framework when atomic + * calls are not available. + * + * Two distinct sets of clk_ops are provided since we could have multiple SCMI + * instances with different underlying transport quality, so they cannot be + * shared. + */ static const struct clk_ops scmi_clk_ops = { .recalc_rate = scmi_clk_recalc_rate, .round_rate = scmi_clk_round_rate, .set_rate = scmi_clk_set_rate, - /* - * We can't provide enable/disable callback as we can't perform the same - * in atomic context. Since the clock framework provides standard API - * clk_prepare_enable that helps cases using clk_enable in non-atomic - * context, it should be fine providing prepare/unprepare. - */ .prepare = scmi_clk_enable, .unprepare = scmi_clk_disable, }; -static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk) +static const struct clk_ops scmi_atomic_clk_ops = { + .recalc_rate = scmi_clk_recalc_rate, + .round_rate = scmi_clk_round_rate, + .set_rate = scmi_clk_set_rate, + .prepare = scmi_clk_enable, + .unprepare = scmi_clk_disable, + .enable = scmi_clk_atomic_enable, + .disable = scmi_clk_atomic_disable, +}; + +static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk, + const struct clk_ops *scmi_ops) { int ret; unsigned long min_rate, max_rate; @@ -110,7 +142,7 @@ static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk) struct clk_init_data init = { .flags = CLK_GET_RATE_NOCACHE, .num_parents = 0, - .ops = &scmi_clk_ops, + .ops = scmi_ops, .name = sclk->info->name, }; @@ -145,6 +177,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev) struct device_node *np = dev->of_node; const struct scmi_handle *handle = sdev->handle; struct scmi_protocol_handle *ph; + const struct clk_ops *scmi_ops; if (!handle) return -ENODEV; @@ -168,6 +201,11 @@ static int scmi_clocks_probe(struct scmi_device *sdev) clk_data->num = count; hws = clk_data->hws; + if (handle->is_transport_atomic(handle)) + scmi_ops = &scmi_atomic_clk_ops; + else + scmi_ops = &scmi_clk_ops; + for (idx = 0; idx < count; idx++) { struct scmi_clk *sclk; @@ -184,7 +222,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev) sclk->id = idx; sclk->ph = ph; - err = scmi_clk_ops_init(dev, sclk); + err = scmi_clk_ops_init(dev, sclk, scmi_ops); if (err) { dev_err(dev, "failed to register clock %d\n", idx); devm_kfree(dev, sclk); -- 2.17.1
WARNING: multiple messages have this Message-ID (diff)
From: Cristian Marussi <cristian.marussi@arm.com> To: linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: sudeep.holla@arm.com, james.quinlan@broadcom.com, Jonathan.Cameron@Huawei.com, f.fainelli@gmail.com, etienne.carriere@linaro.org, vincent.guittot@linaro.org, souvik.chakravarty@arm.com, cristian.marussi@arm.com, Michael Turquette <mturquette@baylibre.com>, Stephen Boyd <sboyd@kernel.org>, linux-clk@vger.kernel.org Subject: [PATCH v7 16/16] clk: scmi: Support atomic clock enable/disable API Date: Mon, 29 Nov 2021 19:11:56 +0000 [thread overview] Message-ID: <20211129191156.29322-17-cristian.marussi@arm.com> (raw) In-Reply-To: <20211129191156.29322-1-cristian.marussi@arm.com> Support also atomic enable/disable clk_ops beside the bare non-atomic one (prepare/unprepare) when the underlying SCMI transport is configured to support atomic transactions for synchronous commands. Cc: Michael Turquette <mturquette@baylibre.com> Cc: Stephen Boyd <sboyd@kernel.org> Cc: linux-clk@vger.kernel.org Signed-off-by: Cristian Marussi <cristian.marussi@arm.com> --- V5 --> V6 - add concurrent availability of atomic and non atomic reqs --- drivers/clk/clk-scmi.c | 56 +++++++++++++++++++++++++++++++++++------- 1 file changed, 47 insertions(+), 9 deletions(-) diff --git a/drivers/clk/clk-scmi.c b/drivers/clk/clk-scmi.c index 1e357d364ca2..50033d873dde 100644 --- a/drivers/clk/clk-scmi.c +++ b/drivers/clk/clk-scmi.c @@ -88,21 +88,53 @@ static void scmi_clk_disable(struct clk_hw *hw) scmi_proto_clk_ops->disable(clk->ph, clk->id); } +static int scmi_clk_atomic_enable(struct clk_hw *hw) +{ + struct scmi_clk *clk = to_scmi_clk(hw); + + return scmi_proto_clk_ops->enable_atomic(clk->ph, clk->id); +} + +static void scmi_clk_atomic_disable(struct clk_hw *hw) +{ + struct scmi_clk *clk = to_scmi_clk(hw); + + scmi_proto_clk_ops->disable_atomic(clk->ph, clk->id); +} + +/* + * 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. + * + * When no SCMI atomic transport support is available we instead provide only + * the prepare/unprepare API, as allowed by the clock framework when atomic + * calls are not available. + * + * Two distinct sets of clk_ops are provided since we could have multiple SCMI + * instances with different underlying transport quality, so they cannot be + * shared. + */ static const struct clk_ops scmi_clk_ops = { .recalc_rate = scmi_clk_recalc_rate, .round_rate = scmi_clk_round_rate, .set_rate = scmi_clk_set_rate, - /* - * We can't provide enable/disable callback as we can't perform the same - * in atomic context. Since the clock framework provides standard API - * clk_prepare_enable that helps cases using clk_enable in non-atomic - * context, it should be fine providing prepare/unprepare. - */ .prepare = scmi_clk_enable, .unprepare = scmi_clk_disable, }; -static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk) +static const struct clk_ops scmi_atomic_clk_ops = { + .recalc_rate = scmi_clk_recalc_rate, + .round_rate = scmi_clk_round_rate, + .set_rate = scmi_clk_set_rate, + .prepare = scmi_clk_enable, + .unprepare = scmi_clk_disable, + .enable = scmi_clk_atomic_enable, + .disable = scmi_clk_atomic_disable, +}; + +static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk, + const struct clk_ops *scmi_ops) { int ret; unsigned long min_rate, max_rate; @@ -110,7 +142,7 @@ static int scmi_clk_ops_init(struct device *dev, struct scmi_clk *sclk) struct clk_init_data init = { .flags = CLK_GET_RATE_NOCACHE, .num_parents = 0, - .ops = &scmi_clk_ops, + .ops = scmi_ops, .name = sclk->info->name, }; @@ -145,6 +177,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev) struct device_node *np = dev->of_node; const struct scmi_handle *handle = sdev->handle; struct scmi_protocol_handle *ph; + const struct clk_ops *scmi_ops; if (!handle) return -ENODEV; @@ -168,6 +201,11 @@ static int scmi_clocks_probe(struct scmi_device *sdev) clk_data->num = count; hws = clk_data->hws; + if (handle->is_transport_atomic(handle)) + scmi_ops = &scmi_atomic_clk_ops; + else + scmi_ops = &scmi_clk_ops; + for (idx = 0; idx < count; idx++) { struct scmi_clk *sclk; @@ -184,7 +222,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev) sclk->id = idx; sclk->ph = ph; - err = scmi_clk_ops_init(dev, sclk); + err = scmi_clk_ops_init(dev, sclk, scmi_ops); if (err) { dev_err(dev, "failed to register clock %d\n", idx); devm_kfree(dev, sclk); -- 2.17.1 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-11-29 19:18 UTC|newest] Thread overview: 82+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-11-29 19:11 [PATCH v7 00/16] Introduce atomic support for SCMI transports Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 01/16] firmware: arm_scmi: Perform earlier cinfo lookup call in do_xfer Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 02/16] firmware: arm_scmi: Set polling timeout to max_rx_timeout_ms Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-03 20:13 ` Florian Fainelli 2021-12-03 20:13 ` Florian Fainelli 2021-12-13 11:06 ` Sudeep Holla 2021-12-13 11:06 ` Sudeep Holla 2021-11-29 19:11 ` [PATCH v7 03/16] firmware: arm_scmi: Refactor message response path Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 04/16] include: trace: Add new scmi_xfer_response_wait event Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-03 20:16 ` Florian Fainelli 2021-12-03 20:16 ` Florian Fainelli 2021-11-29 19:11 ` [PATCH v7 05/16] firmware: arm_scmi: Use new trace event scmi_xfer_response_wait Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-03 20:16 ` Florian Fainelli 2021-12-03 20:16 ` Florian Fainelli 2021-11-29 19:11 ` [PATCH v7 06/16] firmware: arm_scmi: Add configurable polling mode for transports Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-13 11:25 ` Sudeep Holla 2021-12-13 11:25 ` Sudeep Holla 2021-12-14 10:49 ` Cristian Marussi 2021-12-14 10:49 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 07/16] firmware: arm_scmi: Make smc transport use common completions Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 08/16] firmware: arm_scmi: Add sync_cmds_atomic_replies transport flag Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-13 11:54 ` Sudeep Holla 2021-12-13 11:54 ` Sudeep Holla 2021-12-14 10:52 ` Cristian Marussi 2021-12-14 10:52 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 09/16] firmware: arm_scmi: Make smc support atomic sync commands replies Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 10/16] firmware: arm_scmi: Make optee " Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 11/16] firmware: arm_scmi: Add support for atomic transports Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 12/16] firmware: arm_scmi: Add atomic mode support to smc transport Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-13 11:42 ` Sudeep Holla 2021-12-13 11:42 ` Sudeep Holla 2021-12-14 10:54 ` Cristian Marussi 2021-12-14 10:54 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 13/16] firmware: arm_scmi: Add new parameter to mark_txdone Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-03 20:17 ` Florian Fainelli 2021-12-03 20:17 ` Florian Fainelli 2021-11-29 19:11 ` [PATCH v7 14/16] firmware: arm_scmi: Add atomic mode support to virtio transport Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-10 12:12 ` Peter Hilber 2021-12-10 12:12 ` Peter Hilber 2021-12-20 21:30 ` Cristian Marussi 2021-12-20 21:30 ` Cristian Marussi 2022-01-18 14:20 ` Peter Hilber 2022-01-18 14:20 ` Peter Hilber 2021-12-13 11:34 ` Sudeep Holla 2021-12-13 11:34 ` Sudeep Holla 2021-12-14 10:56 ` Cristian Marussi 2021-12-14 10:56 ` Cristian Marussi 2021-11-29 19:11 ` [PATCH v7 15/16] firmware: arm_scmi: Add atomic support to clock protocol Cristian Marussi 2021-11-29 19:11 ` Cristian Marussi 2021-12-03 20:16 ` Florian Fainelli 2021-12-03 20:16 ` Florian Fainelli 2021-11-29 19:11 ` Cristian Marussi [this message] 2021-11-29 19:11 ` [PATCH v7 16/16] clk: scmi: Support atomic clock enable/disable API Cristian Marussi 2021-12-03 2:06 ` Stephen Boyd 2021-12-03 2:06 ` Stephen Boyd 2021-12-03 20:17 ` Florian Fainelli 2021-12-03 20:17 ` Florian Fainelli 2021-12-10 10:52 ` Vincent Guittot 2021-12-10 10:52 ` Vincent Guittot 2021-12-10 13:30 ` Cristian Marussi 2021-12-10 13:30 ` Cristian Marussi 2021-12-10 14:27 ` Vincent Guittot 2021-12-10 14:27 ` Vincent Guittot 2021-12-10 19:36 ` Cristian Marussi 2021-12-10 19:36 ` Cristian Marussi 2021-12-13 17:52 ` [PATCH v7 00/16] (subset) Introduce atomic support for SCMI transports Sudeep Holla 2021-12-13 17:52 ` Sudeep Holla
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211129191156.29322-17-cristian.marussi@arm.com \ --to=cristian.marussi@arm.com \ --cc=Jonathan.Cameron@Huawei.com \ --cc=etienne.carriere@linaro.org \ --cc=f.fainelli@gmail.com \ --cc=james.quinlan@broadcom.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-clk@vger.kernel.org \ --cc=linux-kernel@vger.kernel.org \ --cc=mturquette@baylibre.com \ --cc=sboyd@kernel.org \ --cc=souvik.chakravarty@arm.com \ --cc=sudeep.holla@arm.com \ --cc=vincent.guittot@linaro.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.