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