summaryrefslogtreecommitdiff
path: root/firmware/target/mips/ingenic_x1000/boot-x1000.c
diff options
context:
space:
mode:
authorAidan MacDonald <amachronic@protonmail.com>2022-06-29 23:22:55 +0100
committerAidan MacDonald <amachronic@protonmail.com>2022-07-10 09:48:39 -0400
commit131566b8f80355aa64bba904f9de4d1506b90442 (patch)
treea480bc6140029199ef3569204b29162de23674b8 /firmware/target/mips/ingenic_x1000/boot-x1000.c
parentd0d13baf3e263d5aa270b3d26686cd01deb3b059 (diff)
downloadrockbox-131566b8f80355aa64bba904f9de4d1506b90442.tar.gz
rockbox-131566b8f80355aa64bba904f9de4d1506b90442.zip
x1000: fix linux boot USB issues
If the USB controller is active when we hand over to Linux it'll often trigger "irq nobody cared" warnings. Disabling the controller before boot prevents that. Also move the USB PHY bit workaround from the dualboot cleanup hook to the main Linux boot function. Mainline kernels don't clear these bits either. Change-Id: Ieaf896c3b8c3e58a8c47de5afeb384ae2511a5fa
Diffstat (limited to 'firmware/target/mips/ingenic_x1000/boot-x1000.c')
-rw-r--r--firmware/target/mips/ingenic_x1000/boot-x1000.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/firmware/target/mips/ingenic_x1000/boot-x1000.c b/firmware/target/mips/ingenic_x1000/boot-x1000.c
index c8e97b4d6a..f59ec5c4ea 100644
--- a/firmware/target/mips/ingenic_x1000/boot-x1000.c
+++ b/firmware/target/mips/ingenic_x1000/boot-x1000.c
@@ -20,6 +20,7 @@
20 ****************************************************************************/ 20 ****************************************************************************/
21 21
22#include "system.h" 22#include "system.h"
23#include "usb.h"
23#include "boot-x1000.h" 24#include "boot-x1000.h"
24#include "nand-x1000.h" 25#include "nand-x1000.h"
25#include "gpio-x1000.h" 26#include "gpio-x1000.h"
@@ -113,6 +114,14 @@ void x1000_boot_linux(const void* source, size_t length,
113{ 114{
114 size_t args_len = strlen(args); 115 size_t args_len = strlen(args);
115 116
117 /* Shut off USB to avoid "irq 21 nobody cared" error */
118 usb_close();
119 usb_enable(false);
120
121 /* clear USB PHY voodoo bits, not all kernels use them */
122 jz_writef(CPM_OPCR, GATE_USBPHY_CLK(0));
123 jz_writef(CPM_USBCDR, PHY_GATE(0));
124
116 disable_irq(); 125 disable_irq();
117 126
118 /* --- Beyond this point, do not call into DRAM --- */ 127 /* --- Beyond this point, do not call into DRAM --- */
@@ -151,10 +160,6 @@ void x1000_dualboot_cleanup(void)
151 jz_writef(LCD_CTRL, BEDN(0), EOFM(0), SOFM(0), IFUM(0), QDM(0)); 160 jz_writef(LCD_CTRL, BEDN(0), EOFM(0), SOFM(0), IFUM(0), QDM(0));
152 jz_writef(CPM_CLKGR, LCD(1)); 161 jz_writef(CPM_CLKGR, LCD(1));
153 162
154 /* clear USB PHY voodoo bits, not all kernels use them */
155 jz_writef(CPM_OPCR, GATE_USBPHY_CLK(0));
156 jz_writef(CPM_USBCDR, PHY_GATE(0));
157
158#if defined(FIIO_M3K) || defined(EROS_QN) 163#if defined(FIIO_M3K) || defined(EROS_QN)
159 /* 164 /*
160 * Need to bring up MPLL before booting Linux 165 * Need to bring up MPLL before booting Linux