mirror of
https://github.com/CTCaer/hekate
synced 2024-12-22 19:31:12 +00:00
clock: Move PLLU init/deinit from USB to clock
This commit is contained in:
parent
6dddb968fa
commit
8305058cf5
3 changed files with 32 additions and 19 deletions
|
@ -362,6 +362,32 @@ static void _clock_disable_pllc4(u32 mask)
|
||||||
pllc4_enabled = 0;
|
pllc4_enabled = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void clock_enable_pllu()
|
||||||
|
{
|
||||||
|
// Configure PLLU.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLU_MISC) |= (1 << 29); // Disable reference clock.
|
||||||
|
u32 pllu_cfg = (CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) & 0xFFE00000) | (1 << 24) | (1 << 16) | (0x19 << 8) | 2;
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) = pllu_cfg;
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) = pllu_cfg | (1 << 30); // Enable.
|
||||||
|
|
||||||
|
// Wait for PLL to stabilize.
|
||||||
|
u32 timeout = (u32)TMR(TIMERUS_CNTR_1US) + 1300;
|
||||||
|
while (!(CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) & (1 << 27))) // PLL_LOCK.
|
||||||
|
if ((u32)TMR(TIMERUS_CNTR_1US) > timeout)
|
||||||
|
break;
|
||||||
|
usleep(10);
|
||||||
|
|
||||||
|
// Enable PLLU USB/HSIC/ICUSB/48M.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) |= 0x2E00000;
|
||||||
|
}
|
||||||
|
|
||||||
|
void clock_disable_pllu()
|
||||||
|
{
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) &= ~0x2E00000; // Disable PLLU USB/HSIC/ICUSB/48M.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) &= ~0x40000000; // Disable PLLU.
|
||||||
|
CLOCK(CLK_RST_CONTROLLER_PLLU_MISC) &= ~0x20000000; // Enable reference clock.
|
||||||
|
}
|
||||||
|
|
||||||
static int _clock_sdmmc_is_reset(u32 id)
|
static int _clock_sdmmc_is_reset(u32 id)
|
||||||
{
|
{
|
||||||
switch (id)
|
switch (id)
|
||||||
|
|
|
@ -478,6 +478,8 @@ void clock_enable_pwm();
|
||||||
void clock_disable_pwm();
|
void clock_disable_pwm();
|
||||||
void clock_enable_pllc(u32 divn);
|
void clock_enable_pllc(u32 divn);
|
||||||
void clock_disable_pllc();
|
void clock_disable_pllc();
|
||||||
|
void clock_enable_pllu();
|
||||||
|
void clock_disable_pllu();
|
||||||
void clock_sdmmc_config_clock_source(u32 *pclock, u32 id, u32 val);
|
void clock_sdmmc_config_clock_source(u32 *pclock, u32 id, u32 val);
|
||||||
void clock_sdmmc_get_card_clock_div(u32 *pclock, u16 *pdivisor, u32 type);
|
void clock_sdmmc_get_card_clock_div(u32 *pclock, u16 *pdivisor, u32 type);
|
||||||
int clock_sdmmc_is_not_reset_and_enabled(u32 id);
|
int clock_sdmmc_is_not_reset_and_enabled(u32 id);
|
||||||
|
|
|
@ -247,21 +247,8 @@ int usb_device_init()
|
||||||
if (usb_init_done)
|
if (usb_init_done)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
// Configure PLLU.
|
// Configure and enable PLLU.
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLU_MISC) |= (1 << 29); // Disable reference clock.
|
clock_enable_pllu();
|
||||||
u32 pllu_cfg = (((((CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) >> 8 << 8) | 2) & 0xFFFF00FF) | ((0x19 << 8) & 0xFFFF)) & 0xFFE0FFFF) | (1 << 16) | (1 << 24);
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) = pllu_cfg;
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) = pllu_cfg | (1 << 30); // Enable.
|
|
||||||
|
|
||||||
// Wait for PLL to stabilize.
|
|
||||||
u32 timeout = (u32)TMR(TIMERUS_CNTR_1US) + 1300;
|
|
||||||
while (!(CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) & (1 << 27))) // PLL_LOCK.
|
|
||||||
if ((u32)TMR(TIMERUS_CNTR_1US) > timeout)
|
|
||||||
break;
|
|
||||||
usleep(10);
|
|
||||||
|
|
||||||
// Enable PLLU USB/HSIC/ICUSB/48M.
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) |= 0x2E00000;
|
|
||||||
|
|
||||||
// Enable USBD clock.
|
// Enable USBD clock.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_USBD);
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_SET) = BIT(CLK_L_USBD);
|
||||||
|
@ -453,10 +440,8 @@ static void _usb_device_power_down()
|
||||||
// Disable USBD clock.
|
// Disable USBD clock.
|
||||||
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_CLR) = BIT(CLK_L_USBD);
|
CLOCK(CLK_RST_CONTROLLER_CLK_ENB_L_CLR) = BIT(CLK_L_USBD);
|
||||||
|
|
||||||
// Completely disable PLLU.
|
// Disable PLLU.
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) &= ~0x2E00000; // Disable PLLU USB/HSIC/ICUSB/48M.
|
clock_disable_pllu();
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLU_BASE) &= ~0x40000000; // Disable PLLU.
|
|
||||||
CLOCK(CLK_RST_CONTROLLER_PLLU_MISC) &= ~0x20000000; // Enable reference clock.
|
|
||||||
|
|
||||||
usb_init_done = false;
|
usb_init_done = false;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue