diff --git a/drivers/clk/clk-si521xx.c b/drivers/clk/clk-si521xx.c index 6e3c8e6ccc8d..23d80f060f99 100644 --- a/drivers/clk/clk-si521xx.c +++ b/drivers/clk/clk-si521xx.c @@ -13,6 +13,7 @@ */ #include +#include #include #include #include @@ -255,18 +256,24 @@ static void si521xx_diff_idx_to_reg_bit(const u16 chip_info, const int idx, struct si_clk *clk) { unsigned long mask; - int oe, b, ctr = 0; + unsigned int bit; + int oe = 1; - for (oe = 1; oe <= 2; oe++) { - mask = bitrev8(SI521XX_OE_MAP_GET_OE(oe, chip_info)); - for_each_set_bit(b, &mask, 8) { - if (ctr++ != idx) - continue; - clk->reg = SI521XX_REG_OE(oe); - clk->bit = 7 - b; - return; - } - } + mask = bitrev8(SI521XX_OE_MAP_GET_OE(1, chip_info)); + bit = fns(mask, idx); + if (bit < 8) + goto out; + + oe = 2; + bit = idx - hweight8(mask); + mask = bitrev8(SI521XX_OE_MAP_GET_OE(2, chip_info)); + bit = fns(mask, bit); + if (bit >= 8) + return; + +out: + clk->reg = SI521XX_REG_OE(oe); + clk->bit = 7 - bit; } static struct clk_hw *