diff options
| author | Tobias Diedrich <ranma+coreboot@tdiedrich.de> | 2010-05-18 16:23:11 +0000 |
|---|---|---|
| committer | Tobias Diedrich <ranma+coreboot@tdiedrich.de> | 2010-05-18 16:23:11 +0000 |
| commit | 0f6b5f03d9e11ec896b0d86d2027471c12a655eb (patch) | |
| tree | 14f1a25943cbf1c60dfa816ab53d7eef39eb8b8b | |
| parent | 681cedb4d8e55647fd3a125cdd2966c7d2ccd200 (diff) | |
| download | rockbox-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.h | 7 | ||||
| -rw-r--r-- | firmware/target/arm/as3525/system-as3525.c | 16 | ||||
| -rw-r--r-- | firmware/target/arm/as3525/usb-drv-as3525.c | 26 |
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"); } |