diff options
Diffstat (limited to 'drivers/gpio/gpio-aggregator.c')
| -rw-r--r-- | drivers/gpio/gpio-aggregator.c | 25 | 
1 files changed, 11 insertions, 14 deletions
diff --git a/drivers/gpio/gpio-aggregator.c b/drivers/gpio/gpio-aggregator.c index 34e35b64dcdc..e9671d1660ef 100644 --- a/drivers/gpio/gpio-aggregator.c +++ b/drivers/gpio/gpio-aggregator.c @@ -247,6 +247,11 @@ struct gpiochip_fwd {  	unsigned long tmp[];		/* values and descs for multiple ops */  }; +#define fwd_tmp_values(fwd)	&(fwd)->tmp[0] +#define fwd_tmp_descs(fwd)	(void *)&(fwd)->tmp[BITS_TO_LONGS((fwd)->chip.ngpio)] + +#define fwd_tmp_size(ngpios)	(BITS_TO_LONGS((ngpios)) + (ngpios)) +  static int gpio_fwd_get_direction(struct gpio_chip *chip, unsigned int offset)  {  	struct gpiochip_fwd *fwd = gpiochip_get_data(chip); @@ -279,15 +284,11 @@ static int gpio_fwd_get(struct gpio_chip *chip, unsigned int offset)  static int gpio_fwd_get_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,  				 unsigned long *bits)  { -	struct gpio_desc **descs; -	unsigned long *values; +	struct gpio_desc **descs = fwd_tmp_descs(fwd); +	unsigned long *values = fwd_tmp_values(fwd);  	unsigned int i, j = 0;  	int error; -	/* Both values bitmap and desc pointers are stored in tmp[] */ -	values = &fwd->tmp[0]; -	descs = (void *)&fwd->tmp[BITS_TO_LONGS(fwd->chip.ngpio)]; -  	bitmap_clear(values, 0, fwd->chip.ngpio);  	for_each_set_bit(i, mask, fwd->chip.ngpio)  		descs[j++] = fwd->descs[i]; @@ -333,14 +334,10 @@ static void gpio_fwd_set(struct gpio_chip *chip, unsigned int offset, int value)  static void gpio_fwd_set_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,  				  unsigned long *bits)  { -	struct gpio_desc **descs; -	unsigned long *values; +	struct gpio_desc **descs = fwd_tmp_descs(fwd); +	unsigned long *values = fwd_tmp_values(fwd);  	unsigned int i, j = 0; -	/* Both values bitmap and desc pointers are stored in tmp[] */ -	values = &fwd->tmp[0]; -	descs = (void *)&fwd->tmp[BITS_TO_LONGS(fwd->chip.ngpio)]; -  	for_each_set_bit(i, mask, fwd->chip.ngpio) {  		__assign_bit(j, values, test_bit(i, bits));  		descs[j++] = fwd->descs[i]; @@ -398,8 +395,8 @@ static struct gpiochip_fwd *gpiochip_fwd_create(struct device *dev,  	unsigned int i;  	int error; -	fwd = devm_kzalloc(dev, struct_size(fwd, tmp, -			   BITS_TO_LONGS(ngpios) + ngpios), GFP_KERNEL); +	fwd = devm_kzalloc(dev, struct_size(fwd, tmp, fwd_tmp_size(ngpios)), +			   GFP_KERNEL);  	if (!fwd)  		return ERR_PTR(-ENOMEM);  | 
