},
 };
 
+/* For GPU PLL, using an output divider for DFS causes system to fail */
 #define SUN50I_H6_PLL_GPU_REG          0x030
 static struct ccu_nkmp pll_gpu_clk = {
        .enable         = BIT(31),
        .lock           = BIT(28),
        .n              = _SUNXI_CCU_MULT_MIN(8, 8, 12),
        .m              = _SUNXI_CCU_DIV(1, 1), /* input divider */
-       .p              = _SUNXI_CCU_DIV(0, 1), /* output divider */
        .common         = {
                .reg            = 0x030,
                .hw.init        = CLK_HW_INIT("pll-gpu", "osc24M",
 static SUNXI_CCU_GATE(bus_deinterlace_clk, "bus-deinterlace", "psi-ahb1-ahb2",
                      0x62c, BIT(0), 0);
 
+/* Keep GPU_CLK divider const to avoid DFS instability. */
 static const char * const gpu_parents[] = { "pll-gpu" };
-static SUNXI_CCU_M_WITH_MUX_GATE(gpu_clk, "gpu", gpu_parents, 0x670,
-                                      0, 3,    /* M */
+static SUNXI_CCU_MUX_WITH_GATE(gpu_clk, "gpu", gpu_parents, 0x670,
                                       24, 1,   /* mux */
                                       BIT(31), /* gate */
                                       CLK_SET_RATE_PARENT);
        if (IS_ERR(reg))
                return PTR_ERR(reg);
 
+       /* Force PLL_GPU output divider bits to 0 */
+       val = readl(reg + SUN50I_H6_PLL_GPU_REG);
+       val &= ~BIT(0);
+       writel(val, reg + SUN50I_H6_PLL_GPU_REG);
+
+       /* Force GPU_CLK divider bits to 0 */
+       val = readl(reg + gpu_clk.common.reg);
+       val &= ~GENMASK(3, 0);
+       writel(val, reg + gpu_clk.common.reg);
+
        /* Enable the lock bits on all PLLs */
        for (i = 0; i < ARRAY_SIZE(pll_regs); i++) {
                val = readl(reg + pll_regs[i]);