1 /*
2  * twl6030_usb - TWL6030 USB transceiver, talking to OMAP OTG driver.
3  *
4  * Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * Author: Hema HK <hemahk@ti.com>
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20  *
21  */
22 
23 #include <linux/module.h>
24 #include <linux/init.h>
25 #include <linux/interrupt.h>
26 #include <linux/platform_device.h>
27 #include <linux/io.h>
28 #include <linux/usb/otg.h>
29 #include <linux/i2c/twl.h>
30 #include <linux/regulator/consumer.h>
31 #include <linux/err.h>
32 #include <linux/notifier.h>
33 #include <linux/slab.h>
34 #include <linux/delay.h>
35 
36 /* usb register definitions */
37 #define USB_VENDOR_ID_LSB		0x00
38 #define USB_VENDOR_ID_MSB		0x01
39 #define USB_PRODUCT_ID_LSB		0x02
40 #define USB_PRODUCT_ID_MSB		0x03
41 #define USB_VBUS_CTRL_SET		0x04
42 #define USB_VBUS_CTRL_CLR		0x05
43 #define USB_ID_CTRL_SET			0x06
44 #define USB_ID_CTRL_CLR			0x07
45 #define USB_VBUS_INT_SRC		0x08
46 #define USB_VBUS_INT_LATCH_SET		0x09
47 #define USB_VBUS_INT_LATCH_CLR		0x0A
48 #define USB_VBUS_INT_EN_LO_SET		0x0B
49 #define USB_VBUS_INT_EN_LO_CLR		0x0C
50 #define USB_VBUS_INT_EN_HI_SET		0x0D
51 #define USB_VBUS_INT_EN_HI_CLR		0x0E
52 #define USB_ID_INT_SRC			0x0F
53 #define USB_ID_INT_LATCH_SET		0x10
54 #define USB_ID_INT_LATCH_CLR		0x11
55 
56 #define USB_ID_INT_EN_LO_SET		0x12
57 #define USB_ID_INT_EN_LO_CLR		0x13
58 #define USB_ID_INT_EN_HI_SET		0x14
59 #define USB_ID_INT_EN_HI_CLR		0x15
60 #define USB_OTG_ADP_CTRL		0x16
61 #define USB_OTG_ADP_HIGH		0x17
62 #define USB_OTG_ADP_LOW			0x18
63 #define USB_OTG_ADP_RISE		0x19
64 #define USB_OTG_REVISION		0x1A
65 
66 /* to be moved to LDO */
67 #define TWL6030_MISC2			0xE5
68 #define TWL6030_CFG_LDO_PD2		0xF5
69 #define TWL6030_BACKUP_REG		0xFA
70 
71 #define STS_HW_CONDITIONS		0x21
72 
73 /* In module TWL6030_MODULE_PM_MASTER */
74 #define STS_HW_CONDITIONS		0x21
75 #define STS_USB_ID			BIT(2)
76 
77 /* In module TWL6030_MODULE_PM_RECEIVER */
78 #define VUSB_CFG_TRANS			0x71
79 #define VUSB_CFG_STATE			0x72
80 #define VUSB_CFG_VOLTAGE		0x73
81 
82 /* in module TWL6030_MODULE_MAIN_CHARGE */
83 
84 #define CHARGERUSB_CTRL1		0x8
85 
86 #define CONTROLLER_STAT1		0x03
87 #define	VBUS_DET			BIT(2)
88 
89 struct twl6030_usb {
90 	struct otg_transceiver	otg;
91 	struct device		*dev;
92 
93 	/* for vbus reporting with irqs disabled */
94 	spinlock_t		lock;
95 
96 	struct regulator		*usb3v3;
97 
98 	/* used to set vbus, in atomic path */
99 	struct work_struct	set_vbus_work;
100 
101 	int			irq1;
102 	int			irq2;
103 	u8			linkstat;
104 	u8			asleep;
105 	bool			irq_enabled;
106 	bool			vbus_enable;
107 	unsigned long		features;
108 };
109 
110 #define xceiv_to_twl(x)		container_of((x), struct twl6030_usb, otg)
111 
112 /*-------------------------------------------------------------------------*/
113 
twl6030_writeb(struct twl6030_usb * twl,u8 module,u8 data,u8 address)114 static inline int twl6030_writeb(struct twl6030_usb *twl, u8 module,
115 						u8 data, u8 address)
116 {
117 	int ret = 0;
118 
119 	ret = twl_i2c_write_u8(module, data, address);
120 	if (ret < 0)
121 		dev_err(twl->dev,
122 			"Write[0x%x] Error %d\n", address, ret);
123 	return ret;
124 }
125 
twl6030_readb(struct twl6030_usb * twl,u8 module,u8 address)126 static inline u8 twl6030_readb(struct twl6030_usb *twl, u8 module, u8 address)
127 {
128 	u8 data, ret = 0;
129 
130 	ret = twl_i2c_read_u8(module, &data, address);
131 	if (ret >= 0)
132 		ret = data;
133 	else
134 		dev_err(twl->dev,
135 			"readb[0x%x,0x%x] Error %d\n",
136 					module, address, ret);
137 	return ret;
138 }
139 
twl6030_phy_init(struct otg_transceiver * x)140 static int twl6030_phy_init(struct otg_transceiver *x)
141 {
142 	struct twl6030_usb *twl;
143 	struct device *dev;
144 	struct twl4030_usb_data *pdata;
145 
146 	twl = xceiv_to_twl(x);
147 	dev  = twl->dev;
148 	pdata = dev->platform_data;
149 
150 	if (twl->linkstat == USB_EVENT_ID)
151 		pdata->phy_power(twl->dev, 1, 1);
152 	else
153 		pdata->phy_power(twl->dev, 0, 1);
154 
155 	return 0;
156 }
157 
twl6030_phy_shutdown(struct otg_transceiver * x)158 static void twl6030_phy_shutdown(struct otg_transceiver *x)
159 {
160 	struct twl6030_usb *twl;
161 	struct device *dev;
162 	struct twl4030_usb_data *pdata;
163 
164 	twl = xceiv_to_twl(x);
165 	dev  = twl->dev;
166 	pdata = dev->platform_data;
167 	pdata->phy_power(twl->dev, 0, 0);
168 }
169 
twl6030_phy_suspend(struct otg_transceiver * x,int suspend)170 static int twl6030_phy_suspend(struct otg_transceiver *x, int suspend)
171 {
172 	struct twl6030_usb *twl = xceiv_to_twl(x);
173 	struct device *dev = twl->dev;
174 	struct twl4030_usb_data *pdata = dev->platform_data;
175 
176 	pdata->phy_suspend(dev, suspend);
177 
178 	return 0;
179 }
180 
twl6030_start_srp(struct otg_transceiver * x)181 static int twl6030_start_srp(struct otg_transceiver *x)
182 {
183 	struct twl6030_usb *twl = xceiv_to_twl(x);
184 
185 	twl6030_writeb(twl, TWL_MODULE_USB, 0x24, USB_VBUS_CTRL_SET);
186 	twl6030_writeb(twl, TWL_MODULE_USB, 0x84, USB_VBUS_CTRL_SET);
187 
188 	mdelay(100);
189 	twl6030_writeb(twl, TWL_MODULE_USB, 0xa0, USB_VBUS_CTRL_CLR);
190 
191 	return 0;
192 }
193 
twl6030_usb_ldo_init(struct twl6030_usb * twl)194 static int twl6030_usb_ldo_init(struct twl6030_usb *twl)
195 {
196 	char *regulator_name;
197 
198 	if (twl->features & TWL6025_SUBCLASS)
199 		regulator_name = "ldousb";
200 	else
201 		regulator_name = "vusb";
202 
203 	/* Set to OTG_REV 1.3 and turn on the ID_WAKEUP_COMP */
204 	twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x1, TWL6030_BACKUP_REG);
205 
206 	/* Program CFG_LDO_PD2 register and set VUSB bit */
207 	twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x1, TWL6030_CFG_LDO_PD2);
208 
209 	/* Program MISC2 register and set bit VUSB_IN_VBAT */
210 	twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x10, TWL6030_MISC2);
211 
212 	twl->usb3v3 = regulator_get(twl->dev, regulator_name);
213 	if (IS_ERR(twl->usb3v3))
214 		return -ENODEV;
215 
216 	/* Program the USB_VBUS_CTRL_SET and set VBUS_ACT_COMP bit */
217 	twl6030_writeb(twl, TWL_MODULE_USB, 0x4, USB_VBUS_CTRL_SET);
218 
219 	/*
220 	 * Program the USB_ID_CTRL_SET register to enable GND drive
221 	 * and the ID comparators
222 	 */
223 	twl6030_writeb(twl, TWL_MODULE_USB, 0x14, USB_ID_CTRL_SET);
224 
225 	return 0;
226 }
227 
twl6030_usb_vbus_show(struct device * dev,struct device_attribute * attr,char * buf)228 static ssize_t twl6030_usb_vbus_show(struct device *dev,
229 			struct device_attribute *attr, char *buf)
230 {
231 	struct twl6030_usb *twl = dev_get_drvdata(dev);
232 	unsigned long flags;
233 	int ret = -EINVAL;
234 
235 	spin_lock_irqsave(&twl->lock, flags);
236 
237 	switch (twl->linkstat) {
238 	case USB_EVENT_VBUS:
239 	       ret = snprintf(buf, PAGE_SIZE, "vbus\n");
240 	       break;
241 	case USB_EVENT_ID:
242 	       ret = snprintf(buf, PAGE_SIZE, "id\n");
243 	       break;
244 	case USB_EVENT_NONE:
245 	       ret = snprintf(buf, PAGE_SIZE, "none\n");
246 	       break;
247 	default:
248 	       ret = snprintf(buf, PAGE_SIZE, "UNKNOWN\n");
249 	}
250 	spin_unlock_irqrestore(&twl->lock, flags);
251 
252 	return ret;
253 }
254 static DEVICE_ATTR(vbus, 0444, twl6030_usb_vbus_show, NULL);
255 
twl6030_usb_irq(int irq,void * _twl)256 static irqreturn_t twl6030_usb_irq(int irq, void *_twl)
257 {
258 	struct twl6030_usb *twl = _twl;
259 	int status;
260 	u8 vbus_state, hw_state;
261 
262 	hw_state = twl6030_readb(twl, TWL6030_MODULE_ID0, STS_HW_CONDITIONS);
263 
264 	vbus_state = twl6030_readb(twl, TWL_MODULE_MAIN_CHARGE,
265 						CONTROLLER_STAT1);
266 	if (!(hw_state & STS_USB_ID)) {
267 		if (vbus_state & VBUS_DET) {
268 			regulator_enable(twl->usb3v3);
269 			twl->asleep = 1;
270 			status = USB_EVENT_VBUS;
271 			twl->otg.default_a = false;
272 			twl->otg.state = OTG_STATE_B_IDLE;
273 			twl->linkstat = status;
274 			twl->otg.last_event = status;
275 			atomic_notifier_call_chain(&twl->otg.notifier,
276 						status, twl->otg.gadget);
277 		} else {
278 			status = USB_EVENT_NONE;
279 			twl->linkstat = status;
280 			twl->otg.last_event = status;
281 			atomic_notifier_call_chain(&twl->otg.notifier,
282 						status, twl->otg.gadget);
283 			if (twl->asleep) {
284 				regulator_disable(twl->usb3v3);
285 				twl->asleep = 0;
286 			}
287 		}
288 	}
289 	sysfs_notify(&twl->dev->kobj, NULL, "vbus");
290 
291 	return IRQ_HANDLED;
292 }
293 
twl6030_usbotg_irq(int irq,void * _twl)294 static irqreturn_t twl6030_usbotg_irq(int irq, void *_twl)
295 {
296 	struct twl6030_usb *twl = _twl;
297 	int status = USB_EVENT_NONE;
298 	u8 hw_state;
299 
300 	hw_state = twl6030_readb(twl, TWL6030_MODULE_ID0, STS_HW_CONDITIONS);
301 
302 	if (hw_state & STS_USB_ID) {
303 
304 		regulator_enable(twl->usb3v3);
305 		twl->asleep = 1;
306 		twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_CLR, 0x1);
307 		twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_SET,
308 								0x10);
309 		status = USB_EVENT_ID;
310 		twl->otg.default_a = true;
311 		twl->otg.state = OTG_STATE_A_IDLE;
312 		twl->linkstat = status;
313 		twl->otg.last_event = status;
314 		atomic_notifier_call_chain(&twl->otg.notifier, status,
315 							twl->otg.gadget);
316 	} else  {
317 		twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_CLR,
318 								0x10);
319 		twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_SET,
320 								0x1);
321 	}
322 	twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_LATCH_CLR, status);
323 
324 	return IRQ_HANDLED;
325 }
326 
twl6030_set_peripheral(struct otg_transceiver * x,struct usb_gadget * gadget)327 static int twl6030_set_peripheral(struct otg_transceiver *x,
328 		struct usb_gadget *gadget)
329 {
330 	struct twl6030_usb *twl;
331 
332 	if (!x)
333 		return -ENODEV;
334 
335 	twl = xceiv_to_twl(x);
336 	twl->otg.gadget = gadget;
337 	if (!gadget)
338 		twl->otg.state = OTG_STATE_UNDEFINED;
339 
340 	return 0;
341 }
342 
twl6030_enable_irq(struct otg_transceiver * x)343 static int twl6030_enable_irq(struct otg_transceiver *x)
344 {
345 	struct twl6030_usb *twl = xceiv_to_twl(x);
346 
347 	twl6030_writeb(twl, TWL_MODULE_USB, USB_ID_INT_EN_HI_SET, 0x1);
348 	twl6030_interrupt_unmask(0x05, REG_INT_MSK_LINE_C);
349 	twl6030_interrupt_unmask(0x05, REG_INT_MSK_STS_C);
350 
351 	twl6030_interrupt_unmask(TWL6030_CHARGER_CTRL_INT_MASK,
352 				REG_INT_MSK_LINE_C);
353 	twl6030_interrupt_unmask(TWL6030_CHARGER_CTRL_INT_MASK,
354 				REG_INT_MSK_STS_C);
355 	twl6030_usb_irq(twl->irq2, twl);
356 	twl6030_usbotg_irq(twl->irq1, twl);
357 
358 	return 0;
359 }
360 
otg_set_vbus_work(struct work_struct * data)361 static void otg_set_vbus_work(struct work_struct *data)
362 {
363 	struct twl6030_usb *twl = container_of(data, struct twl6030_usb,
364 								set_vbus_work);
365 
366 	/*
367 	 * Start driving VBUS. Set OPA_MODE bit in CHARGERUSB_CTRL1
368 	 * register. This enables boost mode.
369 	 */
370 
371 	if (twl->vbus_enable)
372 		twl6030_writeb(twl, TWL_MODULE_MAIN_CHARGE , 0x40,
373 							CHARGERUSB_CTRL1);
374 	else
375 		twl6030_writeb(twl, TWL_MODULE_MAIN_CHARGE , 0x00,
376 							CHARGERUSB_CTRL1);
377 }
378 
twl6030_set_vbus(struct otg_transceiver * x,bool enabled)379 static int twl6030_set_vbus(struct otg_transceiver *x, bool enabled)
380 {
381 	struct twl6030_usb *twl = xceiv_to_twl(x);
382 
383 	twl->vbus_enable = enabled;
384 	schedule_work(&twl->set_vbus_work);
385 
386 	return 0;
387 }
388 
twl6030_set_host(struct otg_transceiver * x,struct usb_bus * host)389 static int twl6030_set_host(struct otg_transceiver *x, struct usb_bus *host)
390 {
391 	struct twl6030_usb *twl;
392 
393 	if (!x)
394 		return -ENODEV;
395 
396 	twl = xceiv_to_twl(x);
397 	twl->otg.host = host;
398 	if (!host)
399 		twl->otg.state = OTG_STATE_UNDEFINED;
400 	return 0;
401 }
402 
twl6030_usb_probe(struct platform_device * pdev)403 static int __devinit twl6030_usb_probe(struct platform_device *pdev)
404 {
405 	struct twl6030_usb	*twl;
406 	int			status, err;
407 	struct twl4030_usb_data *pdata;
408 	struct device *dev = &pdev->dev;
409 	pdata = dev->platform_data;
410 
411 	twl = kzalloc(sizeof *twl, GFP_KERNEL);
412 	if (!twl)
413 		return -ENOMEM;
414 
415 	twl->dev		= &pdev->dev;
416 	twl->irq1		= platform_get_irq(pdev, 0);
417 	twl->irq2		= platform_get_irq(pdev, 1);
418 	twl->features		= pdata->features;
419 	twl->otg.dev		= twl->dev;
420 	twl->otg.label		= "twl6030";
421 	twl->otg.set_host	= twl6030_set_host;
422 	twl->otg.set_peripheral	= twl6030_set_peripheral;
423 	twl->otg.set_vbus	= twl6030_set_vbus;
424 	twl->otg.init		= twl6030_phy_init;
425 	twl->otg.shutdown	= twl6030_phy_shutdown;
426 	twl->otg.set_suspend	= twl6030_phy_suspend;
427 	twl->otg.start_srp	= twl6030_start_srp;
428 
429 	/* init spinlock for workqueue */
430 	spin_lock_init(&twl->lock);
431 
432 	err = twl6030_usb_ldo_init(twl);
433 	if (err) {
434 		dev_err(&pdev->dev, "ldo init failed\n");
435 		kfree(twl);
436 		return err;
437 	}
438 	otg_set_transceiver(&twl->otg);
439 
440 	platform_set_drvdata(pdev, twl);
441 	if (device_create_file(&pdev->dev, &dev_attr_vbus))
442 		dev_warn(&pdev->dev, "could not create sysfs file\n");
443 
444 	ATOMIC_INIT_NOTIFIER_HEAD(&twl->otg.notifier);
445 
446 	INIT_WORK(&twl->set_vbus_work, otg_set_vbus_work);
447 
448 	twl->irq_enabled = true;
449 	status = request_threaded_irq(twl->irq1, NULL, twl6030_usbotg_irq,
450 			IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
451 			"twl6030_usb", twl);
452 	if (status < 0) {
453 		dev_err(&pdev->dev, "can't get IRQ %d, err %d\n",
454 			twl->irq1, status);
455 		device_remove_file(twl->dev, &dev_attr_vbus);
456 		kfree(twl);
457 		return status;
458 	}
459 
460 	status = request_threaded_irq(twl->irq2, NULL, twl6030_usb_irq,
461 			IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING,
462 			"twl6030_usb", twl);
463 	if (status < 0) {
464 		dev_err(&pdev->dev, "can't get IRQ %d, err %d\n",
465 			twl->irq2, status);
466 		free_irq(twl->irq1, twl);
467 		device_remove_file(twl->dev, &dev_attr_vbus);
468 		kfree(twl);
469 		return status;
470 	}
471 
472 	twl->asleep = 0;
473 	pdata->phy_init(dev);
474 	twl6030_phy_suspend(&twl->otg, 0);
475 	twl6030_enable_irq(&twl->otg);
476 	dev_info(&pdev->dev, "Initialized TWL6030 USB module\n");
477 
478 	return 0;
479 }
480 
twl6030_usb_remove(struct platform_device * pdev)481 static int __exit twl6030_usb_remove(struct platform_device *pdev)
482 {
483 	struct twl6030_usb *twl = platform_get_drvdata(pdev);
484 
485 	struct twl4030_usb_data *pdata;
486 	struct device *dev = &pdev->dev;
487 	pdata = dev->platform_data;
488 
489 	twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK,
490 		REG_INT_MSK_LINE_C);
491 	twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK,
492 			REG_INT_MSK_STS_C);
493 	free_irq(twl->irq1, twl);
494 	free_irq(twl->irq2, twl);
495 	regulator_put(twl->usb3v3);
496 	pdata->phy_exit(twl->dev);
497 	device_remove_file(twl->dev, &dev_attr_vbus);
498 	cancel_work_sync(&twl->set_vbus_work);
499 	kfree(twl);
500 
501 	return 0;
502 }
503 
504 static struct platform_driver twl6030_usb_driver = {
505 	.probe		= twl6030_usb_probe,
506 	.remove		= __exit_p(twl6030_usb_remove),
507 	.driver		= {
508 		.name	= "twl6030_usb",
509 		.owner	= THIS_MODULE,
510 	},
511 };
512 
twl6030_usb_init(void)513 static int __init twl6030_usb_init(void)
514 {
515 	return platform_driver_register(&twl6030_usb_driver);
516 }
517 subsys_initcall(twl6030_usb_init);
518 
twl6030_usb_exit(void)519 static void __exit twl6030_usb_exit(void)
520 {
521 	platform_driver_unregister(&twl6030_usb_driver);
522 }
523 module_exit(twl6030_usb_exit);
524 
525 MODULE_ALIAS("platform:twl6030_usb");
526 MODULE_AUTHOR("Hema HK <hemahk@ti.com>");
527 MODULE_DESCRIPTION("TWL6030 USB transceiver driver");
528 MODULE_LICENSE("GPL");
529