Subject: Re: linux-next: build failure after merge of the mfd tree

From: Lee Jones <[email-masked]>
Date: Fri, 17 Jul 2020 07:56:36 +0100

On Fri, 17 Jul 2020, Stephen Rothwell wrote:

> Hi all,
> 
> After merging the mfd tree, today's linux-next build (x86_64 allmodconfig)
> failed like this:
> 
> drivers/mfd/kempld-core.c: In function 'kempld_register_cells_generic':
> drivers/mfd/kempld-core.c:105:13: error: assignment of read-only location 'devs[i++]'
>   105 |   devs[i++] = kempld_devs[KEMPLD_I2C];
>       |             ^
> drivers/mfd/kempld-core.c:108:13: error: assignment of read-only location 'devs[i++]'
>   108 |   devs[i++] = kempld_devs[KEMPLD_WDT];
>       |             ^
> drivers/mfd/kempld-core.c:111:13: error: assignment of read-only location 'devs[i++]'
>   111 |   devs[i++] = kempld_devs[KEMPLD_GPIO];
>       |             ^
> drivers/mfd/kempld-core.c:114:13: error: assignment of read-only location 'devs[i++]'
>   114 |   devs[i++] = kempld_devs[KEMPLD_UART];
>       |             ^
> 
> Caused by commit
> 
>   70d48975c152 ("mfd: core: Make a best effort attempt to match devices with the correct of_nodes")
> 
> I have added the following fix patch for today (I assume that there is
> a better solution):
> 
> From: Stephen Rothwell <[email-masked]>
> Date: Fri, 17 Jul 2020 13:36:22 +1000
> Subject: [PATCH] fix up for struct mfd_cell change
> 
> Fixes: 70d48975c152 ("mfd: core: Make a best effort attempt to match devices with the correct of_nodes")

Thanks for fixing this Stephen.

I need to investigate why this didn't show up during my own testing.
  
> Signed-off-by: Stephen Rothwell <[email-masked]>
> ---
>  drivers/mfd/kempld-core.c | 28 ++++++++++------------------
>  1 file changed, 10 insertions(+), 18 deletions(-)
> 
> diff --git a/drivers/mfd/kempld-core.c b/drivers/mfd/kempld-core.c
> index f48e21d8b97c..ad68ee699cb5 100644
> --- a/drivers/mfd/kempld-core.c
> +++ b/drivers/mfd/kempld-core.c
> @@ -79,39 +79,31 @@ enum kempld_cells {
>  	KEMPLD_UART,
>  };
>  
> -static const struct mfd_cell kempld_devs[] = {
> -	[KEMPLD_I2C] = {
> -		.name = "kempld-i2c",
> -	},
> -	[KEMPLD_WDT] = {
> -		.name = "kempld-wdt",
> -	},
> -	[KEMPLD_GPIO] = {
> -		.name = "kempld-gpio",
> -	},
> -	[KEMPLD_UART] = {
> -		.name = "kempld-uart",
> -	},
> +static const char *kempld_devs[] = {

Do you mind if I change this to 'kempld_dev_names' and still keep your
SoB?

> +	[KEMPLD_I2C] = "kempld-i2c",
> +	[KEMPLD_WDT] = "kempld-wdt",
> +	[KEMPLD_GPIO] = "kempld-gpio",
> +	[KEMPLD_UART] = "kempld-uart",
>  };
>  
>  #define KEMPLD_MAX_DEVS	ARRAY_SIZE(kempld_devs)
>  
>  static int kempld_register_cells_generic(struct kempld_device_data *pld)
>  {
> -	struct mfd_cell devs[KEMPLD_MAX_DEVS];
> +	struct mfd_cell devs[KEMPLD_MAX_DEVS] = {};
>  	int i = 0;
>  
>  	if (pld->feature_mask & KEMPLD_FEATURE_BIT_I2C)
> -		devs[i++] = kempld_devs[KEMPLD_I2C];
> +		devs[i++].name = kempld_devs[KEMPLD_I2C];
>  
>  	if (pld->feature_mask & KEMPLD_FEATURE_BIT_WATCHDOG)
> -		devs[i++] = kempld_devs[KEMPLD_WDT];
> +		devs[i++].name = kempld_devs[KEMPLD_WDT];
>  
>  	if (pld->feature_mask & KEMPLD_FEATURE_BIT_GPIO)
> -		devs[i++] = kempld_devs[KEMPLD_GPIO];
> +		devs[i++].name = kempld_devs[KEMPLD_GPIO];
>  
>  	if (pld->feature_mask & KEMPLD_FEATURE_MASK_UART)
> -		devs[i++] = kempld_devs[KEMPLD_UART];
> +		devs[i++].name = kempld_devs[KEMPLD_UART];
>  
>  	return mfd_add_devices(pld->dev, -1, devs, i, NULL, 0, NULL);
>  }

-- 
Lee Jones [李琼斯]
Senior Technical Lead - Developer Services
Linaro.org │ Open source software for Arm SoCs
Follow Linaro: Facebook | Twitter | Blog