USB: S5P: Add ehci support
This patch adds ehci driver support for s5p. Signed-off-by: Vivek Gautam <gautam.vivek@samsung.com> Signed-off-by: Rajeshwari Shinde <rajeshwari.s@samsung.com>
This commit is contained in:
		
							parent
							
								
									6734b6b234
								
							
						
					
					
						commit
						5f0ffea455
					
				|  | @ -0,0 +1,66 @@ | ||||||
|  | /*
 | ||||||
|  |  * SAMSUNG S5P USB HOST EHCI Controller | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2012 Samsung Electronics Co.Ltd | ||||||
|  |  *	Vivek Gautam <gautam.vivek@samsung.com> | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||||||
|  |  * MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #ifndef __ASM_ARM_ARCH_EXYNOS5_EHCI_S5P_H__ | ||||||
|  | #define __ASM_ARM_ARCH_EXYNOS5_EHCI_S5P_H__ | ||||||
|  | 
 | ||||||
|  | #define CLK_24MHZ		5 | ||||||
|  | 
 | ||||||
|  | #define HOST_CTRL0_PHYSWRSTALL			(1 << 31) | ||||||
|  | #define HOST_CTRL0_COMMONON_N			(1 << 9) | ||||||
|  | #define HOST_CTRL0_SIDDQ			(1 << 6) | ||||||
|  | #define HOST_CTRL0_FORCESLEEP			(1 << 5) | ||||||
|  | #define HOST_CTRL0_FORCESUSPEND			(1 << 4) | ||||||
|  | #define HOST_CTRL0_WORDINTERFACE		(1 << 3) | ||||||
|  | #define HOST_CTRL0_UTMISWRST			(1 << 2) | ||||||
|  | #define HOST_CTRL0_LINKSWRST			(1 << 1) | ||||||
|  | #define HOST_CTRL0_PHYSWRST			(1 << 0) | ||||||
|  | 
 | ||||||
|  | #define HOST_CTRL0_FSEL_MASK			(7 << 16) | ||||||
|  | 
 | ||||||
|  | #define EHCICTRL_ENAINCRXALIGN			(1 << 29) | ||||||
|  | #define EHCICTRL_ENAINCR4			(1 << 28) | ||||||
|  | #define EHCICTRL_ENAINCR8			(1 << 27) | ||||||
|  | #define EHCICTRL_ENAINCR16			(1 << 26) | ||||||
|  | 
 | ||||||
|  | /* Register map for PHY control */ | ||||||
|  | struct s5p_usb_phy { | ||||||
|  | 	unsigned int usbphyctrl0; | ||||||
|  | 	unsigned int usbphytune0; | ||||||
|  | 	unsigned int reserved1[2]; | ||||||
|  | 	unsigned int hsicphyctrl1; | ||||||
|  | 	unsigned int hsicphytune1; | ||||||
|  | 	unsigned int reserved2[2]; | ||||||
|  | 	unsigned int hsicphyctrl2; | ||||||
|  | 	unsigned int hsicphytune2; | ||||||
|  | 	unsigned int reserved3[2]; | ||||||
|  | 	unsigned int ehcictrl; | ||||||
|  | 	unsigned int ohcictrl; | ||||||
|  | 	unsigned int usbotgsys; | ||||||
|  | 	unsigned int reserved4; | ||||||
|  | 	unsigned int usbotgtune; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | /* Switch on the VBUS power. */ | ||||||
|  | int board_usb_vbus_init(void); | ||||||
|  | 
 | ||||||
|  | #endif /* __ASM_ARM_ARCH_EXYNOS5_EHCI_S5P_H__ */ | ||||||
|  | @ -50,6 +50,7 @@ COBJS-$(CONFIG_USB_EHCI_PPC4XX) += ehci-ppc4xx.o | ||||||
| COBJS-$(CONFIG_USB_EHCI_IXP4XX) += ehci-ixp.o | COBJS-$(CONFIG_USB_EHCI_IXP4XX) += ehci-ixp.o | ||||||
| COBJS-$(CONFIG_USB_EHCI_MARVELL) += ehci-marvell.o | COBJS-$(CONFIG_USB_EHCI_MARVELL) += ehci-marvell.o | ||||||
| COBJS-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o | COBJS-$(CONFIG_USB_EHCI_PCI) += ehci-pci.o | ||||||
|  | COBJS-$(CONFIG_USB_EHCI_S5P) += ehci-s5p.o | ||||||
| COBJS-$(CONFIG_USB_EHCI_TEGRA) += ehci-tegra.o | COBJS-$(CONFIG_USB_EHCI_TEGRA) += ehci-tegra.o | ||||||
| COBJS-$(CONFIG_USB_EHCI_VCT) += ehci-vct.o | COBJS-$(CONFIG_USB_EHCI_VCT) += ehci-vct.o | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,110 @@ | ||||||
|  | /*
 | ||||||
|  |  * SAMSUNG S5P USB HOST EHCI Controller | ||||||
|  |  * | ||||||
|  |  * Copyright (C) 2012 Samsung Electronics Co.Ltd | ||||||
|  |  *	Vivek Gautam <gautam.vivek@samsung.com> | ||||||
|  |  * | ||||||
|  |  * This program is free software; you can redistribute it and/or | ||||||
|  |  * modify it under the terms of the GNU General Public License as | ||||||
|  |  * published by the Free Software Foundation; either version 2 of | ||||||
|  |  * the License, or (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  * This program is distributed in the hope that it will be useful, | ||||||
|  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||
|  |  * GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  * You should have received a copy of the GNU General Public License | ||||||
|  |  * along with this program; if not, write to the Free Software | ||||||
|  |  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, | ||||||
|  |  * MA 02110-1301 USA | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #include <common.h> | ||||||
|  | #include <usb.h> | ||||||
|  | #include <asm/arch/cpu.h> | ||||||
|  | #include <asm/arch/ehci-s5p.h> | ||||||
|  | #include "ehci.h" | ||||||
|  | #include "ehci-core.h" | ||||||
|  | 
 | ||||||
|  | /* Setup the EHCI host controller. */ | ||||||
|  | static void setup_usb_phy(struct s5p_usb_phy *usb) | ||||||
|  | { | ||||||
|  | 	clrbits_le32(&usb->usbphyctrl0, | ||||||
|  | 			HOST_CTRL0_FSEL_MASK | | ||||||
|  | 			HOST_CTRL0_COMMONON_N | | ||||||
|  | 			/* HOST Phy setting */ | ||||||
|  | 			HOST_CTRL0_PHYSWRST | | ||||||
|  | 			HOST_CTRL0_PHYSWRSTALL | | ||||||
|  | 			HOST_CTRL0_SIDDQ | | ||||||
|  | 			HOST_CTRL0_FORCESUSPEND | | ||||||
|  | 			HOST_CTRL0_FORCESLEEP); | ||||||
|  | 
 | ||||||
|  | 	setbits_le32(&usb->usbphyctrl0, | ||||||
|  | 			/* Setting up the ref freq */ | ||||||
|  | 			(CLK_24MHZ << 16) | | ||||||
|  | 			/* HOST Phy setting */ | ||||||
|  | 			HOST_CTRL0_LINKSWRST | | ||||||
|  | 			HOST_CTRL0_UTMISWRST); | ||||||
|  | 	udelay(10); | ||||||
|  | 	clrbits_le32(&usb->usbphyctrl0, | ||||||
|  | 			HOST_CTRL0_LINKSWRST | | ||||||
|  | 			HOST_CTRL0_UTMISWRST); | ||||||
|  | 	udelay(20); | ||||||
|  | 
 | ||||||
|  | 	/* EHCI Ctrl setting */ | ||||||
|  | 	setbits_le32(&usb->ehcictrl, | ||||||
|  | 			EHCICTRL_ENAINCRXALIGN | | ||||||
|  | 			EHCICTRL_ENAINCR4 | | ||||||
|  | 			EHCICTRL_ENAINCR8 | | ||||||
|  | 			EHCICTRL_ENAINCR16); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /* Reset the EHCI host controller. */ | ||||||
|  | static void reset_usb_phy(struct s5p_usb_phy *usb) | ||||||
|  | { | ||||||
|  | 	/* HOST_PHY reset */ | ||||||
|  | 	setbits_le32(&usb->usbphyctrl0, | ||||||
|  | 			HOST_CTRL0_PHYSWRST | | ||||||
|  | 			HOST_CTRL0_PHYSWRSTALL | | ||||||
|  | 			HOST_CTRL0_SIDDQ | | ||||||
|  | 			HOST_CTRL0_FORCESUSPEND | | ||||||
|  | 			HOST_CTRL0_FORCESLEEP); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * EHCI-initialization | ||||||
|  |  * Create the appropriate control structures to manage | ||||||
|  |  * a new EHCI host controller. | ||||||
|  |  */ | ||||||
|  | int ehci_hcd_init(void) | ||||||
|  | { | ||||||
|  | 	struct s5p_usb_phy *usb; | ||||||
|  | 
 | ||||||
|  | 	usb = (struct s5p_usb_phy *)samsung_get_base_usb_phy(); | ||||||
|  | 	setup_usb_phy(usb); | ||||||
|  | 
 | ||||||
|  | 	hccr = (struct ehci_hccr *)(EXYNOS5_USB_HOST_EHCI_BASE); | ||||||
|  | 	hcor = (struct ehci_hcor *)((uint32_t) hccr | ||||||
|  | 				+ HC_LENGTH(ehci_readl(&hccr->cr_capbase))); | ||||||
|  | 
 | ||||||
|  | 	debug("Exynos5-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; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | /*
 | ||||||
|  |  * Destroy the appropriate control structures corresponding | ||||||
|  |  * the EHCI host controller. | ||||||
|  |  */ | ||||||
|  | int ehci_hcd_stop() | ||||||
|  | { | ||||||
|  | 	struct s5p_usb_phy *usb; | ||||||
|  | 
 | ||||||
|  | 	usb = (struct s5p_usb_phy *)samsung_get_base_usb_phy(); | ||||||
|  | 	reset_usb_phy(usb); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
		Loading…
	
		Reference in New Issue