aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/phy
diff options
context:
space:
mode:
authorKishon Vijay Abraham I <kishon@ti.com>2013-09-27 02:23:27 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-09-27 20:36:58 -0400
commit6747caa76cab1150c60a772cf64f8cd47fa19d39 (patch)
treea80e21a0d4746cf194888ede0a08b3370a0be623 /drivers/phy
parent5d93d1e76afbe629caf5d995fd7f8ddd6e3d4d01 (diff)
usb: phy: twl4030: use the new generic PHY framework
Used the generic PHY framework API to create the PHY. For powering on and powering off the PHY, power_on and power_off ops are used. Once the MUSB OMAP glue is adapted to the new framework, the suspend and resume ops of usb phy library will be removed. Also twl4030-usb driver is moved to drivers/phy/. However using the old usb phy library cannot be completely removed because otg is intertwined with phy and moving to the new framework completely will break otg. Once we have a separate otg state machine, we can get rid of the usb phy library. Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com> Acked-by: Felipe Balbi <balbi@ti.com> Reviewed-by: Sylwester Nawrocki <s.nawrocki@samsung.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/phy')
-rw-r--r--drivers/phy/Kconfig11
-rw-r--r--drivers/phy/Makefile1
-rw-r--r--drivers/phy/phy-twl4030-usb.c844
3 files changed, 856 insertions, 0 deletions
diff --git a/drivers/phy/Kconfig b/drivers/phy/Kconfig
index 38c3477ead4c..ac239aca77ec 100644
--- a/drivers/phy/Kconfig
+++ b/drivers/phy/Kconfig
@@ -27,4 +27,15 @@ config OMAP_USB2
27 The USB OTG controller communicates with the comparator using this 27 The USB OTG controller communicates with the comparator using this
28 driver. 28 driver.
29 29
30config TWL4030_USB
31 tristate "TWL4030 USB Transceiver Driver"
32 depends on TWL4030_CORE && REGULATOR_TWL4030 && USB_MUSB_OMAP2PLUS
33 select GENERIC_PHY
34 select USB_PHY
35 help
36 Enable this to support the USB OTG transceiver on TWL4030
37 family chips (including the TWL5030 and TPS659x0 devices).
38 This transceiver supports high and full speed devices plus,
39 in host mode, low speed.
40
30endmenu 41endmenu
diff --git a/drivers/phy/Makefile b/drivers/phy/Makefile
index ed5b088abaee..0dd8a9834548 100644
--- a/drivers/phy/Makefile
+++ b/drivers/phy/Makefile
@@ -4,3 +4,4 @@
4 4
5obj-$(CONFIG_GENERIC_PHY) += phy-core.o 5obj-$(CONFIG_GENERIC_PHY) += phy-core.o
6obj-$(CONFIG_OMAP_USB2) += phy-omap-usb2.o 6obj-$(CONFIG_OMAP_USB2) += phy-omap-usb2.o
7obj-$(CONFIG_TWL4030_USB) += phy-twl4030-usb.o
diff --git a/drivers/phy/phy-twl4030-usb.c b/drivers/phy/phy-twl4030-usb.c
new file mode 100644
index 000000000000..d02913f9a6b1
--- /dev/null
+++ b/drivers/phy/phy-twl4030-usb.c
@@ -0,0 +1,844 @@
1/*
2 * twl4030_usb - TWL4030 USB transceiver, talking to OMAP OTG controller
3 *
4 * Copyright (C) 2004-2007 Texas Instruments
5 * Copyright (C) 2008 Nokia Corporation
6 * Contact: Felipe Balbi <felipe.balbi@nokia.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 *
22 * Current status:
23 * - HS USB ULPI mode works.
24 * - 3-pin mode support may be added in future.
25 */
26
27#include <linux/module.h>
28#include <linux/init.h>
29#include <linux/interrupt.h>
30#include <linux/platform_device.h>
31#include <linux/spinlock.h>
32#include <linux/workqueue.h>
33#include <linux/io.h>
34#include <linux/delay.h>
35#include <linux/usb/otg.h>
36#include <linux/phy/phy.h>
37#include <linux/usb/musb-omap.h>
38#include <linux/usb/ulpi.h>
39#include <linux/i2c/twl.h>
40#include <linux/regulator/consumer.h>
41#include <linux/err.h>
42#include <linux/slab.h>
43
44/* Register defines */
45
46#define MCPC_CTRL 0x30
47#define MCPC_CTRL_RTSOL (1 << 7)
48#define MCPC_CTRL_EXTSWR (1 << 6)
49#define MCPC_CTRL_EXTSWC (1 << 5)
50#define MCPC_CTRL_VOICESW (1 << 4)
51#define MCPC_CTRL_OUT64K (1 << 3)
52#define MCPC_CTRL_RTSCTSSW (1 << 2)
53#define MCPC_CTRL_HS_UART (1 << 0)
54
55#define MCPC_IO_CTRL 0x33
56#define MCPC_IO_CTRL_MICBIASEN (1 << 5)
57#define MCPC_IO_CTRL_CTS_NPU (1 << 4)
58#define MCPC_IO_CTRL_RXD_PU (1 << 3)
59#define MCPC_IO_CTRL_TXDTYP (1 << 2)
60#define MCPC_IO_CTRL_CTSTYP (1 << 1)
61#define MCPC_IO_CTRL_RTSTYP (1 << 0)
62
63#define MCPC_CTRL2 0x36
64#define MCPC_CTRL2_MCPC_CK_EN (1 << 0)
65
66#define OTHER_FUNC_CTRL 0x80
67#define OTHER_FUNC_CTRL_BDIS_ACON_EN (1 << 4)
68#define OTHER_FUNC_CTRL_FIVEWIRE_MODE (1 << 2)
69
70#define OTHER_IFC_CTRL 0x83
71#define OTHER_IFC_CTRL_OE_INT_EN (1 << 6)
72#define OTHER_IFC_CTRL_CEA2011_MODE (1 << 5)
73#define OTHER_IFC_CTRL_FSLSSERIALMODE_4PIN (1 << 4)
74#define OTHER_IFC_CTRL_HIZ_ULPI_60MHZ_OUT (1 << 3)
75#define OTHER_IFC_CTRL_HIZ_ULPI (1 << 2)
76#define OTHER_IFC_CTRL_ALT_INT_REROUTE (1 << 0)
77
78#define OTHER_INT_EN_RISE 0x86
79#define OTHER_INT_EN_FALL 0x89
80#define OTHER_INT_STS 0x8C
81#define OTHER_INT_LATCH 0x8D
82#define OTHER_INT_VB_SESS_VLD (1 << 7)
83#define OTHER_INT_DM_HI (1 << 6) /* not valid for "latch" reg */
84#define OTHER_INT_DP_HI (1 << 5) /* not valid for "latch" reg */
85#define OTHER_INT_BDIS_ACON (1 << 3) /* not valid for "fall" regs */
86#define OTHER_INT_MANU (1 << 1)
87#define OTHER_INT_ABNORMAL_STRESS (1 << 0)
88
89#define ID_STATUS 0x96
90#define ID_RES_FLOAT (1 << 4)
91#define ID_RES_440K (1 << 3)
92#define ID_RES_200K (1 << 2)
93#define ID_RES_102K (1 << 1)
94#define ID_RES_GND (1 << 0)
95
96#define POWER_CTRL 0xAC
97#define POWER_CTRL_OTG_ENAB (1 << 5)
98
99#define OTHER_IFC_CTRL2 0xAF
100#define OTHER_IFC_CTRL2_ULPI_STP_LOW (1 << 4)
101#define OTHER_IFC_CTRL2_ULPI_TXEN_POL (1 << 3)
102#define OTHER_IFC_CTRL2_ULPI_4PIN_2430 (1 << 2)
103#define OTHER_IFC_CTRL2_USB_INT_OUTSEL_MASK (3 << 0) /* bits 0 and 1 */
104#define OTHER_IFC_CTRL2_USB_INT_OUTSEL_INT1N (0 << 0)
105#define OTHER_IFC_CTRL2_USB_INT_OUTSEL_INT2N (1 << 0)
106
107#define REG_CTRL_EN 0xB2
108#define REG_CTRL_ERROR 0xB5
109#define ULPI_I2C_CONFLICT_INTEN (1 << 0)
110
111#define OTHER_FUNC_CTRL2 0xB8
112#define OTHER_FUNC_CTRL2_VBAT_TIMER_EN (1 << 0)
113
114/* following registers do not have separate _clr and _set registers */
115#define VBUS_DEBOUNCE 0xC0
116#define ID_DEBOUNCE 0xC1
117#define VBAT_TIMER 0xD3
118#define PHY_PWR_CTRL 0xFD
119#define PHY_PWR_PHYPWD (1 << 0)
120#define PHY_CLK_CTRL 0xFE
121#define PHY_CLK_CTRL_CLOCKGATING_EN (1 << 2)
122#define PHY_CLK_CTRL_CLK32K_EN (1 << 1)
123#define REQ_PHY_DPLL_CLK (1 << 0)
124#define PHY_CLK_CTRL_STS 0xFF
125#define PHY_DPLL_CLK (1 << 0)
126
127/* In module TWL_MODULE_PM_MASTER */
128#define STS_HW_CONDITIONS 0x0F
129
130/* In module TWL_MODULE_PM_RECEIVER */
131#define VUSB_DEDICATED1 0x7D
132#define VUSB_DEDICATED2 0x7E
133#define VUSB1V5_DEV_GRP 0x71
134#define VUSB1V5_TYPE 0x72
135#define VUSB1V5_REMAP 0x73
136#define VUSB1V8_DEV_GRP 0x74
137#define VUSB1V8_TYPE 0x75
138#define VUSB1V8_REMAP 0x76
139#define VUSB3V1_DEV_GRP 0x77
140#define VUSB3V1_TYPE 0x78
141#define VUSB3V1_REMAP 0x79
142
143/* In module TWL4030_MODULE_INTBR */
144#define PMBR1 0x0D
145#define GPIO_USB_4PIN_ULPI_2430C (3 << 0)
146
147struct twl4030_usb {
148 struct usb_phy phy;
149 struct device *dev;
150
151 /* TWL4030 internal USB regulator supplies */
152 struct regulator *usb1v5;
153 struct regulator *usb1v8;
154 struct regulator *usb3v1;
155
156 /* for vbus reporting with irqs disabled */
157 spinlock_t lock;
158
159 /* pin configuration */
160 enum twl4030_usb_mode usb_mode;
161
162 int irq;
163 enum omap_musb_vbus_id_status linkstat;
164 bool vbus_supplied;
165 u8 asleep;
166 bool irq_enabled;
167
168 struct delayed_work id_workaround_work;
169};
170
171/* internal define on top of container_of */
172#define phy_to_twl(x) container_of((x), struct twl4030_usb, phy)
173
174/*-------------------------------------------------------------------------*/
175
176static int twl4030_i2c_write_u8_verify(struct twl4030_usb *twl,
177 u8 module, u8 data, u8 address)
178{
179 u8 check;
180
181 if ((twl_i2c_write_u8(module, data, address) >= 0) &&
182 (twl_i2c_read_u8(module, &check, address) >= 0) &&
183 (check == data))
184 return 0;
185 dev_dbg(twl->dev, "Write%d[%d,0x%x] wrote %02x but read %02x\n",
186 1, module, address, check, data);
187
188 /* Failed once: Try again */
189 if ((twl_i2c_write_u8(module, data, address) >= 0) &&
190 (twl_i2c_read_u8(module, &check, address) >= 0) &&
191 (check == data))
192 return 0;
193 dev_dbg(twl->dev, "Write%d[%d,0x%x] wrote %02x but read %02x\n",
194 2, module, address, check, data);
195
196 /* Failed again: Return error */
197 return -EBUSY;
198}
199
200#define twl4030_usb_write_verify(twl, address, data) \
201 twl4030_i2c_write_u8_verify(twl, TWL_MODULE_USB, (data), (address))
202
203static inline int twl4030_usb_write(struct twl4030_usb *twl,
204 u8 address, u8 data)
205{
206 int ret = 0;
207
208 ret = twl_i2c_write_u8(TWL_MODULE_USB, data, address);
209 if (ret < 0)
210 dev_dbg(twl->dev,
211 "TWL4030:USB:Write[0x%x] Error %d\n", address, ret);
212 return ret;
213}
214
215static inline int twl4030_readb(struct twl4030_usb *twl, u8 module, u8 address)
216{
217 u8 data;
218 int ret = 0;
219
220 ret = twl_i2c_read_u8(module, &data, address);
221 if (ret >= 0)
222 ret = data;
223 else
224 dev_dbg(twl->dev,
225 "TWL4030:readb[0x%x,0x%x] Error %d\n",
226 module, address, ret);
227
228 return ret;
229}
230
231static inline int twl4030_usb_read(struct twl4030_usb *twl, u8 address)
232{
233 return twl4030_readb(twl, TWL_MODULE_USB, address);
234}
235
236/*-------------------------------------------------------------------------*/
237
238static inline int
239twl4030_usb_set_bits(struct twl4030_usb *twl, u8 reg, u8 bits)
240{
241 return twl4030_usb_write(twl, ULPI_SET(reg), bits);
242}
243
244static inline int
245twl4030_usb_clear_bits(struct twl4030_usb *twl, u8 reg, u8 bits)
246{
247 return twl4030_usb_write(twl, ULPI_CLR(reg), bits);
248}
249
250/*-------------------------------------------------------------------------*/
251
252static bool twl4030_is_driving_vbus(struct twl4030_usb *twl)
253{
254 int ret;
255
256 ret = twl4030_usb_read(twl, PHY_CLK_CTRL_STS);
257 if (ret < 0 || !(ret & PHY_DPLL_CLK))
258 /*
259 * if clocks are off, registers are not updated,
260 * but we can assume we don't drive VBUS in this case
261 */
262 return false;
263
264 ret = twl4030_usb_read(twl, ULPI_OTG_CTRL);
265 if (ret < 0)
266 return false;
267
268 return (ret & (ULPI_OTG_DRVVBUS | ULPI_OTG_CHRGVBUS)) ? true : false;
269}
270
271static enum omap_musb_vbus_id_status
272 twl4030_usb_linkstat(struct twl4030_usb *twl)
273{
274 int status;
275 enum omap_musb_vbus_id_status linkstat = OMAP_MUSB_UNKNOWN;
276
277 twl->vbus_supplied = false;
278
279 /*
280 * For ID/VBUS sensing, see manual section 15.4.8 ...
281 * except when using only battery backup power, two
282 * comparators produce VBUS_PRES and ID_PRES signals,
283 * which don't match docs elsewhere. But ... BIT(7)
284 * and BIT(2) of STS_HW_CONDITIONS, respectively, do
285 * seem to match up. If either is true the USB_PRES
286 * signal is active, the OTG module is activated, and
287 * its interrupt may be raised (may wake the system).
288 */
289 status = twl4030_readb(twl, TWL_MODULE_PM_MASTER, STS_HW_CONDITIONS);
290 if (status < 0)
291 dev_err(twl->dev, "USB link status err %d\n", status);
292 else if (status & (BIT(7) | BIT(2))) {
293 if (status & BIT(7)) {
294 if (twl4030_is_driving_vbus(twl))
295 status &= ~BIT(7);
296 else
297 twl->vbus_supplied = true;
298 }
299
300 if (status & BIT(2))
301 linkstat = OMAP_MUSB_ID_GROUND;
302 else if (status & BIT(7))
303 linkstat = OMAP_MUSB_VBUS_VALID;
304 else
305 linkstat = OMAP_MUSB_VBUS_OFF;
306 } else {
307 if (twl->linkstat != OMAP_MUSB_UNKNOWN)
308 linkstat = OMAP_MUSB_VBUS_OFF;
309 }
310
311 dev_dbg(twl->dev, "HW_CONDITIONS 0x%02x/%d; link %d\n",
312 status, status, linkstat);
313
314 /* REVISIT this assumes host and peripheral controllers
315 * are registered, and that both are active...
316 */
317
318 return linkstat;
319}
320
321static void twl4030_usb_set_mode(struct twl4030_usb *twl, int mode)
322{
323 twl->usb_mode = mode;
324
325 switch (mode) {
326 case T2_USB_MODE_ULPI:
327 twl4030_usb_clear_bits(twl, ULPI_IFC_CTRL,
328 ULPI_IFC_CTRL_CARKITMODE);
329 twl4030_usb_set_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB);
330 twl4030_usb_clear_bits(twl, ULPI_FUNC_CTRL,
331 ULPI_FUNC_CTRL_XCVRSEL_MASK |
332 ULPI_FUNC_CTRL_OPMODE_MASK);
333 break;
334 case -1:
335 /* FIXME: power on defaults */
336 break;
337 default:
338 dev_err(twl->dev, "unsupported T2 transceiver mode %d\n",
339 mode);
340 break;
341 };
342}
343
344static void twl4030_i2c_access(struct twl4030_usb *twl, int on)
345{
346 unsigned long timeout;
347 int val = twl4030_usb_read(twl, PHY_CLK_CTRL);
348
349 if (val >= 0) {
350 if (on) {
351 /* enable DPLL to access PHY registers over I2C */
352 val |= REQ_PHY_DPLL_CLK;
353 WARN_ON(twl4030_usb_write_verify(twl, PHY_CLK_CTRL,
354 (u8)val) < 0);
355
356 timeout = jiffies + HZ;
357 while (!(twl4030_usb_read(twl, PHY_CLK_CTRL_STS) &
358 PHY_DPLL_CLK)
359 && time_before(jiffies, timeout))
360 udelay(10);
361 if (!(twl4030_usb_read(twl, PHY_CLK_CTRL_STS) &
362 PHY_DPLL_CLK))
363 dev_err(twl->dev, "Timeout setting T2 HSUSB "
364 "PHY DPLL clock\n");
365 } else {
366 /* let ULPI control the DPLL clock */
367 val &= ~REQ_PHY_DPLL_CLK;
368 WARN_ON(twl4030_usb_write_verify(twl, PHY_CLK_CTRL,
369 (u8)val) < 0);
370 }
371 }
372}
373
374static void __twl4030_phy_power(struct twl4030_usb *twl, int on)
375{
376 u8 pwr = twl4030_usb_read(twl, PHY_PWR_CTRL);
377
378 if (on)
379 pwr &= ~PHY_PWR_PHYPWD;
380 else
381 pwr |= PHY_PWR_PHYPWD;
382
383 WARN_ON(twl4030_usb_write_verify(twl, PHY_PWR_CTRL, pwr) < 0);
384}
385
386static void twl4030_phy_power(struct twl4030_usb *twl, int on)
387{
388 int ret;
389
390 if (on) {
391 ret = regulator_enable(twl->usb3v1);
392 if (ret)
393 dev_err(twl->dev, "Failed to enable usb3v1\n");
394
395 ret = regulator_enable(twl->usb1v8);
396 if (ret)
397 dev_err(twl->dev, "Failed to enable usb1v8\n");
398
399 /*
400 * Disabling usb3v1 regulator (= writing 0 to VUSB3V1_DEV_GRP
401 * in twl4030) resets the VUSB_DEDICATED2 register. This reset
402 * enables VUSB3V1_SLEEP bit that remaps usb3v1 ACTIVE state to
403 * SLEEP. We work around this by clearing the bit after usv3v1
404 * is re-activated. This ensures that VUSB3V1 is really active.
405 */
406 twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);
407
408 ret = regulator_enable(twl->usb1v5);
409 if (ret)
410 dev_err(twl->dev, "Failed to enable usb1v5\n");
411
412 __twl4030_phy_power(twl, 1);
413 twl4030_usb_write(twl, PHY_CLK_CTRL,
414 twl4030_usb_read(twl, PHY_CLK_CTRL) |
415 (PHY_CLK_CTRL_CLOCKGATING_EN |
416 PHY_CLK_CTRL_CLK32K_EN));
417 } else {
418 __twl4030_phy_power(twl, 0);
419 regulator_disable(twl->usb1v5);
420 regulator_disable(twl->usb1v8);
421 regulator_disable(twl->usb3v1);
422 }
423}
424
425static void twl4030_phy_suspend(struct twl4030_usb *twl, int controller_off)
426{
427 if (twl->asleep)
428 return;
429
430 twl4030_phy_power(twl, 0);
431 twl->asleep = 1;
432 dev_dbg(twl->dev, "%s\n", __func__);
433}
434
435static int twl4030_phy_power_off(struct phy *phy)
436{
437 struct twl4030_usb *twl = phy_get_drvdata(phy);
438
439 twl4030_phy_suspend(twl, 0);
440 return 0;
441}
442
443static void __twl4030_phy_resume(struct twl4030_usb *twl)
444{
445 twl4030_phy_power(twl, 1);
446 twl4030_i2c_access(twl, 1);
447 twl4030_usb_set_mode(twl, twl->usb_mode);
448 if (twl->usb_mode == T2_USB_MODE_ULPI)
449 twl4030_i2c_access(twl, 0);
450}
451
452static void twl4030_phy_resume(struct twl4030_usb *twl)
453{
454 if (!twl->asleep)
455 return;
456 __twl4030_phy_resume(twl);
457 twl->asleep = 0;
458 dev_dbg(twl->dev, "%s\n", __func__);
459
460 /*
461 * XXX When VBUS gets driven after musb goes to A mode,
462 * ID_PRES related interrupts no longer arrive, why?
463 * Register itself is updated fine though, so we must poll.
464 */
465 if (twl->linkstat == OMAP_MUSB_ID_GROUND) {
466 cancel_delayed_work(&twl->id_workaround_work);
467 schedule_delayed_work(&twl->id_workaround_work, HZ);
468 }
469}
470
471static int twl4030_phy_power_on(struct phy *phy)
472{
473 struct twl4030_usb *twl = phy_get_drvdata(phy);
474
475 twl4030_phy_resume(twl);
476 return 0;
477}
478
479static int twl4030_usb_ldo_init(struct twl4030_usb *twl)
480{
481 /* Enable writing to power configuration registers */
482 twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG1,
483 TWL4030_PM_MASTER_PROTECT_KEY);
484
485 twl_i2c_write_u8(TWL_MODULE_PM_MASTER, TWL4030_PM_MASTER_KEY_CFG2,
486 TWL4030_PM_MASTER_PROTECT_KEY);
487
488 /* Keep VUSB3V1 LDO in sleep state until VBUS/ID change detected*/
489 /*twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB_DEDICATED2);*/
490
491 /* input to VUSB3V1 LDO is from VBAT, not VBUS */
492 twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0x14, VUSB_DEDICATED1);
493
494 /* Initialize 3.1V regulator */
495 twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB3V1_DEV_GRP);
496
497 twl->usb3v1 = devm_regulator_get(twl->dev, "usb3v1");
498 if (IS_ERR(twl->usb3v1))
499 return -ENODEV;
500
501 twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB3V1_TYPE);
502
503 /* Initialize 1.5V regulator */
504 twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V5_DEV_GRP);
505
506 twl->usb1v5 = devm_regulator_get(twl->dev, "usb1v5");
507 if (IS_ERR(twl->usb1v5))
508 return -ENODEV;
509
510 twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V5_TYPE);
511
512 /* Initialize 1.8V regulator */
513 twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V8_DEV_GRP);
514
515 twl->usb1v8 = devm_regulator_get(twl->dev, "usb1v8");
516 if (IS_ERR(twl->usb1v8))
517 return -ENODEV;
518
519 twl_i2c_write_u8(TWL_MODULE_PM_RECEIVER, 0, VUSB1V8_TYPE);
520
521 /* disable access to power configuration registers */
522 twl_i2c_write_u8(TWL_MODULE_PM_MASTER, 0,
523 TWL4030_PM_MASTER_PROTECT_KEY);
524
525 return 0;
526}
527
528static ssize_t twl4030_usb_vbus_show(struct device *dev,
529 struct device_attribute *attr, char *buf)
530{
531 struct twl4030_usb *twl = dev_get_drvdata(dev);
532 unsigned long flags;
533 int ret = -EINVAL;
534
535 spin_lock_irqsave(&twl->lock, flags);
536 ret = sprintf(buf, "%s\n",
537 twl->vbus_supplied ? "on" : "off");
538 spin_unlock_irqrestore(&twl->lock, flags);
539
540 return ret;
541}
542static DEVICE_ATTR(vbus, 0444, twl4030_usb_vbus_show, NULL);
543
544static irqreturn_t twl4030_usb_irq(int irq, void *_twl)
545{
546 struct twl4030_usb *twl = _twl;
547 enum omap_musb_vbus_id_status status;
548 bool status_changed = false;
549
550 status = twl4030_usb_linkstat(twl);
551
552 spin_lock_irq(&twl->lock);
553 if (status >= 0 && status != twl->linkstat) {
554 twl->linkstat = status;
555 status_changed = true;
556 }
557 spin_unlock_irq(&twl->lock);
558
559 if (status_changed) {
560 /* FIXME add a set_power() method so that B-devices can
561 * configure the charger appropriately. It's not always
562 * correct to consume VBUS power, and how much current to
563 * consume is a function of the USB configuration chosen
564 * by the host.
565 *
566 * REVISIT usb_gadget_vbus_connect(...) as needed, ditto
567 * its disconnect() sibling, when changing to/from the
568 * USB_LINK_VBUS state. musb_hdrc won't care until it
569 * starts to handle softconnect right.
570 */
571 omap_musb_mailbox(status);
572 }
573 sysfs_notify(&twl->dev->kobj, NULL, "vbus");
574
575 return IRQ_HANDLED;
576}
577
578static void twl4030_id_workaround_work(struct work_struct *work)
579{
580 struct twl4030_usb *twl = container_of(work, struct twl4030_usb,
581 id_workaround_work.work);
582 enum omap_musb_vbus_id_status status;
583 bool status_changed = false;
584
585 status = twl4030_usb_linkstat(twl);
586
587 spin_lock_irq(&twl->lock);
588 if (status >= 0 && status != twl->linkstat) {
589 twl->linkstat = status;
590 status_changed = true;
591 }
592 spin_unlock_irq(&twl->lock);
593
594 if (status_changed) {
595 dev_dbg(twl->dev, "handle missing status change to %d\n",
596 status);
597 omap_musb_mailbox(status);
598 }
599
600 /* don't schedule during sleep - irq works right then */
601 if (status == OMAP_MUSB_ID_GROUND && !twl->asleep) {
602 cancel_delayed_work(&twl->id_workaround_work);
603 schedule_delayed_work(&twl->id_workaround_work, HZ);
604 }
605}
606
607static int twl4030_usb_phy_init(struct usb_phy *phy)
608{
609 struct twl4030_usb *twl = phy_to_twl(phy);
610 enum omap_musb_vbus_id_status status;
611
612 /*
613 * Start in sleep state, we'll get called through set_suspend()
614 * callback when musb is runtime resumed and it's time to start.
615 */
616 __twl4030_phy_power(twl, 0);
617 twl->asleep = 1;
618
619 status = twl4030_usb_linkstat(twl);
620 twl->linkstat = status;
621
622 if (status == OMAP_MUSB_ID_GROUND || status == OMAP_MUSB_VBUS_VALID) {
623 omap_musb_mailbox(twl->linkstat);
624 twl4030_phy_resume(twl);
625 }
626
627 sysfs_notify(&twl->dev->kobj, NULL, "vbus");
628 return 0;
629}
630
631static int twl4030_phy_init(struct phy *phy)
632{
633 struct twl4030_usb *twl = phy_get_drvdata(phy);
634
635 return twl4030_usb_phy_init(&twl->phy);
636}
637
638static int twl4030_set_suspend(struct usb_phy *x, int suspend)
639{
640 struct twl4030_usb *twl = phy_to_twl(x);
641
642 if (suspend)
643 twl4030_phy_suspend(twl, 1);
644 else
645 twl4030_phy_resume(twl);
646
647 return 0;
648}
649
650static int twl4030_set_peripheral(struct usb_otg *otg,
651 struct usb_gadget *gadget)
652{
653 if (!otg)
654 return -ENODEV;
655
656 otg->gadget = gadget;
657 if (!gadget)
658 otg->phy->state = OTG_STATE_UNDEFINED;
659
660 return 0;
661}
662
663static int twl4030_set_host(struct usb_otg *otg, struct usb_bus *host)
664{
665 if (!otg)
666 return -ENODEV;
667
668 otg->host = host;
669 if (!host)
670 otg->phy->state = OTG_STATE_UNDEFINED;
671
672 return 0;
673}
674
675static const struct phy_ops ops = {
676 .init = twl4030_phy_init,
677 .power_on = twl4030_phy_power_on,
678 .power_off = twl4030_phy_power_off,
679 .owner = THIS_MODULE,
680};
681
682static int twl4030_usb_probe(struct platform_device *pdev)
683{
684 struct twl4030_usb_data *pdata = dev_get_platdata(&pdev->dev);
685 struct twl4030_usb *twl;
686 struct phy *phy;
687 int status, err;
688 struct usb_otg *otg;
689 struct device_node *np = pdev->dev.of_node;
690 struct phy_provider *phy_provider;
691 struct phy_init_data *init_data = NULL;
692
693 twl = devm_kzalloc(&pdev->dev, sizeof *twl, GFP_KERNEL);
694 if (!twl)
695 return -ENOMEM;
696
697 if (np)
698 of_property_read_u32(np, "usb_mode",
699 (enum twl4030_usb_mode *)&twl->usb_mode);
700 else if (pdata) {
701 twl->usb_mode = pdata->usb_mode;
702 init_data = pdata->init_data;
703 } else {
704 dev_err(&pdev->dev, "twl4030 initialized without pdata\n");
705 return -EINVAL;
706 }
707
708 otg = devm_kzalloc(&pdev->dev, sizeof *otg, GFP_KERNEL);
709 if (!otg)
710 return -ENOMEM;
711
712 twl->dev = &pdev->dev;
713 twl->irq = platform_get_irq(pdev, 0);
714 twl->vbus_supplied = false;
715 twl->asleep = 1;
716 twl->linkstat = OMAP_MUSB_UNKNOWN;
717
718 twl->phy.dev = twl->dev;
719 twl->phy.label = "twl4030";
720 twl->phy.otg = otg;
721 twl->phy.type = USB_PHY_TYPE_USB2;
722 twl->phy.set_suspend = twl4030_set_suspend;
723 twl->phy.init = twl4030_usb_phy_init;
724
725 otg->phy = &twl->phy;
726 otg->set_host = twl4030_set_host;
727 otg->set_peripheral = twl4030_set_peripheral;
728
729 phy_provider = devm_of_phy_provider_register(twl->dev,
730 of_phy_simple_xlate);
731 if (IS_ERR(phy_provider))
732 return PTR_ERR(phy_provider);
733
734 phy = devm_phy_create(twl->dev, &ops, init_data);
735 if (IS_ERR(phy)) {
736 dev_dbg(&pdev->dev, "Failed to create PHY\n");
737 return PTR_ERR(phy);
738 }
739
740 phy_set_drvdata(phy, twl);
741
742 /* init spinlock for workqueue */
743 spin_lock_init(&twl->lock);
744
745 INIT_DELAYED_WORK(&twl->id_workaround_work, twl4030_id_workaround_work);
746
747 err = twl4030_usb_ldo_init(twl);
748 if (err) {
749 dev_err(&pdev->dev, "ldo init failed\n");
750 return err;
751 }
752 usb_add_phy_dev(&twl->phy);
753
754 platform_set_drvdata(pdev, twl);
755 if (device_create_file(&pdev->dev, &dev_attr_vbus))
756 dev_warn(&pdev->dev, "could not create sysfs file\n");
757
758 /* Our job is to use irqs and status from the power module
759 * to keep the transceiver disabled when nothing's connected.
760 *
761 * FIXME we actually shouldn't start enabling it until the
762 * USB controller drivers have said they're ready, by calling
763 * set_host() and/or set_peripheral() ... OTG_capable boards
764 * need both handles, otherwise just one suffices.
765 */
766 twl->irq_enabled = true;
767 status = devm_request_threaded_irq(twl->dev, twl->irq, NULL,
768 twl4030_usb_irq, IRQF_TRIGGER_FALLING |
769 IRQF_TRIGGER_RISING | IRQF_ONESHOT, "twl4030_usb", twl);
770 if (status < 0) {
771 dev_dbg(&pdev->dev, "can't get IRQ %d, err %d\n",
772 twl->irq, status);
773 return status;
774 }
775
776 dev_info(&pdev->dev, "Initialized TWL4030 USB module\n");
777 return 0;
778}
779
780static int twl4030_usb_remove(struct platform_device *pdev)
781{
782 struct twl4030_usb *twl = platform_get_drvdata(pdev);
783 int val;
784
785 cancel_delayed_work(&twl->id_workaround_work);
786 device_remove_file(twl->dev, &dev_attr_vbus);
787
788 /* set transceiver mode to power on defaults */
789 twl4030_usb_set_mode(twl, -1);
790
791 /* autogate 60MHz ULPI clock,
792 * clear dpll clock request for i2c access,
793 * disable 32KHz
794 */
795 val = twl4030_usb_read(twl, PHY_CLK_CTRL);
796 if (val >= 0) {
797 val |= PHY_CLK_CTRL_CLOCKGATING_EN;
798 val &= ~(PHY_CLK_CTRL_CLK32K_EN | REQ_PHY_DPLL_CLK);
799 twl4030_usb_write(twl, PHY_CLK_CTRL, (u8)val);
800 }
801
802 /* disable complete OTG block */
803 twl4030_usb_clear_bits(twl, POWER_CTRL, POWER_CTRL_OTG_ENAB);
804
805 if (!twl->asleep)
806 twl4030_phy_power(twl, 0);
807
808 return 0;
809}
810
811#ifdef CONFIG_OF
812static const struct of_device_id twl4030_usb_id_table[] = {
813 { .compatible = "ti,twl4030-usb" },
814 {}
815};
816MODULE_DEVICE_TABLE(of, twl4030_usb_id_table);
817#endif
818
819static struct platform_driver twl4030_usb_driver = {
820 .probe = twl4030_usb_probe,
821 .remove = twl4030_usb_remove,
822 .driver = {
823 .name = "twl4030_usb",
824 .owner = THIS_MODULE,
825 .of_match_table = of_match_ptr(twl4030_usb_id_table),
826 },
827};
828
829static int __init twl4030_usb_init(void)
830{
831 return platform_driver_register(&twl4030_usb_driver);
832}
833subsys_initcall(twl4030_usb_init);
834
835static void __exit twl4030_usb_exit(void)
836{
837 platform_driver_unregister(&twl4030_usb_driver);
838}
839module_exit(twl4030_usb_exit);
840
841MODULE_ALIAS("platform:twl4030_usb");
842MODULE_AUTHOR("Texas Instruments, Inc, Nokia Corporation");
843MODULE_DESCRIPTION("TWL4030 USB transceiver driver");
844MODULE_LICENSE("GPL");