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 27*b55b5960SWenyou Yang at91_usb_clk_init(AT91_PMC_USBS_USB_PLLB | AT91_PMC_USB_DIV_2); 28d9bef0adSBo Shen #endif 29dcd2f1a0SBo Shen #elif defined(CONFIG_USB_ATMEL_CLK_SEL_UPLL) 30*b55b5960SWenyou Yang if (at91_upll_clk_enable()) 31*b55b5960SWenyou Yang return -1; 3264203c7bSSergey Matyukevich 33*b55b5960SWenyou Yang at91_usb_clk_init(AT91_PMC_USBS_USB_UPLL | AT91_PMC_USBDIV_10); 342731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 352731b9a8SJean-Christophe PLAGNIOL-VILLARD 3601c8bf5aSBo Shen at91_periph_clk_enable(ATMEL_ID_UHP); 37e5e8bb05SBo Shen 38cd4de1d9SWenyou Yang at91_system_clk_enable(ATMEL_PMC_UHP); 39158947d2SBo Shen #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10) 40cd4de1d9SWenyou Yang at91_system_clk_enable(AT91_PMC_HCK0); 412731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 422731b9a8SJean-Christophe PLAGNIOL-VILLARD 432731b9a8SJean-Christophe PLAGNIOL-VILLARD return 0; 442731b9a8SJean-Christophe PLAGNIOL-VILLARD } 452731b9a8SJean-Christophe PLAGNIOL-VILLARD 462731b9a8SJean-Christophe PLAGNIOL-VILLARD int usb_cpu_stop(void) 472731b9a8SJean-Christophe PLAGNIOL-VILLARD { 48372f2783SReinhard Meyer at91_pmc_t *pmc = (at91_pmc_t *)ATMEL_BASE_PMC; 490701f730SMatthias Fuchs 5001c8bf5aSBo Shen at91_periph_clk_disable(ATMEL_ID_UHP); 51e5e8bb05SBo Shen 52cd4de1d9SWenyou Yang at91_system_clk_disable(ATMEL_PMC_UHP); 53158947d2SBo Shen #if defined(CONFIG_AT91SAM9261) || defined(CONFIG_AT91SAM9G10) 54cd4de1d9SWenyou Yang at91_system_clk_disable(AT91_PMC_HCK0); 552731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 562731b9a8SJean-Christophe PLAGNIOL-VILLARD 57dcd2f1a0SBo Shen #ifdef CONFIG_USB_ATMEL_CLK_SEL_PLLB 58d9bef0adSBo Shen #ifdef CONFIG_AT91SAM9N12 59*b55b5960SWenyou Yang at91_usb_clk_init(0); 60d9bef0adSBo Shen #endif 612731b9a8SJean-Christophe PLAGNIOL-VILLARD /* Disable PLLB */ 620701f730SMatthias Fuchs writel(0, &pmc->pllbr); 630701f730SMatthias Fuchs while ((readl(&pmc->sr) & AT91_PMC_LOCKB) != 0) 642731b9a8SJean-Christophe PLAGNIOL-VILLARD ; 65dcd2f1a0SBo Shen #elif defined(CONFIG_USB_ATMEL_CLK_SEL_UPLL) 66*b55b5960SWenyou Yang if (at91_upll_clk_disable()) 67*b55b5960SWenyou Yang return -1; 682731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif 692731b9a8SJean-Christophe PLAGNIOL-VILLARD 702731b9a8SJean-Christophe PLAGNIOL-VILLARD return 0; 712731b9a8SJean-Christophe PLAGNIOL-VILLARD } 722731b9a8SJean-Christophe PLAGNIOL-VILLARD 732731b9a8SJean-Christophe PLAGNIOL-VILLARD int usb_cpu_init_fail(void) 742731b9a8SJean-Christophe PLAGNIOL-VILLARD { 752731b9a8SJean-Christophe PLAGNIOL-VILLARD return usb_cpu_stop(); 762731b9a8SJean-Christophe PLAGNIOL-VILLARD } 772731b9a8SJean-Christophe PLAGNIOL-VILLARD 782731b9a8SJean-Christophe PLAGNIOL-VILLARD #endif /* defined(CONFIG_USB_OHCI) && defined(CONFIG_SYS_USB_OHCI_CPU_INIT) */ 79