diff mbox series

[V2,1/4] pinctrl: imx: prepare for making "group_names" in "function_desc" const

Message ID 20211216162206.8027-1-zajec5@gmail.com (mailing list archive)
State New, archived
Headers show
Series [V2,1/4] pinctrl: imx: prepare for making "group_names" in "function_desc" const | expand

Commit Message

Rafał Miłecki Dec. 16, 2021, 4:22 p.m. UTC
From: Rafał Miłecki <rafal@milecki.pl>

The plan for "struct function_desc" is to make its "group_names"
/double/ const. That will allow drivers to use it with static const
data.

This imx change is required to avoid:
drivers/pinctrl/freescale/pinctrl-imx.c: In function 'imx_pinctrl_parse_functions':
drivers/pinctrl/freescale/pinctrl-imx.c:672:24: error: assignment of read-only location '*(func->group_names + (sizetype)(i * 4))'
  672 |   func->group_names[i] = child->name;
      |                        ^

Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
---
 drivers/pinctrl/freescale/pinctrl-imx.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

Comments

Andy Shevchenko Dec. 17, 2021, 9:39 a.m. UTC | #1
On Fri, Dec 17, 2021 at 1:54 AM Rafał Miłecki <zajec5@gmail.com> wrote:
>
> From: Rafał Miłecki <rafal@milecki.pl>
>
> The plan for "struct function_desc" is to make its "group_names"
> /double/ const. That will allow drivers to use it with static const
> data.

Good plan, I support it!

> This imx change is required to avoid:
> drivers/pinctrl/freescale/pinctrl-imx.c: In function 'imx_pinctrl_parse_functions':
> drivers/pinctrl/freescale/pinctrl-imx.c:672:24: error: assignment of read-only location '*(func->group_names + (sizetype)(i * 4))'
>   672 |   func->group_names[i] = child->name;
>       |                        ^
Linus Walleij Dec. 22, 2021, 1:58 a.m. UTC | #2
On Thu, Dec 16, 2021 at 5:22 PM Rafał Miłecki <zajec5@gmail.com> wrote:

> From: Rafał Miłecki <rafal@milecki.pl>
>
> The plan for "struct function_desc" is to make its "group_names"
> /double/ const. That will allow drivers to use it with static const
> data.
>
> This imx change is required to avoid:
> drivers/pinctrl/freescale/pinctrl-imx.c: In function 'imx_pinctrl_parse_functions':
> drivers/pinctrl/freescale/pinctrl-imx.c:672:24: error: assignment of read-only location '*(func->group_names + (sizetype)(i * 4))'
>   672 |   func->group_names[i] = child->name;
>       |                        ^
>
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>

Patches applied, let's see what happens!

Yours,
Linus Walleij
Abel Vesa Dec. 22, 2021, 8:24 p.m. UTC | #3
On 21-12-16 17:22:03, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal@milecki.pl>
> 
> The plan for "struct function_desc" is to make its "group_names"
> /double/ const. That will allow drivers to use it with static const
> data.
> 
> This imx change is required to avoid:
> drivers/pinctrl/freescale/pinctrl-imx.c: In function 'imx_pinctrl_parse_functions':
> drivers/pinctrl/freescale/pinctrl-imx.c:672:24: error: assignment of read-only location '*(func->group_names + (sizetype)(i * 4))'
>   672 |   func->group_names[i] = child->name;
>       |                        ^
> 
> Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
> ---
>  drivers/pinctrl/freescale/pinctrl-imx.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c
> index daf28bc5661d..47b2ab1a14d0 100644
> --- a/drivers/pinctrl/freescale/pinctrl-imx.c
> +++ b/drivers/pinctrl/freescale/pinctrl-imx.c
> @@ -648,6 +648,7 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
>  	struct device_node *child;
>  	struct function_desc *func;
>  	struct group_desc *grp;
> +	const char **group_names;
>  	u32 i = 0;
>  
>  	dev_dbg(pctl->dev, "parse function(%d): %pOFn\n", index, np);
> @@ -663,14 +664,16 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
>  		dev_err(ipctl->dev, "no groups defined in %pOF\n", np);
>  		return -EINVAL;
>  	}
> -	func->group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
> -					 sizeof(char *), GFP_KERNEL);
> +
> +	group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
> +				   sizeof(char *), GFP_KERNEL);
>  	if (!func->group_names)
This line needs to be:
  	if (!group_names)

Otherwise, the driver never probes successufully.

Linus, maybe you can squashed this fix in your tree without a resend.

>  		return -ENOMEM;
> +	for_each_child_of_node(np, child)
> +		group_names[i] = child->name;
> +	func->group_names = group_names;
>  
>  	for_each_child_of_node(np, child) {
> -		func->group_names[i] = child->name;
> -
>  		grp = devm_kzalloc(ipctl->dev, sizeof(struct group_desc),
>  				   GFP_KERNEL);
>  		if (!grp) {
> -- 
> 2.31.1
>
Marcel Ziswiler Jan. 1, 2022, 11:55 p.m. UTC | #4
On Wed, 2021-12-22 at 22:24 +0200, Abel Vesa wrote:
> On 21-12-16 17:22:03, Rafał Miłecki wrote:
> > From: Rafał Miłecki <rafal@milecki.pl>
> > 
> > The plan for "struct function_desc" is to make its "group_names"
> > /double/ const. That will allow drivers to use it with static const
> > data.
> > 
> > This imx change is required to avoid:
> > drivers/pinctrl/freescale/pinctrl-imx.c: In function 'imx_pinctrl_parse_functions':
> > drivers/pinctrl/freescale/pinctrl-imx.c:672:24: error: assignment of read-only location '*(func-
> > >group_names + (sizetype)(i * 4))'
> >   672 |   func->group_names[i] = child->name;
> >       |                        ^
> > 
> > Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
> > ---
> >  drivers/pinctrl/freescale/pinctrl-imx.c | 11 +++++++----
> >  1 file changed, 7 insertions(+), 4 deletions(-)
> > 
> > diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c
> > index daf28bc5661d..47b2ab1a14d0 100644
> > --- a/drivers/pinctrl/freescale/pinctrl-imx.c
> > +++ b/drivers/pinctrl/freescale/pinctrl-imx.c
> > @@ -648,6 +648,7 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
> >         struct device_node *child;
> >         struct function_desc *func;
> >         struct group_desc *grp;
> > +       const char **group_names;
> >         u32 i = 0;
> >  
> >         dev_dbg(pctl->dev, "parse function(%d): %pOFn\n", index, np);
> > @@ -663,14 +664,16 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
> >                 dev_err(ipctl->dev, "no groups defined in %pOF\n", np);
> >                 return -EINVAL;
> >         }
> > -       func->group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
> > -                                        sizeof(char *), GFP_KERNEL);
> > +
> > +       group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
> > +                                  sizeof(char *), GFP_KERNEL);
> >         if (!func->group_names)
> This line needs to be:
>         if (!group_names)
> 
> Otherwise, the driver never probes successufully.

After my i.MX 8M Mini target running latest -next just hang early boot I bisected it to this commit.

I can confirm that this fixes it. Thanks!

> Linus, maybe you can squashed this fix in your tree without a resend.
> 
> >                 return -ENOMEM;
> > +       for_each_child_of_node(np, child)
> > +               group_names[i] = child->name;
> > +       func->group_names = group_names;
> >  
> >         for_each_child_of_node(np, child) {
> > -               func->group_names[i] = child->name;
> > -
> >                 grp = devm_kzalloc(ipctl->dev, sizeof(struct group_desc),
> >                                    GFP_KERNEL);
> >                 if (!grp) {
> > -- 
> > 2.31.1
Rafał Miłecki Jan. 1, 2022, 11:58 p.m. UTC | #5
On 2.01.2022 00:55, Marcel Ziswiler wrote:
> On Wed, 2021-12-22 at 22:24 +0200, Abel Vesa wrote:
>>> @@ -663,14 +664,16 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
>>>                  dev_err(ipctl->dev, "no groups defined in %pOF\n", np);
>>>                  return -EINVAL;
>>>          }
>>> -       func->group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
>>> -                                        sizeof(char *), GFP_KERNEL);
>>> +
>>> +       group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
>>> +                                  sizeof(char *), GFP_KERNEL);
>>>          if (!func->group_names)
>> This line needs to be:
>>          if (!group_names)
>>
>> Otherwise, the driver never probes successufully.
> 
> After my i.MX 8M Mini target running latest -next just hang early boot I bisected it to this commit.
> 
> I can confirm that this fixes it. Thanks!

Please note there is one more pending fix. Please apply both:
[PATCH] pinctrl: imx: fix allocation result check
[PATCH] pinctrl: imx: fix assigning groups names
Marcel Ziswiler Jan. 1, 2022, 11:59 p.m. UTC | #6
On Sun, 2022-01-02 at 00:58 +0100, Rafał Miłecki wrote:
> On 2.01.2022 00:55, Marcel Ziswiler wrote:
> > On Wed, 2021-12-22 at 22:24 +0200, Abel Vesa wrote:
> > > > @@ -663,14 +664,16 @@ static int imx_pinctrl_parse_functions(struct device_node *np,
> > > >                  dev_err(ipctl->dev, "no groups defined in %pOF\n", np);
> > > >                  return -EINVAL;
> > > >          }
> > > > -       func->group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
> > > > -                                        sizeof(char *), GFP_KERNEL);
> > > > +
> > > > +       group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
> > > > +                                  sizeof(char *), GFP_KERNEL);
> > > >          if (!func->group_names)
> > > This line needs to be:
> > >          if (!group_names)
> > > 
> > > Otherwise, the driver never probes successufully.
> > 
> > After my i.MX 8M Mini target running latest -next just hang early boot I bisected it to this commit.
> > 
> > I can confirm that this fixes it. Thanks!
> 
> Please note there is one more pending fix. Please apply both:
> [PATCH] pinctrl: imx: fix allocation result check
> [PATCH] pinctrl: imx: fix assigning groups names

Yep, also just noticed that. Thanks!
diff mbox series

Patch

diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c
index daf28bc5661d..47b2ab1a14d0 100644
--- a/drivers/pinctrl/freescale/pinctrl-imx.c
+++ b/drivers/pinctrl/freescale/pinctrl-imx.c
@@ -648,6 +648,7 @@  static int imx_pinctrl_parse_functions(struct device_node *np,
 	struct device_node *child;
 	struct function_desc *func;
 	struct group_desc *grp;
+	const char **group_names;
 	u32 i = 0;
 
 	dev_dbg(pctl->dev, "parse function(%d): %pOFn\n", index, np);
@@ -663,14 +664,16 @@  static int imx_pinctrl_parse_functions(struct device_node *np,
 		dev_err(ipctl->dev, "no groups defined in %pOF\n", np);
 		return -EINVAL;
 	}
-	func->group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
-					 sizeof(char *), GFP_KERNEL);
+
+	group_names = devm_kcalloc(ipctl->dev, func->num_group_names,
+				   sizeof(char *), GFP_KERNEL);
 	if (!func->group_names)
 		return -ENOMEM;
+	for_each_child_of_node(np, child)
+		group_names[i] = child->name;
+	func->group_names = group_names;
 
 	for_each_child_of_node(np, child) {
-		func->group_names[i] = child->name;
-
 		grp = devm_kzalloc(ipctl->dev, sizeof(struct group_desc),
 				   GFP_KERNEL);
 		if (!grp) {