summaryrefslogtreecommitdiffstats
path: root/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c
diff options
context:
space:
mode:
authorMichael Sevakis <jethead71@rockbox.org>2009-01-19 13:41:25 +0000
committerMichael Sevakis <jethead71@rockbox.org>2009-01-19 13:41:25 +0000
commit616c98b38f6ddac0ac3dde8ec0fa248f835717e2 (patch)
tree5eeeabb85fbefa162a438edca88611c1bc688269 /firmware/target/arm/imx31/gigabeat-s/usb-imx31.c
parentcef6399c4c3bcaa35733bdab8b9016b66b71a6f0 (diff)
downloadrockbox-616c98b38f6ddac0ac3dde8ec0fa248f835717e2.tar.gz
rockbox-616c98b38f6ddac0ac3dde8ec0fa248f835717e2.tar.bz2
rockbox-616c98b38f6ddac0ac3dde8ec0fa248f835717e2.zip
USB detection changes. c200/e200: Consider USB to be powered when charger is plugged but detect USB connection by bus reset. When received, disconnect and restart the driver fully enabled. imx31: Fix hack used to make initial connect succeeded-- set PHY type before initial reset. General: Move some target code out of usb-drv-arc.c and implement it in respective usb sources and CPU headers so things stay clean.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@19797 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/target/arm/imx31/gigabeat-s/usb-imx31.c')
-rw-r--r--firmware/target/arm/imx31/gigabeat-s/usb-imx31.c35
1 files changed, 25 insertions, 10 deletions
diff --git a/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c b/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c
index cd8b513ecd..c0d7cb8d2a 100644
--- a/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c
+++ b/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c
@@ -29,6 +29,7 @@
#include "usb-target.h"
#include "clkctl-imx31.h"
#include "power-imx31.h"
+#include "avic-imx31.h"
#include "mc13783.h"
static int usb_status = USB_EXTRACTED;
@@ -75,11 +76,7 @@ bool usb_plugged(void)
void usb_init_device(void)
{
- imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_ON_ALL);
-
- enable_transceiver(true);
-
- /* Module will be turned off later after firmware init */
+ /* Do one-time inits */
usb_drv_startup();
/* Initially poll */
@@ -91,19 +88,37 @@ void usb_init_device(void)
void usb_enable(bool on)
{
+ /* Module clock should be on since since this could be called with
+ * OFF initially and writing module registers would hardlock otherwise. */
+ imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_ON_ALL);
+ enable_transceiver(true);
+
if (on)
{
- imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_ON_ALL);
- enable_transceiver(true);
usb_core_init();
}
else
{
- /* Module clock should be on since this could be called first */
- imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_ON_ALL);
- enable_transceiver(true);
usb_core_exit();
enable_transceiver(false);
imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_OFF);
}
}
+
+void usb_attach(void)
+{
+ usb_enable(true);
+}
+
+static void __attribute__((interrupt("IRQ"))) USB_OTG_HANDLER(void)
+{
+ usb_drv_int(); /* Call driver handler */
+}
+
+void usb_drv_int_enable(bool enable)
+{
+ if (enable)
+ avic_enable_int(USB_OTG, IRQ, 7, USB_OTG_HANDLER);
+ else
+ avic_disable_int(USB_OTG);
+}