if (banked_p)
                f.pre_div = ns_to_pre_div(&rcg->p[bank], ns) + 1;
 
-       f.src = index;
+       f.src = qcom_find_src_index(hw, rcg->s[bank].parent_map, index);
        return configure_bank(rcg, &f);
 }
 
 static long _freq_tbl_determine_rate(struct clk_hw *hw,
                const struct freq_tbl *f, unsigned long rate,
                unsigned long min_rate, unsigned long max_rate,
-               unsigned long *p_rate, struct clk_hw **p_hw)
+               unsigned long *p_rate, struct clk_hw **p_hw,
+               const struct parent_map *parent_map)
 {
        unsigned long clk_flags;
        struct clk *p;
+       int index;
 
        f = qcom_find_freq(f, rate);
        if (!f)
                return -EINVAL;
 
+       index = qcom_find_src_index(hw, parent_map, f->src);
+       if (index < 0)
+               return index;
+
        clk_flags = __clk_get_flags(hw->clk);
-       p = clk_get_parent_by_index(hw->clk, f->src);
+       p = clk_get_parent_by_index(hw->clk, index);
        if (clk_flags & CLK_SET_RATE_PARENT) {
                rate = rate * f->pre_div;
                if (f->n) {
        struct clk_rcg *rcg = to_clk_rcg(hw);
 
        return _freq_tbl_determine_rate(hw, rcg->freq_tbl, rate, min_rate,
-                       max_rate, p_rate, p);
+                       max_rate, p_rate, p, rcg->s.parent_map);
 }
 
 static long clk_dyn_rcg_determine_rate(struct clk_hw *hw, unsigned long rate,
                unsigned long *p_rate, struct clk_hw **p)
 {
        struct clk_dyn_rcg *rcg = to_clk_dyn_rcg(hw);
+       u32 reg;
+       int bank;
+       struct src_sel *s;
+
+       regmap_read(rcg->clkr.regmap, rcg->bank_reg, ®);
+       bank = reg_to_bank(rcg, reg);
+       s = &rcg->s[bank];
 
        return _freq_tbl_determine_rate(hw, rcg->freq_tbl, rate, min_rate,
-                       max_rate, p_rate, p);
+                       max_rate, p_rate, p, s->parent_map);
 }
 
 static long clk_rcg_bypass_determine_rate(struct clk_hw *hw, unsigned long rate,
        struct clk_rcg *rcg = to_clk_rcg(hw);
        const struct freq_tbl *f = rcg->freq_tbl;
        struct clk *p;
+       int index = qcom_find_src_index(hw, rcg->s.parent_map, f->src);
 
-       p = clk_get_parent_by_index(hw->clk, f->src);
+       p = clk_get_parent_by_index(hw->clk, index);
        *p_hw = __clk_get_hw(p);
        *p_rate = __clk_round_rate(p, rate);
 
 
 {
        unsigned long clk_flags;
        struct clk *p;
+       struct clk_rcg2 *rcg = to_clk_rcg2(hw);
+       int index;
 
        f = qcom_find_freq(f, rate);
        if (!f)
                return -EINVAL;
 
+       index = qcom_find_src_index(hw, rcg->parent_map, f->src);
+       if (index < 0)
+               return index;
+
        clk_flags = __clk_get_flags(hw->clk);
-       p = clk_get_parent_by_index(hw->clk, f->src);
+       p = clk_get_parent_by_index(hw->clk, index);
        if (clk_flags & CLK_SET_RATE_PARENT) {
                if (f->pre_div) {
                        rate /= 2;
        s64 request;
        u32 mask = BIT(rcg->hid_width) - 1;
        u32 hid_div;
+       int index = qcom_find_src_index(hw, rcg->parent_map, f->src);
 
        /* Force the correct parent */
-       *p = __clk_get_hw(clk_get_parent_by_index(hw->clk, f->src));
+       *p = __clk_get_hw(clk_get_parent_by_index(hw->clk, index));
 
        if (src_rate == 810000000)
                frac = frac_table_810m;
 {
        struct clk_rcg2 *rcg = to_clk_rcg2(hw);
        const struct freq_tbl *f = rcg->freq_tbl;
+       int index = qcom_find_src_index(hw, rcg->parent_map, f->src);
        unsigned long parent_rate, div;
        u32 mask = BIT(rcg->hid_width) - 1;
        struct clk *p;
        if (rate == 0)
                return -EINVAL;
 
-       p = clk_get_parent_by_index(hw->clk, f->src);
+       p = clk_get_parent_by_index(hw->clk, index);
        *p_hw = __clk_get_hw(p);
        *p_rate = parent_rate = __clk_round_rate(p, rate);
 
        int delta = 100000;
        const struct freq_tbl *f = rcg->freq_tbl;
        const struct frac_entry *frac = frac_table_pixel;
-       struct clk *parent = clk_get_parent_by_index(hw->clk, f->src);
+       int index = qcom_find_src_index(hw, rcg->parent_map, f->src);
+       struct clk *parent = clk_get_parent_by_index(hw->clk, index);
 
        *p = __clk_get_hw(parent);
 
        int delta = 100000;
        u32 mask = BIT(rcg->hid_width) - 1;
        u32 hid_div;
-       struct clk *parent = clk_get_parent_by_index(hw->clk, f.src);
+       int index = qcom_find_src_index(hw, rcg->parent_map, f.src);
+       struct clk *parent = clk_get_parent_by_index(hw->clk, index);
 
        for (; frac->num; frac++) {
                request = (rate * frac->den) / frac->num;