]> git.sur5r.net Git - u-boot/blob - drivers/usb/host/ohci-at91.c
arm: atmel: at91sam9n12ek: add usb host support
[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 #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) */