firmware: arm_scmi: Move power-domain driver to the pmdomain dir
authorSudeep Holla <sudeep.holla@arm.com>
Thu, 21 Sep 2023 11:24:15 +0000 (12:24 +0100)
committerSudeep Holla <sudeep.holla@arm.com>
Thu, 21 Sep 2023 15:35:14 +0000 (16:35 +0100)
To simplify with maintenance let's move the Arm SCMI power-domain driver
to the new pmdomain directory.

Link: https://lore.kernel.org/all/20230921113328.3208651-1-sudeep.holla@arm.com
Reviewed-by: Ulf Hansson <ulf.hansson@linaro.org>
Cc: Cristian Marussi <cristian.marussi@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/Makefile
drivers/firmware/arm_scmi/scmi_pm_domain.c [deleted file]
drivers/pmdomain/arm/Makefile
drivers/pmdomain/arm/scmi_pm_domain.c [new file with mode: 0644]

index b31d78fa66cc11618bb34db358d9dab11f2974a1..a7bc4796519c4a63934e0d40611d0aa3c403b33a 100644 (file)
@@ -16,7 +16,6 @@ scmi-module-objs := $(scmi-driver-y) $(scmi-protocols-y) $(scmi-transport-y)
 obj-$(CONFIG_ARM_SCMI_PROTOCOL) += scmi-core.o
 obj-$(CONFIG_ARM_SCMI_PROTOCOL) += scmi-module.o
 
-obj-$(CONFIG_ARM_SCMI_POWER_DOMAIN) += scmi_pm_domain.o
 obj-$(CONFIG_ARM_SCMI_POWER_CONTROL) += scmi_power_control.o
 
 ifeq ($(CONFIG_THUMB2_KERNEL)$(CONFIG_CC_IS_CLANG),yy)
diff --git a/drivers/firmware/arm_scmi/scmi_pm_domain.c b/drivers/firmware/arm_scmi/scmi_pm_domain.c
deleted file mode 100644 (file)
index 0e05a79..0000000
+++ /dev/null
@@ -1,153 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- * SCMI Generic power domain support.
- *
- * Copyright (C) 2018-2021 ARM Ltd.
- */
-
-#include <linux/err.h>
-#include <linux/io.h>
-#include <linux/module.h>
-#include <linux/pm_domain.h>
-#include <linux/scmi_protocol.h>
-
-static const struct scmi_power_proto_ops *power_ops;
-
-struct scmi_pm_domain {
-       struct generic_pm_domain genpd;
-       const struct scmi_protocol_handle *ph;
-       const char *name;
-       u32 domain;
-};
-
-#define to_scmi_pd(gpd) container_of(gpd, struct scmi_pm_domain, genpd)
-
-static int scmi_pd_power(struct generic_pm_domain *domain, bool power_on)
-{
-       int ret;
-       u32 state, ret_state;
-       struct scmi_pm_domain *pd = to_scmi_pd(domain);
-
-       if (power_on)
-               state = SCMI_POWER_STATE_GENERIC_ON;
-       else
-               state = SCMI_POWER_STATE_GENERIC_OFF;
-
-       ret = power_ops->state_set(pd->ph, pd->domain, state);
-       if (!ret)
-               ret = power_ops->state_get(pd->ph, pd->domain, &ret_state);
-       if (!ret && state != ret_state)
-               return -EIO;
-
-       return ret;
-}
-
-static int scmi_pd_power_on(struct generic_pm_domain *domain)
-{
-       return scmi_pd_power(domain, true);
-}
-
-static int scmi_pd_power_off(struct generic_pm_domain *domain)
-{
-       return scmi_pd_power(domain, false);
-}
-
-static int scmi_pm_domain_probe(struct scmi_device *sdev)
-{
-       int num_domains, i;
-       struct device *dev = &sdev->dev;
-       struct device_node *np = dev->of_node;
-       struct scmi_pm_domain *scmi_pd;
-       struct genpd_onecell_data *scmi_pd_data;
-       struct generic_pm_domain **domains;
-       const struct scmi_handle *handle = sdev->handle;
-       struct scmi_protocol_handle *ph;
-
-       if (!handle)
-               return -ENODEV;
-
-       power_ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_POWER, &ph);
-       if (IS_ERR(power_ops))
-               return PTR_ERR(power_ops);
-
-       num_domains = power_ops->num_domains_get(ph);
-       if (num_domains < 0) {
-               dev_err(dev, "number of domains not found\n");
-               return num_domains;
-       }
-
-       scmi_pd = devm_kcalloc(dev, num_domains, sizeof(*scmi_pd), GFP_KERNEL);
-       if (!scmi_pd)
-               return -ENOMEM;
-
-       scmi_pd_data = devm_kzalloc(dev, sizeof(*scmi_pd_data), GFP_KERNEL);
-       if (!scmi_pd_data)
-               return -ENOMEM;
-
-       domains = devm_kcalloc(dev, num_domains, sizeof(*domains), GFP_KERNEL);
-       if (!domains)
-               return -ENOMEM;
-
-       for (i = 0; i < num_domains; i++, scmi_pd++) {
-               u32 state;
-
-               if (power_ops->state_get(ph, i, &state)) {
-                       dev_warn(dev, "failed to get state for domain %d\n", i);
-                       continue;
-               }
-
-               scmi_pd->domain = i;
-               scmi_pd->ph = ph;
-               scmi_pd->name = power_ops->name_get(ph, i);
-               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;
-
-               pm_genpd_init(&scmi_pd->genpd, NULL,
-                             state == SCMI_POWER_STATE_GENERIC_OFF);
-
-               domains[i] = &scmi_pd->genpd;
-       }
-
-       scmi_pd_data->domains = domains;
-       scmi_pd_data->num_domains = num_domains;
-
-       dev_set_drvdata(dev, scmi_pd_data);
-
-       return of_genpd_add_provider_onecell(np, scmi_pd_data);
-}
-
-static void scmi_pm_domain_remove(struct scmi_device *sdev)
-{
-       int i;
-       struct genpd_onecell_data *scmi_pd_data;
-       struct device *dev = &sdev->dev;
-       struct device_node *np = dev->of_node;
-
-       of_genpd_del_provider(np);
-
-       scmi_pd_data = dev_get_drvdata(dev);
-       for (i = 0; i < scmi_pd_data->num_domains; i++) {
-               if (!scmi_pd_data->domains[i])
-                       continue;
-               pm_genpd_remove(scmi_pd_data->domains[i]);
-       }
-}
-
-static const struct scmi_device_id scmi_id_table[] = {
-       { SCMI_PROTOCOL_POWER, "genpd" },
-       { },
-};
-MODULE_DEVICE_TABLE(scmi, scmi_id_table);
-
-static struct scmi_driver scmi_power_domain_driver = {
-       .name = "scmi-power-domain",
-       .probe = scmi_pm_domain_probe,
-       .remove = scmi_pm_domain_remove,
-       .id_table = scmi_id_table,
-};
-module_scmi_driver(scmi_power_domain_driver);
-
-MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");
-MODULE_DESCRIPTION("ARM SCMI power domain driver");
-MODULE_LICENSE("GPL v2");
index 7128db96deac77324d5c83aa4043cd63341f57c2..cfcb1f6cdd90094320275aeeada48a541400c8ba 100644 (file)
@@ -1,3 +1,4 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
 obj-$(CONFIG_ARM_SCMI_PERF_DOMAIN) += scmi_perf_domain.o
+obj-$(CONFIG_ARM_SCMI_POWER_DOMAIN) += scmi_pm_domain.o
diff --git a/drivers/pmdomain/arm/scmi_pm_domain.c b/drivers/pmdomain/arm/scmi_pm_domain.c
new file mode 100644 (file)
index 0000000..0e05a79
--- /dev/null
@@ -0,0 +1,153 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * SCMI Generic power domain support.
+ *
+ * Copyright (C) 2018-2021 ARM Ltd.
+ */
+
+#include <linux/err.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/pm_domain.h>
+#include <linux/scmi_protocol.h>
+
+static const struct scmi_power_proto_ops *power_ops;
+
+struct scmi_pm_domain {
+       struct generic_pm_domain genpd;
+       const struct scmi_protocol_handle *ph;
+       const char *name;
+       u32 domain;
+};
+
+#define to_scmi_pd(gpd) container_of(gpd, struct scmi_pm_domain, genpd)
+
+static int scmi_pd_power(struct generic_pm_domain *domain, bool power_on)
+{
+       int ret;
+       u32 state, ret_state;
+       struct scmi_pm_domain *pd = to_scmi_pd(domain);
+
+       if (power_on)
+               state = SCMI_POWER_STATE_GENERIC_ON;
+       else
+               state = SCMI_POWER_STATE_GENERIC_OFF;
+
+       ret = power_ops->state_set(pd->ph, pd->domain, state);
+       if (!ret)
+               ret = power_ops->state_get(pd->ph, pd->domain, &ret_state);
+       if (!ret && state != ret_state)
+               return -EIO;
+
+       return ret;
+}
+
+static int scmi_pd_power_on(struct generic_pm_domain *domain)
+{
+       return scmi_pd_power(domain, true);
+}
+
+static int scmi_pd_power_off(struct generic_pm_domain *domain)
+{
+       return scmi_pd_power(domain, false);
+}
+
+static int scmi_pm_domain_probe(struct scmi_device *sdev)
+{
+       int num_domains, i;
+       struct device *dev = &sdev->dev;
+       struct device_node *np = dev->of_node;
+       struct scmi_pm_domain *scmi_pd;
+       struct genpd_onecell_data *scmi_pd_data;
+       struct generic_pm_domain **domains;
+       const struct scmi_handle *handle = sdev->handle;
+       struct scmi_protocol_handle *ph;
+
+       if (!handle)
+               return -ENODEV;
+
+       power_ops = handle->devm_protocol_get(sdev, SCMI_PROTOCOL_POWER, &ph);
+       if (IS_ERR(power_ops))
+               return PTR_ERR(power_ops);
+
+       num_domains = power_ops->num_domains_get(ph);
+       if (num_domains < 0) {
+               dev_err(dev, "number of domains not found\n");
+               return num_domains;
+       }
+
+       scmi_pd = devm_kcalloc(dev, num_domains, sizeof(*scmi_pd), GFP_KERNEL);
+       if (!scmi_pd)
+               return -ENOMEM;
+
+       scmi_pd_data = devm_kzalloc(dev, sizeof(*scmi_pd_data), GFP_KERNEL);
+       if (!scmi_pd_data)
+               return -ENOMEM;
+
+       domains = devm_kcalloc(dev, num_domains, sizeof(*domains), GFP_KERNEL);
+       if (!domains)
+               return -ENOMEM;
+
+       for (i = 0; i < num_domains; i++, scmi_pd++) {
+               u32 state;
+
+               if (power_ops->state_get(ph, i, &state)) {
+                       dev_warn(dev, "failed to get state for domain %d\n", i);
+                       continue;
+               }
+
+               scmi_pd->domain = i;
+               scmi_pd->ph = ph;
+               scmi_pd->name = power_ops->name_get(ph, i);
+               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;
+
+               pm_genpd_init(&scmi_pd->genpd, NULL,
+                             state == SCMI_POWER_STATE_GENERIC_OFF);
+
+               domains[i] = &scmi_pd->genpd;
+       }
+
+       scmi_pd_data->domains = domains;
+       scmi_pd_data->num_domains = num_domains;
+
+       dev_set_drvdata(dev, scmi_pd_data);
+
+       return of_genpd_add_provider_onecell(np, scmi_pd_data);
+}
+
+static void scmi_pm_domain_remove(struct scmi_device *sdev)
+{
+       int i;
+       struct genpd_onecell_data *scmi_pd_data;
+       struct device *dev = &sdev->dev;
+       struct device_node *np = dev->of_node;
+
+       of_genpd_del_provider(np);
+
+       scmi_pd_data = dev_get_drvdata(dev);
+       for (i = 0; i < scmi_pd_data->num_domains; i++) {
+               if (!scmi_pd_data->domains[i])
+                       continue;
+               pm_genpd_remove(scmi_pd_data->domains[i]);
+       }
+}
+
+static const struct scmi_device_id scmi_id_table[] = {
+       { SCMI_PROTOCOL_POWER, "genpd" },
+       { },
+};
+MODULE_DEVICE_TABLE(scmi, scmi_id_table);
+
+static struct scmi_driver scmi_power_domain_driver = {
+       .name = "scmi-power-domain",
+       .probe = scmi_pm_domain_probe,
+       .remove = scmi_pm_domain_remove,
+       .id_table = scmi_id_table,
+};
+module_scmi_driver(scmi_power_domain_driver);
+
+MODULE_AUTHOR("Sudeep Holla <sudeep.holla@arm.com>");
+MODULE_DESCRIPTION("ARM SCMI power domain driver");
+MODULE_LICENSE("GPL v2");