All of lore.kernel.org
 help / color / mirror / Atom feed
From: Chester Lin <clin@suse.com>
To: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: "Linus Walleij" <linus.walleij@linaro.org>,
	"NXP S32 Linux Team" <s32@nxp.com>,
	linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	"Ghennadi Procopciuc" <Ghennadi.Procopciuc@oss.nxp.com>,
	"Andrei Stefanescu" <andrei.stefanescu@nxp.com>,
	"Radu Pirea" <radu-nicolae.pirea@nxp.com>,
	"Andreas Färber" <afaerber@suse.de>,
	"Matthias Brugger" <mbrugger@suse.com>
Subject: Re: [PATCH v2 4/4] pinctrl: s32cc: embed generic struct pingroup and pinfunction
Date: Tue, 21 Mar 2023 13:09:18 +0800	[thread overview]
Message-ID: <ZBk7/h4nquwZShv1@linux-8mug> (raw)
In-Reply-To: <CAHp75VfFTjPFMQ91yHC4O1enTJqtww7ur8ppwa1rqT_7WNzDTQ@mail.gmail.com>

On Mon, Mar 20, 2023 at 07:10:40PM +0200, Andy Shevchenko wrote:
> On Mon, Mar 20, 2023 at 6:39 PM Chester Lin <clin@suse.com> wrote:
> >
> > Use generic data structure to describe pin control functions and groups in
> > S32 SoC family and drop duplicated struct members.
> 
> Not sure about the need of the casting, see below, otherwise LGTM.
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> 
> > Signed-off-by: Chester Lin <clin@suse.com>
> > ---
> > Changes in v2:
> > - Simply use generic 'struct pinfunction' rather than having extra 'struct
> >   s32_pmx_func'.
> >
> >  drivers/pinctrl/nxp/pinctrl-s32.h   | 26 ++--------
> >  drivers/pinctrl/nxp/pinctrl-s32cc.c | 76 +++++++++++++++--------------
> >  2 files changed, 45 insertions(+), 57 deletions(-)
> >
> > diff --git a/drivers/pinctrl/nxp/pinctrl-s32.h b/drivers/pinctrl/nxp/pinctrl-s32.h
> > index 545bf16b988d..2f7aecd462e4 100644
> > --- a/drivers/pinctrl/nxp/pinctrl-s32.h
> > +++ b/drivers/pinctrl/nxp/pinctrl-s32.h
> > @@ -15,31 +15,15 @@ struct platform_device;
> >
> >  /**
> >   * struct s32_pin_group - describes an S32 pin group
> > - * @name: the name of this specific pin group
> > - * @npins: the number of pins in this group array, i.e. the number of
> > - *         elements in pin_ids and pin_sss so we can iterate over that array
> > - * @pin_ids: an array of pin IDs in this group
> > - * @pin_sss: an array of source signal select configs paired with pin_ids
> > + * @data: generic data describes group name, number of pins, and a pin array in
> > +       this group.
> > + * @pin_sss: an array of source signal select configs paired with pin array.
> >   */
> >  struct s32_pin_group {
> > -       const char *name;
> > -       unsigned int npins;
> > -       unsigned int *pin_ids;
> > +       struct pingroup data;
> >         unsigned int *pin_sss;
> >  };
> >
> > -/**
> > - * struct s32_pmx_func - describes S32 pinmux functions
> > - * @name: the name of this specific function
> > - * @groups: corresponding pin groups
> > - * @num_groups: the number of groups
> > - */
> > -struct s32_pmx_func {
> > -       const char *name;
> > -       const char **groups;
> > -       unsigned int num_groups;
> > -};
> > -
> >  /**
> >   * struct s32_pin_range - pin ID range for each memory region.
> >   * @start: start pin ID
> > @@ -56,7 +40,7 @@ struct s32_pinctrl_soc_info {
> >         unsigned int npins;
> >         struct s32_pin_group *groups;
> >         unsigned int ngroups;
> > -       struct s32_pmx_func *functions;
> > +       struct pinfunction *functions;
> >         unsigned int nfunctions;
> >         unsigned int grp_index;
> >         const struct s32_pin_range *mem_pin_ranges;
> > diff --git a/drivers/pinctrl/nxp/pinctrl-s32cc.c b/drivers/pinctrl/nxp/pinctrl-s32cc.c
> > index cb8a0844c0fa..4ed0cc905232 100644
> > --- a/drivers/pinctrl/nxp/pinctrl-s32cc.c
> > +++ b/drivers/pinctrl/nxp/pinctrl-s32cc.c
> > @@ -188,7 +188,7 @@ static const char *s32_get_group_name(struct pinctrl_dev *pctldev,
> >         struct s32_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
> >         const struct s32_pinctrl_soc_info *info = ipctl->info;
> >
> > -       return info->groups[selector].name;
> > +       return info->groups[selector].data.name;
> >  }
> >
> >  static int s32_get_group_pins(struct pinctrl_dev *pctldev,
> > @@ -198,8 +198,8 @@ static int s32_get_group_pins(struct pinctrl_dev *pctldev,
> >         struct s32_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
> >         const struct s32_pinctrl_soc_info *info = ipctl->info;
> >
> > -       *pins = info->groups[selector].pin_ids;
> > -       *npins = info->groups[selector].npins;
> > +       *pins = info->groups[selector].data.pins;
> > +       *npins = info->groups[selector].data.npins;
> >
> >         return 0;
> >  }
> > @@ -314,23 +314,23 @@ static int s32_pmx_set(struct pinctrl_dev *pctldev, unsigned int selector,
> >         grp = &info->groups[group];
> >
> >         dev_dbg(ipctl->dev, "set mux for function %s group %s\n",
> > -               info->functions[selector].name, grp->name);
> > +               info->functions[selector].name, grp->data.name);
> >
> >         /* Check beforehand so we don't have a partial config. */
> > -       for (i = 0; i < grp->npins; i++) {
> > -               if (s32_check_pin(pctldev, grp->pin_ids[i]) != 0) {
> > +       for (i = 0; i < grp->data.npins; i++) {
> > +               if (s32_check_pin(pctldev, grp->data.pins[i]) != 0) {
> >                         dev_err(info->dev, "invalid pin: %u in group: %u\n",
> > -                               grp->pin_ids[i], group);
> > +                               grp->data.pins[i], group);
> >                         return -EINVAL;
> >                 }
> >         }
> >
> > -       for (i = 0, ret = 0; i < grp->npins && !ret; i++) {
> > -               ret = s32_regmap_update(pctldev, grp->pin_ids[i],
> > +       for (i = 0, ret = 0; i < grp->data.npins && !ret; i++) {
> > +               ret = s32_regmap_update(pctldev, grp->data.pins[i],
> >                                         S32_MSCR_SSS_MASK, grp->pin_sss[i]);
> >                 if (ret) {
> >                         dev_err(info->dev, "Failed to set pin %u\n",
> > -                               grp->pin_ids[i]);
> > +                               grp->data.pins[i]);
> >                         return ret;
> >                 }
> >         }
> > @@ -364,7 +364,7 @@ static int s32_pmx_get_groups(struct pinctrl_dev *pctldev,
> >         const struct s32_pinctrl_soc_info *info = ipctl->info;
> >
> >         *groups = info->functions[selector].groups;
> > -       *num_groups = info->functions[selector].num_groups;
> > +       *num_groups = info->functions[selector].ngroups;
> >
> >         return 0;
> >  }
> > @@ -602,8 +602,8 @@ static int s32_pconf_group_set(struct pinctrl_dev *pctldev, unsigned int selecto
> >         int i, ret;
> >
> >         grp = &info->groups[selector];
> > -       for (i = 0; i < grp->npins; i++) {
> > -               ret = s32_pinconf_mscr_update(pctldev, grp->pin_ids[i],
> > +       for (i = 0; i < grp->data.npins; i++) {
> > +               ret = s32_pinconf_mscr_update(pctldev, grp->data.pins[i],
> >                                               configs, num_configs);
> >                 if (ret)
> >                         return ret;
> > @@ -637,9 +637,9 @@ static void s32_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
> >
> >         seq_puts(s, "\n");
> >         grp = &info->groups[selector];
> > -       for (i = 0; i < grp->npins; i++) {
> > -               name = pin_get_name(pctldev, grp->pin_ids[i]);
> > -               ret = s32_regmap_read(pctldev, grp->pin_ids[i], &config);
> > +       for (i = 0; i < grp->data.npins; i++) {
> > +               name = pin_get_name(pctldev, grp->data.pins[i]);
> > +               ret = s32_regmap_read(pctldev, grp->data.pins[i], &config);
> >                 if (ret)
> >                         return;
> >                 seq_printf(s, "%s: 0x%x\n", name, config);
> > @@ -732,6 +732,7 @@ static int s32_pinctrl_parse_groups(struct device_node *np,
> >         const __be32 *p;
> >         struct device *dev;
> >         struct property *prop;
> > +       unsigned int *pins, *sss;
> >         int i, npins;
> >         u32 pinmux;
> >
> > @@ -740,38 +741,38 @@ static int s32_pinctrl_parse_groups(struct device_node *np,
> >         dev_dbg(dev, "group: %pOFn\n", np);
> >
> >         /* Initialise group */
> > -       grp->name = np->name;
> > +       grp->data.name = np->name;
> >
> >         npins = of_property_count_elems_of_size(np, "pinmux", sizeof(u32));
> >         if (npins < 0) {
> >                 dev_err(dev, "Failed to read 'pinmux' property in node %s.\n",
> > -                       grp->name);
> > +                       grp->data.name);
> >                 return -EINVAL;
> >         }
> >         if (!npins) {
> > -               dev_err(dev, "The group %s has no pins.\n", grp->name);
> > +               dev_err(dev, "The group %s has no pins.\n", grp->data.name);
> >                 return -EINVAL;
> >         }
> >
> > -       grp->npins = npins;
> > +       grp->data.npins = npins;
> >
> > -       grp->pin_ids = devm_kcalloc(info->dev, grp->npins,
> > -                                   sizeof(unsigned int), GFP_KERNEL);
> > -       grp->pin_sss = devm_kcalloc(info->dev, grp->npins,
> > -                                   sizeof(unsigned int), GFP_KERNEL);
> > -       if (!grp->pin_ids || !grp->pin_sss)
> > +       pins = devm_kcalloc(info->dev, npins, sizeof(*pins), GFP_KERNEL);
> > +       sss = devm_kcalloc(info->dev, npins, sizeof(*sss), GFP_KERNEL);
> > +       if (!pins || !sss)
> >                 return -ENOMEM;
> >
> >         i = 0;
> >         of_property_for_each_u32(np, "pinmux", prop, p, pinmux) {
> > -               grp->pin_ids[i] = get_pin_no(pinmux);
> > -               grp->pin_sss[i] = get_pin_func(pinmux);
> > +               pins[i] = get_pin_no(pinmux);
> > +               sss[i] = get_pin_func(pinmux);
> >
> > -               dev_dbg(info->dev, "pin-id: 0x%x, sss: 0x%x",
> > -                       grp->pin_ids[i], grp->pin_sss[i]);
> > +               dev_dbg(info->dev, "pin: 0x%x, sss: 0x%x", pins[i], sss[i]);
> >                 i++;
> >         }
> >
> > +       grp->data.pins = pins;
> > +       grp->pin_sss = sss;
> > +
> >         return 0;
> >  }
> >
> > @@ -780,8 +781,9 @@ static int s32_pinctrl_parse_functions(struct device_node *np,
> >                                         u32 index)
> >  {
> >         struct device_node *child;
> > -       struct s32_pmx_func *func;
> > +       struct pinfunction *func;
> >         struct s32_pin_group *grp;
> > +       char **groups;
> >         u32 i = 0;
> >         int ret = 0;
> >
> > @@ -791,18 +793,18 @@ static int s32_pinctrl_parse_functions(struct device_node *np,
> >
> >         /* Initialise function */
> >         func->name = np->name;
> > -       func->num_groups = of_get_child_count(np);
> > -       if (func->num_groups == 0) {
> > +       func->ngroups = of_get_child_count(np);
> > +       if (func->ngroups == 0) {
> >                 dev_err(info->dev, "no groups defined in %pOF\n", np);
> >                 return -EINVAL;
> >         }
> > -       func->groups = devm_kcalloc(info->dev, func->num_groups,
> > -                                   sizeof(*func->groups), GFP_KERNEL);
> > -       if (!func->groups)
> > +       groups = devm_kcalloc(info->dev, func->ngroups,
> > +                             sizeof(*func->groups), GFP_KERNEL);
> > +       if (!groups)
> >                 return -ENOMEM;
> >
> >         for_each_child_of_node(np, child) {
> > -               func->groups[i] = child->name;
> > +               groups[i] = (char *)child->name;
> >                 grp = &info->groups[info->grp_index++];
> >                 ret = s32_pinctrl_parse_groups(child, grp, info);
> >                 if (ret)
> > @@ -810,6 +812,8 @@ static int s32_pinctrl_parse_functions(struct device_node *np,
> >                 i++;
> >         }
> >
> > +       func->groups = (const char **)groups;
> 
> Hmm... Why is casting needed?

It's used for fulfilling the type checking done by kbuild otherwise an error will occur:

drivers/pinctrl/nxp/pinctrl-s32cc.c:815:22: error: assignment to 'const char * const*' from incompatible pointer type 'char **' [-Werror=incompatible-pointer-types]

In 'struct pinfunction', the member 'groups' is declared as (const char * const *).

Regards,
Chester

> 
> >         return 0;
> >  }
> 
> -- 
> With Best Regards,
> Andy Shevchenko

WARNING: multiple messages have this Message-ID (diff)
From: Chester Lin <clin@suse.com>
To: Andy Shevchenko <andy.shevchenko@gmail.com>
Cc: "Linus Walleij" <linus.walleij@linaro.org>,
	"NXP S32 Linux Team" <s32@nxp.com>,
	linux-gpio@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org,
	"Ghennadi Procopciuc" <Ghennadi.Procopciuc@oss.nxp.com>,
	"Andrei Stefanescu" <andrei.stefanescu@nxp.com>,
	"Radu Pirea" <radu-nicolae.pirea@nxp.com>,
	"Andreas Färber" <afaerber@suse.de>,
	"Matthias Brugger" <mbrugger@suse.com>
Subject: Re: [PATCH v2 4/4] pinctrl: s32cc: embed generic struct pingroup and pinfunction
Date: Tue, 21 Mar 2023 13:09:18 +0800	[thread overview]
Message-ID: <ZBk7/h4nquwZShv1@linux-8mug> (raw)
In-Reply-To: <CAHp75VfFTjPFMQ91yHC4O1enTJqtww7ur8ppwa1rqT_7WNzDTQ@mail.gmail.com>

On Mon, Mar 20, 2023 at 07:10:40PM +0200, Andy Shevchenko wrote:
> On Mon, Mar 20, 2023 at 6:39 PM Chester Lin <clin@suse.com> wrote:
> >
> > Use generic data structure to describe pin control functions and groups in
> > S32 SoC family and drop duplicated struct members.
> 
> Not sure about the need of the casting, see below, otherwise LGTM.
> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
> 
> > Signed-off-by: Chester Lin <clin@suse.com>
> > ---
> > Changes in v2:
> > - Simply use generic 'struct pinfunction' rather than having extra 'struct
> >   s32_pmx_func'.
> >
> >  drivers/pinctrl/nxp/pinctrl-s32.h   | 26 ++--------
> >  drivers/pinctrl/nxp/pinctrl-s32cc.c | 76 +++++++++++++++--------------
> >  2 files changed, 45 insertions(+), 57 deletions(-)
> >
> > diff --git a/drivers/pinctrl/nxp/pinctrl-s32.h b/drivers/pinctrl/nxp/pinctrl-s32.h
> > index 545bf16b988d..2f7aecd462e4 100644
> > --- a/drivers/pinctrl/nxp/pinctrl-s32.h
> > +++ b/drivers/pinctrl/nxp/pinctrl-s32.h
> > @@ -15,31 +15,15 @@ struct platform_device;
> >
> >  /**
> >   * struct s32_pin_group - describes an S32 pin group
> > - * @name: the name of this specific pin group
> > - * @npins: the number of pins in this group array, i.e. the number of
> > - *         elements in pin_ids and pin_sss so we can iterate over that array
> > - * @pin_ids: an array of pin IDs in this group
> > - * @pin_sss: an array of source signal select configs paired with pin_ids
> > + * @data: generic data describes group name, number of pins, and a pin array in
> > +       this group.
> > + * @pin_sss: an array of source signal select configs paired with pin array.
> >   */
> >  struct s32_pin_group {
> > -       const char *name;
> > -       unsigned int npins;
> > -       unsigned int *pin_ids;
> > +       struct pingroup data;
> >         unsigned int *pin_sss;
> >  };
> >
> > -/**
> > - * struct s32_pmx_func - describes S32 pinmux functions
> > - * @name: the name of this specific function
> > - * @groups: corresponding pin groups
> > - * @num_groups: the number of groups
> > - */
> > -struct s32_pmx_func {
> > -       const char *name;
> > -       const char **groups;
> > -       unsigned int num_groups;
> > -};
> > -
> >  /**
> >   * struct s32_pin_range - pin ID range for each memory region.
> >   * @start: start pin ID
> > @@ -56,7 +40,7 @@ struct s32_pinctrl_soc_info {
> >         unsigned int npins;
> >         struct s32_pin_group *groups;
> >         unsigned int ngroups;
> > -       struct s32_pmx_func *functions;
> > +       struct pinfunction *functions;
> >         unsigned int nfunctions;
> >         unsigned int grp_index;
> >         const struct s32_pin_range *mem_pin_ranges;
> > diff --git a/drivers/pinctrl/nxp/pinctrl-s32cc.c b/drivers/pinctrl/nxp/pinctrl-s32cc.c
> > index cb8a0844c0fa..4ed0cc905232 100644
> > --- a/drivers/pinctrl/nxp/pinctrl-s32cc.c
> > +++ b/drivers/pinctrl/nxp/pinctrl-s32cc.c
> > @@ -188,7 +188,7 @@ static const char *s32_get_group_name(struct pinctrl_dev *pctldev,
> >         struct s32_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
> >         const struct s32_pinctrl_soc_info *info = ipctl->info;
> >
> > -       return info->groups[selector].name;
> > +       return info->groups[selector].data.name;
> >  }
> >
> >  static int s32_get_group_pins(struct pinctrl_dev *pctldev,
> > @@ -198,8 +198,8 @@ static int s32_get_group_pins(struct pinctrl_dev *pctldev,
> >         struct s32_pinctrl *ipctl = pinctrl_dev_get_drvdata(pctldev);
> >         const struct s32_pinctrl_soc_info *info = ipctl->info;
> >
> > -       *pins = info->groups[selector].pin_ids;
> > -       *npins = info->groups[selector].npins;
> > +       *pins = info->groups[selector].data.pins;
> > +       *npins = info->groups[selector].data.npins;
> >
> >         return 0;
> >  }
> > @@ -314,23 +314,23 @@ static int s32_pmx_set(struct pinctrl_dev *pctldev, unsigned int selector,
> >         grp = &info->groups[group];
> >
> >         dev_dbg(ipctl->dev, "set mux for function %s group %s\n",
> > -               info->functions[selector].name, grp->name);
> > +               info->functions[selector].name, grp->data.name);
> >
> >         /* Check beforehand so we don't have a partial config. */
> > -       for (i = 0; i < grp->npins; i++) {
> > -               if (s32_check_pin(pctldev, grp->pin_ids[i]) != 0) {
> > +       for (i = 0; i < grp->data.npins; i++) {
> > +               if (s32_check_pin(pctldev, grp->data.pins[i]) != 0) {
> >                         dev_err(info->dev, "invalid pin: %u in group: %u\n",
> > -                               grp->pin_ids[i], group);
> > +                               grp->data.pins[i], group);
> >                         return -EINVAL;
> >                 }
> >         }
> >
> > -       for (i = 0, ret = 0; i < grp->npins && !ret; i++) {
> > -               ret = s32_regmap_update(pctldev, grp->pin_ids[i],
> > +       for (i = 0, ret = 0; i < grp->data.npins && !ret; i++) {
> > +               ret = s32_regmap_update(pctldev, grp->data.pins[i],
> >                                         S32_MSCR_SSS_MASK, grp->pin_sss[i]);
> >                 if (ret) {
> >                         dev_err(info->dev, "Failed to set pin %u\n",
> > -                               grp->pin_ids[i]);
> > +                               grp->data.pins[i]);
> >                         return ret;
> >                 }
> >         }
> > @@ -364,7 +364,7 @@ static int s32_pmx_get_groups(struct pinctrl_dev *pctldev,
> >         const struct s32_pinctrl_soc_info *info = ipctl->info;
> >
> >         *groups = info->functions[selector].groups;
> > -       *num_groups = info->functions[selector].num_groups;
> > +       *num_groups = info->functions[selector].ngroups;
> >
> >         return 0;
> >  }
> > @@ -602,8 +602,8 @@ static int s32_pconf_group_set(struct pinctrl_dev *pctldev, unsigned int selecto
> >         int i, ret;
> >
> >         grp = &info->groups[selector];
> > -       for (i = 0; i < grp->npins; i++) {
> > -               ret = s32_pinconf_mscr_update(pctldev, grp->pin_ids[i],
> > +       for (i = 0; i < grp->data.npins; i++) {
> > +               ret = s32_pinconf_mscr_update(pctldev, grp->data.pins[i],
> >                                               configs, num_configs);
> >                 if (ret)
> >                         return ret;
> > @@ -637,9 +637,9 @@ static void s32_pinconf_group_dbg_show(struct pinctrl_dev *pctldev,
> >
> >         seq_puts(s, "\n");
> >         grp = &info->groups[selector];
> > -       for (i = 0; i < grp->npins; i++) {
> > -               name = pin_get_name(pctldev, grp->pin_ids[i]);
> > -               ret = s32_regmap_read(pctldev, grp->pin_ids[i], &config);
> > +       for (i = 0; i < grp->data.npins; i++) {
> > +               name = pin_get_name(pctldev, grp->data.pins[i]);
> > +               ret = s32_regmap_read(pctldev, grp->data.pins[i], &config);
> >                 if (ret)
> >                         return;
> >                 seq_printf(s, "%s: 0x%x\n", name, config);
> > @@ -732,6 +732,7 @@ static int s32_pinctrl_parse_groups(struct device_node *np,
> >         const __be32 *p;
> >         struct device *dev;
> >         struct property *prop;
> > +       unsigned int *pins, *sss;
> >         int i, npins;
> >         u32 pinmux;
> >
> > @@ -740,38 +741,38 @@ static int s32_pinctrl_parse_groups(struct device_node *np,
> >         dev_dbg(dev, "group: %pOFn\n", np);
> >
> >         /* Initialise group */
> > -       grp->name = np->name;
> > +       grp->data.name = np->name;
> >
> >         npins = of_property_count_elems_of_size(np, "pinmux", sizeof(u32));
> >         if (npins < 0) {
> >                 dev_err(dev, "Failed to read 'pinmux' property in node %s.\n",
> > -                       grp->name);
> > +                       grp->data.name);
> >                 return -EINVAL;
> >         }
> >         if (!npins) {
> > -               dev_err(dev, "The group %s has no pins.\n", grp->name);
> > +               dev_err(dev, "The group %s has no pins.\n", grp->data.name);
> >                 return -EINVAL;
> >         }
> >
> > -       grp->npins = npins;
> > +       grp->data.npins = npins;
> >
> > -       grp->pin_ids = devm_kcalloc(info->dev, grp->npins,
> > -                                   sizeof(unsigned int), GFP_KERNEL);
> > -       grp->pin_sss = devm_kcalloc(info->dev, grp->npins,
> > -                                   sizeof(unsigned int), GFP_KERNEL);
> > -       if (!grp->pin_ids || !grp->pin_sss)
> > +       pins = devm_kcalloc(info->dev, npins, sizeof(*pins), GFP_KERNEL);
> > +       sss = devm_kcalloc(info->dev, npins, sizeof(*sss), GFP_KERNEL);
> > +       if (!pins || !sss)
> >                 return -ENOMEM;
> >
> >         i = 0;
> >         of_property_for_each_u32(np, "pinmux", prop, p, pinmux) {
> > -               grp->pin_ids[i] = get_pin_no(pinmux);
> > -               grp->pin_sss[i] = get_pin_func(pinmux);
> > +               pins[i] = get_pin_no(pinmux);
> > +               sss[i] = get_pin_func(pinmux);
> >
> > -               dev_dbg(info->dev, "pin-id: 0x%x, sss: 0x%x",
> > -                       grp->pin_ids[i], grp->pin_sss[i]);
> > +               dev_dbg(info->dev, "pin: 0x%x, sss: 0x%x", pins[i], sss[i]);
> >                 i++;
> >         }
> >
> > +       grp->data.pins = pins;
> > +       grp->pin_sss = sss;
> > +
> >         return 0;
> >  }
> >
> > @@ -780,8 +781,9 @@ static int s32_pinctrl_parse_functions(struct device_node *np,
> >                                         u32 index)
> >  {
> >         struct device_node *child;
> > -       struct s32_pmx_func *func;
> > +       struct pinfunction *func;
> >         struct s32_pin_group *grp;
> > +       char **groups;
> >         u32 i = 0;
> >         int ret = 0;
> >
> > @@ -791,18 +793,18 @@ static int s32_pinctrl_parse_functions(struct device_node *np,
> >
> >         /* Initialise function */
> >         func->name = np->name;
> > -       func->num_groups = of_get_child_count(np);
> > -       if (func->num_groups == 0) {
> > +       func->ngroups = of_get_child_count(np);
> > +       if (func->ngroups == 0) {
> >                 dev_err(info->dev, "no groups defined in %pOF\n", np);
> >                 return -EINVAL;
> >         }
> > -       func->groups = devm_kcalloc(info->dev, func->num_groups,
> > -                                   sizeof(*func->groups), GFP_KERNEL);
> > -       if (!func->groups)
> > +       groups = devm_kcalloc(info->dev, func->ngroups,
> > +                             sizeof(*func->groups), GFP_KERNEL);
> > +       if (!groups)
> >                 return -ENOMEM;
> >
> >         for_each_child_of_node(np, child) {
> > -               func->groups[i] = child->name;
> > +               groups[i] = (char *)child->name;
> >                 grp = &info->groups[info->grp_index++];
> >                 ret = s32_pinctrl_parse_groups(child, grp, info);
> >                 if (ret)
> > @@ -810,6 +812,8 @@ static int s32_pinctrl_parse_functions(struct device_node *np,
> >                 i++;
> >         }
> >
> > +       func->groups = (const char **)groups;
> 
> Hmm... Why is casting needed?

It's used for fulfilling the type checking done by kbuild otherwise an error will occur:

drivers/pinctrl/nxp/pinctrl-s32cc.c:815:22: error: assignment to 'const char * const*' from incompatible pointer type 'char **' [-Werror=incompatible-pointer-types]

In 'struct pinfunction', the member 'groups' is declared as (const char * const *).

Regards,
Chester

> 
> >         return 0;
> >  }
> 
> -- 
> With Best Regards,
> Andy Shevchenko

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2023-03-21  5:11 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-03-20 16:38 [PATCH v2 0/4] pinctrl: s32: driver improvements and generic struct use Chester Lin
2023-03-20 16:38 ` Chester Lin
2023-03-20 16:38 ` [PATCH v2 1/4] pinctrl: s32: use of_device_get_match_data() to get device data Chester Lin
2023-03-20 16:38   ` Chester Lin
2023-03-20 16:59   ` Andy Shevchenko
2023-03-20 16:59     ` Andy Shevchenko
2023-03-21  4:44     ` Chester Lin
2023-03-21  4:44       ` Chester Lin
2023-03-21  7:32       ` Andy Shevchenko
2023-03-21  7:32         ` Andy Shevchenko
2023-03-20 16:38 ` [PATCH v2 2/4] pinctrl: s32: refine error/return/config checks and simplify driver codes Chester Lin
2023-03-20 16:38   ` Chester Lin
2023-03-20 16:38 ` [PATCH v2 3/4] pinctrl: s32cc: refactor pin config parsing Chester Lin
2023-03-20 16:38   ` Chester Lin
2023-03-20 17:06   ` Andy Shevchenko
2023-03-20 17:06     ` Andy Shevchenko
2023-03-21  5:01     ` Chester Lin
2023-03-21  5:01       ` Chester Lin
2023-03-20 16:38 ` [PATCH v2 4/4] pinctrl: s32cc: embed generic struct pingroup and pinfunction Chester Lin
2023-03-20 16:38   ` Chester Lin
2023-03-20 17:10   ` Andy Shevchenko
2023-03-20 17:10     ` Andy Shevchenko
2023-03-21  5:09     ` Chester Lin [this message]
2023-03-21  5:09       ` Chester Lin
2023-03-21  7:39       ` Andy Shevchenko
2023-03-21  7:39         ` Andy Shevchenko

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=ZBk7/h4nquwZShv1@linux-8mug \
    --to=clin@suse.com \
    --cc=Ghennadi.Procopciuc@oss.nxp.com \
    --cc=afaerber@suse.de \
    --cc=andrei.stefanescu@nxp.com \
    --cc=andy.shevchenko@gmail.com \
    --cc=linus.walleij@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-gpio@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mbrugger@suse.com \
    --cc=radu-nicolae.pirea@nxp.com \
    --cc=s32@nxp.com \
    /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: link
Be 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.