summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Diedrich <ranma+coreboot@tdiedrich.de>2010-05-18 16:23:11 +0000
committerTobias Diedrich <ranma+coreboot@tdiedrich.de>2010-05-18 16:23:11 +0000
commit0f6b5f03d9e11ec896b0d86d2027471c12a655eb (patch)
tree14f1a25943cbf1c60dfa816ab53d7eef39eb8b8b
parent681cedb4d8e55647fd3a125cdd2966c7d2ccd200 (diff)
downloadrockbox-0f6b5f03d9e11ec896b0d86d2027471c12a655eb.zip
rockbox-0f6b5f03d9e11ec896b0d86d2027471c12a655eb.tar.gz
rockbox-0f6b5f03d9e11ec896b0d86d2027471c12a655eb.tar.bz2
rockbox-0f6b5f03d9e11ec896b0d86d2027471c12a655eb.tar.xz
Enable/disable second pll dynamically on usb plugin/remove.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@26145 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--firmware/export/as3525.h7
-rw-r--r--firmware/target/arm/as3525/system-as3525.c16
-rw-r--r--firmware/target/arm/as3525/usb-drv-as3525.c26
3 files changed, 41 insertions, 8 deletions
diff --git a/firmware/export/as3525.h b/firmware/export/as3525.h
index 699762a..e578b60 100644
--- a/firmware/export/as3525.h
+++ b/firmware/export/as3525.h
@@ -242,6 +242,13 @@ CE lines
#define CGU_TIMER2_CLOCK_ENABLE ( 1 << 8 ) /* timer 2 */
#define CGU_TIMERIF_CLOCK_ENABLE ( 1 << 7 ) /* timer interface */
+/* CGU_PLL[AB]SUP bits */
+#define CGU_PLL_POWERDOWN ( 1 << 3 )
+
+/* CGU_INTCTRL bits */
+#define CGU_PLLA_LOCK ( 1 << 0 )
+#define CGU_PLLB_LOCK ( 1 << 1 )
+
/** ------------------------------------------------------------------
* Number of cycles to wait before cgu is safely locked.
**/
diff --git a/firmware/target/arm/as3525/system-as3525.c b/firmware/target/arm/as3525/system-as3525.c
index dbbe1a1..ae7c71d 100644
--- a/firmware/target/arm/as3525/system-as3525.c
+++ b/firmware/target/arm/as3525/system-as3525.c
@@ -320,16 +320,16 @@ void system_init(void)
"mcr p15, 0, r0, c1, c0 \n"
: : : "r0" );
- CGU_COUNTA = 0xff;
+ CGU_COUNTA = CGU_LOCK_CNT;
CGU_PLLA = AS3525_PLLA_SETTING;
- CGU_PLLASUP = 0; /* enable PLLA */
- while(!(CGU_INTCTRL & (1<<0))); /* wait until PLLA is locked */
-
-#if (defined(USE_ROCKBOX_USB) && CONFIG_CPU==AS3525) || (AS3525_MCLK_SEL == AS3525_CLK_PLLB)
- CGU_COUNTB = 0xff;
+ CGU_PLLASUP = 0; /* enable PLLA */
+ while(!(CGU_INTCTRL & CGU_PLLA_LOCK)); /* wait until PLLA is locked */
+
+#if AS3525_MCLK_SEL == AS3525_CLK_PLLB
+ CGU_COUNTB = CGU_LOCK_CNT;
CGU_PLLB = AS3525_PLLB_SETTING;
- CGU_PLLBSUP = 0; /* enable PLLB */
- while(!(CGU_INTCTRL & (1<<1))); /* wait until PLLB is locked */
+ CGU_PLLBSUP = 0; /* enable PLLB */
+ while(!(CGU_INTCTRL & CGU_PLLB_LOCK)); /* wait until PLLB is locked */
#endif
/* Set FCLK frequency */
diff --git a/firmware/target/arm/as3525/usb-drv-as3525.c b/firmware/target/arm/as3525/usb-drv-as3525.c
index 2cb1318..61a1265 100644
--- a/firmware/target/arm/as3525/usb-drv-as3525.c
+++ b/firmware/target/arm/as3525/usb-drv-as3525.c
@@ -306,6 +306,29 @@ static struct usb_dev_setup_buf dummy __attribute__((unused));
static char rx_buf[1024];
static char tx_buf[1024];
+#if AS3525_MCLK_SEL != AS3525_CLK_PLLB
+static inline void usb_enable_pll(void)
+{
+ CGU_COUNTB = CGU_LOCK_CNT;
+ CGU_PLLB = AS3525_PLLB_SETTING;
+ CGU_PLLBSUP = 0; /* enable PLLB */
+ while(!(CGU_INTCTRL & CGU_PLLB_LOCK)); /* wait until PLLB is locked */
+}
+
+static inline void usb_disable_pll(void)
+{
+ CGU_PLLBSUP = CGU_PLL_POWERDOWN;
+}
+#else
+static inline void usb_enable_pll(void)
+{
+}
+
+static inline void usb_disable_pll(void)
+{
+}
+#endif /* AS3525_MCLK_SEL != AS3525_CLK_PLLB */
+
void usb_attach(void)
{
usb_enable(true);
@@ -448,6 +471,8 @@ void usb_drv_init(void)
{
logf("usb_drv_init() !!!!\n");
+ usb_enable_pll();
+
/* length regulator: normal operation */
ascodec_write(AS3514_CVDD_DCDC3, ascodec_read(AS3514_CVDD_DCDC3) | 1<<2);
@@ -524,6 +549,7 @@ void usb_drv_exit(void)
CGU_PERI &= ~CGU_USB_CLOCK_ENABLE;
/* Disable UVDD generating LDO */
ascodec_write(AS3515_USB_UTIL, ascodec_read(AS3515_USB_UTIL) & ~(1<<4));
+ usb_disable_pll();
logf("usb_drv_exit() !!!!\n");
}