]>
git.ipfire.org Git - people/ms/u-boot.git/blob - drivers/usb/host/ehci-atmel.c
3 * Atmel Semiconductor <www.atmel.com>
4 * Written-by: Bo Shen <voice.shen@atmel.com>
6 * SPDX-License-Identifier: GPL-2.0+
14 #include <asm/arch/clk.h>
18 DECLARE_GLOBAL_DATA_PTR
;
22 int ehci_hcd_init(int index
, enum usb_init_type init
,
23 struct ehci_hccr
**hccr
, struct ehci_hcor
**hcor
)
26 if (at91_upll_clk_enable())
29 /* Enable USB Host clock */
30 at91_periph_clk_enable(ATMEL_ID_UHPHS
);
32 *hccr
= (struct ehci_hccr
*)ATMEL_BASE_EHCI
;
33 *hcor
= (struct ehci_hcor
*)((uint32_t)*hccr
+
34 HC_LENGTH(ehci_readl(&(*hccr
)->cr_capbase
)));
39 int ehci_hcd_stop(int index
)
41 /* Disable USB Host Clock */
42 at91_periph_clk_disable(ATMEL_ID_UHPHS
);
44 /* Disable UTMI PLL */
45 if (at91_upll_clk_disable())
53 struct ehci_atmel_priv
{
54 struct ehci_ctrl ehci
;
57 static int ehci_atmel_enable_clk(struct udevice
*dev
)
62 ret
= clk_get_by_index(dev
, 0, &clk
);
66 ret
= clk_enable(&clk
);
70 ret
= clk_get_by_index(dev
, 1, &clk
);
74 ret
= clk_enable(&clk
);
83 static int ehci_atmel_probe(struct udevice
*dev
)
85 struct ehci_hccr
*hccr
;
86 struct ehci_hcor
*hcor
;
90 ret
= ehci_atmel_enable_clk(dev
);
92 debug("Failed to enable USB Host clock\n");
97 * Get the base address for EHCI controller from the device node
99 hcd_base
= devfdt_get_addr(dev
);
100 if (hcd_base
== FDT_ADDR_T_NONE
) {
101 debug("Can't get the EHCI register base address\n");
105 hccr
= (struct ehci_hccr
*)hcd_base
;
106 hcor
= (struct ehci_hcor
*)
107 ((u32
)hccr
+ HC_LENGTH(ehci_readl(&hccr
->cr_capbase
)));
109 debug("echi-atmel: init hccr %x and hcor %x hc_length %d\n",
110 (u32
)hccr
, (u32
)hcor
,
111 (u32
)HC_LENGTH(ehci_readl(&hccr
->cr_capbase
)));
113 return ehci_register(dev
, hccr
, hcor
, NULL
, 0, USB_INIT_HOST
);
116 static const struct udevice_id ehci_usb_ids
[] = {
117 { .compatible
= "atmel,at91sam9g45-ehci", },
121 U_BOOT_DRIVER(ehci_atmel
) = {
122 .name
= "ehci_atmel",
124 .of_match
= ehci_usb_ids
,
125 .probe
= ehci_atmel_probe
,
126 .remove
= ehci_deregister
,
127 .ops
= &ehci_usb_ops
,
128 .platdata_auto_alloc_size
= sizeof(struct usb_platdata
),
129 .priv_auto_alloc_size
= sizeof(struct ehci_atmel_priv
),
130 .flags
= DM_FLAG_ALLOC_PRIV_DMA
,