On 2018-09-01 00:56, Janusz Krzysztofik wrote:
> Most users of get/set array functions iterate consecutive bits of data,
> usually a single integer, while processing array of results obtained
> from, or building an array of values to be passed to those functions.
> Save time wasted on those iterations by changing the functions' API to
> accept bitmaps.
> 
> All current users are updated as well.
> 
> More benefits from the change are expected as soon as planned support
> for accepting/passing those bitmaps directly from/to respective GPIO
> chip callbacks if applicable is implemented.

> diff --git a/drivers/i2c/muxes/i2c-mux-gpio.c 
> b/drivers/i2c/muxes/i2c-mux-gpio.c
> index 401308e3d036..e28ddc20000d 100644
> --- a/drivers/i2c/muxes/i2c-mux-gpio.c
> +++ b/drivers/i2c/muxes/i2c-mux-gpio.c
> @@ -22,18 +22,16 @@ struct gpiomux {
>       struct i2c_mux_gpio_platform_data data;
>       unsigned gpio_base;
>       struct gpio_desc **gpios;
> -     int *values;
>  };
>  
>  static void i2c_mux_gpio_set(const struct gpiomux *mux, unsigned val)
>  {
> -     int i;
> -
> -     for (i = 0; i < mux->data.n_gpios; i++)
> -             mux->values[i] = (val >> i) & 1;
> +     DECLARE_BITMAP(value_bitmap, mux->data.n_gpios);

Picking a random driver for this comment, it applies to many of them.

I think this creates a VLA? Can't you, for the bit-count, just go with
BITS_PER_TYPE(unsigned)? Or whatever is appropriate for the driver
in question.

Also, I find that where you use DECLARE_BITMAP, the _bitmap suffix is
just noise and I would very much like to zap it.

Cheers,
Peter

> +     
> +     *value_bitmap = val;
>  
>       gpiod_set_array_value_cansleep(mux->data.n_gpios,
> -                                    mux->gpios, mux->values);
> +                                    mux->gpios, value_bitmap);
>  }
>  
>  static int i2c_mux_gpio_select(struct i2c_mux_core *muxc, u32 chan)
> @@ -182,15 +180,13 @@ static int i2c_mux_gpio_probe(struct platform_device 
> *pdev)
>               return -EPROBE_DEFER;
>  
>       muxc = i2c_mux_alloc(parent, &pdev->dev, mux->data.n_values,
> -                          mux->data.n_gpios * sizeof(*mux->gpios) +
> -                          mux->data.n_gpios * sizeof(*mux->values), 0,
> +                          mux->data.n_gpios * sizeof(*mux->gpios), 0,
>                            i2c_mux_gpio_select, NULL);
>       if (!muxc) {
>               ret = -ENOMEM;
>               goto alloc_failed;
>       }
>       mux->gpios = muxc->priv;
> -     mux->values = (int *)(mux->gpios + mux->data.n_gpios);
>       muxc->priv = mux;
>  
>       platform_set_drvdata(pdev, muxc);
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to