| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 1 | /* | 
|  | 2 | * Copyright (C) 2005-2006 by Texas Instruments | 
|  | 3 | * | 
|  | 4 | * This file is part of the Inventra Controller Driver for Linux. | 
|  | 5 | * | 
|  | 6 | * The Inventra Controller Driver for Linux is free software; you | 
|  | 7 | * can redistribute it and/or modify it under the terms of the GNU | 
|  | 8 | * General Public License version 2 as published by the Free Software | 
|  | 9 | * Foundation. | 
|  | 10 | * | 
|  | 11 | * The Inventra Controller Driver for Linux is distributed in | 
|  | 12 | * the hope that it will be useful, but WITHOUT ANY WARRANTY; | 
|  | 13 | * without even the implied warranty of MERCHANTABILITY or | 
|  | 14 | * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public | 
|  | 15 | * License for more details. | 
|  | 16 | * | 
|  | 17 | * You should have received a copy of the GNU General Public License | 
|  | 18 | * along with The Inventra Controller Driver for Linux ; if not, | 
|  | 19 | * write to the Free Software Foundation, Inc., 59 Temple Place, | 
|  | 20 | * Suite 330, Boston, MA  02111-1307  USA | 
|  | 21 | * | 
|  | 22 | */ | 
|  | 23 |  | 
|  | 24 | #include <linux/module.h> | 
|  | 25 | #include <linux/kernel.h> | 
|  | 26 | #include <linux/sched.h> | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 27 | #include <linux/init.h> | 
|  | 28 | #include <linux/list.h> | 
|  | 29 | #include <linux/delay.h> | 
|  | 30 | #include <linux/clk.h> | 
| Kishon Vijay Abraham I | ded017e | 2012-06-26 17:40:32 +0530 | [diff] [blame] | 31 | #include <linux/err.h> | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 32 | #include <linux/io.h> | 
| David Brownell | c767c1c | 2008-09-11 11:53:23 +0300 | [diff] [blame] | 33 | #include <linux/gpio.h> | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 34 | #include <linux/platform_device.h> | 
|  | 35 | #include <linux/dma-mapping.h> | 
| Felipe Balbi | 78c289f | 2012-07-19 13:32:15 +0300 | [diff] [blame] | 36 | #include <linux/usb/nop-usb-xceiv.h> | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 37 |  | 
| David Brownell | d163ef2 | 2009-07-01 03:32:43 -0700 | [diff] [blame] | 38 | #include <mach/cputype.h> | 
| Jon Povey | 6594b2d | 2012-05-25 10:50:18 +0900 | [diff] [blame] | 39 | #include <mach/hardware.h> | 
| David Brownell | 10b4ead | 2009-01-24 17:56:17 -0800 | [diff] [blame] | 40 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 41 | #include <asm/mach-types.h> | 
|  | 42 |  | 
|  | 43 | #include "musb_core.h" | 
|  | 44 |  | 
|  | 45 | #ifdef CONFIG_MACH_DAVINCI_EVM | 
| Swaminathan S | a2396a3 | 2009-12-15 13:29:57 +0200 | [diff] [blame] | 46 | #define GPIO_nVBUS_DRV		160 | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 47 | #endif | 
|  | 48 |  | 
|  | 49 | #include "davinci.h" | 
|  | 50 | #include "cppi_dma.h" | 
|  | 51 |  | 
|  | 52 |  | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 53 | #define USB_PHY_CTRL	IO_ADDRESS(USBPHY_CTL_PADDR) | 
|  | 54 | #define DM355_DEEPSLEEP	IO_ADDRESS(DM355_DEEPSLEEP_PADDR) | 
|  | 55 |  | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 56 | struct davinci_glue { | 
|  | 57 | struct device		*dev; | 
|  | 58 | struct platform_device	*musb; | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 59 | struct clk		*clk; | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 60 | }; | 
|  | 61 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 62 | /* REVISIT (PM) we should be able to keep the PHY in low power mode most | 
|  | 63 | * of the time (24 MHZ oscillator and PLL off, etc) by setting POWER.D0 | 
|  | 64 | * and, when in host mode, autosuspending idle root ports... PHYPLLON | 
|  | 65 | * (overriding SUSPENDM?) then likely needs to stay off. | 
|  | 66 | */ | 
|  | 67 |  | 
|  | 68 | static inline void phy_on(void) | 
|  | 69 | { | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 70 | u32	phy_ctrl = __raw_readl(USB_PHY_CTRL); | 
|  | 71 |  | 
|  | 72 | /* power everything up; start the on-chip PHY and its PLL */ | 
|  | 73 | phy_ctrl &= ~(USBPHY_OSCPDWN | USBPHY_OTGPDWN | USBPHY_PHYPDWN); | 
|  | 74 | phy_ctrl |= USBPHY_SESNDEN | USBPHY_VBDTCTEN | USBPHY_PHYPLLON; | 
|  | 75 | __raw_writel(phy_ctrl, USB_PHY_CTRL); | 
|  | 76 |  | 
|  | 77 | /* wait for PLL to lock before proceeding */ | 
|  | 78 | while ((__raw_readl(USB_PHY_CTRL) & USBPHY_PHYCLKGD) == 0) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 79 | cpu_relax(); | 
|  | 80 | } | 
|  | 81 |  | 
|  | 82 | static inline void phy_off(void) | 
|  | 83 | { | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 84 | u32	phy_ctrl = __raw_readl(USB_PHY_CTRL); | 
|  | 85 |  | 
|  | 86 | /* powerdown the on-chip PHY, its PLL, and the OTG block */ | 
|  | 87 | phy_ctrl &= ~(USBPHY_SESNDEN | USBPHY_VBDTCTEN | USBPHY_PHYPLLON); | 
|  | 88 | phy_ctrl |= USBPHY_OSCPDWN | USBPHY_OTGPDWN | USBPHY_PHYPDWN; | 
|  | 89 | __raw_writel(phy_ctrl, USB_PHY_CTRL); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 90 | } | 
|  | 91 |  | 
|  | 92 | static int dma_off = 1; | 
|  | 93 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 94 | static void davinci_musb_enable(struct musb *musb) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 95 | { | 
|  | 96 | u32	tmp, old, val; | 
|  | 97 |  | 
|  | 98 | /* workaround:  setup irqs through both register sets */ | 
|  | 99 | tmp = (musb->epmask & DAVINCI_USB_TX_ENDPTS_MASK) | 
|  | 100 | << DAVINCI_USB_TXINT_SHIFT; | 
|  | 101 | musb_writel(musb->ctrl_base, DAVINCI_USB_INT_MASK_SET_REG, tmp); | 
|  | 102 | old = tmp; | 
|  | 103 | tmp = (musb->epmask & (0xfffe & DAVINCI_USB_RX_ENDPTS_MASK)) | 
|  | 104 | << DAVINCI_USB_RXINT_SHIFT; | 
|  | 105 | musb_writel(musb->ctrl_base, DAVINCI_USB_INT_MASK_SET_REG, tmp); | 
|  | 106 | tmp |= old; | 
|  | 107 |  | 
|  | 108 | val = ~MUSB_INTR_SOF; | 
|  | 109 | tmp |= ((val & 0x01ff) << DAVINCI_USB_USBINT_SHIFT); | 
|  | 110 | musb_writel(musb->ctrl_base, DAVINCI_USB_INT_MASK_SET_REG, tmp); | 
|  | 111 |  | 
|  | 112 | if (is_dma_capable() && !dma_off) | 
|  | 113 | printk(KERN_WARNING "%s %s: dma not reactivated\n", | 
|  | 114 | __FILE__, __func__); | 
|  | 115 | else | 
|  | 116 | dma_off = 0; | 
|  | 117 |  | 
|  | 118 | /* force a DRVVBUS irq so we can start polling for ID change */ | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 119 | musb_writel(musb->ctrl_base, DAVINCI_USB_INT_SET_REG, | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 120 | DAVINCI_INTR_DRVVBUS << DAVINCI_USB_USBINT_SHIFT); | 
|  | 121 | } | 
|  | 122 |  | 
|  | 123 | /* | 
|  | 124 | * Disable the HDRC and flush interrupts | 
|  | 125 | */ | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 126 | static void davinci_musb_disable(struct musb *musb) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 127 | { | 
|  | 128 | /* because we don't set CTRLR.UINT, "important" to: | 
|  | 129 | *  - not read/write INTRUSB/INTRUSBE | 
|  | 130 | *  - (except during initial setup, as workaround) | 
|  | 131 | *  - use INTSETR/INTCLRR instead | 
|  | 132 | */ | 
|  | 133 | musb_writel(musb->ctrl_base, DAVINCI_USB_INT_MASK_CLR_REG, | 
|  | 134 | DAVINCI_USB_USBINT_MASK | 
|  | 135 | | DAVINCI_USB_TXINT_MASK | 
|  | 136 | | DAVINCI_USB_RXINT_MASK); | 
|  | 137 | musb_writeb(musb->mregs, MUSB_DEVCTL, 0); | 
|  | 138 | musb_writel(musb->ctrl_base, DAVINCI_USB_EOI_REG, 0); | 
|  | 139 |  | 
|  | 140 | if (is_dma_capable() && !dma_off) | 
|  | 141 | WARNING("dma still active\n"); | 
|  | 142 | } | 
|  | 143 |  | 
|  | 144 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 145 | #define	portstate(stmt)		stmt | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 146 |  | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 147 | /* | 
|  | 148 | * VBUS SWITCHING IS BOARD-SPECIFIC ... at least for the DM6446 EVM, | 
|  | 149 | * which doesn't wire DRVVBUS to the FET that switches it.  Unclear | 
|  | 150 | * if that's a problem with the DM6446 chip or just with that board. | 
|  | 151 | * | 
|  | 152 | * In either case, the DM355 EVM automates DRVVBUS the normal way, | 
|  | 153 | * when J10 is out, and TI documents it as handling OTG. | 
|  | 154 | */ | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 155 |  | 
|  | 156 | #ifdef CONFIG_MACH_DAVINCI_EVM | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 157 |  | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 158 | static int vbus_state = -1; | 
|  | 159 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 160 | /* I2C operations are always synchronous, and require a task context. | 
|  | 161 | * With unloaded systems, using the shared workqueue seems to suffice | 
|  | 162 | * to satisfy the 100msec A_WAIT_VRISE timeout... | 
|  | 163 | */ | 
|  | 164 | static void evm_deferred_drvvbus(struct work_struct *ignored) | 
|  | 165 | { | 
| David Brownell | c767c1c | 2008-09-11 11:53:23 +0300 | [diff] [blame] | 166 | gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 167 | vbus_state = !vbus_state; | 
|  | 168 | } | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 169 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 170 | #endif	/* EVM */ | 
|  | 171 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 172 | static void davinci_musb_source_power(struct musb *musb, int is_on, int immediate) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 173 | { | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 174 | #ifdef CONFIG_MACH_DAVINCI_EVM | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 175 | if (is_on) | 
|  | 176 | is_on = 1; | 
|  | 177 |  | 
|  | 178 | if (vbus_state == is_on) | 
|  | 179 | return; | 
|  | 180 | vbus_state = !is_on;		/* 0/1 vs "-1 == unknown/init" */ | 
|  | 181 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 182 | if (machine_is_davinci_evm()) { | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 183 | static DECLARE_WORK(evm_vbus_work, evm_deferred_drvvbus); | 
|  | 184 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 185 | if (immediate) | 
| David Brownell | c767c1c | 2008-09-11 11:53:23 +0300 | [diff] [blame] | 186 | gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 187 | else | 
|  | 188 | schedule_work(&evm_vbus_work); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 189 | } | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 190 | if (immediate) | 
|  | 191 | vbus_state = is_on; | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 192 | #endif | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 193 | } | 
|  | 194 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 195 | static void davinci_musb_set_vbus(struct musb *musb, int is_on) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 196 | { | 
|  | 197 | WARN_ON(is_on && is_peripheral_active(musb)); | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 198 | davinci_musb_source_power(musb, is_on, 0); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 199 | } | 
|  | 200 |  | 
|  | 201 |  | 
|  | 202 | #define	POLL_SECONDS	2 | 
|  | 203 |  | 
|  | 204 | static struct timer_list otg_workaround; | 
|  | 205 |  | 
|  | 206 | static void otg_timer(unsigned long _musb) | 
|  | 207 | { | 
|  | 208 | struct musb		*musb = (void *)_musb; | 
|  | 209 | void __iomem		*mregs = musb->mregs; | 
|  | 210 | u8			devctl; | 
|  | 211 | unsigned long		flags; | 
|  | 212 |  | 
|  | 213 | /* We poll because DaVinci's won't expose several OTG-critical | 
|  | 214 | * status change events (from the transceiver) otherwise. | 
|  | 215 | */ | 
|  | 216 | devctl = musb_readb(mregs, MUSB_DEVCTL); | 
| Felipe Balbi | 5c8a86e | 2011-05-11 12:44:08 +0300 | [diff] [blame] | 217 | dev_dbg(musb->controller, "poll devctl %02x (%s)\n", devctl, | 
| Anatolij Gustschin | 3df0045 | 2011-05-05 12:11:21 +0200 | [diff] [blame] | 218 | otg_state_string(musb->xceiv->state)); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 219 |  | 
|  | 220 | spin_lock_irqsave(&musb->lock, flags); | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 221 | switch (musb->xceiv->state) { | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 222 | case OTG_STATE_A_WAIT_VFALL: | 
|  | 223 | /* Wait till VBUS falls below SessionEnd (~0.2V); the 1.3 RTL | 
|  | 224 | * seems to mis-handle session "start" otherwise (or in our | 
|  | 225 | * case "recover"), in routine "VBUS was valid by the time | 
|  | 226 | * VBUSERR got reported during enumeration" cases. | 
|  | 227 | */ | 
|  | 228 | if (devctl & MUSB_DEVCTL_VBUS) { | 
|  | 229 | mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); | 
|  | 230 | break; | 
|  | 231 | } | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 232 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 233 | musb_writel(musb->ctrl_base, DAVINCI_USB_INT_SET_REG, | 
|  | 234 | MUSB_INTR_VBUSERROR << DAVINCI_USB_USBINT_SHIFT); | 
|  | 235 | break; | 
|  | 236 | case OTG_STATE_B_IDLE: | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 237 | /* | 
|  | 238 | * There's no ID-changed IRQ, so we have no good way to tell | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 239 | * when to switch to the A-Default state machine (by setting | 
|  | 240 | * the DEVCTL.SESSION flag). | 
|  | 241 | * | 
|  | 242 | * Workaround:  whenever we're in B_IDLE, try setting the | 
|  | 243 | * session flag every few seconds.  If it works, ID was | 
|  | 244 | * grounded and we're now in the A-Default state machine. | 
|  | 245 | * | 
|  | 246 | * NOTE setting the session flag is _supposed_ to trigger | 
|  | 247 | * SRP, but clearly it doesn't. | 
|  | 248 | */ | 
|  | 249 | musb_writeb(mregs, MUSB_DEVCTL, | 
|  | 250 | devctl | MUSB_DEVCTL_SESSION); | 
|  | 251 | devctl = musb_readb(mregs, MUSB_DEVCTL); | 
|  | 252 | if (devctl & MUSB_DEVCTL_BDEVICE) | 
|  | 253 | mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); | 
|  | 254 | else | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 255 | musb->xceiv->state = OTG_STATE_A_IDLE; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 256 | break; | 
|  | 257 | default: | 
|  | 258 | break; | 
|  | 259 | } | 
|  | 260 | spin_unlock_irqrestore(&musb->lock, flags); | 
|  | 261 | } | 
|  | 262 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 263 | static irqreturn_t davinci_musb_interrupt(int irq, void *__hci) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 264 | { | 
|  | 265 | unsigned long	flags; | 
|  | 266 | irqreturn_t	retval = IRQ_NONE; | 
|  | 267 | struct musb	*musb = __hci; | 
| Heikki Krogerus | d445b6d | 2012-02-13 13:24:15 +0200 | [diff] [blame] | 268 | struct usb_otg	*otg = musb->xceiv->otg; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 269 | void __iomem	*tibase = musb->ctrl_base; | 
| Sergei Shtylyov | 91e9c4fe | 2009-03-27 12:59:46 -0700 | [diff] [blame] | 270 | struct cppi	*cppi; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 271 | u32		tmp; | 
|  | 272 |  | 
|  | 273 | spin_lock_irqsave(&musb->lock, flags); | 
|  | 274 |  | 
|  | 275 | /* NOTE: DaVinci shadows the Mentor IRQs.  Don't manage them through | 
|  | 276 | * the Mentor registers (except for setup), use the TI ones and EOI. | 
|  | 277 | * | 
| Uwe Kleine-König | dfff061 | 2010-02-12 21:58:11 +0100 | [diff] [blame] | 278 | * Docs describe irq "vector" registers associated with the CPPI and | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 279 | * USB EOI registers.  These hold a bitmask corresponding to the | 
|  | 280 | * current IRQ, not an irq handler address.  Would using those bits | 
|  | 281 | * resolve some of the races observed in this dispatch code?? | 
|  | 282 | */ | 
|  | 283 |  | 
|  | 284 | /* CPPI interrupts share the same IRQ line, but have their own | 
|  | 285 | * mask, state, "vector", and EOI registers. | 
|  | 286 | */ | 
| Sergei Shtylyov | 91e9c4fe | 2009-03-27 12:59:46 -0700 | [diff] [blame] | 287 | cppi = container_of(musb->dma_controller, struct cppi, controller); | 
|  | 288 | if (is_cppi_enabled() && musb->dma_controller && !cppi->irq) | 
|  | 289 | retval = cppi_interrupt(irq, __hci); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 290 |  | 
|  | 291 | /* ack and handle non-CPPI interrupts */ | 
|  | 292 | tmp = musb_readl(tibase, DAVINCI_USB_INT_SRC_MASKED_REG); | 
|  | 293 | musb_writel(tibase, DAVINCI_USB_INT_SRC_CLR_REG, tmp); | 
| Felipe Balbi | 5c8a86e | 2011-05-11 12:44:08 +0300 | [diff] [blame] | 294 | dev_dbg(musb->controller, "IRQ %08x\n", tmp); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 295 |  | 
|  | 296 | musb->int_rx = (tmp & DAVINCI_USB_RXINT_MASK) | 
|  | 297 | >> DAVINCI_USB_RXINT_SHIFT; | 
|  | 298 | musb->int_tx = (tmp & DAVINCI_USB_TXINT_MASK) | 
|  | 299 | >> DAVINCI_USB_TXINT_SHIFT; | 
|  | 300 | musb->int_usb = (tmp & DAVINCI_USB_USBINT_MASK) | 
|  | 301 | >> DAVINCI_USB_USBINT_SHIFT; | 
|  | 302 |  | 
|  | 303 | /* DRVVBUS irqs are the only proxy we have (a very poor one!) for | 
|  | 304 | * DaVinci's missing ID change IRQ.  We need an ID change IRQ to | 
|  | 305 | * switch appropriately between halves of the OTG state machine. | 
|  | 306 | * Managing DEVCTL.SESSION per Mentor docs requires we know its | 
|  | 307 | * value, but DEVCTL.BDEVICE is invalid without DEVCTL.SESSION set. | 
|  | 308 | * Also, DRVVBUS pulses for SRP (but not at 5V) ... | 
|  | 309 | */ | 
|  | 310 | if (tmp & (DAVINCI_INTR_DRVVBUS << DAVINCI_USB_USBINT_SHIFT)) { | 
|  | 311 | int	drvvbus = musb_readl(tibase, DAVINCI_USB_STAT_REG); | 
|  | 312 | void __iomem *mregs = musb->mregs; | 
|  | 313 | u8	devctl = musb_readb(mregs, MUSB_DEVCTL); | 
|  | 314 | int	err = musb->int_usb & MUSB_INTR_VBUSERROR; | 
|  | 315 |  | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 316 | err = musb->int_usb & MUSB_INTR_VBUSERROR; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 317 | if (err) { | 
|  | 318 | /* The Mentor core doesn't debounce VBUS as needed | 
|  | 319 | * to cope with device connect current spikes. This | 
|  | 320 | * means it's not uncommon for bus-powered devices | 
|  | 321 | * to get VBUS errors during enumeration. | 
|  | 322 | * | 
|  | 323 | * This is a workaround, but newer RTL from Mentor | 
|  | 324 | * seems to allow a better one: "re"starting sessions | 
|  | 325 | * without waiting (on EVM, a **long** time) for VBUS | 
|  | 326 | * to stop registering in devctl. | 
|  | 327 | */ | 
|  | 328 | musb->int_usb &= ~MUSB_INTR_VBUSERROR; | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 329 | musb->xceiv->state = OTG_STATE_A_WAIT_VFALL; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 330 | mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); | 
|  | 331 | WARNING("VBUS error workaround (delay coming)\n"); | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 332 | } else if (drvvbus) { | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 333 | MUSB_HST_MODE(musb); | 
| Heikki Krogerus | d445b6d | 2012-02-13 13:24:15 +0200 | [diff] [blame] | 334 | otg->default_a = 1; | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 335 | musb->xceiv->state = OTG_STATE_A_WAIT_VRISE; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 336 | portstate(musb->port1_status |= USB_PORT_STAT_POWER); | 
|  | 337 | del_timer(&otg_workaround); | 
|  | 338 | } else { | 
|  | 339 | musb->is_active = 0; | 
|  | 340 | MUSB_DEV_MODE(musb); | 
| Heikki Krogerus | d445b6d | 2012-02-13 13:24:15 +0200 | [diff] [blame] | 341 | otg->default_a = 0; | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 342 | musb->xceiv->state = OTG_STATE_B_IDLE; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 343 | portstate(musb->port1_status &= ~USB_PORT_STAT_POWER); | 
|  | 344 | } | 
|  | 345 |  | 
| David Brownell | 89368d3 | 2009-07-01 03:36:16 -0700 | [diff] [blame] | 346 | /* NOTE:  this must complete poweron within 100 msec | 
|  | 347 | * (OTG_TIME_A_WAIT_VRISE) but we don't check for that. | 
|  | 348 | */ | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 349 | davinci_musb_source_power(musb, drvvbus, 0); | 
| Felipe Balbi | 5c8a86e | 2011-05-11 12:44:08 +0300 | [diff] [blame] | 350 | dev_dbg(musb->controller, "VBUS %s (%s)%s, devctl %02x\n", | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 351 | drvvbus ? "on" : "off", | 
| Anatolij Gustschin | 3df0045 | 2011-05-05 12:11:21 +0200 | [diff] [blame] | 352 | otg_state_string(musb->xceiv->state), | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 353 | err ? " ERROR" : "", | 
|  | 354 | devctl); | 
|  | 355 | retval = IRQ_HANDLED; | 
|  | 356 | } | 
|  | 357 |  | 
|  | 358 | if (musb->int_tx || musb->int_rx || musb->int_usb) | 
|  | 359 | retval |= musb_interrupt(musb); | 
|  | 360 |  | 
|  | 361 | /* irq stays asserted until EOI is written */ | 
|  | 362 | musb_writel(tibase, DAVINCI_USB_EOI_REG, 0); | 
|  | 363 |  | 
|  | 364 | /* poll for ID change */ | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 365 | if (musb->xceiv->state == OTG_STATE_B_IDLE) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 366 | mod_timer(&otg_workaround, jiffies + POLL_SECONDS * HZ); | 
|  | 367 |  | 
|  | 368 | spin_unlock_irqrestore(&musb->lock, flags); | 
|  | 369 |  | 
| Sergei Shtylyov | a5073b5 | 2009-03-27 12:52:43 -0700 | [diff] [blame] | 370 | return retval; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 371 | } | 
|  | 372 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 373 | static int davinci_musb_set_mode(struct musb *musb, u8 mode) | 
| David Brownell | 96a274d | 2008-11-24 13:06:47 +0200 | [diff] [blame] | 374 | { | 
|  | 375 | /* EVM can't do this (right?) */ | 
|  | 376 | return -EIO; | 
|  | 377 | } | 
|  | 378 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 379 | static int davinci_musb_init(struct musb *musb) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 380 | { | 
|  | 381 | void __iomem	*tibase = musb->ctrl_base; | 
|  | 382 | u32		revision; | 
|  | 383 |  | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 384 | usb_nop_xceiv_register(); | 
| Kishon Vijay Abraham I | 662dca5 | 2012-06-22 17:02:46 +0530 | [diff] [blame] | 385 | musb->xceiv = usb_get_phy(USB_PHY_TYPE_USB2); | 
| Kishon Vijay Abraham I | ded017e | 2012-06-26 17:40:32 +0530 | [diff] [blame] | 386 | if (IS_ERR_OR_NULL(musb->xceiv)) | 
| Julia Lawall | c67dd31 | 2012-04-16 17:03:10 +0200 | [diff] [blame] | 387 | goto unregister; | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 388 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 389 | musb->mregs += DAVINCI_BASE_OFFSET; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 390 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 391 | /* returns zero if e.g. not clocked */ | 
|  | 392 | revision = musb_readl(tibase, DAVINCI_USB_VERSION_REG); | 
|  | 393 | if (revision == 0) | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 394 | goto fail; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 395 |  | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 396 | setup_timer(&otg_workaround, otg_timer, (unsigned long) musb); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 397 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 398 | davinci_musb_source_power(musb, 0, 1); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 399 |  | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 400 | /* dm355 EVM swaps D+/D- for signal integrity, and | 
|  | 401 | * is clocked from the main 24 MHz crystal. | 
|  | 402 | */ | 
|  | 403 | if (machine_is_davinci_dm355_evm()) { | 
|  | 404 | u32	phy_ctrl = __raw_readl(USB_PHY_CTRL); | 
|  | 405 |  | 
|  | 406 | phy_ctrl &= ~(3 << 9); | 
|  | 407 | phy_ctrl |= USBPHY_DATAPOL; | 
|  | 408 | __raw_writel(phy_ctrl, USB_PHY_CTRL); | 
|  | 409 | } | 
|  | 410 |  | 
| David Brownell | d163ef2 | 2009-07-01 03:32:43 -0700 | [diff] [blame] | 411 | /* On dm355, the default-A state machine needs DRVVBUS control. | 
|  | 412 | * If we won't be a host, there's no need to turn it on. | 
|  | 413 | */ | 
|  | 414 | if (cpu_is_davinci_dm355()) { | 
|  | 415 | u32	deepsleep = __raw_readl(DM355_DEEPSLEEP); | 
|  | 416 |  | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 417 | deepsleep &= ~DRVVBUS_FORCE; | 
| David Brownell | d163ef2 | 2009-07-01 03:32:43 -0700 | [diff] [blame] | 418 | __raw_writel(deepsleep, DM355_DEEPSLEEP); | 
|  | 419 | } | 
|  | 420 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 421 | /* reset the controller */ | 
|  | 422 | musb_writel(tibase, DAVINCI_USB_CTRL_REG, 0x1); | 
|  | 423 |  | 
|  | 424 | /* start the on-chip PHY and its PLL */ | 
|  | 425 | phy_on(); | 
|  | 426 |  | 
|  | 427 | msleep(5); | 
|  | 428 |  | 
|  | 429 | /* NOTE:  irqs are in mixed mode, not bypass to pure-musb */ | 
|  | 430 | pr_debug("DaVinci OTG revision %08x phy %03x control %02x\n", | 
| David Brownell | a227fd7 | 2009-02-24 15:31:54 -0800 | [diff] [blame] | 431 | revision, __raw_readl(USB_PHY_CTRL), | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 432 | musb_readb(tibase, DAVINCI_USB_CTRL_REG)); | 
|  | 433 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 434 | musb->isr = davinci_musb_interrupt; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 435 | return 0; | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 436 |  | 
|  | 437 | fail: | 
| Kishon Vijay Abraham I | 721002e | 2012-06-22 17:02:45 +0530 | [diff] [blame] | 438 | usb_put_phy(musb->xceiv); | 
| Julia Lawall | c67dd31 | 2012-04-16 17:03:10 +0200 | [diff] [blame] | 439 | unregister: | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 440 | usb_nop_xceiv_unregister(); | 
|  | 441 | return -ENODEV; | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 442 | } | 
|  | 443 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 444 | static int davinci_musb_exit(struct musb *musb) | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 445 | { | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 446 | del_timer_sync(&otg_workaround); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 447 |  | 
| David Brownell | d163ef2 | 2009-07-01 03:32:43 -0700 | [diff] [blame] | 448 | /* force VBUS off */ | 
|  | 449 | if (cpu_is_davinci_dm355()) { | 
|  | 450 | u32	deepsleep = __raw_readl(DM355_DEEPSLEEP); | 
|  | 451 |  | 
|  | 452 | deepsleep &= ~DRVVBUS_FORCE; | 
|  | 453 | deepsleep |= DRVVBUS_OVERRIDE; | 
|  | 454 | __raw_writel(deepsleep, DM355_DEEPSLEEP); | 
|  | 455 | } | 
|  | 456 |  | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 457 | davinci_musb_source_power(musb, 0 /*off*/, 1); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 458 |  | 
|  | 459 | /* delay, to avoid problems with module reload */ | 
| Felipe Balbi | 032ec49 | 2011-11-24 15:46:26 +0200 | [diff] [blame] | 460 | if (musb->xceiv->otg->default_a) { | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 461 | int	maxdelay = 30; | 
|  | 462 | u8	devctl, warn = 0; | 
|  | 463 |  | 
|  | 464 | /* if there's no peripheral connected, this can take a | 
|  | 465 | * long time to fall, especially on EVM with huge C133. | 
|  | 466 | */ | 
|  | 467 | do { | 
|  | 468 | devctl = musb_readb(musb->mregs, MUSB_DEVCTL); | 
|  | 469 | if (!(devctl & MUSB_DEVCTL_VBUS)) | 
|  | 470 | break; | 
|  | 471 | if ((devctl & MUSB_DEVCTL_VBUS) != warn) { | 
|  | 472 | warn = devctl & MUSB_DEVCTL_VBUS; | 
| Felipe Balbi | 5c8a86e | 2011-05-11 12:44:08 +0300 | [diff] [blame] | 473 | dev_dbg(musb->controller, "VBUS %d\n", | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 474 | warn >> MUSB_DEVCTL_VBUS_SHIFT); | 
|  | 475 | } | 
|  | 476 | msleep(1000); | 
|  | 477 | maxdelay--; | 
|  | 478 | } while (maxdelay > 0); | 
|  | 479 |  | 
|  | 480 | /* in OTG mode, another host might be connected */ | 
|  | 481 | if (devctl & MUSB_DEVCTL_VBUS) | 
| Felipe Balbi | 5c8a86e | 2011-05-11 12:44:08 +0300 | [diff] [blame] | 482 | dev_dbg(musb->controller, "VBUS off timeout (devctl %02x)\n", devctl); | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 483 | } | 
|  | 484 |  | 
|  | 485 | phy_off(); | 
| David Brownell | 34f32c9 | 2009-02-20 13:45:17 -0800 | [diff] [blame] | 486 |  | 
| Kishon Vijay Abraham I | 721002e | 2012-06-22 17:02:45 +0530 | [diff] [blame] | 487 | usb_put_phy(musb->xceiv); | 
| David Brownell | 84e250f | 2009-03-31 12:30:04 -0700 | [diff] [blame] | 488 | usb_nop_xceiv_unregister(); | 
|  | 489 |  | 
| Felipe Balbi | 550a737 | 2008-07-24 12:27:36 +0300 | [diff] [blame] | 490 | return 0; | 
|  | 491 | } | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 492 |  | 
| Felipe Balbi | f7ec943 | 2010-12-02 09:48:58 +0200 | [diff] [blame] | 493 | static const struct musb_platform_ops davinci_ops = { | 
| Felipe Balbi | 743411b | 2010-12-01 13:22:05 +0200 | [diff] [blame] | 494 | .init		= davinci_musb_init, | 
|  | 495 | .exit		= davinci_musb_exit, | 
|  | 496 |  | 
|  | 497 | .enable		= davinci_musb_enable, | 
|  | 498 | .disable	= davinci_musb_disable, | 
|  | 499 |  | 
|  | 500 | .set_mode	= davinci_musb_set_mode, | 
|  | 501 |  | 
|  | 502 | .set_vbus	= davinci_musb_set_vbus, | 
|  | 503 | }; | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 504 |  | 
|  | 505 | static u64 davinci_dmamask = DMA_BIT_MASK(32); | 
|  | 506 |  | 
| Felipe Balbi | e9e8c85 | 2012-01-26 12:40:23 +0200 | [diff] [blame] | 507 | static int __devinit davinci_probe(struct platform_device *pdev) | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 508 | { | 
|  | 509 | struct musb_hdrc_platform_data	*pdata = pdev->dev.platform_data; | 
|  | 510 | struct platform_device		*musb; | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 511 | struct davinci_glue		*glue; | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 512 | struct clk			*clk; | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 513 |  | 
|  | 514 | int				ret = -ENOMEM; | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 515 | int				musbid; | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 516 |  | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 517 | glue = kzalloc(sizeof(*glue), GFP_KERNEL); | 
|  | 518 | if (!glue) { | 
|  | 519 | dev_err(&pdev->dev, "failed to allocate glue context\n"); | 
|  | 520 | goto err0; | 
|  | 521 | } | 
|  | 522 |  | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 523 | /* get the musb id */ | 
|  | 524 | musbid = musb_get_id(&pdev->dev, GFP_KERNEL); | 
|  | 525 | if (musbid < 0) { | 
|  | 526 | dev_err(&pdev->dev, "failed to allocate musb id\n"); | 
|  | 527 | ret = -ENOMEM; | 
|  | 528 | goto err1; | 
|  | 529 | } | 
|  | 530 |  | 
|  | 531 | musb = platform_device_alloc("musb-hdrc", musbid); | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 532 | if (!musb) { | 
|  | 533 | dev_err(&pdev->dev, "failed to allocate musb device\n"); | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 534 | goto err2; | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 535 | } | 
|  | 536 |  | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 537 | clk = clk_get(&pdev->dev, "usb"); | 
|  | 538 | if (IS_ERR(clk)) { | 
|  | 539 | dev_err(&pdev->dev, "failed to get clock\n"); | 
|  | 540 | ret = PTR_ERR(clk); | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 541 | goto err3; | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 542 | } | 
|  | 543 |  | 
|  | 544 | ret = clk_enable(clk); | 
|  | 545 | if (ret) { | 
|  | 546 | dev_err(&pdev->dev, "failed to enable clock\n"); | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 547 | goto err4; | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 548 | } | 
|  | 549 |  | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 550 | musb->id			= musbid; | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 551 | musb->dev.parent		= &pdev->dev; | 
|  | 552 | musb->dev.dma_mask		= &davinci_dmamask; | 
|  | 553 | musb->dev.coherent_dma_mask	= davinci_dmamask; | 
|  | 554 |  | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 555 | glue->dev			= &pdev->dev; | 
|  | 556 | glue->musb			= musb; | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 557 | glue->clk			= clk; | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 558 |  | 
| Felipe Balbi | f7ec943 | 2010-12-02 09:48:58 +0200 | [diff] [blame] | 559 | pdata->platform_ops		= &davinci_ops; | 
|  | 560 |  | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 561 | platform_set_drvdata(pdev, glue); | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 562 |  | 
|  | 563 | ret = platform_device_add_resources(musb, pdev->resource, | 
|  | 564 | pdev->num_resources); | 
|  | 565 | if (ret) { | 
|  | 566 | dev_err(&pdev->dev, "failed to add resources\n"); | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 567 | goto err5; | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 568 | } | 
|  | 569 |  | 
|  | 570 | ret = platform_device_add_data(musb, pdata, sizeof(*pdata)); | 
|  | 571 | if (ret) { | 
|  | 572 | dev_err(&pdev->dev, "failed to add platform_data\n"); | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 573 | goto err5; | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 574 | } | 
|  | 575 |  | 
|  | 576 | ret = platform_device_add(musb); | 
|  | 577 | if (ret) { | 
|  | 578 | dev_err(&pdev->dev, "failed to register musb device\n"); | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 579 | goto err5; | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 580 | } | 
|  | 581 |  | 
|  | 582 | return 0; | 
|  | 583 |  | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 584 | err5: | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 585 | clk_disable(clk); | 
|  | 586 |  | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 587 | err4: | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 588 | clk_put(clk); | 
|  | 589 |  | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 590 | err3: | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 591 | platform_device_put(musb); | 
|  | 592 |  | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 593 | err2: | 
|  | 594 | musb_put_id(&pdev->dev, musbid); | 
|  | 595 |  | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 596 | err1: | 
|  | 597 | kfree(glue); | 
|  | 598 |  | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 599 | err0: | 
|  | 600 | return ret; | 
|  | 601 | } | 
|  | 602 |  | 
| Felipe Balbi | e9e8c85 | 2012-01-26 12:40:23 +0200 | [diff] [blame] | 603 | static int __devexit davinci_remove(struct platform_device *pdev) | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 604 | { | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 605 | struct davinci_glue		*glue = platform_get_drvdata(pdev); | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 606 |  | 
| B, Ravi | 65b3d52 | 2012-08-31 11:09:49 +0000 | [diff] [blame] | 607 | musb_put_id(&pdev->dev, glue->musb->id); | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 608 | platform_device_del(glue->musb); | 
|  | 609 | platform_device_put(glue->musb); | 
| Felipe Balbi | 0349176 | 2010-12-02 09:57:08 +0200 | [diff] [blame] | 610 | clk_disable(glue->clk); | 
|  | 611 | clk_put(glue->clk); | 
| Felipe Balbi | e110de4 | 2010-12-02 09:38:12 +0200 | [diff] [blame] | 612 | kfree(glue); | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 613 |  | 
|  | 614 | return 0; | 
|  | 615 | } | 
|  | 616 |  | 
|  | 617 | static struct platform_driver davinci_driver = { | 
| Felipe Balbi | e9e8c85 | 2012-01-26 12:40:23 +0200 | [diff] [blame] | 618 | .probe		= davinci_probe, | 
|  | 619 | .remove		= __devexit_p(davinci_remove), | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 620 | .driver		= { | 
|  | 621 | .name	= "musb-davinci", | 
|  | 622 | }, | 
|  | 623 | }; | 
|  | 624 |  | 
|  | 625 | MODULE_DESCRIPTION("DaVinci MUSB Glue Layer"); | 
|  | 626 | MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>"); | 
|  | 627 | MODULE_LICENSE("GPL v2"); | 
|  | 628 |  | 
|  | 629 | static int __init davinci_init(void) | 
|  | 630 | { | 
| Felipe Balbi | e9e8c85 | 2012-01-26 12:40:23 +0200 | [diff] [blame] | 631 | return platform_driver_register(&davinci_driver); | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 632 | } | 
| Felipe Balbi | e9e8c85 | 2012-01-26 12:40:23 +0200 | [diff] [blame] | 633 | module_init(davinci_init); | 
| Felipe Balbi | 73b089b | 2010-12-02 09:16:55 +0200 | [diff] [blame] | 634 |  | 
|  | 635 | static void __exit davinci_exit(void) | 
|  | 636 | { | 
|  | 637 | platform_driver_unregister(&davinci_driver); | 
|  | 638 | } | 
|  | 639 | module_exit(davinci_exit); |