1
0
Fork 0
forked from len0rd/rockbox

jz4760: Don't enable PLL1 until we need audio.

Change-Id: I6320ee9ac809da93c80e571d45f01e22c5bd1c40
This commit is contained in:
Solomon Peachy 2020-08-06 18:23:38 -04:00
parent 7ab063a157
commit f554c78734
2 changed files with 48 additions and 29 deletions

View file

@ -192,80 +192,85 @@ void audiohw_set_filter_roll_off(int value)
} }
void pll1_init(unsigned int freq); void pll1_init(unsigned int freq);
void pll1_disable(void);
void audiohw_set_frequency(int fsel) void audiohw_set_frequency(int fsel)
{ {
unsigned int pll1_speed; unsigned int pll1_speed;
unsigned char mclk_div, bclk_div, func_mode; unsigned char mclk_div, bclk_div, func_mode;
// bclk is 1..8
// mclk is 1..512
switch(fsel) switch(fsel)
{ {
case HW_FREQ_8: case HW_FREQ_8: // 0.512 MHz
pll1_speed = 426000000; pll1_speed = 426000000;
mclk_div = 52; mclk_div = 52;
bclk_div = 16; bclk_div = 16;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_11: case HW_FREQ_11: // 0.7056 MHz
pll1_speed = 508000000; pll1_speed = 508000000;
mclk_div = 45; mclk_div = 45;
bclk_div = 16; bclk_div = 16;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_12: case HW_FREQ_12: // 0.768 MHz
pll1_speed = 516000000; pll1_speed = 516000000;
mclk_div = 42; mclk_div = 42;
bclk_div = 16; bclk_div = 16;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_16: case HW_FREQ_16: // 1.024 MHz
pll1_speed = 426000000; pll1_speed = 426000000;
mclk_div = 52; mclk_div = 52;
bclk_div = 8; bclk_div = 8;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_22: case HW_FREQ_22: // 1.4112 MHz
pll1_speed = 508000000; pll1_speed = 508000000;
mclk_div = 45; mclk_div = 45;
bclk_div = 8; bclk_div = 8;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_24: case HW_FREQ_24: // 1.536 MHz
pll1_speed = 516000000; pll1_speed = 516000000;
mclk_div = 42; mclk_div = 42;
bclk_div = 8; bclk_div = 8;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_32: case HW_FREQ_32: // 2.048 MHz
pll1_speed = 426000000; pll1_speed = 426000000;
mclk_div = 52; mclk_div = 52;
bclk_div = 4; bclk_div = 4;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_44: case HW_FREQ_44: // 2.8224 MHz
pll1_speed = 508000000; pll1_speed = 508000000;
mclk_div = 45; mclk_div = 45;
bclk_div = 4; bclk_div = 4;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_48: case HW_FREQ_48: // 3.072 MHz
pll1_speed = 516000000; pll1_speed = 516000000;
mclk_div = 42; mclk_div = 42;
bclk_div = 4; bclk_div = 4;
func_mode = 0; func_mode = 0;
break; break;
case HW_FREQ_64: case HW_FREQ_64: // 4.096 MHz
pll1_speed = 426000000; pll1_speed = 426000000;
mclk_div = 52; mclk_div = 52;
bclk_div = 2; bclk_div = 2;
func_mode = 1; func_mode = 1;
break; break;
case HW_FREQ_88: case HW_FREQ_88: // 5.6448 MHz
pll1_speed = 508000000; pll1_speed = 508000000;
mclk_div = 45; mclk_div = 45;
bclk_div = 2; bclk_div = 2;
func_mode = 1; func_mode = 1;
break; break;
case HW_FREQ_96: case HW_FREQ_96: // 6.144 MHz
pll1_speed = 516000000; pll1_speed = 516000000;
mclk_div = 42; mclk_div = 42;
bclk_div = 2; bclk_div = 2;
@ -314,6 +319,7 @@ void audiohw_close(void)
dac_enable(0); dac_enable(0);
__i2s_disable(); __i2s_disable();
__cpm_stop_aic(); __cpm_stop_aic();
pll1_disable();
sleep(HZ); sleep(HZ);
pop_ctrl(1); pop_ctrl(1);
} }

View file

@ -430,12 +430,21 @@ static void pll0_init(unsigned int freq)
int div[6] = {1, 4, 4, 4, 4, 4}; int div[6] = {1, 4, 4, 4, 4, 4};
int usbdiv; int usbdiv;
/* @ CPU_FREQ of 492MHZ, this means:
492MHz CCLK
123MHz HCLK
123MHz H2CLK
123MHz PCLK
123MHz MCLK
123MHZ SCLK ( must equal H2CLK or HCLK/2)
*/
/* set ahb **/ /* set ahb **/
REG32(HARB0_BASE) = 0x00300000; REG32(HARB0_BASE) = 0x00300000;
REG32(0xb3070048) = 0x00000000; REG32(0xb3070048) = 0x00000000;
REG32(HARB2_BASE) = 0x00FFFFFF; REG32(HARB2_BASE) = 0x00FFFFFF;
cfcr = CPCCR_PCS | cfcr = CPCCR_PCS | // no divisor on PLL for peripherals
(n2FR[div[0]] << CPCCR_CDIV_LSB) | (n2FR[div[0]] << CPCCR_CDIV_LSB) |
(n2FR[div[1]] << CPCCR_HDIV_LSB) | (n2FR[div[1]] << CPCCR_HDIV_LSB) |
(n2FR[div[2]] << CPCCR_H2DIV_LSB) | (n2FR[div[2]] << CPCCR_H2DIV_LSB) |
@ -458,7 +467,7 @@ static void pll0_init(unsigned int freq)
else else
cfcr &= ~CPCCR_ECS; cfcr &= ~CPCCR_ECS;
cfcr &= ~CPCCR_MEM; /* mddr */ cfcr &= ~CPCCR_MEM; /* Use mobile DDR / SDRAM */
cfcr |= CPCCR_CE; cfcr |= CPCCR_CE;
plcr1 = pll_calc_m_n_od(freq, CFG_EXTAL); plcr1 = pll_calc_m_n_od(freq, CFG_EXTAL);
@ -488,7 +497,6 @@ void pll1_init(unsigned int freq)
{ {
register unsigned int plcr2; register unsigned int plcr2;
/* set CPM_CPCCR_MEM only for ddr1 or ddr2 */
plcr2 = pll_calc_m_n_od(freq, CFG_EXTAL) plcr2 = pll_calc_m_n_od(freq, CFG_EXTAL)
| CPPCR1_PLL1EN; /* enable PLL1 */ | CPPCR1_PLL1EN; /* enable PLL1 */
@ -503,6 +511,11 @@ void pll1_init(unsigned int freq)
REG_CPM_CPPCR1 &= ~CPPCR1_LOCK; REG_CPM_CPPCR1 &= ~CPPCR1_LOCK;
} }
void pll1_disable(void)
{
REG_CPM_CPPCR1 &= ~CPPCR1_PLL1EN;
}
static void serial_setbrg(void) static void serial_setbrg(void)
{ {
volatile u8 *uart_lcr = (volatile u8 *)(CFG_UART_BASE + OFF_LCR); volatile u8 *uart_lcr = (volatile u8 *)(CFG_UART_BASE + OFF_LCR);
@ -638,8 +651,8 @@ void ICODE_ATTR system_main(void)
mmu_init(); mmu_init();
pll0_init(CPU_FREQ); pll0_init(CPU_FREQ); // PLL0 drives everything but audio
pll1_init(CPU_FREQ); pll1_disable(); // Leave PLL1 disabled until audio needs it
serial_preinit(); serial_preinit();
usb_preinit(); usb_preinit();