Eric Wong <e@xxxxxxxxx> writes: > Bjørn Mork <bjorn@xxxxxxx> wrote: > >> And then I believe you have a busy loop here: >> >> > @@ -3815,20 +3838,20 @@ static int adaptive_keyboard_set_mode(int new_mode) >> > >> > static int adaptive_keyboard_get_next_mode(int mode) >> > { >> > - size_t i; >> > - size_t max_mode = ARRAY_SIZE(adaptive_keyboard_modes) - 1; >> > - >> > - for (i = 0; i <= max_mode; i++) { >> > - if (adaptive_keyboard_modes[i] == mode) >> > - break; >> > - } >> > + int max_mode = fls(adaptive_kbd_modes); >> > + int new_mode = mode >= max_mode ? HOME_MODE : mode + 1; >> > >> > - if (i >= max_mode) >> > - i = 0; >> > - else >> > - i++; >> > + /* make sure the new mode is allowed by the user */ >> > + while (!(adaptive_kbd_modes & (1 << new_mode))) { >> > + new_mode++; >> > + if (new_mode > max_mode) >> > + new_mode = HOME_MODE; >> > >> > - return adaptive_keyboard_modes[i]; >> > + /* maybe the user disabled all other modes: */ >> > + if (new_mode == mode) >> > + return mode; >> > + } >> > + return new_mode; >> > } > > Not a busy loop, since new_mode will reset at HOME_MODE (0) > and then it'll hit "new_mode == mode" and remain locked in > to the current mode. Right. I see it now. Thanks for explaining. I guess I was expecting a complete loop bypass ala if (!max_mode) return mode: but your solution will of course work just as fine. Bjørn