diff options
author | Kishon Vijay Abraham I <kishon@ti.com> | 2012-09-06 10:57:08 -0400 |
---|---|---|
committer | Felipe Balbi <balbi@ti.com> | 2012-09-06 13:16:07 -0400 |
commit | ff0a1f39400a8d2c02343bd22d295517d72e58ec (patch) | |
tree | 8c3f4ceeb399372cfe3b3d86b11a8c7cbb262cbc /drivers/usb/otg | |
parent | 0e98de67bacba812b1b465b90a3f940d24401c27 (diff) |
usb: twl6030: Add dt support for twl6030 usb
Add device tree support for twl6030 usb driver.
Update the Documentation with device tree binding information.
Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
Signed-off-by: Felipe Balbi <balbi@ti.com>
Diffstat (limited to 'drivers/usb/otg')
-rw-r--r-- | drivers/usb/otg/twl6030-usb.c | 39 |
1 files changed, 26 insertions, 13 deletions
diff --git a/drivers/usb/otg/twl6030-usb.c b/drivers/usb/otg/twl6030-usb.c index 32525bb667ee..fcadef7864f1 100644 --- a/drivers/usb/otg/twl6030-usb.c +++ b/drivers/usb/otg/twl6030-usb.c | |||
@@ -105,7 +105,7 @@ struct twl6030_usb { | |||
105 | u8 asleep; | 105 | u8 asleep; |
106 | bool irq_enabled; | 106 | bool irq_enabled; |
107 | bool vbus_enable; | 107 | bool vbus_enable; |
108 | unsigned long features; | 108 | const char *regulator; |
109 | }; | 109 | }; |
110 | 110 | ||
111 | #define comparator_to_twl(x) container_of((x), struct twl6030_usb, comparator) | 111 | #define comparator_to_twl(x) container_of((x), struct twl6030_usb, comparator) |
@@ -153,13 +153,6 @@ static int twl6030_start_srp(struct phy_companion *comparator) | |||
153 | 153 | ||
154 | static int twl6030_usb_ldo_init(struct twl6030_usb *twl) | 154 | static int twl6030_usb_ldo_init(struct twl6030_usb *twl) |
155 | { | 155 | { |
156 | char *regulator_name; | ||
157 | |||
158 | if (twl->features & TWL6025_SUBCLASS) | ||
159 | regulator_name = "ldousb"; | ||
160 | else | ||
161 | regulator_name = "vusb"; | ||
162 | |||
163 | /* Set to OTG_REV 1.3 and turn on the ID_WAKEUP_COMP */ | 156 | /* Set to OTG_REV 1.3 and turn on the ID_WAKEUP_COMP */ |
164 | twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x1, TWL6030_BACKUP_REG); | 157 | twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x1, TWL6030_BACKUP_REG); |
165 | 158 | ||
@@ -169,7 +162,7 @@ static int twl6030_usb_ldo_init(struct twl6030_usb *twl) | |||
169 | /* Program MISC2 register and set bit VUSB_IN_VBAT */ | 162 | /* Program MISC2 register and set bit VUSB_IN_VBAT */ |
170 | twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x10, TWL6030_MISC2); | 163 | twl6030_writeb(twl, TWL6030_MODULE_ID0 , 0x10, TWL6030_MISC2); |
171 | 164 | ||
172 | twl->usb3v3 = regulator_get(twl->dev, regulator_name); | 165 | twl->usb3v3 = regulator_get(twl->dev, twl->regulator); |
173 | if (IS_ERR(twl->usb3v3)) | 166 | if (IS_ERR(twl->usb3v3)) |
174 | return -ENODEV; | 167 | return -ENODEV; |
175 | 168 | ||
@@ -322,9 +315,9 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
322 | u32 ret; | 315 | u32 ret; |
323 | struct twl6030_usb *twl; | 316 | struct twl6030_usb *twl; |
324 | int status, err; | 317 | int status, err; |
325 | struct twl4030_usb_data *pdata; | 318 | struct device_node *np = pdev->dev.of_node; |
326 | struct device *dev = &pdev->dev; | 319 | struct device *dev = &pdev->dev; |
327 | pdata = dev->platform_data; | 320 | struct twl4030_usb_data *pdata = dev->platform_data; |
328 | 321 | ||
329 | twl = devm_kzalloc(dev, sizeof *twl, GFP_KERNEL); | 322 | twl = devm_kzalloc(dev, sizeof *twl, GFP_KERNEL); |
330 | if (!twl) | 323 | if (!twl) |
@@ -333,7 +326,6 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
333 | twl->dev = &pdev->dev; | 326 | twl->dev = &pdev->dev; |
334 | twl->irq1 = platform_get_irq(pdev, 0); | 327 | twl->irq1 = platform_get_irq(pdev, 0); |
335 | twl->irq2 = platform_get_irq(pdev, 1); | 328 | twl->irq2 = platform_get_irq(pdev, 1); |
336 | twl->features = pdata->features; | ||
337 | twl->linkstat = OMAP_MUSB_UNKNOWN; | 329 | twl->linkstat = OMAP_MUSB_UNKNOWN; |
338 | 330 | ||
339 | twl->comparator.set_vbus = twl6030_set_vbus; | 331 | twl->comparator.set_vbus = twl6030_set_vbus; |
@@ -345,6 +337,18 @@ static int __devinit twl6030_usb_probe(struct platform_device *pdev) | |||
345 | return -EPROBE_DEFER; | 337 | return -EPROBE_DEFER; |
346 | } | 338 | } |
347 | 339 | ||
340 | if (np) { | ||
341 | twl->regulator = "usb"; | ||
342 | } else if (pdata) { | ||
343 | if (pdata->features & TWL6025_SUBCLASS) | ||
344 | twl->regulator = "ldousb"; | ||
345 | else | ||
346 | twl->regulator = "vusb"; | ||
347 | } else { | ||
348 | dev_err(&pdev->dev, "twl6030 initialized without pdata\n"); | ||
349 | return -EINVAL; | ||
350 | } | ||
351 | |||
348 | /* init spinlock for workqueue */ | 352 | /* init spinlock for workqueue */ |
349 | spin_lock_init(&twl->lock); | 353 | spin_lock_init(&twl->lock); |
350 | 354 | ||
@@ -406,12 +410,21 @@ static int __exit twl6030_usb_remove(struct platform_device *pdev) | |||
406 | return 0; | 410 | return 0; |
407 | } | 411 | } |
408 | 412 | ||
413 | #ifdef CONFIG_OF | ||
414 | static const struct of_device_id twl6030_usb_id_table[] = { | ||
415 | { .compatible = "ti,twl6030-usb" }, | ||
416 | {} | ||
417 | }; | ||
418 | MODULE_DEVICE_TABLE(of, twl6030_usb_id_table); | ||
419 | #endif | ||
420 | |||
409 | static struct platform_driver twl6030_usb_driver = { | 421 | static struct platform_driver twl6030_usb_driver = { |
410 | .probe = twl6030_usb_probe, | 422 | .probe = twl6030_usb_probe, |
411 | .remove = __exit_p(twl6030_usb_remove), | 423 | .remove = __exit_p(twl6030_usb_remove), |
412 | .driver = { | 424 | .driver = { |
413 | .name = "twl6030_usb", | 425 | .name = "twl6030_usb", |
414 | .owner = THIS_MODULE, | 426 | .owner = THIS_MODULE, |
427 | .of_match_table = of_match_ptr(twl6030_usb_id_table), | ||
415 | }, | 428 | }, |
416 | }; | 429 | }; |
417 | 430 | ||