On Mon, Sep 3, 2018 at 6:31 AM Matthew Wilcox <willy@xxxxxxxxxxxxx> wrote: > > +++ b/drivers/auxdisplay/hd44780.c > > @@ -62,17 +62,12 @@ static void hd44780_strobe_gpio(struct hd44780 *hd) > > /* write to an LCD panel register in 8 bit GPIO mode */ > > static void hd44780_write_gpio8(struct hd44780 *hd, u8 val, unsigned int rs) > > { > > - int values[10]; /* for DATA[0-7], RS, RW */ > > - unsigned int i, n; > > - > > - for (i = 0; i < 8; i++) > > - values[PIN_DATA0 + i] = !!(val & BIT(i)); > > - values[PIN_CTRL_RS] = rs; > > - n = 9; > > - if (hd->pins[PIN_CTRL_RW]) { > > - values[PIN_CTRL_RW] = 0; > > - n++; > > - } > > + DECLARE_BITMAP(values, 10); /* for DATA[0-7], RS, RW */ > > + unsigned int n; > > + > > + *values = val; > > + __assign_bit(8, values, rs); > > + n = hd->pins[PIN_CTRL_RW] ? 10 : 9; > > Doesn't this assume little endian bitmaps? Has anyone tested this on > big-endian machines? include/linux/bitops.h: static __always_inline void __assign_bit(long nr, volatile unsigned long *addr, bool value) { if (value) __set_bit(nr, addr); else __clear_bit(nr, addr); } include/asm-generic/bitops/non-atomic.h: static inline void __set_bit(int nr, volatile unsigned long *addr) { unsigned long mask = BIT_MASK(nr); unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr); *p |= mask; } include/linux/bits.h: #define BIT_MASK(nr) (1UL << ((nr) % BITS_PER_LONG)) Looks like native endianness to me. Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@xxxxxxxxxxxxxx In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds