OPP: Drop redundant *_opp_attach|detach_genpd()
authorUlf Hansson <ulf.hansson@linaro.org>
Wed, 2 Oct 2024 12:22:32 +0000 (14:22 +0200)
committerUlf Hansson <ulf.hansson@linaro.org>
Thu, 10 Oct 2024 12:24:30 +0000 (14:24 +0200)
All users of *_opp_attach|detach_genpd(), have been converted to use
dev|devm_pm_domain_attach|detach_list(), hence let's drop it along with its
corresponding exported functions.

Acked-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
Link: https://lore.kernel.org/r/20241002122232.194245-12-ulf.hansson@linaro.org
drivers/opp/core.c
drivers/opp/opp.h
include/linux/pm_opp.h

index 40e5f29..0311b18 100644 (file)
@@ -2360,119 +2360,6 @@ static void _opp_put_config_regulators_helper(struct opp_table *opp_table)
                opp_table->config_regulators = NULL;
 }
 
-static void _opp_detach_genpd(struct opp_table *opp_table)
-{
-       int index;
-
-       for (index = 0; index < opp_table->required_opp_count; index++) {
-               if (!opp_table->required_devs[index])
-                       continue;
-
-               dev_pm_domain_detach(opp_table->required_devs[index], false);
-               opp_table->required_devs[index] = NULL;
-       }
-}
-
-/*
- * Multiple generic power domains for a device are supported with the help of
- * virtual genpd devices, which are created for each consumer device - genpd
- * pair. These are the device structures which are attached to the power domain
- * and are required by the OPP core to set the performance state of the genpd.
- * The same API also works for the case where single genpd is available and so
- * we don't need to support that separately.
- *
- * This helper will normally be called by the consumer driver of the device
- * "dev", as only that has details of the genpd names.
- *
- * This helper needs to be called once with a list of all genpd to attach.
- * Otherwise the original device structure will be used instead by the OPP core.
- *
- * The order of entries in the names array must match the order in which
- * "required-opps" are added in DT.
- */
-static int _opp_attach_genpd(struct opp_table *opp_table, struct device *dev,
-                       const char * const *names, struct device ***virt_devs)
-{
-       struct device *virt_dev, *gdev;
-       struct opp_table *genpd_table;
-       int index = 0, ret = -EINVAL;
-       const char * const *name = names;
-
-       if (!opp_table->required_devs) {
-               dev_err(dev, "Required OPPs not available, can't attach genpd\n");
-               return -EINVAL;
-       }
-
-       /* Genpd core takes care of propagation to parent genpd */
-       if (opp_table->is_genpd) {
-               dev_err(dev, "%s: Operation not supported for genpds\n", __func__);
-               return -EOPNOTSUPP;
-       }
-
-       /* Checking only the first one is enough ? */
-       if (opp_table->required_devs[0])
-               return 0;
-
-       while (*name) {
-               if (index >= opp_table->required_opp_count) {
-                       dev_err(dev, "Index can't be greater than required-opp-count - 1, %s (%d : %d)\n",
-                               *name, opp_table->required_opp_count, index);
-                       goto err;
-               }
-
-               virt_dev = dev_pm_domain_attach_by_name(dev, *name);
-               if (IS_ERR_OR_NULL(virt_dev)) {
-                       ret = virt_dev ? PTR_ERR(virt_dev) : -ENODEV;
-                       dev_err(dev, "Couldn't attach to pm_domain: %d\n", ret);
-                       goto err;
-               }
-
-               /*
-                * The required_opp_tables parsing is not perfect, as the OPP
-                * core does the parsing solely based on the DT node pointers.
-                * The core sets the required_opp_tables entry to the first OPP
-                * table in the "opp_tables" list, that matches with the node
-                * pointer.
-                *
-                * If the target DT OPP table is used by multiple devices and
-                * they all create separate instances of 'struct opp_table' from
-                * it, then it is possible that the required_opp_tables entry
-                * may be set to the incorrect sibling device.
-                *
-                * Cross check it again and fix if required.
-                */
-               gdev = dev_to_genpd_dev(virt_dev);
-               if (IS_ERR(gdev)) {
-                       ret = PTR_ERR(gdev);
-                       goto err;
-               }
-
-               genpd_table = _find_opp_table(gdev);
-               if (!IS_ERR(genpd_table)) {
-                       if (genpd_table != opp_table->required_opp_tables[index]) {
-                               dev_pm_opp_put_opp_table(opp_table->required_opp_tables[index]);
-                               opp_table->required_opp_tables[index] = genpd_table;
-                       } else {
-                               dev_pm_opp_put_opp_table(genpd_table);
-                       }
-               }
-
-               opp_table->required_devs[index] = virt_dev;
-               index++;
-               name++;
-       }
-
-       if (virt_devs)
-               *virt_devs = opp_table->required_devs;
-
-       return 0;
-
-err:
-       _opp_detach_genpd(opp_table);
-       return ret;
-
-}
-
 static int _opp_set_required_dev(struct opp_table *opp_table,
                                 struct device *dev,
                                 struct device *required_dev,
@@ -2540,9 +2427,6 @@ static void _opp_clear_config(struct opp_config_data *data)
        if (data->flags & OPP_CONFIG_REQUIRED_DEV)
                _opp_put_required_dev(data->opp_table,
                                      data->required_dev_index);
-       else if (data->flags & OPP_CONFIG_GENPD)
-               _opp_detach_genpd(data->opp_table);
-
        if (data->flags & OPP_CONFIG_REGULATOR)
                _opp_put_regulators(data->opp_table);
        if (data->flags & OPP_CONFIG_SUPPORTED_HW)
@@ -2654,20 +2538,7 @@ int dev_pm_opp_set_config(struct device *dev, struct dev_pm_opp_config *config)
                data->flags |= OPP_CONFIG_REGULATOR;
        }
 
-       /* Attach genpds */
-       if (config->genpd_names) {
-               if (config->required_dev) {
-                       ret = -EINVAL;
-                       goto err;
-               }
-
-               ret = _opp_attach_genpd(opp_table, dev, config->genpd_names,
-                                       config->virt_devs);
-               if (ret)
-                       goto err;
-
-               data->flags |= OPP_CONFIG_GENPD;
-       } else if (config->required_dev) {
+       if (config->required_dev) {
                ret = _opp_set_required_dev(opp_table, dev,
                                            config->required_dev,
                                            config->required_dev_index);
index 3eed6f1..4bdb79f 100644 (file)
@@ -34,8 +34,7 @@ extern struct list_head opp_tables;
 #define OPP_CONFIG_REGULATOR_HELPER    BIT(2)
 #define OPP_CONFIG_PROP_NAME           BIT(3)
 #define OPP_CONFIG_SUPPORTED_HW                BIT(4)
-#define OPP_CONFIG_GENPD               BIT(5)
-#define OPP_CONFIG_REQUIRED_DEV                BIT(6)
+#define OPP_CONFIG_REQUIRED_DEV                BIT(5)
 
 /**
  * struct opp_config_data - data for set config operations
index bc74bc6..568183e 100644 (file)
@@ -62,11 +62,7 @@ typedef int (*config_clks_t)(struct device *dev, struct opp_table *opp_table,
  * @supported_hw: Array of hierarchy of versions to match.
  * @supported_hw_count: Number of elements in the array.
  * @regulator_names: Array of pointers to the names of the regulator, NULL terminated.
- * @genpd_names: Null terminated array of pointers containing names of genpd to
- *             attach. Mutually exclusive with required_dev.
- * @virt_devs: Pointer to return the array of genpd virtual devices. Mutually
- *             exclusive with required_dev.
- * @required_dev: Required OPP device. Mutually exclusive with genpd_names/virt_devs.
+ * @required_dev: The required OPP device.
  * @required_dev_index: The index of the required OPP for the @required_dev.
  *
  * This structure contains platform specific OPP configurations for the device.
@@ -80,8 +76,6 @@ struct dev_pm_opp_config {
        const unsigned int *supported_hw;
        unsigned int supported_hw_count;
        const char * const *regulator_names;
-       const char * const *genpd_names;
-       struct device ***virt_devs;
        struct device *required_dev;
        unsigned int required_dev_index;
 };
@@ -677,36 +671,6 @@ static inline void dev_pm_opp_put_config_regulators(int token)
        dev_pm_opp_clear_config(token);
 }
 
-/* genpd helpers */
-static inline int dev_pm_opp_attach_genpd(struct device *dev,
-                                         const char * const *names,
-                                         struct device ***virt_devs)
-{
-       struct dev_pm_opp_config config = {
-               .genpd_names = names,
-               .virt_devs = virt_devs,
-       };
-
-       return dev_pm_opp_set_config(dev, &config);
-}
-
-static inline void dev_pm_opp_detach_genpd(int token)
-{
-       dev_pm_opp_clear_config(token);
-}
-
-static inline int devm_pm_opp_attach_genpd(struct device *dev,
-                                          const char * const *names,
-                                          struct device ***virt_devs)
-{
-       struct dev_pm_opp_config config = {
-               .genpd_names = names,
-               .virt_devs = virt_devs,
-       };
-
-       return devm_pm_opp_set_config(dev, &config);
-}
-
 /* prop-name helpers */
 static inline int dev_pm_opp_set_prop_name(struct device *dev, const char *name)
 {