carl9170 firmware: reset PTA-DMA registers before reboot
[carl9170fw.git] / carlfw / usb / main.c
index 57f75a44162f93635161182b7a8cc5013f3d1fdd..48ece0e99d4455119229ed584b7908c686d02583 100644 (file)
@@ -224,6 +224,17 @@ static void turn_power_off(void)
 
        set(AR9170_MAC_REG_DMA_TRIGGER, 0);
 
+       andl(AR9170_USB_REG_DMA_CTL, ~(AR9170_USB_DMA_CTL_ENABLE_TO_DEVICE |
+                                      AR9170_USB_DMA_CTL_ENABLE_FROM_DEVICE |
+                                      AR9170_USB_DMA_CTL_UP_PACKET_MODE |
+                                      AR9170_USB_DMA_CTL_DOWN_STREAM));
+
+       /* Do a software reset to PTA component */
+       orl(AR9170_PTA_REG_DMA_MODE_CTRL, AR9170_PTA_DMA_MODE_CTRL_RESET);
+       andl(AR9170_PTA_REG_DMA_MODE_CTRL, ~AR9170_PTA_DMA_MODE_CTRL_RESET);
+
+       orl(AR9170_PTA_REG_DMA_MODE_CTRL, AR9170_PTA_DMA_MODE_CTRL_DISABLE_USB);
+
        set(AR9170_MAC_REG_POWER_STATE_CTRL,
            AR9170_MAC_POWER_STATE_CTRL_RESET);
 
@@ -277,11 +288,14 @@ void __noreturn reboot(void)
        orl(AR9170_PWR_REG_WATCH_DOG_MAGIC, 0x98760000);
 
        /* Disable watchdog */
-       orl(AR9170_TIMER_REG_WATCH_DOG, 0xffff);
+       set(AR9170_TIMER_REG_WATCH_DOG, 0xffff);
 
        /* Turn off power */
        turn_power_off();
 
+       /* clean bootloader workspace */
+       memset(&dma_mem, 0, sizeof(dma_mem));
+
        /* add by ygwei for work around USB PHY chirp sequence problem */
        set(0x10f100, 0x12345678);