Message ID | 5ec68441ce758b17c21264a1a1bb5ab98b5263e8.1521128287.git.vilhelm.gray@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi William, I love your patch! Yet something to improve: [auto build test ERROR on v4.16-rc4] [also build test ERROR on next-20180316] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/William-Breathitt-Gray/Implement-get_multiple-for-ACCES-and-PC-104-drivers/20180317-224135 config: x86_64-randconfig-x016-201810 (attached as .config) compiler: gcc-7 (Debian 7.3.0-1) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=x86_64 All errors (new ones prefixed by >>): drivers/gpio/gpio-104-idi-48.c: In function 'idi_48_gpio_get_multiple': >> drivers/gpio/gpio-104-idi-48.c:120:3: error: 'word_mask' undeclared (first use in this function); did you mean 'port_mask'? word_mask = mask[word_index] & (port_mask << word_offset); ^~~~~~~~~ port_mask drivers/gpio/gpio-104-idi-48.c:120:3: note: each undeclared identifier is reported only once for each function it appears in >> drivers/gpio/gpio-104-idi-48.c:127:20: error: 'idi48egpio' undeclared (first use in this function); did you mean 'idi48gpio'? port_state = inb(idi48egpio->base + ports[i]); ^~~~~~~~~~ idi48gpio drivers/gpio/gpio-104-idi-48.c:101:16: warning: unused variable 'mask_word' [-Wunused-variable] unsigned long mask_word; ^~~~~~~~~ drivers/gpio/gpio-104-idi-48.c:94:28: warning: unused variable 'idi48gpio' [-Wunused-variable] struct idi_48_gpio *const idi48gpio = gpiochip_get_data(chip); ^~~~~~~~~ vim +120 drivers/gpio/gpio-104-idi-48.c 90 91 static int idi_48_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, 92 unsigned long *bits) 93 { 94 struct idi_48_gpio *const idi48gpio = gpiochip_get_data(chip); 95 size_t i; 96 const size_t ports[] = { 0, 1, 2, 4, 5, 6 }; 97 const unsigned int gpio_reg_size = 8; 98 unsigned int bits_offset; 99 size_t word_index; 100 unsigned int word_offset; 101 unsigned long mask_word; 102 const unsigned long port_mask = GENMASK(gpio_reg_size, 0); 103 unsigned long port_state; 104 105 /* clear bits array to a clean slate */ 106 bitmap_zero(bits, chip->ngpio); 107 108 /* get bits are evaluated a gpio port register at a time */ 109 for (i = 0; i < ARRAY_SIZE(ports); i++) { 110 /* gpio offset in bits array */ 111 bits_offset = i * gpio_reg_size; 112 113 /* word index for bits array */ 114 word_index = BIT_WORD(bits_offset); 115 116 /* gpio offset within current word of bits array */ 117 word_offset = bits_offset % BITS_PER_LONG; 118 119 /* mask of get bits for current gpio within current word */ > 120 word_mask = mask[word_index] & (port_mask << word_offset); 121 if (!word_mask) { 122 /* no get bits in this port so skip to next one */ 123 continue; 124 } 125 126 /* read bits from current gpio port */ > 127 port_state = inb(idi48egpio->base + ports[i]); 128 129 /* store acquired bits at respective bits array offset */ 130 bits[word_index] |= port_state << word_offset; 131 } 132 133 return 0; 134 } 135 --- 0-DAY kernel test infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation
diff --git a/drivers/gpio/gpio-104-idi-48.c b/drivers/gpio/gpio-104-idi-48.c index add859d59766..1beb6b0591ee 100644 --- a/drivers/gpio/gpio-104-idi-48.c +++ b/drivers/gpio/gpio-104-idi-48.c @@ -88,6 +88,51 @@ static int idi_48_gpio_get(struct gpio_chip *chip, unsigned offset) return 0; } +static int idi_48_gpio_get_multiple(struct gpio_chip *chip, unsigned long *mask, + unsigned long *bits) +{ + struct idi_48_gpio *const idi48gpio = gpiochip_get_data(chip); + size_t i; + const size_t ports[] = { 0, 1, 2, 4, 5, 6 }; + const unsigned int gpio_reg_size = 8; + unsigned int bits_offset; + size_t word_index; + unsigned int word_offset; + unsigned long mask_word; + const unsigned long port_mask = GENMASK(gpio_reg_size, 0); + unsigned long port_state; + + /* clear bits array to a clean slate */ + bitmap_zero(bits, chip->ngpio); + + /* get bits are evaluated a gpio port register at a time */ + for (i = 0; i < ARRAY_SIZE(ports); i++) { + /* gpio offset in bits array */ + bits_offset = i * gpio_reg_size; + + /* word index for bits array */ + word_index = BIT_WORD(bits_offset); + + /* gpio offset within current word of bits array */ + word_offset = bits_offset % BITS_PER_LONG; + + /* mask of get bits for current gpio within current word */ + word_mask = mask[word_index] & (port_mask << word_offset); + if (!word_mask) { + /* no get bits in this port so skip to next one */ + continue; + } + + /* read bits from current gpio port */ + port_state = inb(idi48egpio->base + ports[i]); + + /* store acquired bits at respective bits array offset */ + bits[word_index] |= port_state << word_offset; + } + + return 0; +} + static void idi_48_irq_ack(struct irq_data *data) { } @@ -256,6 +301,7 @@ static int idi_48_probe(struct device *dev, unsigned int id) idi48gpio->chip.get_direction = idi_48_gpio_get_direction; idi48gpio->chip.direction_input = idi_48_gpio_direction_input; idi48gpio->chip.get = idi_48_gpio_get; + idi48gpio->chip.get_multiple = idi_48_gpio_get_multiple; idi48gpio->base = base[id]; raw_spin_lock_init(&idi48gpio->lock);
The ACCES I/O 104-IDI-48 series of devices provides 48 optically-isolated inputs accessed via six 8-bit ports. Since eight input lines are acquired on a single port input read, the 104-IDI-48 GPIO driver may improve multiple input reads by utilizing a get_multiple callback. This patch implements the idi_48_gpio_get_multiple function which serves as the respective get_multiple callback. Signed-off-by: William Breathitt Gray <vilhelm.gray@gmail.com> --- drivers/gpio/gpio-104-idi-48.c | 46 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+)