]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
pinctrl: nuvoton: Convert to use struct group_desc
authorAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Tue, 18 Mar 2025 10:57:17 +0000 (12:57 +0200)
committerLinus Walleij <linus.walleij@linaro.org>
Thu, 20 Mar 2025 08:14:10 +0000 (09:14 +0100)
The pin control core header provides struct group_desc.
Utilize it instead of open coded variants in the driver.

Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/20250318105932.2090926-5-andriy.shevchenko@linux.intel.com
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/pinctrl/nuvoton/pinctrl-ma35.c

index ad4f9ca414c8b4fda5a04dc894b3756546ade688..da3c8d8e3eb3d61ec6f55d6bbd00933c06e75d51 100644 (file)
@@ -106,13 +106,6 @@ struct ma35_pin_setting {
        unsigned int            nconfigs;
 };
 
-struct ma35_pin_group {
-       const char              *name;
-       unsigned int            npins;
-       unsigned int            *pins;
-       struct ma35_pin_setting *settings;
-};
-
 struct ma35_pin_bank {
        void __iomem            *reg_base;
        struct clk              *clk;
@@ -141,7 +134,7 @@ struct ma35_pinctrl {
        struct pinctrl_dev      *pctl;
        const struct ma35_pinctrl_soc_info *info;
        struct regmap           *regmap;
-       struct ma35_pin_group   *groups;
+       struct group_desc       *groups;
        unsigned int            ngroups;
        struct pinfunction      *functions;
        unsigned int            nfunctions;
@@ -160,7 +153,7 @@ static const char *ma35_get_group_name(struct pinctrl_dev *pctldev, unsigned int
 {
        struct ma35_pinctrl *npctl = pinctrl_dev_get_drvdata(pctldev);
 
-       return npctl->groups[selector].name;
+       return npctl->groups[selector].grp.name;
 }
 
 static int ma35_get_group_pins(struct pinctrl_dev *pctldev, unsigned int selector,
@@ -171,19 +164,19 @@ static int ma35_get_group_pins(struct pinctrl_dev *pctldev, unsigned int selecto
        if (selector >= npctl->ngroups)
                return -EINVAL;
 
-       *pins = npctl->groups[selector].pins;
-       *npins = npctl->groups[selector].npins;
+       *pins = npctl->groups[selector].grp.pins;
+       *npins = npctl->groups[selector].grp.npins;
 
        return 0;
 }
 
-static struct ma35_pin_group *ma35_pinctrl_find_group_by_name(
-                             const struct ma35_pinctrl *npctl, const char *name)
+static struct group_desc *
+ma35_pinctrl_find_group_by_name(const struct ma35_pinctrl *npctl, const char *name)
 {
        int i;
 
        for (i = 0; i < npctl->ngroups; i++) {
-               if (!strcmp(npctl->groups[i].name, name))
+               if (!strcmp(npctl->groups[i].grp.name, name))
                        return &npctl->groups[i];
        }
        return NULL;
@@ -195,9 +188,10 @@ static int ma35_pinctrl_dt_node_to_map_func(struct pinctrl_dev *pctldev,
                                            unsigned int *num_maps)
 {
        struct ma35_pinctrl *npctl = pinctrl_dev_get_drvdata(pctldev);
-       struct ma35_pin_group *grp;
+       struct ma35_pin_setting *setting;
        struct pinctrl_map *new_map;
        struct device_node *parent;
+       struct group_desc *grp;
        int map_num = 1;
        int i;
 
@@ -211,7 +205,7 @@ static int ma35_pinctrl_dt_node_to_map_func(struct pinctrl_dev *pctldev,
                return -EINVAL;
        }
 
-       map_num += grp->npins;
+       map_num += grp->grp.npins;
        new_map = kcalloc(map_num, sizeof(*new_map), GFP_KERNEL);
        if (!new_map)
                return -ENOMEM;
@@ -223,17 +217,19 @@ static int ma35_pinctrl_dt_node_to_map_func(struct pinctrl_dev *pctldev,
        if (!parent)
                return -EINVAL;
 
+       setting = grp->data;
+
        new_map[0].type = PIN_MAP_TYPE_MUX_GROUP;
        new_map[0].data.mux.function = parent->name;
        new_map[0].data.mux.group = np->name;
        of_node_put(parent);
 
        new_map++;
-       for (i = 0; i < grp->npins; i++) {
+       for (i = 0; i < grp->grp.npins; i++) {
                new_map[i].type = PIN_MAP_TYPE_CONFIGS_PIN;
-               new_map[i].data.configs.group_or_pin = pin_get_name(pctldev, grp->pins[i]);
-               new_map[i].data.configs.configs = grp->settings[i].configs;
-               new_map[i].data.configs.num_configs = grp->settings[i].nconfigs;
+               new_map[i].data.configs.group_or_pin = pin_get_name(pctldev, grp->grp.pins[i]);
+               new_map[i].data.configs.configs = setting[i].configs;
+               new_map[i].data.configs.num_configs = setting[i].nconfigs;
        }
        dev_dbg(pctldev->dev, "maps: function %s group %s num %d\n",
                (*map)->data.mux.function, (*map)->data.mux.group, map_num);
@@ -281,14 +277,14 @@ static int ma35_pinmux_set_mux(struct pinctrl_dev *pctldev, unsigned int selecto
                               unsigned int group)
 {
        struct ma35_pinctrl *npctl = pinctrl_dev_get_drvdata(pctldev);
-       struct ma35_pin_group *grp = &npctl->groups[group];
-       struct ma35_pin_setting *setting = grp->settings;
+       struct group_desc *grp = &npctl->groups[group];
+       struct ma35_pin_setting *setting = grp->data;
        u32 i, regval;
 
        dev_dbg(npctl->dev, "enable function %s group %s\n",
-               npctl->functions[selector].name, npctl->groups[group].name);
+               npctl->functions[selector].name, grp->grp.name);
 
-       for (i = 0; i < grp->npins; i++) {
+       for (i = 0; i < grp->grp.npins; i++) {
                regmap_read(npctl->regmap, setting->offset, &regval);
                regval &= ~GENMASK(setting->shift + MA35_MFP_BITS_PER_PORT - 1,
                                   setting->shift);
@@ -980,17 +976,16 @@ static const struct pinconf_ops ma35_pinconf_ops = {
        .is_generic = true,
 };
 
-static int ma35_pinctrl_parse_groups(struct device_node *np, struct ma35_pin_group *grp,
+static int ma35_pinctrl_parse_groups(struct device_node *np, struct group_desc *grp,
                                     struct ma35_pinctrl *npctl, u32 index)
 {
        struct ma35_pin_setting *pin;
        unsigned long *configs;
        unsigned int nconfigs;
+       unsigned int *pins;
        int i, j, count, ret;
        u32 *elems;
 
-       grp->name = np->name;
-
        ret = pinconf_generic_parse_dt_config(np, NULL, &configs, &nconfigs);
        if (ret)
                return ret;
@@ -1003,21 +998,22 @@ static int ma35_pinctrl_parse_groups(struct device_node *np, struct ma35_pin_gro
        if (!elems)
                return -ENOMEM;
 
+       grp->grp.name = np->name;
+
        ret = of_property_read_u32_array(np, "nuvoton,pins", elems, count);
        if (ret)
                return -EINVAL;
+       grp->grp.npins = count / 3;
 
-       grp->npins = count / 3;
-
-       grp->pins = devm_kcalloc(npctl->dev, grp->npins, sizeof(*grp->pins), GFP_KERNEL);
-       if (!grp->pins)
+       pins = devm_kcalloc(npctl->dev, grp->grp.npins, sizeof(*pins), GFP_KERNEL);
+       if (!pins)
                return -ENOMEM;
+       grp->grp.pins = pins;
 
-       grp->settings = devm_kcalloc(npctl->dev, grp->npins, sizeof(*grp->settings), GFP_KERNEL);
-       if (!grp->settings)
+       pin = devm_kcalloc(npctl->dev, grp->grp.npins, sizeof(*pin), GFP_KERNEL);
+       if (!pin)
                return -ENOMEM;
-
-       pin = grp->settings;
+       grp->data = pin;
 
        for (i = 0, j = 0; i < count; i += 3, j++) {
                pin->offset = elems[i] * MA35_MFP_REG_SZ_PER_BANK + MA35_MFP_REG_BASE;
@@ -1025,7 +1021,7 @@ static int ma35_pinctrl_parse_groups(struct device_node *np, struct ma35_pin_gro
                pin->muxval = elems[i + 2];
                pin->configs = configs;
                pin->nconfigs = nconfigs;
-               grp->pins[j] = npctl->info->get_pin_num(pin->offset, pin->shift);
+               pins[j] = npctl->info->get_pin_num(pin->offset, pin->shift);
                pin++;
        }
        return 0;
@@ -1036,7 +1032,7 @@ static int ma35_pinctrl_parse_functions(struct device_node *np, struct ma35_pinc
 {
        struct device_node *child;
        struct pinfunction *func;
-       struct ma35_pin_group *grp;
+       struct group_desc *grp;
        static u32 grp_index;
        const char **groups;
        u32 ret, i = 0;