diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2021-11-08 11:55:21 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2021-11-08 11:55:21 -0800 | 
| commit | d20f7a09e5eeeeef5db679adc9a490fecb6a4c87 (patch) | |
| tree | 94a01e0ba407a5cd41ab05ec624807658a36b54f /drivers/gpio/gpio-aggregator.c | |
| parent | dd72945c43d34bee496b847e021069dc31f7398f (diff) | |
| parent | 7d0003da6297eb128f3490e396e6fc6df71557cd (diff) | |
Merge tag 'gpio-updates-for-v5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux
Pull gpio updates from Bartosz Golaszewski:
 "We have a single new driver, new features in others and some cleanups
  all over the place.
  Nothing really stands out and it is all relatively small.
   - new driver: gpio-modepin (plus relevant change in zynqmp firmware)
   - add interrupt support to gpio-virtio
   - enable the 'gpio-line-names' property in the DT bindings for
     gpio-rockchip
   - use the subsystem helpers where applicable in gpio-uniphier instead
     of accessing IRQ structures directly
   - code shrink in gpio-xilinx
   - add interrupt to gpio-mlxbf2 (and include the removal of custom
     interrupt code from the mellanox ethernet driver)
   - support multiple interrupts per bank in gpio-tegra186 (and force
     one interrupt per bank in older models)
   - fix GPIO line IRQ offset calculation in gpio-realtek-otto
   - drop unneeded MODULE_ALIAS expansions in multiple drivers
   - code cleanup in gpio-aggregator
   - minor improvements in gpio-max730x and gpio-mc33880
   - Kconfig cleanups"
* tag 'gpio-updates-for-v5.16' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux:
  virtio_gpio: drop packed attribute
  gpio: virtio: Add IRQ support
  gpio: realtek-otto: fix GPIO line IRQ offset
  gpio: clean up Kconfig file
  net: mellanox: mlxbf_gige: Replace non-standard interrupt handling
  gpio: mlxbf2: Introduce IRQ support
  gpio: mc33880: Drop if with an always false condition
  gpio: max730x: Make __max730x_remove() return void
  gpio: aggregator: Wrap access to gpiochip_fwd.tmp[]
  gpio: modepin: Add driver support for modepin GPIO controller
  dt-bindings: gpio: zynqmp: Add binding documentation for modepin
  firmware: zynqmp: Add MMIO read and write support for PS_MODE pin
  gpio: tps65218: drop unneeded MODULE_ALIAS
  gpio: max77620: drop unneeded MODULE_ALIAS
  gpio: xilinx: simplify getting .driver_data
  gpio: tegra186: Support multiple interrupts per bank
  gpio: tegra186: Force one interrupt per bank
  gpio: uniphier: Use helper functions to get private data from IRQ data
  gpio: uniphier: Use helper function to get IRQ hardware number
  dt-bindings: gpio: add gpio-line-names to rockchip,gpio-bank.yaml
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);  | 
