]> git.sur5r.net Git - u-boot/blob - drivers/usb/host/ohci-at91.c
drivers: usb: atmel: clean up the UTMI PLL code
[u-boot] / drivers / usb / host / ohci-at91.c
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) */