summaryrefslogtreecommitdiff
path: root/firmware/target/arm/imx31/gigabeat-s/usb-imx31.c
diff options
context:
space:
mode:
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 @@
29#include "usb-target.h" 29#include "usb-target.h"
30#include "clkctl-imx31.h" 30#include "clkctl-imx31.h"
31#include "power-imx31.h" 31#include "power-imx31.h"
32#include "avic-imx31.h"
32#include "mc13783.h" 33#include "mc13783.h"
33 34
34static int usb_status = USB_EXTRACTED; 35static int usb_status = USB_EXTRACTED;
@@ -75,11 +76,7 @@ bool usb_plugged(void)
75 76
76void usb_init_device(void) 77void usb_init_device(void)
77{ 78{
78 imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_ON_ALL); 79 /* Do one-time inits */
79
80 enable_transceiver(true);
81
82 /* Module will be turned off later after firmware init */
83 usb_drv_startup(); 80 usb_drv_startup();
84 81
85 /* Initially poll */ 82 /* Initially poll */
@@ -91,19 +88,37 @@ void usb_init_device(void)
91 88
92void usb_enable(bool on) 89void usb_enable(bool on)
93{ 90{
91 /* Module clock should be on since since this could be called with
92 * OFF initially and writing module registers would hardlock otherwise. */
93 imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_ON_ALL);
94 enable_transceiver(true);
95
94 if (on) 96 if (on)
95 { 97 {
96 imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_ON_ALL);
97 enable_transceiver(true);
98 usb_core_init(); 98 usb_core_init();
99 } 99 }
100 else 100 else
101 { 101 {
102 /* Module clock should be on since this could be called first */
103 imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_ON_ALL);
104 enable_transceiver(true);
105 usb_core_exit(); 102 usb_core_exit();
106 enable_transceiver(false); 103 enable_transceiver(false);
107 imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_OFF); 104 imx31_clkctl_module_clock_gating(CG_USBOTG, CGM_OFF);
108 } 105 }
109} 106}
107
108void usb_attach(void)
109{
110 usb_enable(true);
111}
112
113static void __attribute__((interrupt("IRQ"))) USB_OTG_HANDLER(void)
114{
115 usb_drv_int(); /* Call driver handler */
116}
117
118void usb_drv_int_enable(bool enable)
119{
120 if (enable)
121 avic_enable_int(USB_OTG, IRQ, 7, USB_OTG_HANDLER);
122 else
123 avic_disable_int(USB_OTG);
124}