12731b9a8SJean-Christophe PLAGNIOL-VILLARD /* 22731b9a8SJean-Christophe PLAGNIOL-VILLARD * (C) Copyright 2006 32731b9a8SJean-Christophe PLAGNIOL-VILLARD * DENX Software Engineering <mk@denx.de> 42731b9a8SJean-Christophe PLAGNIOL-VILLARD * 51a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 62731b9a8SJean-Christophe PLAGNIOL-VILLARD */ 72731b9a8SJean-Christophe PLAGNIOL-VILLARD 82731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <common.h> 92731b9a8SJean-Christophe PLAGNIOL-VILLARD 102731b9a8SJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_USB_OHCI_NEW) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT) 112731b9a8SJean-Christophe PLAGNIOL-VILLARD 1286592f60SReinhard Meyer #include <asm/io.h> 132731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/hardware.h> 142731b9a8SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/at91_pmc.h> 15dc39ae95SJean-Christophe PLAGNIOL-VILLARD #include <asm/arch/clk.h> 162731b9a8SJean-Christophe PLAGNIOL-VILLARD 172731b9a8SJean-Christophe PLAGNIOL-VILLARD int usb_cpu_init(void) 182731b9a8SJean-Christophe PLAGNIOL-VILLARD { 19372f2783SReinhard Meyer at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC; 202731b9a8SJean-Christophe PLAGNIOL-VILLARD 21dcd2f1a0SBo Shen #ifdef CONFIG_USB_ATMEL_CLK_SEL_PLLB 222731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Enable PLLB */ 230701f730SMatthias Fuchs writel(get_pllb_init(), &pmc->pllbr); 240701f730SMatthias Fuchs while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != AT91_PMC_LOCKB) 252731b9a8SJean-Christophe PLAGNIOL-VILLARD ; 26d9bef0adSBo Shen #ifdef CONFIG_AT91SAM9N12 27d9bef0adSBo Shen writel(AT91_PMC_USBS_USB_PLLB | AT91_PMC_USB_DIV_2, &pmc->usb); 28d9bef0adSBo Shen #endif 29dcd2f1a0SBo Shen #elif defined(CONFIG_USB_ATMEL_CLK_SEL_UPLL) 3064203c7bSSergey Matyukevich /* Enable UPLL */ 3164203c7bSSergey Matyukevich writel(readl(&pmc->uckr) | AT91_PMC_UPLLEN | AT91_PMC_BIASEN, 3264203c7bSSergey Matyukevich &pmc->uckr); 3364203c7bSSergey Matyukevich while ((readl(&pmc->sr) & AT91_PMC_LOCKU) != AT91_PMC_LOCKU) 3464203c7bSSergey Matyukevich ; 3564203c7bSSergey Matyukevich 3664203c7bSSergey Matyukevich /* Select PLLA as input clock of OHCI */ 3764203c7bSSergey Matyukevich writel(AT91_PMC_USBS_USB_UPLL | AT91_PMC_USBDIV_10, &pmc->usb); 382731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 392731b9a8SJean-Christophe PLAGNIOL-VILLARD 4001c8bf5aSBo Shen at91_periph_clk_enable(ATMEL_ID_UHP); 41e5e8bb05SBo Shen 42*cd4de1d9SWenyou Yang at91_system_clk_enable(ATMEL_PMC_UHP); 43158947d2SBo Shen #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10) 44*cd4de1d9SWenyou Yang at91_system_clk_enable(AT91_PMC_HCK0); 452731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 462731b9a8SJean-Christophe PLAGNIOL-VILLARD 472731b9a8SJean-Christophe PLAGNIOL-VILLARD return 0; 482731b9a8SJean-Christophe PLAGNIOL-VILLARD } 492731b9a8SJean-Christophe PLAGNIOL-VILLARD 502731b9a8SJean-Christophe PLAGNIOL-VILLARD int usb_cpu_stop(void) 512731b9a8SJean-Christophe PLAGNIOL-VILLARD { 52372f2783SReinhard Meyer at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC; 530701f730SMatthias Fuchs 5401c8bf5aSBo Shen at91_periph_clk_disable(ATMEL_ID_UHP); 55e5e8bb05SBo Shen 56*cd4de1d9SWenyou Yang at91_system_clk_disable(ATMEL_PMC_UHP); 57158947d2SBo Shen #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10) 58*cd4de1d9SWenyou Yang at91_system_clk_disable(AT91_PMC_HCK0); 592731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 602731b9a8SJean-Christophe PLAGNIOL-VILLARD 61dcd2f1a0SBo Shen #ifdef CONFIG_USB_ATMEL_CLK_SEL_PLLB 62d9bef0adSBo Shen #ifdef CONFIG_AT91SAM9N12 63d9bef0adSBo Shen writel(0, &pmc->usb); 64d9bef0adSBo Shen #endif 652731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Disable PLLB */ 660701f730SMatthias Fuchs writel(0, &pmc->pllbr); 670701f730SMatthias Fuchs while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != 0) 682731b9a8SJean-Christophe PLAGNIOL-VILLARD ; 69dcd2f1a0SBo Shen #elif defined(CONFIG_USB_ATMEL_CLK_SEL_UPLL) 7064203c7bSSergey Matyukevich /* Disable UPLL */ 7164203c7bSSergey Matyukevich writel(readl(&pmc->uckr) & (~AT91_PMC_UPLLEN), &pmc->uckr); 7264203c7bSSergey Matyukevich while ((readl(&pmc->sr) & AT91_PMC_LOCKU) == AT91_PMC_LOCKU) 7364203c7bSSergey Matyukevich ; 742731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 752731b9a8SJean-Christophe PLAGNIOL-VILLARD 762731b9a8SJean-Christophe PLAGNIOL-VILLARD return 0; 772731b9a8SJean-Christophe PLAGNIOL-VILLARD } 782731b9a8SJean-Christophe PLAGNIOL-VILLARD 792731b9a8SJean-Christophe PLAGNIOL-VILLARD int usb_cpu_init_fail(void) 802731b9a8SJean-Christophe PLAGNIOL-VILLARD { 812731b9a8SJean-Christophe PLAGNIOL-VILLARD return usb_cpu_stop(); 822731b9a8SJean-Christophe PLAGNIOL-VILLARD } 832731b9a8SJean-Christophe PLAGNIOL-VILLARD 842731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif /* defined(CONFIG_USB_OHCI) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT) */ 85