diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-17 19:28:15 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-03-17 19:28:15 -0700 | 
| commit | 0df0914d414a504b975f3cc66ace0c16ef55b7f3 (patch) | |
| tree | c97ffa357943a8b226cdec1b9632c4cede813205 /arch/arm/mach-omap2/omap_phy_internal.c | |
| parent | 6899608533410557e6698cb9d4ff6df553916e98 (diff) | |
| parent | 05f689400ea5fa3d71af82f910c8b140f87ad1f3 (diff) | |
| download | olio-linux-3.10-0df0914d414a504b975f3cc66ace0c16ef55b7f3.tar.xz olio-linux-3.10-0df0914d414a504b975f3cc66ace0c16ef55b7f3.zip  | |
Merge branch 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6
* 'omap-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap-2.6: (258 commits)
  omap: zoom: host should not pull up wl1271's irq line
  arm: plat-omap: iommu: fix request_mem_region() error path
  OMAP2+: Common CPU DIE ID reading code reads wrong registers for OMAP4430
  omap4: mux: Remove duplicate mux modes
  omap: iovmm: don't check 'da' to set IOVMF_DA_FIXED flag
  omap: iovmm: disallow mapping NULL address when IOVMF_DA_ANON is set
  omap2+: mux: Fix compile when CONFIG_OMAP_MUX is not selected
  omap4: board-omap4panda: Initialise the serial pads
  omap3: board-3430sdp: Initialise the serial pads
  omap4: board-4430sdp: Initialise the serial pads
  omap2+: mux: Add macro for configuring static with omap_hwmod_mux_init
  omap2+: mux: Remove the use of IDLE flag
  omap2+: Add separate list for dynamic pads to mux
  perf: add OMAP support for the new power events
  OMAP4: Add IVA OPP enteries.
  OMAP4: Update Voltage Rail Values for MPU, IVA and CORE
  OMAP4: Enable 800 MHz and 1 GHz MPU-OPP
  OMAP3+: OPP: Replace voltage values with Macros
  OMAP3: wdtimer: Fix CORE idle transition
  Watchdog: omap_wdt: add fine grain runtime-pm
  ...
Fix up various conflicts in
 - arch/arm/mach-omap2/board-omap3evm.c
 - arch/arm/mach-omap2/clock3xxx_data.c
 - arch/arm/mach-omap2/usb-musb.c
 - arch/arm/plat-omap/include/plat/usb.h
 - drivers/usb/musb/musb_core.h
Diffstat (limited to 'arch/arm/mach-omap2/omap_phy_internal.c')
| -rw-r--r-- | arch/arm/mach-omap2/omap_phy_internal.c | 93 | 
1 files changed, 93 insertions, 0 deletions
diff --git a/arch/arm/mach-omap2/omap_phy_internal.c b/arch/arm/mach-omap2/omap_phy_internal.c index ebe33df708b..e2e605fe913 100644 --- a/arch/arm/mach-omap2/omap_phy_internal.c +++ b/arch/arm/mach-omap2/omap_phy_internal.c @@ -29,6 +29,7 @@  #include <linux/usb.h>  #include <plat/usb.h> +#include "control.h"  /* OMAP control module register for UTMI PHY */  #define CONTROL_DEV_CONF		0x300 @@ -162,3 +163,95 @@ int omap4430_phy_exit(struct device *dev)  	return 0;  } + +void am35x_musb_reset(void) +{ +	u32	regval; + +	/* Reset the musb interface */ +	regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); + +	regval |= AM35XX_USBOTGSS_SW_RST; +	omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET); + +	regval &= ~AM35XX_USBOTGSS_SW_RST; +	omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET); + +	regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET); +} + +void am35x_musb_phy_power(u8 on) +{ +	unsigned long timeout = jiffies + msecs_to_jiffies(100); +	u32 devconf2; + +	if (on) { +		/* +		 * Start the on-chip PHY and its PLL. +		 */ +		devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2); + +		devconf2 &= ~(CONF2_RESET | CONF2_PHYPWRDN | CONF2_OTGPWRDN); +		devconf2 |= CONF2_PHY_PLLON; + +		omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2); + +		pr_info(KERN_INFO "Waiting for PHY clock good...\n"); +		while (!(omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2) +				& CONF2_PHYCLKGD)) { +			cpu_relax(); + +			if (time_after(jiffies, timeout)) { +				pr_err(KERN_ERR "musb PHY clock good timed out\n"); +				break; +			} +		} +	} else { +		/* +		 * Power down the on-chip PHY. +		 */ +		devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2); + +		devconf2 &= ~CONF2_PHY_PLLON; +		devconf2 |=  CONF2_PHYPWRDN | CONF2_OTGPWRDN; +		omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2); +	} +} + +void am35x_musb_clear_irq(void) +{ +	u32 regval; + +	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); +	regval |= AM35XX_USBOTGSS_INT_CLR; +	omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR); +	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR); +} + +void am35x_musb_set_mode(u8 musb_mode) +{ +	u32 devconf2 = omap_ctrl_readl(AM35XX_CONTROL_DEVCONF2); + +	devconf2 &= ~CONF2_OTGMODE; +	switch (musb_mode) { +#ifdef	CONFIG_USB_MUSB_HDRC_HCD +	case MUSB_HOST:		/* Force VBUS valid, ID = 0 */ +		devconf2 |= CONF2_FORCE_HOST; +		break; +#endif +#ifdef	CONFIG_USB_GADGET_MUSB_HDRC +	case MUSB_PERIPHERAL:	/* Force VBUS valid, ID = 1 */ +		devconf2 |= CONF2_FORCE_DEVICE; +		break; +#endif +#ifdef	CONFIG_USB_MUSB_OTG +	case MUSB_OTG:		/* Don't override the VBUS/ID comparators */ +		devconf2 |= CONF2_NO_OVERRIDE; +		break; +#endif +	default: +		pr_info(KERN_INFO "Unsupported mode %u\n", musb_mode); +	} + +	omap_ctrl_writel(devconf2, AM35XX_CONTROL_DEVCONF2); +}  |