summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/target/arm/imx233/clkctrl-imx233.c8
-rw-r--r--firmware/target/arm/imx233/clkctrl-imx233.h6
-rw-r--r--firmware/target/arm/imx233/system-imx233.c22
-rw-r--r--firmware/target/arm/imx233/system-target.h14
-rw-r--r--firmware/target/arm/imx233/usb-imx233.c12
5 files changed, 59 insertions, 3 deletions
diff --git a/firmware/target/arm/imx233/clkctrl-imx233.c b/firmware/target/arm/imx233/clkctrl-imx233.c
index ee77a77493..976a9f9d3b 100644
--- a/firmware/target/arm/imx233/clkctrl-imx233.c
+++ b/firmware/target/arm/imx233/clkctrl-imx233.c
@@ -118,3 +118,11 @@ void imx233_set_bypass_pll(enum imx233_clock_t clk, bool bypass)
118 __REG_CLR(HW_CLKCTRL_CLKSEQ) = msk; 118 __REG_CLR(HW_CLKCTRL_CLKSEQ) = msk;
119} 119}
120 120
121void imx233_enable_usb_pll(bool enable)
122{
123 if(enable)
124 __REG_SET(HW_CLKCTRL_PLLCTRL0) = HW_CLKCTRL_PLLCTRL0__EN_USB_CLKS;
125 else
126 __REG_CLR(HW_CLKCTRL_PLLCTRL0) = HW_CLKCTRL_PLLCTRL0__EN_USB_CLKS;
127}
128
diff --git a/firmware/target/arm/imx233/clkctrl-imx233.h b/firmware/target/arm/imx233/clkctrl-imx233.h
index f1a51e25b2..7aa4f716e8 100644
--- a/firmware/target/arm/imx233/clkctrl-imx233.h
+++ b/firmware/target/arm/imx233/clkctrl-imx233.h
@@ -28,8 +28,9 @@
28#define HW_CLKCTRL_BASE 0x80040000 28#define HW_CLKCTRL_BASE 0x80040000
29 29
30#define HW_CLKCTRL_PLLCTRL0 (*(volatile uint32_t *)(HW_CLKCTRL_BASE + 0x0)) 30#define HW_CLKCTRL_PLLCTRL0 (*(volatile uint32_t *)(HW_CLKCTRL_BASE + 0x0))
31#define HW_CLKCTRL_PLLCTRL0__DIV_SEL_BP 20 31#define HW_CLKCTRL_PLLCTRL0__EN_USB_CLKS (1 << 18)
32#define HW_CLKCTRL_PLLCTRL0__DIV_SEL_BM (3 << 20) 32#define HW_CLKCTRL_PLLCTRL0__DIV_SEL_BP 20
33#define HW_CLKCTRL_PLLCTRL0__DIV_SEL_BM (3 << 20)
33 34
34#define HW_CLKCTRL_PLLCTRL1 (*(volatile uint32_t *)(HW_CLKCTRL_BASE + 0x10)) 35#define HW_CLKCTRL_PLLCTRL1 (*(volatile uint32_t *)(HW_CLKCTRL_BASE + 0x10))
35 36
@@ -90,5 +91,6 @@ void imx233_set_clock_divisor(enum imx233_clock_t clk, int div);
90/* call with fracdiv=0 to disable it */ 91/* call with fracdiv=0 to disable it */
91void imx233_set_fractional_divisor(enum imx233_clock_t clk, int fracdiv); 92void imx233_set_fractional_divisor(enum imx233_clock_t clk, int fracdiv);
92void imx233_set_bypass_pll(enum imx233_clock_t clk, bool bypass); 93void imx233_set_bypass_pll(enum imx233_clock_t clk, bool bypass);
94void imx233_enable_usb_pll(bool enable);
93 95
94#endif /* CLKCTRL_IMX233_H */ 96#endif /* CLKCTRL_IMX233_H */
diff --git a/firmware/target/arm/imx233/system-imx233.c b/firmware/target/arm/imx233/system-imx233.c
index d27bb1b7d2..7b8e0c858e 100644
--- a/firmware/target/arm/imx233/system-imx233.c
+++ b/firmware/target/arm/imx233/system-imx233.c
@@ -253,3 +253,25 @@ void set_cpu_frequency(long frequency)
253 } 253 }
254} 254}
255#endif 255#endif
256
257void imx233_enable_usb_controller(bool enable)
258{
259 if(enable)
260 __REG_CLR(HW_DIGCTL_CTRL) = HW_DIGCTL_CTRL__USB_CLKGATE;
261 else
262 __REG_SET(HW_DIGCTL_CTRL) = HW_DIGCTL_CTRL__USB_CLKGATE;
263}
264
265void imx233_enable_usb_phy(bool enable)
266{
267 if(enable)
268 {
269 __REG_CLR(HW_USBPHY_CTRL) = __BLOCK_CLKGATE | __BLOCK_SFTRST;
270 __REG_CLR(HW_USBPHY_PWD) = HW_USBPHY_PWD__ALL;
271 }
272 else
273 {
274 __REG_SET(HW_USBPHY_PWD) = HW_USBPHY_PWD__ALL;
275 __REG_SET(HW_USBPHY_CTRL) = __BLOCK_CLKGATE | __BLOCK_SFTRST;
276 }
277}
diff --git a/firmware/target/arm/imx233/system-target.h b/firmware/target/arm/imx233/system-target.h
index fd817a9950..29c175175b 100644
--- a/firmware/target/arm/imx233/system-target.h
+++ b/firmware/target/arm/imx233/system-target.h
@@ -28,9 +28,21 @@
28#include "clock-target.h" /* CPUFREQ_* are defined here */ 28#include "clock-target.h" /* CPUFREQ_* are defined here */
29#include "power-imx233.h" 29#include "power-imx233.h"
30 30
31/* Digital control */
31#define HW_DIGCTL_BASE 0x8001C000 32#define HW_DIGCTL_BASE 0x8001C000
33#define HW_DIGCTL_CTRL (*(volatile uint32_t *)(HW_DIGCTL_BASE + 0))
34#define HW_DIGCTL_CTRL__USB_CLKGATE (1 << 2)
35
32#define HW_DIGCTL_MICROSECONDS (*(volatile uint32_t *)(HW_DIGCTL_BASE + 0xC0)) 36#define HW_DIGCTL_MICROSECONDS (*(volatile uint32_t *)(HW_DIGCTL_BASE + 0xC0))
33 37
38/* USB Phy */
39#define HW_USBPHY_BASE 0x8007C000
40#define HW_USBPHY_PWD (*(volatile uint32_t *)(HW_USBPHY_BASE + 0))
41#define HW_USBPHY_PWD__ALL (7 << 10 | 0xf << 17)
42
43#define HW_USBPHY_CTRL (*(volatile uint32_t *)(HW_USBPHY_BASE + 0x30))
44
45/* Interrupt collector */
34#define HW_ICOLL_BASE 0x80000000 46#define HW_ICOLL_BASE 0x80000000
35 47
36#define HW_ICOLL_VECTOR (*(volatile uint32_t *)(HW_ICOLL_BASE + 0x0)) 48#define HW_ICOLL_VECTOR (*(volatile uint32_t *)(HW_ICOLL_BASE + 0x0))
@@ -89,6 +101,8 @@ void udelay(unsigned us);
89bool imx233_us_elapsed(uint32_t ref, unsigned us_delay); 101bool imx233_us_elapsed(uint32_t ref, unsigned us_delay);
90void imx233_reset_block(volatile uint32_t *block_reg); 102void imx233_reset_block(volatile uint32_t *block_reg);
91void power_off(void); 103void power_off(void);
104void imx233_enable_usb_controller(bool enable);
105void imx233_enable_usb_phy(bool enable);
92 106
93void udelay(unsigned usecs); 107void udelay(unsigned usecs);
94 108
diff --git a/firmware/target/arm/imx233/usb-imx233.c b/firmware/target/arm/imx233/usb-imx233.c
index c2d355ad88..c275f76916 100644
--- a/firmware/target/arm/imx233/usb-imx233.c
+++ b/firmware/target/arm/imx233/usb-imx233.c
@@ -28,6 +28,7 @@
28#include "usb-target.h" 28#include "usb-target.h"
29#include "system.h" 29#include "system.h"
30#include "system-target.h" 30#include "system-target.h"
31#include "clkctrl-imx233.h"
31 32
32 33
33void usb_insert_int(void) 34void usb_insert_int(void)
@@ -77,9 +78,18 @@ bool usb_plugged(void)
77 78
78void usb_enable(bool on) 79void usb_enable(bool on)
79{ 80{
80 /* FIXME: power up/down usb phy and pll usb */
81 if(on) 81 if(on)
82 {
83 imx233_enable_usb_pll(true);
84 imx233_enable_usb_phy(true);
85 imx233_enable_usb_controller(true);
82 usb_core_init(); 86 usb_core_init();
87 }
83 else 88 else
89 {
84 usb_core_exit(); 90 usb_core_exit();
91 imx233_enable_usb_controller(false);
92 imx233_enable_usb_phy(false);
93 imx233_enable_usb_pll(false);
94 }
85} 95}