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 #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ 22 defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) || \ 23 defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9N12) 24 /* Enable PLLB */ 25 writel(get_pllb_init(), &pmc->pllbr); 26 while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != AT91_PMC_LOCKB) 27 ; 28 #ifdef CONFIG_AT91SAM9N12 29 writel(AT91_PMC_USBS_USB_PLLB | AT91_PMC_USB_DIV_2, &pmc->usb); 30 #endif 31 #elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) || \ 32 defined(CONFIG_AT91SAM9X5) || defined(CONFIG_SAMA5D3) 33 /* Enable UPLL */ 34 writel(readl(&pmc->uckr) | AT91_PMC_UPLLEN | AT91_PMC_BIASEN, 35 &pmc->uckr); 36 while ((readl(&pmc->sr) & AT91_PMC_LOCKU) != AT91_PMC_LOCKU) 37 ; 38 39 /* Select PLLA as input clock of OHCI */ 40 writel(AT91_PMC_USBS_USB_UPLL | AT91_PMC_USBDIV_10, &pmc->usb); 41 #endif 42 43 /* Enable USB host clock. */ 44 #ifdef CONFIG_SAMA5D3 45 writel(1 << (ATMEL_ID_UHP - 32), &pmc->pcer1); 46 #else 47 writel(1 << ATMEL_ID_UHP, &pmc->pcer); 48 #endif 49 50 #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10) 51 writel(ATMEL_PMC_UHP | AT91_PMC_HCK0, &pmc->scer); 52 #else 53 writel(ATMEL_PMC_UHP, &pmc->scer); 54 #endif 55 56 return 0; 57 } 58 59 int usb_cpu_stop(void) 60 { 61 at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC; 62 63 /* Disable USB host clock. */ 64 #ifdef CONFIG_SAMA5D3 65 writel(1 << (ATMEL_ID_UHP - 32), &pmc->pcdr1); 66 #else 67 writel(1 << ATMEL_ID_UHP, &pmc->pcdr); 68 #endif 69 70 #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10) 71 writel(ATMEL_PMC_UHP | AT91_PMC_HCK0, &pmc->scdr); 72 #else 73 writel(ATMEL_PMC_UHP, &pmc->scdr); 74 #endif 75 76 #if defined(CONFIG_AT91CAP9) || defined(CONFIG_AT91SAM9260) || \ 77 defined(CONFIG_AT91SAM9263) || defined(CONFIG_AT91SAM9G20) || \ 78 defined(CONFIG_AT91SAM9N12) 79 #ifdef CONFIG_AT91SAM9N12 80 writel(0, &pmc->usb); 81 #endif 82 /* Disable PLLB */ 83 writel(0, &pmc->pllbr); 84 while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != 0) 85 ; 86 #elif defined(CONFIG_AT91SAM9G45) || defined(CONFIG_AT91SAM9M10G45) || \ 87 defined(CONFIG_AT91SAM9X5) || defined(CONFIG_SAMA5D3) 88 /* Disable UPLL */ 89 writel(readl(&pmc->uckr) & (~AT91_PMC_UPLLEN), &pmc->uckr); 90 while ((readl(&pmc->sr) & AT91_PMC_LOCKU) == AT91_PMC_LOCKU) 91 ; 92 #endif 93 94 return 0; 95 } 96 97 int usb_cpu_init_fail(void) 98 { 99 return usb_cpu_stop(); 100 } 101 102 #endif /* defined(CONFIG_USB_OHCI) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT) */ 103