[PATCH/RFC 1/9] firmware: arm_scmi: Replace scmi_power_proto_ops.name_get() by .info_get()
Geert Uytterhoeven <[email protected]>
| Newsgroups | org.kernel.vger.arm-scmi,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-clk,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel,org.kernel.vger.linux-pm,org.kernel.vger.linux-renesas-soc |
|---|---|
| Message-ID | <4957c0d80d2d30ee21a0f6dd596015f57965340d.1781171705.git.geert+renesas@glider.be> |
The SCMI power domain protocol operations structure does not provide a .info_get() method, unlike most other protocols. Instead, it provides a .name_get() method. Replace the .name_get() method by the .info_get() method, to increase uniformity, and to prepare for returning more information. Signed-off-by: Geert Uytterhoeven <[email protected]> --- drivers/firmware/arm_scmi/power.c | 17 ++++++++--------- drivers/pmdomain/arm/scmi_pm_domain.c | 9 ++++++++- include/linux/scmi_protocol.h | 10 +++++++--- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/drivers/firmware/arm_scmi/power.c b/drivers/firmware/arm_scmi/power.c index 28ef63a4ecc2e1df..a00f7c298efb74f9 100644 --- a/drivers/firmware/arm_scmi/power.c +++ b/drivers/firmware/arm_scmi/power.c @@ -63,7 +63,7 @@ struct power_dom_info { bool state_set_sync; bool state_set_async; bool state_set_notify; - char name[SCMI_MAX_STR_SIZE]; + struct scmi_power_domain_info info; }; struct scmi_power_info { @@ -132,7 +132,7 @@ scmi_power_domain_attributes_get(const struct scmi_protocol_handle *ph, SUPPORTS_STATE_SET_NOTIFY(flags); dom_info->state_set_async = SUPPORTS_STATE_SET_ASYNC(flags); dom_info->state_set_sync = SUPPORTS_STATE_SET_SYNC(flags); - strscpy(dom_info->name, attr->name, SCMI_SHORT_NAME_MAX_SIZE); + strscpy(dom_info->info.name, attr->name, SCMI_SHORT_NAME_MAX_SIZE); } ph->xops->xfer_put(ph, t); @@ -143,7 +143,7 @@ scmi_power_domain_attributes_get(const struct scmi_protocol_handle *ph, if (!ret && PROTOCOL_REV_MAJOR(ph->version) >= 0x3 && SUPPORTS_EXTENDED_NAMES(flags)) { ph->hops->extended_name_get(ph, POWER_DOMAIN_NAME_GET, - domain, NULL, dom_info->name, + domain, NULL, dom_info->info.name, SCMI_MAX_STR_SIZE); } @@ -199,23 +199,22 @@ static int scmi_power_num_domains_get(const struct scmi_protocol_handle *ph) return pi->num_domains; } -static const char * -scmi_power_name_get(const struct scmi_protocol_handle *ph, - u32 domain) +static const struct scmi_power_domain_info * +scmi_power_info_get(const struct scmi_protocol_handle *ph, u32 domain) { struct scmi_power_info *pi = ph->get_priv(ph); struct power_dom_info *dom; if (domain >= pi->num_domains) - return "unknown"; + return NULL; dom = pi->dom_info + domain; - return dom->name; + return &dom->info; } static const struct scmi_power_proto_ops power_proto_ops = { .num_domains_get = scmi_power_num_domains_get, - .name_get = scmi_power_name_get, + .info_get = scmi_power_info_get, .state_set = scmi_power_state_set, .state_get = scmi_power_state_get, }; diff --git a/drivers/pmdomain/arm/scmi_pm_domain.c b/drivers/pmdomain/arm/scmi_pm_domain.c index 3d73aef21d2f9942..965592e828741b11 100644 --- a/drivers/pmdomain/arm/scmi_pm_domain.c +++ b/drivers/pmdomain/arm/scmi_pm_domain.c @@ -76,8 +76,15 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev) return -ENOMEM; for (i = 0; i < num_domains; i++, scmi_pd++) { + const struct scmi_power_domain_info *info; u32 state; + info = power_ops->info_get(ph, i); + if (!info) { + dev_warn(dev, "failed to get info for domain %d\n", i); + continue; + } + if (power_ops->state_get(ph, i, &state)) { dev_warn(dev, "failed to get state for domain %d\n", i); continue; @@ -93,7 +100,7 @@ static int scmi_pm_domain_probe(struct scmi_device *sdev) scmi_pd->domain = i; scmi_pd->ph = ph; - scmi_pd->name = power_ops->name_get(ph, i); + scmi_pd->name = info->name; scmi_pd->genpd.name = scmi_pd->name; scmi_pd->genpd.power_off = scmi_pd_power_off; scmi_pd->genpd.power_on = scmi_pd_power_on; diff --git a/include/linux/scmi_protocol.h b/include/linux/scmi_protocol.h index 5ab73b1ab9aa4fa8..1c17515ba45d1fd4 100644 --- a/include/linux/scmi_protocol.h +++ b/include/linux/scmi_protocol.h @@ -191,19 +191,23 @@ struct scmi_perf_proto_ops { enum scmi_power_scale (*power_scale_get)(const struct scmi_protocol_handle *ph); }; +struct scmi_power_domain_info { + char name[SCMI_MAX_STR_SIZE]; +}; + /** * struct scmi_power_proto_ops - represents the various operations provided * by SCMI Power Protocol * * @num_domains_get: get the count of power domains provided by SCMI - * @name_get: gets the name of a power domain + * @info_get: gets the information of the specified power domain * @state_set: sets the power state of a power domain * @state_get: gets the power state of a power domain */ struct scmi_power_proto_ops { int (*num_domains_get)(const struct scmi_protocol_handle *ph); - const char *(*name_get)(const struct scmi_protocol_handle *ph, - u32 domain); + const struct scmi_power_domain_info __must_check *(*info_get) + (const struct scmi_protocol_handle *ph, u32 domain); #define SCMI_POWER_STATE_TYPE_SHIFT 30 #define SCMI_POWER_STATE_ID_MASK (BIT(28) - 1) #define SCMI_POWER_STATE_PARAM(type, id) \ -- 2.43.0