struct ingenic_cgu *cgu = ingenic_clk->cgu;
        unsigned long rate = parent_rate;
        u32 div_reg, div;
+       u8 parent;
 
        if (clk_info->type & CGU_CLK_DIV) {
-               div_reg = readl(cgu->base + clk_info->div.reg);
-               div = (div_reg >> clk_info->div.shift) &
-                     GENMASK(clk_info->div.bits - 1, 0);
+               parent = ingenic_clk_get_parent(hw);
 
-               if (clk_info->div.div_table)
-                       div = clk_info->div.div_table[div];
-               else
-                       div = (div + 1) * clk_info->div.div;
+               if (!(clk_info->div.bypass_mask & BIT(parent))) {
+                       div_reg = readl(cgu->base + clk_info->div.reg);
+                       div = (div_reg >> clk_info->div.shift) &
+                             GENMASK(clk_info->div.bits - 1, 0);
+
+                       if (clk_info->div.div_table)
+                               div = clk_info->div.div_table[div];
+                       else
+                               div = (div + 1) * clk_info->div.div;
 
-               rate /= div;
+                       rate /= div;
+               }
        } else if (clk_info->type & CGU_CLK_FIXDIV) {
                rate /= clk_info->fixdiv.div;
        }
 }
 
 static unsigned
-ingenic_clk_calc_div(const struct ingenic_cgu_clk_info *clk_info,
+ingenic_clk_calc_div(struct clk_hw *hw,
+                    const struct ingenic_cgu_clk_info *clk_info,
                     unsigned long parent_rate, unsigned long req_rate)
 {
        unsigned int div, hw_div;
+       u8 parent;
+
+       parent = ingenic_clk_get_parent(hw);
+       if (clk_info->div.bypass_mask & BIT(parent))
+               return 1;
 
        /* calculate the divide */
        div = DIV_ROUND_UP(parent_rate, req_rate);
        unsigned int div = 1;
 
        if (clk_info->type & CGU_CLK_DIV)
-               div = ingenic_clk_calc_div(clk_info, *parent_rate, req_rate);
+               div = ingenic_clk_calc_div(hw, clk_info, *parent_rate, req_rate);
        else if (clk_info->type & CGU_CLK_FIXDIV)
                div = clk_info->fixdiv.div;
        else if (clk_hw_can_set_rate_parent(hw))
        int ret = 0;
 
        if (clk_info->type & CGU_CLK_DIV) {
-               div = ingenic_clk_calc_div(clk_info, parent_rate, req_rate);
+               div = ingenic_clk_calc_div(hw, clk_info, parent_rate, req_rate);
                rate = DIV_ROUND_UP(parent_rate, div);
 
                if (rate != req_rate)
 
  *          isn't one
  * @busy_bit: the index of the busy bit within reg, or -1 if there isn't one
  * @stop_bit: the index of the stop bit within reg, or -1 if there isn't one
+ * @bypass_mask: mask of parent clocks for which the divider does not apply
  * @div_table: optional table to map the value read from the register to the
  *             actual divider value
  */
        s8 ce_bit;
        s8 busy_bit;
        s8 stop_bit;
+       u8 bypass_mask;
        const u8 *div_table;
 };
 
 
                "pll half", CGU_CLK_DIV,
                .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 21, 1, 1, -1, -1, -1,
+                       CGU_REG_CPCCR, 21, 1, 1, -1, -1, -1, 0,
                        jz4725b_cgu_pll_half_div_table,
                },
        },
                "cclk", CGU_CLK_DIV,
                .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
                        jz4725b_cgu_cpccr_div_table,
                },
        },
                "hclk", CGU_CLK_DIV,
                .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1, 0,
                        jz4725b_cgu_cpccr_div_table,
                },
        },
                "pclk", CGU_CLK_DIV,
                .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1, 0,
                        jz4725b_cgu_cpccr_div_table,
                },
        },
                "mclk", CGU_CLK_DIV,
                .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1, 0,
                        jz4725b_cgu_cpccr_div_table,
                },
        },
                "ipu", CGU_CLK_DIV | CGU_CLK_GATE,
                .parents = { JZ4725B_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1, 0,
                        jz4725b_cgu_cpccr_div_table,
                },
                .gate = { CGU_REG_CLKGR, 13 },
 
                "pll half", CGU_CLK_DIV,
                .parents = { JZ4740_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 21, 1, 1, -1, -1, -1,
+                       CGU_REG_CPCCR, 21, 1, 1, -1, -1, -1, 0,
                        jz4740_cgu_pll_half_div_table,
                },
        },
                "cclk", CGU_CLK_DIV,
                .parents = { JZ4740_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
                        jz4740_cgu_cpccr_div_table,
                },
        },
                "hclk", CGU_CLK_DIV,
                .parents = { JZ4740_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1, 0,
                        jz4740_cgu_cpccr_div_table,
                },
        },
                "pclk", CGU_CLK_DIV,
                .parents = { JZ4740_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1, 0,
                        jz4740_cgu_cpccr_div_table,
                },
        },
                "mclk", CGU_CLK_DIV,
                .parents = { JZ4740_CLK_PLL, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1, 0,
                        jz4740_cgu_cpccr_div_table,
                },
        },
                "lcd", CGU_CLK_DIV | CGU_CLK_GATE,
                .parents = { JZ4740_CLK_PLL_HALF, -1, -1, -1 },
                .div = {
-                       CGU_REG_CPCCR, 16, 1, 5, 22, -1, -1,
+                       CGU_REG_CPCCR, 16, 1, 5, 22, -1, -1, 0,
                        jz4740_cgu_cpccr_div_table,
                },
                .gate = { CGU_REG_CLKGR, 10 },
 
                "cclk", CGU_CLK_DIV,
                .parents = { JZ4770_CLK_PLL0, },
                .div = {
-                       CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 0, 1, 4, 22, -1, -1, 0,
                        jz4770_cgu_cpccr_div_table,
                },
        },
                "h0clk", CGU_CLK_DIV,
                .parents = { JZ4770_CLK_PLL0, },
                .div = {
-                       CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 4, 1, 4, 22, -1, -1, 0,
                        jz4770_cgu_cpccr_div_table,
                },
        },
                "h1clk", CGU_CLK_DIV | CGU_CLK_GATE,
                .parents = { JZ4770_CLK_PLL0, },
                .div = {
-                       CGU_REG_CPCCR, 24, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 24, 1, 4, 22, -1, -1, 0,
                        jz4770_cgu_cpccr_div_table,
                },
                .gate = { CGU_REG_CLKGR1, 7 },
                "h2clk", CGU_CLK_DIV,
                .parents = { JZ4770_CLK_PLL0, },
                .div = {
-                       CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 16, 1, 4, 22, -1, -1, 0,
                        jz4770_cgu_cpccr_div_table,
                },
        },
                "c1clk", CGU_CLK_DIV | CGU_CLK_GATE,
                .parents = { JZ4770_CLK_PLL0, },
                .div = {
-                       CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 12, 1, 4, 22, -1, -1, 0,
                        jz4770_cgu_cpccr_div_table,
                },
                .gate = { CGU_REG_OPCR, 31, true }, // disable CCLK stop on idle
                "pclk", CGU_CLK_DIV,
                .parents = { JZ4770_CLK_PLL0, },
                .div = {
-                       CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1,
+                       CGU_REG_CPCCR, 8, 1, 4, 22, -1, -1, 0,
                        jz4770_cgu_cpccr_div_table,
                },
        },