1 /* 2 * (C) Copyright 2006 3 * DENX Software Engineering <mk@denx.de> 4 * 5 * SPDX-License-Identifier: GPL-2.0+ 6 */ 7 8 #include <common.h> 9 10 #if defined(CONFIG_USB_OHCI_NEW) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT) 11 12 #include <asm/io.h> 13 #include <asm/arch/hardware.h> 14 #include <asm/arch/at91_pmc.h> 15 #include <asm/arch/clk.h> 16 17 int usb_cpu_init(void) 18 { 19 at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC; 20 21 #ifdef CONFIG_USB_ATMEL_CLK_SEL_PLLB 22 /* Enable PLLB */ 23 writel(get_pllb_init(), &pmc->pllbr); 24 while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != AT91_PMC_LOCKB) 25 ; 26 #ifdef CONFIG_AT91SAM9N12 27 at91_usb_clk_init(AT91_PMC_USBS_USB_PLLB | AT91_PMC_USB_DIV_2); 28 #endif 29 #elif defined(CONFIG_USB_ATMEL_CLK_SEL_UPLL) 30 if (at91_upll_clk_enable()) 31 return -1; 32 33 at91_usb_clk_init(AT91_PMC_USBS_USB_UPLL | AT91_PMC_USBDIV_10); 34 #endif 35 36 at91_periph_clk_enable(ATMEL_ID_UHP); 37 38 at91_system_clk_enable(ATMEL_PMC_UHP); 39 #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10) 40 at91_system_clk_enable(AT91_PMC_HCK0); 41 #endif 42 43 return 0; 44 } 45 46 int usb_cpu_stop(void) 47 { 48 at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC; 49 50 at91_periph_clk_disable(ATMEL_ID_UHP); 51 52 at91_system_clk_disable(ATMEL_PMC_UHP); 53 #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10) 54 at91_system_clk_disable(AT91_PMC_HCK0); 55 #endif 56 57 #ifdef CONFIG_USB_ATMEL_CLK_SEL_PLLB 58 #ifdef CONFIG_AT91SAM9N12 59 at91_usb_clk_init(0); 60 #endif 61 /* Disable PLLB */ 62 writel(0, &pmc->pllbr); 63 while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != 0) 64 ; 65 #elif defined(CONFIG_USB_ATMEL_CLK_SEL_UPLL) 66 if (at91_upll_clk_disable()) 67 return -1; 68 #endif 69 70 return 0; 71 } 72 73 int usb_cpu_init_fail(void) 74 { 75 return usb_cpu_stop(); 76 } 77 78 #endif /* defined(CONFIG_USB_OHCI) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT) */ 79