return true;
 }
 
+void ast_patch_ahb_2500(struct ast_private *ast)
+{
+       u32     data;
+
+       /* Clear bus lock condition */
+       ast_moutdwm(ast, 0x1e600000, 0xAEED1A03);
+       ast_moutdwm(ast, 0x1e600084, 0x00010000);
+       ast_moutdwm(ast, 0x1e600088, 0x00000000);
+       ast_moutdwm(ast, 0x1e6e2000, 0x1688A8A8);
+       data = ast_mindwm(ast, 0x1e6e2070);
+       if (data & 0x08000000) {                                        /* check fast reset */
+               /*
+                * If "Fast restet" is enabled for ARM-ICE debugger,
+                * then WDT needs to enable, that
+                * WDT04 is WDT#1 Reload reg.
+                * WDT08 is WDT#1 counter restart reg to avoid system deadlock
+                * WDT0C is WDT#1 control reg
+                *      [6:5]:= 01:Full chip
+                *      [4]:= 1:1MHz clock source
+                *      [1]:= 1:WDT will be cleeared and disabled after timeout occurs
+                *      [0]:= 1:WDT enable
+                */
+               ast_moutdwm(ast, 0x1E785004, 0x00000010);
+               ast_moutdwm(ast, 0x1E785008, 0x00004755);
+               ast_moutdwm(ast, 0x1E78500c, 0x00000033);
+               udelay(1000);
+       }
+       do {
+               ast_moutdwm(ast, 0x1e6e2000, 0x1688A8A8);
+               data = ast_mindwm(ast, 0x1e6e2000);
+       }       while (data != 1);
+       ast_moutdwm(ast, 0x1e6e207c, 0x08000000);       /* clear fast reset */
+}
+
 void ast_post_chip_2500(struct drm_device *dev)
 {
        struct ast_private *ast = to_ast_private(dev);
        u8 reg;
 
        reg = ast_get_index_reg_mask(ast, AST_IO_CRTC_PORT, 0xd0, 0xff);
-       if ((reg & 0x80) == 0) {/* vga only */
+       if ((reg & AST_VRAM_INIT_STATUS_MASK) == 0) {/* vga only */
                /* Clear bus lock condition */
-               ast_moutdwm(ast, 0x1e600000, 0xAEED1A03);
-               ast_moutdwm(ast, 0x1e600084, 0x00010000);
-               ast_moutdwm(ast, 0x1e600088, 0x00000000);
-               ast_moutdwm(ast, 0x1e6e2000, 0x1688A8A8);
-               ast_write32(ast, 0xf004, 0x1e6e0000);
-               ast_write32(ast, 0xf000, 0x1);
-               ast_write32(ast, 0x12000, 0x1688a8a8);
-               while (ast_read32(ast, 0x12000) != 0x1)
-                       ;
-
-               ast_write32(ast, 0x10000, 0xfc600309);
-               while (ast_read32(ast, 0x10000) != 0x1)
-                       ;
+               ast_patch_ahb_2500(ast);
+
+               /* Disable watchdog */
+               ast_moutdwm(ast, 0x1E78502C, 0x00000000);
+               ast_moutdwm(ast, 0x1E78504C, 0x00000000);
+
+               /*
+                * Reset USB port to patch USB unknown device issue
+                * SCU90 is Multi-function Pin Control #5
+                *      [29]:= 1:Enable USB2.0 Host port#1 (that the mutually shared USB2.0 Hub
+                *                              port).
+                * SCU94 is Multi-function Pin Control #6
+                *      [14:13]:= 1x:USB2.0 Host2 controller
+                * SCU70 is Hardware Strap reg
+                *      [23]:= 1:CLKIN is 25MHz and USBCK1 = 24/48 MHz (determined by
+                *                              [18]: 0(24)/1(48) MHz)
+                * SCU7C is Write clear reg to SCU70
+                *      [23]:= write 1 and then SCU70[23] will be clear as 0b.
+                */
+               ast_moutdwm(ast, 0x1E6E2090, 0x20000000);
+               ast_moutdwm(ast, 0x1E6E2094, 0x00004000);
+               if (ast_mindwm(ast, 0x1E6E2070) & 0x00800000) {
+                       ast_moutdwm(ast, 0x1E6E207C, 0x00800000);
+                       mdelay(100);
+                       ast_moutdwm(ast, 0x1E6E2070, 0x00800000);
+               }
+               /* Modify eSPI reset pin */
+               temp = ast_mindwm(ast, 0x1E6E2070);
+               if (temp & 0x02000000)
+                       ast_moutdwm(ast, 0x1E6E207C, 0x00004000);
 
                /* Slow down CPU/AHB CLK in VGA only mode */
                temp = ast_read32(ast, 0x12008);
                temp |= 0x73;
                ast_write32(ast, 0x12008, temp);
 
-               /* Reset USB port to patch USB unknown device issue */
-               ast_moutdwm(ast, 0x1e6e2090, 0x20000000);
-               temp  = ast_mindwm(ast, 0x1e6e2094);
-               temp |= 0x00004000;
-               ast_moutdwm(ast, 0x1e6e2094, temp);
-               temp  = ast_mindwm(ast, 0x1e6e2070);
-               if (temp & 0x00800000) {
-                       ast_moutdwm(ast, 0x1e6e207c, 0x00800000);
-                       mdelay(100);
-                       ast_moutdwm(ast, 0x1e6e2070, 0x00800000);
-               }
-
                if (!ast_dram_init_2500(ast))
                        drm_err(dev, "DRAM init failed !\n");