mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-07-11 13:46:17 +09:00
![Hans de Goede](/assets/img/avatar_default.png)
The sunxi "usbc" code is mostly about phy setup, but currently also sets up the host controller clocks, which is something which really belongs in the host controller drivers, so move it there. This is a preparation patch for moving the sunxi ehci code to the driver model and for adding ohci support. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Ian Campbell <ijc@hellion.org.uk>
67 lines
1.7 KiB
C
67 lines
1.7 KiB
C
/*
|
|
* Copyright (C) 2014 Roman Byshko
|
|
*
|
|
* Roman Byshko <rbyshko@gmail.com>
|
|
*
|
|
* Based on code from
|
|
* Allwinner Technology Co., Ltd. <www.allwinnertech.com>
|
|
*
|
|
* SPDX-License-Identifier: GPL-2.0+
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <asm/arch/clock.h>
|
|
#include <asm/arch/usbc.h>
|
|
#include <asm/io.h>
|
|
#include "ehci.h"
|
|
|
|
int ehci_hcd_init(int index, enum usb_init_type init, struct ehci_hccr **hccr,
|
|
struct ehci_hcor **hcor)
|
|
{
|
|
struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
|
|
int ahb_gate_offset, err;
|
|
|
|
err = sunxi_usbc_request_resources(index + 1);
|
|
if (err)
|
|
return err;
|
|
|
|
ahb_gate_offset = index ? AHB_GATE_OFFSET_USB_EHCI1 :
|
|
AHB_GATE_OFFSET_USB_EHCI0;
|
|
setbits_le32(&ccm->ahb_gate0, 1 << ahb_gate_offset);
|
|
#ifdef CONFIG_SUNXI_GEN_SUN6I
|
|
setbits_le32(&ccm->ahb_reset0_cfg, 1 << ahb_gate_offset);
|
|
#endif
|
|
|
|
sunxi_usbc_enable(index + 1);
|
|
sunxi_usbc_vbus_enable(index + 1);
|
|
|
|
*hccr = sunxi_usbc_get_io_base(index + 1);
|
|
|
|
*hcor = (struct ehci_hcor *)((uint32_t) *hccr
|
|
+ HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
|
|
|
|
debug("sunxi-ehci: init hccr %x and hcor %x hc_length %d\n",
|
|
(uint32_t)*hccr, (uint32_t)*hcor,
|
|
(uint32_t)HC_LENGTH(ehci_readl(&(*hccr)->cr_capbase)));
|
|
|
|
return 0;
|
|
}
|
|
|
|
int ehci_hcd_stop(int index)
|
|
{
|
|
struct sunxi_ccm_reg *ccm = (struct sunxi_ccm_reg *)SUNXI_CCM_BASE;
|
|
int ahb_gate_offset;
|
|
|
|
sunxi_usbc_vbus_disable(index + 1);
|
|
sunxi_usbc_disable(index + 1);
|
|
|
|
ahb_gate_offset = index ? AHB_GATE_OFFSET_USB_EHCI1 :
|
|
AHB_GATE_OFFSET_USB_EHCI0;
|
|
#ifdef CONFIG_SUNXI_GEN_SUN6I
|
|
clrbits_le32(&ccm->ahb_reset0_cfg, 1 << ahb_gate_offset);
|
|
#endif
|
|
clrbits_le32(&ccm->ahb_gate0, 1 << ahb_gate_offset);
|
|
|
|
return sunxi_usbc_free_resources(index + 1);
|
|
}
|