xref: /rk3399_rockchip-uboot/drivers/usb/host/ehci-exynos.c (revision 71045da8122c15ffa6cd31079f33b68f2a66b3e5)
17590d3ceSRajeshwari Shinde /*
27590d3ceSRajeshwari Shinde  * SAMSUNG EXYNOS USB HOST EHCI Controller
37590d3ceSRajeshwari Shinde  *
47590d3ceSRajeshwari Shinde  * Copyright (C) 2012 Samsung Electronics Co.Ltd
57590d3ceSRajeshwari Shinde  *	Vivek Gautam <gautam.vivek@samsung.com>
67590d3ceSRajeshwari Shinde  *
77590d3ceSRajeshwari Shinde  * This program is free software; you can redistribute it and/or
87590d3ceSRajeshwari Shinde  * modify it under the terms of the GNU General Public License as
97590d3ceSRajeshwari Shinde  * published by the Free Software Foundation; either version 2 of
107590d3ceSRajeshwari Shinde  * the License, or (at your option) any later version.
117590d3ceSRajeshwari Shinde  *
127590d3ceSRajeshwari Shinde  * This program is distributed in the hope that it will be useful,
137590d3ceSRajeshwari Shinde  * but WITHOUT ANY WARRANTY; without even the implied warranty of
147590d3ceSRajeshwari Shinde  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
157590d3ceSRajeshwari Shinde  * GNU General Public License for more details.
167590d3ceSRajeshwari Shinde  *
177590d3ceSRajeshwari Shinde  * You should have received a copy of the GNU General Public License
187590d3ceSRajeshwari Shinde  * along with this program; if not, write to the Free Software
197590d3ceSRajeshwari Shinde  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
207590d3ceSRajeshwari Shinde  * MA 02110-1301 USA
217590d3ceSRajeshwari Shinde  */
227590d3ceSRajeshwari Shinde 
237590d3ceSRajeshwari Shinde #include <common.h>
247590d3ceSRajeshwari Shinde #include <usb.h>
257590d3ceSRajeshwari Shinde #include <asm/arch/cpu.h>
267590d3ceSRajeshwari Shinde #include <asm/arch/ehci.h>
27*71045da8SRajeshwari Shinde #include <asm/arch/system.h>
287590d3ceSRajeshwari Shinde #include "ehci.h"
297590d3ceSRajeshwari Shinde #include "ehci-core.h"
307590d3ceSRajeshwari Shinde 
317590d3ceSRajeshwari Shinde /* Setup the EHCI host controller. */
327590d3ceSRajeshwari Shinde static void setup_usb_phy(struct exynos_usb_phy *usb)
337590d3ceSRajeshwari Shinde {
34*71045da8SRajeshwari Shinde 	set_usbhost_mode(USB20_PHY_CFG_HOST_LINK_EN);
35*71045da8SRajeshwari Shinde 
367590d3ceSRajeshwari Shinde 	clrbits_le32(&usb->usbphyctrl0,
377590d3ceSRajeshwari Shinde 			HOST_CTRL0_FSEL_MASK |
387590d3ceSRajeshwari Shinde 			HOST_CTRL0_COMMONON_N |
397590d3ceSRajeshwari Shinde 			/* HOST Phy setting */
407590d3ceSRajeshwari Shinde 			HOST_CTRL0_PHYSWRST |
417590d3ceSRajeshwari Shinde 			HOST_CTRL0_PHYSWRSTALL |
427590d3ceSRajeshwari Shinde 			HOST_CTRL0_SIDDQ |
437590d3ceSRajeshwari Shinde 			HOST_CTRL0_FORCESUSPEND |
447590d3ceSRajeshwari Shinde 			HOST_CTRL0_FORCESLEEP);
457590d3ceSRajeshwari Shinde 
467590d3ceSRajeshwari Shinde 	setbits_le32(&usb->usbphyctrl0,
477590d3ceSRajeshwari Shinde 			/* Setting up the ref freq */
487590d3ceSRajeshwari Shinde 			(CLK_24MHZ << 16) |
497590d3ceSRajeshwari Shinde 			/* HOST Phy setting */
507590d3ceSRajeshwari Shinde 			HOST_CTRL0_LINKSWRST |
517590d3ceSRajeshwari Shinde 			HOST_CTRL0_UTMISWRST);
527590d3ceSRajeshwari Shinde 	udelay(10);
537590d3ceSRajeshwari Shinde 	clrbits_le32(&usb->usbphyctrl0,
547590d3ceSRajeshwari Shinde 			HOST_CTRL0_LINKSWRST |
557590d3ceSRajeshwari Shinde 			HOST_CTRL0_UTMISWRST);
567590d3ceSRajeshwari Shinde 	udelay(20);
577590d3ceSRajeshwari Shinde 
587590d3ceSRajeshwari Shinde 	/* EHCI Ctrl setting */
597590d3ceSRajeshwari Shinde 	setbits_le32(&usb->ehcictrl,
607590d3ceSRajeshwari Shinde 			EHCICTRL_ENAINCRXALIGN |
617590d3ceSRajeshwari Shinde 			EHCICTRL_ENAINCR4 |
627590d3ceSRajeshwari Shinde 			EHCICTRL_ENAINCR8 |
637590d3ceSRajeshwari Shinde 			EHCICTRL_ENAINCR16);
647590d3ceSRajeshwari Shinde }
657590d3ceSRajeshwari Shinde 
667590d3ceSRajeshwari Shinde /* Reset the EHCI host controller. */
677590d3ceSRajeshwari Shinde static void reset_usb_phy(struct exynos_usb_phy *usb)
687590d3ceSRajeshwari Shinde {
697590d3ceSRajeshwari Shinde 	/* HOST_PHY reset */
707590d3ceSRajeshwari Shinde 	setbits_le32(&usb->usbphyctrl0,
717590d3ceSRajeshwari Shinde 			HOST_CTRL0_PHYSWRST |
727590d3ceSRajeshwari Shinde 			HOST_CTRL0_PHYSWRSTALL |
737590d3ceSRajeshwari Shinde 			HOST_CTRL0_SIDDQ |
747590d3ceSRajeshwari Shinde 			HOST_CTRL0_FORCESUSPEND |
757590d3ceSRajeshwari Shinde 			HOST_CTRL0_FORCESLEEP);
767590d3ceSRajeshwari Shinde }
777590d3ceSRajeshwari Shinde 
787590d3ceSRajeshwari Shinde /*
797590d3ceSRajeshwari Shinde  * EHCI-initialization
807590d3ceSRajeshwari Shinde  * Create the appropriate control structures to manage
817590d3ceSRajeshwari Shinde  * a new EHCI host controller.
827590d3ceSRajeshwari Shinde  */
837590d3ceSRajeshwari Shinde int ehci_hcd_init(void)
847590d3ceSRajeshwari Shinde {
857590d3ceSRajeshwari Shinde 	struct exynos_usb_phy *usb;
867590d3ceSRajeshwari Shinde 
877590d3ceSRajeshwari Shinde 	usb = (struct exynos_usb_phy *)samsung_get_base_usb_phy();
887590d3ceSRajeshwari Shinde 	setup_usb_phy(usb);
897590d3ceSRajeshwari Shinde 
907590d3ceSRajeshwari Shinde 	hccr = (struct ehci_hccr *)samsung_get_base_usb_ehci();
917590d3ceSRajeshwari Shinde 	hcor = (struct ehci_hcor *)((uint32_t) hccr
927590d3ceSRajeshwari Shinde 				+ HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
937590d3ceSRajeshwari Shinde 
947590d3ceSRajeshwari Shinde 	debug("Exynos5-ehci: init hccr %x and hcor %x hc_length %d\n",
957590d3ceSRajeshwari Shinde 		(uint32_t)hccr, (uint32_t)hcor,
967590d3ceSRajeshwari Shinde 		(uint32_t)HC_LENGTH(ehci_readl(&hccr->cr_capbase)));
977590d3ceSRajeshwari Shinde 
987590d3ceSRajeshwari Shinde 	return 0;
997590d3ceSRajeshwari Shinde }
1007590d3ceSRajeshwari Shinde 
1017590d3ceSRajeshwari Shinde /*
1027590d3ceSRajeshwari Shinde  * Destroy the appropriate control structures corresponding
1037590d3ceSRajeshwari Shinde  * the EHCI host controller.
1047590d3ceSRajeshwari Shinde  */
1057590d3ceSRajeshwari Shinde int ehci_hcd_stop()
1067590d3ceSRajeshwari Shinde {
1077590d3ceSRajeshwari Shinde 	struct exynos_usb_phy *usb;
1087590d3ceSRajeshwari Shinde 
1097590d3ceSRajeshwari Shinde 	usb = (struct exynos_usb_phy *)samsung_get_base_usb_phy();
1107590d3ceSRajeshwari Shinde 	reset_usb_phy(usb);
1117590d3ceSRajeshwari Shinde 
1127590d3ceSRajeshwari Shinde 	return 0;
1137590d3ceSRajeshwari Shinde }
114