4 * Copyright (C) 2015 Hans de Goede <hdegoede@redhat.com>
5 * Copyright (C) 2014 Roman Byshko <rbyshko@gmail.com>
8 * Allwinner Technology Co., Ltd. <www.allwinnertech.com>
10 * SPDX-License-Identifier: GPL-2.0+
14 #include <asm/arch/clock.h>
15 #include <asm/arch/usb_phy.h>
19 int ehci_hcd_init(int index
, enum usb_init_type init
, struct ehci_hccr
**hccr
,
20 struct ehci_hcor
**hcor
)
22 struct sunxi_ccm_reg
*ccm
= (struct sunxi_ccm_reg
*)SUNXI_CCM_BASE
;
23 int ahb_gate_offset
, err
;
25 err
= sunxi_usb_phy_probe(index
+ 1);
29 ahb_gate_offset
= index
? AHB_GATE_OFFSET_USB_EHCI1
:
30 AHB_GATE_OFFSET_USB_EHCI0
;
31 setbits_le32(&ccm
->ahb_gate0
, 1 << ahb_gate_offset
);
32 #ifdef CONFIG_SUNXI_GEN_SUN6I
33 setbits_le32(&ccm
->ahb_reset0_cfg
, 1 << ahb_gate_offset
);
36 sunxi_usb_phy_init(index
+ 1);
37 sunxi_usb_phy_power_on(index
+ 1);
40 *hccr
= (void *)SUNXI_USB1_BASE
;
42 *hccr
= (void *)SUNXI_USB2_BASE
;
44 *hcor
= (struct ehci_hcor
*)((uint32_t) *hccr
45 + HC_LENGTH(ehci_readl(&(*hccr
)->cr_capbase
)));
47 debug("sunxi-ehci: init hccr %x and hcor %x hc_length %d\n",
48 (uint32_t)*hccr
, (uint32_t)*hcor
,
49 (uint32_t)HC_LENGTH(ehci_readl(&(*hccr
)->cr_capbase
)));
54 int ehci_hcd_stop(int index
)
56 struct sunxi_ccm_reg
*ccm
= (struct sunxi_ccm_reg
*)SUNXI_CCM_BASE
;
59 sunxi_usb_phy_power_off(index
+ 1);
60 sunxi_usb_phy_exit(index
+ 1);
62 ahb_gate_offset
= index
? AHB_GATE_OFFSET_USB_EHCI1
:
63 AHB_GATE_OFFSET_USB_EHCI0
;
64 #ifdef CONFIG_SUNXI_GEN_SUN6I
65 clrbits_le32(&ccm
->ahb_reset0_cfg
, 1 << ahb_gate_offset
);
67 clrbits_le32(&ccm
->ahb_gate0
, 1 << ahb_gate_offset
);
69 return sunxi_usb_phy_remove(index
+ 1);