1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * Motorola CPCAP PMIC USB PHY driver 4 * Copyright (C) 2017 Tony Lindgren <tony@atomide.com> 5 * 6 * Some parts based on earlier Motorola Linux kernel tree code in 7 * board-mapphone-usb.c and cpcap-usb-det.c: 8 * Copyright (C) 2007 - 2011 Motorola, Inc. 9 */ 10 11 #include <linux/atomic.h> 12 #include <linux/clk.h> 13 #include <linux/delay.h> 14 #include <linux/err.h> 15 #include <linux/io.h> 16 #include <linux/module.h> 17 #include <linux/of.h> 18 #include <linux/of_platform.h> 19 #include <linux/iio/consumer.h> 20 #include <linux/pinctrl/consumer.h> 21 #include <linux/platform_device.h> 22 #include <linux/regmap.h> 23 #include <linux/slab.h> 24 25 #include <linux/gpio/consumer.h> 26 #include <linux/mfd/motorola-cpcap.h> 27 #include <linux/phy/omap_usb.h> 28 #include <linux/phy/phy.h> 29 #include <linux/regulator/consumer.h> 30 #include <linux/usb/musb.h> 31 32 /* CPCAP_REG_USBC1 register bits */ 33 #define CPCAP_BIT_IDPULSE BIT(15) 34 #define CPCAP_BIT_ID100KPU BIT(14) 35 #define CPCAP_BIT_IDPUCNTRL BIT(13) 36 #define CPCAP_BIT_IDPU BIT(12) 37 #define CPCAP_BIT_IDPD BIT(11) 38 #define CPCAP_BIT_VBUSCHRGTMR3 BIT(10) 39 #define CPCAP_BIT_VBUSCHRGTMR2 BIT(9) 40 #define CPCAP_BIT_VBUSCHRGTMR1 BIT(8) 41 #define CPCAP_BIT_VBUSCHRGTMR0 BIT(7) 42 #define CPCAP_BIT_VBUSPU BIT(6) 43 #define CPCAP_BIT_VBUSPD BIT(5) 44 #define CPCAP_BIT_DMPD BIT(4) 45 #define CPCAP_BIT_DPPD BIT(3) 46 #define CPCAP_BIT_DM1K5PU BIT(2) 47 #define CPCAP_BIT_DP1K5PU BIT(1) 48 #define CPCAP_BIT_DP150KPU BIT(0) 49 50 /* CPCAP_REG_USBC2 register bits */ 51 #define CPCAP_BIT_ZHSDRV1 BIT(15) 52 #define CPCAP_BIT_ZHSDRV0 BIT(14) 53 #define CPCAP_BIT_DPLLCLKREQ BIT(13) 54 #define CPCAP_BIT_SE0CONN BIT(12) 55 #define CPCAP_BIT_UARTTXTRI BIT(11) 56 #define CPCAP_BIT_UARTSWAP BIT(10) 57 #define CPCAP_BIT_UARTMUX1 BIT(9) 58 #define CPCAP_BIT_UARTMUX0 BIT(8) 59 #define CPCAP_BIT_ULPISTPLOW BIT(7) 60 #define CPCAP_BIT_TXENPOL BIT(6) 61 #define CPCAP_BIT_USBXCVREN BIT(5) 62 #define CPCAP_BIT_USBCNTRL BIT(4) 63 #define CPCAP_BIT_USBSUSPEND BIT(3) 64 #define CPCAP_BIT_EMUMODE2 BIT(2) 65 #define CPCAP_BIT_EMUMODE1 BIT(1) 66 #define CPCAP_BIT_EMUMODE0 BIT(0) 67 68 /* CPCAP_REG_USBC3 register bits */ 69 #define CPCAP_BIT_SPARE_898_15 BIT(15) 70 #define CPCAP_BIT_IHSTX03 BIT(14) 71 #define CPCAP_BIT_IHSTX02 BIT(13) 72 #define CPCAP_BIT_IHSTX01 BIT(12) 73 #define CPCAP_BIT_IHSTX0 BIT(11) 74 #define CPCAP_BIT_IDPU_SPI BIT(10) 75 #define CPCAP_BIT_UNUSED_898_9 BIT(9) 76 #define CPCAP_BIT_VBUSSTBY_EN BIT(8) 77 #define CPCAP_BIT_VBUSEN_SPI BIT(7) 78 #define CPCAP_BIT_VBUSPU_SPI BIT(6) 79 #define CPCAP_BIT_VBUSPD_SPI BIT(5) 80 #define CPCAP_BIT_DMPD_SPI BIT(4) 81 #define CPCAP_BIT_DPPD_SPI BIT(3) 82 #define CPCAP_BIT_SUSPEND_SPI BIT(2) 83 #define CPCAP_BIT_PU_SPI BIT(1) 84 #define CPCAP_BIT_ULPI_SPI_SEL BIT(0) 85 86 struct cpcap_usb_ints_state { 87 bool id_ground; 88 bool id_float; 89 bool chrg_det; 90 bool rvrs_chrg; 91 bool vbusov; 92 93 bool chrg_se1b; 94 bool se0conn; 95 bool rvrs_mode; 96 bool chrgcurr1; 97 bool vbusvld; 98 bool sessvld; 99 bool sessend; 100 bool se1; 101 102 bool battdetb; 103 bool dm; 104 bool dp; 105 }; 106 107 enum cpcap_gpio_mode { 108 CPCAP_DM_DP, 109 CPCAP_MDM_RX_TX, 110 CPCAP_UNKNOWN_DISABLED, /* Seems to disable USB lines */ 111 CPCAP_OTG_DM_DP, 112 }; 113 114 struct cpcap_phy_ddata { 115 struct regmap *reg; 116 struct device *dev; 117 struct usb_phy phy; 118 struct delayed_work detect_work; 119 struct pinctrl *pins; 120 struct pinctrl_state *pins_ulpi; 121 struct pinctrl_state *pins_utmi; 122 struct pinctrl_state *pins_uart; 123 struct gpio_desc *gpio[2]; 124 struct iio_channel *vbus; 125 struct iio_channel *id; 126 struct regulator *vusb; 127 atomic_t active; 128 unsigned int vbus_provider:1; 129 unsigned int docked:1; 130 }; 131 132 static bool cpcap_usb_vbus_valid(struct cpcap_phy_ddata *ddata) 133 { 134 int error, value = 0; 135 136 error = iio_read_channel_processed(ddata->vbus, &value); 137 if (error >= 0) 138 return value > 3900; 139 140 dev_err(ddata->dev, "error reading VBUS: %i\n", error); 141 142 return false; 143 } 144 145 static int cpcap_usb_phy_set_host(struct usb_otg *otg, struct usb_bus *host) 146 { 147 otg->host = host; 148 if (!host) 149 otg->state = OTG_STATE_UNDEFINED; 150 151 return 0; 152 } 153 154 static int cpcap_usb_phy_set_peripheral(struct usb_otg *otg, 155 struct usb_gadget *gadget) 156 { 157 otg->gadget = gadget; 158 if (!gadget) 159 otg->state = OTG_STATE_UNDEFINED; 160 161 return 0; 162 } 163 164 static const struct phy_ops ops = { 165 .owner = THIS_MODULE, 166 }; 167 168 static int cpcap_phy_get_ints_state(struct cpcap_phy_ddata *ddata, 169 struct cpcap_usb_ints_state *s) 170 { 171 int val, error; 172 173 error = regmap_read(ddata->reg, CPCAP_REG_INTS1, &val); 174 if (error) 175 return error; 176 177 s->id_ground = val & BIT(15); 178 s->id_float = val & BIT(14); 179 s->vbusov = val & BIT(11); 180 181 error = regmap_read(ddata->reg, CPCAP_REG_INTS2, &val); 182 if (error) 183 return error; 184 185 s->vbusvld = val & BIT(3); 186 s->sessvld = val & BIT(2); 187 s->sessend = val & BIT(1); 188 s->se1 = val & BIT(0); 189 190 error = regmap_read(ddata->reg, CPCAP_REG_INTS4, &val); 191 if (error) 192 return error; 193 194 s->dm = val & BIT(1); 195 s->dp = val & BIT(0); 196 197 return 0; 198 } 199 200 static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata); 201 static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata); 202 203 static void cpcap_usb_try_musb_mailbox(struct cpcap_phy_ddata *ddata, 204 enum musb_vbus_id_status status) 205 { 206 int error; 207 208 error = musb_mailbox(status); 209 if (!error) 210 return; 211 212 dev_dbg(ddata->dev, "%s: musb_mailbox failed: %i\n", 213 __func__, error); 214 } 215 216 static void cpcap_usb_detect(struct work_struct *work) 217 { 218 struct cpcap_phy_ddata *ddata; 219 struct cpcap_usb_ints_state s; 220 bool vbus = false; 221 int error; 222 223 ddata = container_of(work, struct cpcap_phy_ddata, detect_work.work); 224 225 error = cpcap_phy_get_ints_state(ddata, &s); 226 if (error) 227 return; 228 229 vbus = cpcap_usb_vbus_valid(ddata); 230 231 /* We need to kick the VBUS as USB A-host */ 232 if (s.id_ground && ddata->vbus_provider) { 233 dev_dbg(ddata->dev, "still in USB A-host mode, kicking VBUS\n"); 234 235 cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND); 236 237 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3, 238 CPCAP_BIT_VBUSSTBY_EN | 239 CPCAP_BIT_VBUSEN_SPI, 240 CPCAP_BIT_VBUSEN_SPI); 241 if (error) 242 goto out_err; 243 244 return; 245 } 246 247 if (vbus && s.id_ground && ddata->docked) { 248 dev_dbg(ddata->dev, "still docked as A-host, signal ID down\n"); 249 250 cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND); 251 252 return; 253 } 254 255 /* No VBUS needed with docks */ 256 if (vbus && s.id_ground && !ddata->vbus_provider) { 257 dev_dbg(ddata->dev, "connected to a dock\n"); 258 259 ddata->docked = true; 260 261 error = cpcap_usb_set_usb_mode(ddata); 262 if (error) 263 goto out_err; 264 265 cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND); 266 267 /* 268 * Force check state again after musb has reoriented, 269 * otherwise devices won't enumerate after loading PHY 270 * driver. 271 */ 272 schedule_delayed_work(&ddata->detect_work, 273 msecs_to_jiffies(1000)); 274 275 return; 276 } 277 278 if (s.id_ground && !ddata->docked) { 279 dev_dbg(ddata->dev, "id ground, USB host mode\n"); 280 281 ddata->vbus_provider = true; 282 283 error = cpcap_usb_set_usb_mode(ddata); 284 if (error) 285 goto out_err; 286 287 cpcap_usb_try_musb_mailbox(ddata, MUSB_ID_GROUND); 288 289 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3, 290 CPCAP_BIT_VBUSSTBY_EN | 291 CPCAP_BIT_VBUSEN_SPI, 292 CPCAP_BIT_VBUSEN_SPI); 293 if (error) 294 goto out_err; 295 296 return; 297 } 298 299 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3, 300 CPCAP_BIT_VBUSSTBY_EN | 301 CPCAP_BIT_VBUSEN_SPI, 0); 302 if (error) 303 goto out_err; 304 305 vbus = cpcap_usb_vbus_valid(ddata); 306 307 /* Otherwise assume we're connected to a USB host */ 308 if (vbus) { 309 dev_dbg(ddata->dev, "connected to USB host\n"); 310 error = cpcap_usb_set_usb_mode(ddata); 311 if (error) 312 goto out_err; 313 cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_VALID); 314 315 return; 316 } 317 318 ddata->vbus_provider = false; 319 ddata->docked = false; 320 cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_OFF); 321 322 /* Default to debug UART mode */ 323 error = cpcap_usb_set_uart_mode(ddata); 324 if (error) 325 goto out_err; 326 327 dev_dbg(ddata->dev, "set UART mode\n"); 328 329 return; 330 331 out_err: 332 dev_err(ddata->dev, "error setting cable state: %i\n", error); 333 } 334 335 static irqreturn_t cpcap_phy_irq_thread(int irq, void *data) 336 { 337 struct cpcap_phy_ddata *ddata = data; 338 339 if (!atomic_read(&ddata->active)) 340 return IRQ_NONE; 341 342 schedule_delayed_work(&ddata->detect_work, msecs_to_jiffies(1)); 343 344 return IRQ_HANDLED; 345 } 346 347 static int cpcap_usb_init_irq(struct platform_device *pdev, 348 struct cpcap_phy_ddata *ddata, 349 const char *name) 350 { 351 int irq, error; 352 353 irq = platform_get_irq_byname(pdev, name); 354 if (irq < 0) 355 return -ENODEV; 356 357 error = devm_request_threaded_irq(ddata->dev, irq, NULL, 358 cpcap_phy_irq_thread, 359 IRQF_SHARED | 360 IRQF_ONESHOT, 361 name, ddata); 362 if (error) { 363 dev_err(ddata->dev, "could not get irq %s: %i\n", 364 name, error); 365 366 return error; 367 } 368 369 return 0; 370 } 371 372 static const char * const cpcap_phy_irqs[] = { 373 /* REG_INT_0 */ 374 "id_ground", "id_float", 375 376 /* REG_INT1 */ 377 "se0conn", "vbusvld", "sessvld", "sessend", "se1", 378 379 /* REG_INT_3 */ 380 "dm", "dp", 381 }; 382 383 static int cpcap_usb_init_interrupts(struct platform_device *pdev, 384 struct cpcap_phy_ddata *ddata) 385 { 386 int i, error; 387 388 for (i = 0; i < ARRAY_SIZE(cpcap_phy_irqs); i++) { 389 error = cpcap_usb_init_irq(pdev, ddata, cpcap_phy_irqs[i]); 390 if (error) 391 return error; 392 } 393 394 return 0; 395 } 396 397 /* 398 * Optional pins and modes. At least Motorola mapphone devices 399 * are using two GPIOs and dynamic pinctrl to multiplex PHY pins 400 * to UART, ULPI or UTMI mode. 401 */ 402 403 static int cpcap_usb_gpio_set_mode(struct cpcap_phy_ddata *ddata, 404 enum cpcap_gpio_mode mode) 405 { 406 if (!ddata->gpio[0] || !ddata->gpio[1]) 407 return 0; 408 409 gpiod_set_value(ddata->gpio[0], mode & 1); 410 gpiod_set_value(ddata->gpio[1], mode >> 1); 411 412 return 0; 413 } 414 415 static int cpcap_usb_set_uart_mode(struct cpcap_phy_ddata *ddata) 416 { 417 int error; 418 419 /* Disable lines to prevent glitches from waking up mdm6600 */ 420 error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); 421 if (error) 422 goto out_err; 423 424 if (ddata->pins_uart) { 425 error = pinctrl_select_state(ddata->pins, ddata->pins_uart); 426 if (error) 427 goto out_err; 428 } 429 430 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC1, 431 CPCAP_BIT_VBUSPD, 432 CPCAP_BIT_VBUSPD); 433 if (error) 434 goto out_err; 435 436 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC2, 437 0xffff, CPCAP_BIT_UARTMUX0 | 438 CPCAP_BIT_EMUMODE0); 439 if (error) 440 goto out_err; 441 442 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3, 0x7fff, 443 CPCAP_BIT_IDPU_SPI); 444 if (error) 445 goto out_err; 446 447 /* Enable UART mode */ 448 error = cpcap_usb_gpio_set_mode(ddata, CPCAP_DM_DP); 449 if (error) 450 goto out_err; 451 452 return 0; 453 454 out_err: 455 dev_err(ddata->dev, "%s failed with %i\n", __func__, error); 456 457 return error; 458 } 459 460 static int cpcap_usb_set_usb_mode(struct cpcap_phy_ddata *ddata) 461 { 462 int error; 463 464 /* Disable lines to prevent glitches from waking up mdm6600 */ 465 error = cpcap_usb_gpio_set_mode(ddata, CPCAP_UNKNOWN_DISABLED); 466 if (error) 467 return error; 468 469 if (ddata->pins_utmi) { 470 error = pinctrl_select_state(ddata->pins, ddata->pins_utmi); 471 if (error) { 472 dev_err(ddata->dev, "could not set usb mode: %i\n", 473 error); 474 475 return error; 476 } 477 } 478 479 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC1, 480 CPCAP_BIT_VBUSPD, 0); 481 if (error) 482 goto out_err; 483 484 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC3, 485 CPCAP_BIT_PU_SPI | 486 CPCAP_BIT_DMPD_SPI | 487 CPCAP_BIT_DPPD_SPI | 488 CPCAP_BIT_SUSPEND_SPI | 489 CPCAP_BIT_ULPI_SPI_SEL, 0); 490 if (error) 491 goto out_err; 492 493 error = regmap_update_bits(ddata->reg, CPCAP_REG_USBC2, 494 CPCAP_BIT_USBXCVREN, 495 CPCAP_BIT_USBXCVREN); 496 if (error) 497 goto out_err; 498 499 /* Enable USB mode */ 500 error = cpcap_usb_gpio_set_mode(ddata, CPCAP_OTG_DM_DP); 501 if (error) 502 goto out_err; 503 504 return 0; 505 506 out_err: 507 dev_err(ddata->dev, "%s failed with %i\n", __func__, error); 508 509 return error; 510 } 511 512 static int cpcap_usb_init_optional_pins(struct cpcap_phy_ddata *ddata) 513 { 514 ddata->pins = devm_pinctrl_get(ddata->dev); 515 if (IS_ERR(ddata->pins)) { 516 dev_info(ddata->dev, "default pins not configured: %ld\n", 517 PTR_ERR(ddata->pins)); 518 ddata->pins = NULL; 519 520 return 0; 521 } 522 523 ddata->pins_ulpi = pinctrl_lookup_state(ddata->pins, "ulpi"); 524 if (IS_ERR(ddata->pins_ulpi)) { 525 dev_info(ddata->dev, "ulpi pins not configured\n"); 526 ddata->pins_ulpi = NULL; 527 } 528 529 ddata->pins_utmi = pinctrl_lookup_state(ddata->pins, "utmi"); 530 if (IS_ERR(ddata->pins_utmi)) { 531 dev_info(ddata->dev, "utmi pins not configured\n"); 532 ddata->pins_utmi = NULL; 533 } 534 535 ddata->pins_uart = pinctrl_lookup_state(ddata->pins, "uart"); 536 if (IS_ERR(ddata->pins_uart)) { 537 dev_info(ddata->dev, "uart pins not configured\n"); 538 ddata->pins_uart = NULL; 539 } 540 541 if (ddata->pins_uart) 542 return pinctrl_select_state(ddata->pins, ddata->pins_uart); 543 544 return 0; 545 } 546 547 static void cpcap_usb_init_optional_gpios(struct cpcap_phy_ddata *ddata) 548 { 549 int i; 550 551 for (i = 0; i < 2; i++) { 552 ddata->gpio[i] = devm_gpiod_get_index(ddata->dev, "mode", 553 i, GPIOD_OUT_HIGH); 554 if (IS_ERR(ddata->gpio[i])) { 555 dev_info(ddata->dev, "no mode change GPIO%i: %li\n", 556 i, PTR_ERR(ddata->gpio[i])); 557 ddata->gpio[i] = NULL; 558 } 559 } 560 } 561 562 static int cpcap_usb_init_iio(struct cpcap_phy_ddata *ddata) 563 { 564 enum iio_chan_type type; 565 int error; 566 567 ddata->vbus = devm_iio_channel_get(ddata->dev, "vbus"); 568 if (IS_ERR(ddata->vbus)) { 569 error = PTR_ERR(ddata->vbus); 570 goto out_err; 571 } 572 573 if (!ddata->vbus->indio_dev) { 574 error = -ENXIO; 575 goto out_err; 576 } 577 578 error = iio_get_channel_type(ddata->vbus, &type); 579 if (error < 0) 580 goto out_err; 581 582 if (type != IIO_VOLTAGE) { 583 error = -EINVAL; 584 goto out_err; 585 } 586 587 return 0; 588 589 out_err: 590 dev_err(ddata->dev, "could not initialize VBUS or ID IIO: %i\n", 591 error); 592 593 return error; 594 } 595 596 #ifdef CONFIG_OF 597 static const struct of_device_id cpcap_usb_phy_id_table[] = { 598 { 599 .compatible = "motorola,cpcap-usb-phy", 600 }, 601 { 602 .compatible = "motorola,mapphone-cpcap-usb-phy", 603 }, 604 {}, 605 }; 606 MODULE_DEVICE_TABLE(of, cpcap_usb_phy_id_table); 607 #endif 608 609 static int cpcap_usb_phy_probe(struct platform_device *pdev) 610 { 611 struct cpcap_phy_ddata *ddata; 612 struct phy *generic_phy; 613 struct phy_provider *phy_provider; 614 struct usb_otg *otg; 615 const struct of_device_id *of_id; 616 int error; 617 618 of_id = of_match_device(of_match_ptr(cpcap_usb_phy_id_table), 619 &pdev->dev); 620 if (!of_id) 621 return -EINVAL; 622 623 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); 624 if (!ddata) 625 return -ENOMEM; 626 627 ddata->reg = dev_get_regmap(pdev->dev.parent, NULL); 628 if (!ddata->reg) 629 return -ENODEV; 630 631 otg = devm_kzalloc(&pdev->dev, sizeof(*otg), GFP_KERNEL); 632 if (!otg) 633 return -ENOMEM; 634 635 ddata->dev = &pdev->dev; 636 ddata->phy.dev = ddata->dev; 637 ddata->phy.label = "cpcap_usb_phy"; 638 ddata->phy.otg = otg; 639 ddata->phy.type = USB_PHY_TYPE_USB2; 640 otg->set_host = cpcap_usb_phy_set_host; 641 otg->set_peripheral = cpcap_usb_phy_set_peripheral; 642 otg->usb_phy = &ddata->phy; 643 INIT_DELAYED_WORK(&ddata->detect_work, cpcap_usb_detect); 644 platform_set_drvdata(pdev, ddata); 645 646 ddata->vusb = devm_regulator_get(&pdev->dev, "vusb"); 647 if (IS_ERR(ddata->vusb)) 648 return PTR_ERR(ddata->vusb); 649 650 error = regulator_enable(ddata->vusb); 651 if (error) 652 return error; 653 654 generic_phy = devm_phy_create(ddata->dev, NULL, &ops); 655 if (IS_ERR(generic_phy)) { 656 error = PTR_ERR(generic_phy); 657 goto out_reg_disable; 658 } 659 660 phy_set_drvdata(generic_phy, ddata); 661 662 phy_provider = devm_of_phy_provider_register(ddata->dev, 663 of_phy_simple_xlate); 664 if (IS_ERR(phy_provider)) { 665 error = PTR_ERR(phy_provider); 666 goto out_reg_disable; 667 } 668 669 error = cpcap_usb_init_optional_pins(ddata); 670 if (error) 671 goto out_reg_disable; 672 673 cpcap_usb_init_optional_gpios(ddata); 674 675 error = cpcap_usb_init_iio(ddata); 676 if (error) 677 goto out_reg_disable; 678 679 error = cpcap_usb_init_interrupts(pdev, ddata); 680 if (error) 681 goto out_reg_disable; 682 683 usb_add_phy_dev(&ddata->phy); 684 atomic_set(&ddata->active, 1); 685 schedule_delayed_work(&ddata->detect_work, msecs_to_jiffies(1)); 686 687 return 0; 688 689 out_reg_disable: 690 regulator_disable(ddata->vusb); 691 692 return error; 693 } 694 695 static int cpcap_usb_phy_remove(struct platform_device *pdev) 696 { 697 struct cpcap_phy_ddata *ddata = platform_get_drvdata(pdev); 698 int error; 699 700 atomic_set(&ddata->active, 0); 701 error = cpcap_usb_set_uart_mode(ddata); 702 if (error) 703 dev_err(ddata->dev, "could not set UART mode\n"); 704 705 cpcap_usb_try_musb_mailbox(ddata, MUSB_VBUS_OFF); 706 707 usb_remove_phy(&ddata->phy); 708 cancel_delayed_work_sync(&ddata->detect_work); 709 regulator_disable(ddata->vusb); 710 711 return 0; 712 } 713 714 static struct platform_driver cpcap_usb_phy_driver = { 715 .probe = cpcap_usb_phy_probe, 716 .remove = cpcap_usb_phy_remove, 717 .driver = { 718 .name = "cpcap-usb-phy", 719 .of_match_table = of_match_ptr(cpcap_usb_phy_id_table), 720 }, 721 }; 722 723 module_platform_driver(cpcap_usb_phy_driver); 724 725 MODULE_ALIAS("platform:cpcap_usb"); 726 MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>"); 727 MODULE_DESCRIPTION("CPCAP usb phy driver"); 728 MODULE_LICENSE("GPL v2"); 729