• Keerthy's avatar
    pinctrl: single: Fix pcs_parse_bits_in_pinctrl_entry to use __ffs than ffs · 9f31dbd9
    Keerthy authored
    [ Upstream commit 56b367c0 ]
    
    pcs_parse_bits_in_pinctrl_entry uses ffs which gives bit indices
    ranging from 1 to MAX. This leads to a corner case where we try to request
    the pin number = MAX and fails.
    
    bit_pos value is being calculted using ffs. pin_num_from_lsb uses
    bit_pos value. pins array is populated with:
    
    pin + pin_num_from_lsb.
    
    The above is 1 more than usual bit indices as bit_pos uses ffs to compute
    first set bit. Hence the last of the pins array is populated with the MAX
    value and not MAX - 1 which causes error when we call pin_request.
    
    mask_pos is rightly calculated as ((pcs->fmask) << (bit_pos - 1))
    Consequently val_pos and submask are correct.
    
    Hence use __ffs which gives (ffs(x) - 1) as the first bit set.
    
    fixes: 4e7e8017 ("pinctrl: pinctrl-single: enhance to configure multiple pins of different modules")
    Signed-off-by: default avatarKeerthy <j-keerthy@ti.com>
    Acked-by: default avatarTony Lindgren <tony@atomide.com>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    Signed-off-by: default avatarSasha Levin <sasha.levin@oracle.com>
    9f31dbd9
pinctrl-single.c 49.1 KB