phy-tusb1210.c (16453B)
1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * tusb1210.c - TUSB1210 USB ULPI PHY driver 4 * 5 * Copyright (C) 2015 Intel Corporation 6 * 7 * Author: Heikki Krogerus <heikki.krogerus@linux.intel.com> 8 */ 9#include <linux/module.h> 10#include <linux/bitfield.h> 11#include <linux/delay.h> 12#include <linux/ulpi/driver.h> 13#include <linux/ulpi/regs.h> 14#include <linux/gpio/consumer.h> 15#include <linux/phy/ulpi_phy.h> 16#include <linux/power_supply.h> 17#include <linux/workqueue.h> 18 19#define TUSB1211_POWER_CONTROL 0x3d 20#define TUSB1211_POWER_CONTROL_SET 0x3e 21#define TUSB1211_POWER_CONTROL_CLEAR 0x3f 22#define TUSB1211_POWER_CONTROL_SW_CONTROL BIT(0) 23#define TUSB1211_POWER_CONTROL_DET_COMP BIT(1) 24#define TUSB1211_POWER_CONTROL_DP_VSRC_EN BIT(6) 25 26#define TUSB1210_VENDOR_SPECIFIC2 0x80 27#define TUSB1210_VENDOR_SPECIFIC2_IHSTX_MASK GENMASK(3, 0) 28#define TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_MASK GENMASK(5, 4) 29#define TUSB1210_VENDOR_SPECIFIC2_DP_MASK BIT(6) 30 31#define TUSB1211_VENDOR_SPECIFIC3 0x85 32#define TUSB1211_VENDOR_SPECIFIC3_SET 0x86 33#define TUSB1211_VENDOR_SPECIFIC3_CLEAR 0x87 34#define TUSB1211_VENDOR_SPECIFIC3_SW_USB_DET BIT(4) 35#define TUSB1211_VENDOR_SPECIFIC3_CHGD_IDP_SRC_EN BIT(6) 36 37#define TUSB1210_RESET_TIME_MS 50 38 39#define TUSB1210_CHG_DET_MAX_RETRIES 5 40 41/* TUSB1210 charger detection work states */ 42enum tusb1210_chg_det_state { 43 TUSB1210_CHG_DET_CONNECTING, 44 TUSB1210_CHG_DET_START_DET, 45 TUSB1210_CHG_DET_READ_DET, 46 TUSB1210_CHG_DET_FINISH_DET, 47 TUSB1210_CHG_DET_CONNECTED, 48 TUSB1210_CHG_DET_DISCONNECTING, 49 TUSB1210_CHG_DET_DISCONNECTING_DONE, 50 TUSB1210_CHG_DET_DISCONNECTED, 51}; 52 53struct tusb1210 { 54 struct ulpi *ulpi; 55 struct phy *phy; 56 struct gpio_desc *gpio_reset; 57 struct gpio_desc *gpio_cs; 58 u8 otg_ctrl; 59 u8 vendor_specific2; 60#ifdef CONFIG_POWER_SUPPLY 61 enum power_supply_usb_type chg_type; 62 enum tusb1210_chg_det_state chg_det_state; 63 int chg_det_retries; 64 struct delayed_work chg_det_work; 65 struct notifier_block psy_nb; 66 struct power_supply *psy; 67 struct power_supply *charger; 68#endif 69}; 70 71static int tusb1210_ulpi_write(struct tusb1210 *tusb, u8 reg, u8 val) 72{ 73 int ret; 74 75 ret = ulpi_write(tusb->ulpi, reg, val); 76 if (ret) 77 dev_err(&tusb->ulpi->dev, "error %d writing val 0x%02x to reg 0x%02x\n", 78 ret, val, reg); 79 80 return ret; 81} 82 83static int tusb1210_ulpi_read(struct tusb1210 *tusb, u8 reg, u8 *val) 84{ 85 int ret; 86 87 ret = ulpi_read(tusb->ulpi, reg); 88 if (ret >= 0) { 89 *val = ret; 90 ret = 0; 91 } else { 92 dev_err(&tusb->ulpi->dev, "error %d reading reg 0x%02x\n", ret, reg); 93 } 94 95 return ret; 96} 97 98static int tusb1210_power_on(struct phy *phy) 99{ 100 struct tusb1210 *tusb = phy_get_drvdata(phy); 101 102 gpiod_set_value_cansleep(tusb->gpio_reset, 1); 103 gpiod_set_value_cansleep(tusb->gpio_cs, 1); 104 105 msleep(TUSB1210_RESET_TIME_MS); 106 107 /* Restore the optional eye diagram optimization value */ 108 return tusb1210_ulpi_write(tusb, TUSB1210_VENDOR_SPECIFIC2, 109 tusb->vendor_specific2); 110} 111 112static int tusb1210_power_off(struct phy *phy) 113{ 114 struct tusb1210 *tusb = phy_get_drvdata(phy); 115 116 gpiod_set_value_cansleep(tusb->gpio_reset, 0); 117 gpiod_set_value_cansleep(tusb->gpio_cs, 0); 118 119 return 0; 120} 121 122static int tusb1210_set_mode(struct phy *phy, enum phy_mode mode, int submode) 123{ 124 struct tusb1210 *tusb = phy_get_drvdata(phy); 125 int ret; 126 u8 reg; 127 128 ret = tusb1210_ulpi_read(tusb, ULPI_OTG_CTRL, ®); 129 if (ret < 0) 130 return ret; 131 132 switch (mode) { 133 case PHY_MODE_USB_HOST: 134 reg |= (ULPI_OTG_CTRL_DRVVBUS_EXT 135 | ULPI_OTG_CTRL_ID_PULLUP 136 | ULPI_OTG_CTRL_DP_PULLDOWN 137 | ULPI_OTG_CTRL_DM_PULLDOWN); 138 tusb1210_ulpi_write(tusb, ULPI_OTG_CTRL, reg); 139 reg |= ULPI_OTG_CTRL_DRVVBUS; 140 break; 141 case PHY_MODE_USB_DEVICE: 142 reg &= ~(ULPI_OTG_CTRL_DRVVBUS 143 | ULPI_OTG_CTRL_DP_PULLDOWN 144 | ULPI_OTG_CTRL_DM_PULLDOWN); 145 tusb1210_ulpi_write(tusb, ULPI_OTG_CTRL, reg); 146 reg &= ~ULPI_OTG_CTRL_DRVVBUS_EXT; 147 break; 148 default: 149 /* nothing */ 150 return 0; 151 } 152 153 tusb->otg_ctrl = reg; 154 return tusb1210_ulpi_write(tusb, ULPI_OTG_CTRL, reg); 155} 156 157#ifdef CONFIG_POWER_SUPPLY 158static const char * const tusb1210_chg_det_states[] = { 159 "CHG_DET_CONNECTING", 160 "CHG_DET_START_DET", 161 "CHG_DET_READ_DET", 162 "CHG_DET_FINISH_DET", 163 "CHG_DET_CONNECTED", 164 "CHG_DET_DISCONNECTING", 165 "CHG_DET_DISCONNECTING_DONE", 166 "CHG_DET_DISCONNECTED", 167}; 168 169static void tusb1210_reset(struct tusb1210 *tusb) 170{ 171 gpiod_set_value_cansleep(tusb->gpio_reset, 0); 172 usleep_range(200, 500); 173 gpiod_set_value_cansleep(tusb->gpio_reset, 1); 174} 175 176static void tusb1210_chg_det_set_type(struct tusb1210 *tusb, 177 enum power_supply_usb_type type) 178{ 179 dev_dbg(&tusb->ulpi->dev, "charger type: %d\n", type); 180 tusb->chg_type = type; 181 tusb->chg_det_retries = 0; 182 power_supply_changed(tusb->psy); 183} 184 185static void tusb1210_chg_det_set_state(struct tusb1210 *tusb, 186 enum tusb1210_chg_det_state new_state, 187 int delay_ms) 188{ 189 if (delay_ms) 190 dev_dbg(&tusb->ulpi->dev, "chg_det new state %s in %d ms\n", 191 tusb1210_chg_det_states[new_state], delay_ms); 192 193 tusb->chg_det_state = new_state; 194 mod_delayed_work(system_long_wq, &tusb->chg_det_work, 195 msecs_to_jiffies(delay_ms)); 196} 197 198static void tusb1210_chg_det_handle_ulpi_error(struct tusb1210 *tusb) 199{ 200 tusb1210_reset(tusb); 201 if (tusb->chg_det_retries < TUSB1210_CHG_DET_MAX_RETRIES) { 202 tusb->chg_det_retries++; 203 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_START_DET, 204 TUSB1210_RESET_TIME_MS); 205 } else { 206 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_FINISH_DET, 207 TUSB1210_RESET_TIME_MS); 208 } 209} 210 211/* 212 * Boards using a TUSB121x for charger-detection have 3 power_supply class devs: 213 * 214 * tusb1211-charger-detect(1) -> charger -> fuel-gauge 215 * 216 * To determine if an USB charger is connected to the board, the online prop of 217 * the charger psy needs to be read. Since the tusb1211-charger-detect psy is 218 * the start of the supplier -> supplied-to chain, power_supply_am_i_supplied() 219 * cannot be used here. 220 * 221 * Instead, below is a list of the power_supply names of known chargers for 222 * these boards and the charger psy is looked up by name from this list. 223 * 224 * (1) modelling the external USB charger 225 */ 226static const char * const tusb1210_chargers[] = { 227 "bq24190-charger", 228}; 229 230static bool tusb1210_get_online(struct tusb1210 *tusb) 231{ 232 union power_supply_propval val; 233 int i; 234 235 for (i = 0; i < ARRAY_SIZE(tusb1210_chargers) && !tusb->charger; i++) 236 tusb->charger = power_supply_get_by_name(tusb1210_chargers[i]); 237 238 if (!tusb->charger) 239 return false; 240 241 if (power_supply_get_property(tusb->charger, POWER_SUPPLY_PROP_ONLINE, &val)) 242 return false; 243 244 return val.intval; 245} 246 247static void tusb1210_chg_det_work(struct work_struct *work) 248{ 249 struct tusb1210 *tusb = container_of(work, struct tusb1210, chg_det_work.work); 250 bool vbus_present = tusb1210_get_online(tusb); 251 int ret; 252 u8 val; 253 254 dev_dbg(&tusb->ulpi->dev, "chg_det state %s vbus_present %d\n", 255 tusb1210_chg_det_states[tusb->chg_det_state], vbus_present); 256 257 switch (tusb->chg_det_state) { 258 case TUSB1210_CHG_DET_CONNECTING: 259 tusb->chg_type = POWER_SUPPLY_USB_TYPE_UNKNOWN; 260 tusb->chg_det_retries = 0; 261 /* Power on USB controller for ulpi_read()/_write() */ 262 ret = pm_runtime_resume_and_get(tusb->ulpi->dev.parent); 263 if (ret < 0) { 264 dev_err(&tusb->ulpi->dev, "error %d runtime-resuming\n", ret); 265 /* Should never happen, skip charger detection */ 266 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_CONNECTED, 0); 267 return; 268 } 269 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_START_DET, 0); 270 break; 271 case TUSB1210_CHG_DET_START_DET: 272 /* 273 * Use the builtin charger detection FSM to keep things simple. 274 * This only detects DCP / SDP. This is good enough for the few 275 * boards which actually rely on the phy for charger detection. 276 */ 277 mutex_lock(&tusb->phy->mutex); 278 ret = tusb1210_ulpi_write(tusb, TUSB1211_VENDOR_SPECIFIC3_SET, 279 TUSB1211_VENDOR_SPECIFIC3_SW_USB_DET); 280 mutex_unlock(&tusb->phy->mutex); 281 if (ret) { 282 tusb1210_chg_det_handle_ulpi_error(tusb); 283 break; 284 } 285 286 /* Wait 400 ms for the charger detection FSM to finish */ 287 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_READ_DET, 400); 288 break; 289 case TUSB1210_CHG_DET_READ_DET: 290 mutex_lock(&tusb->phy->mutex); 291 ret = tusb1210_ulpi_read(tusb, TUSB1211_POWER_CONTROL, &val); 292 mutex_unlock(&tusb->phy->mutex); 293 if (ret) { 294 tusb1210_chg_det_handle_ulpi_error(tusb); 295 break; 296 } 297 298 if (val & TUSB1211_POWER_CONTROL_DET_COMP) 299 tusb1210_chg_det_set_type(tusb, POWER_SUPPLY_USB_TYPE_DCP); 300 else 301 tusb1210_chg_det_set_type(tusb, POWER_SUPPLY_USB_TYPE_SDP); 302 303 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_FINISH_DET, 0); 304 break; 305 case TUSB1210_CHG_DET_FINISH_DET: 306 mutex_lock(&tusb->phy->mutex); 307 308 /* Set SW_CONTROL to stop the charger-det FSM */ 309 ret = tusb1210_ulpi_write(tusb, TUSB1211_POWER_CONTROL_SET, 310 TUSB1211_POWER_CONTROL_SW_CONTROL); 311 312 /* Clear DP_VSRC_EN which may have been enabled by the charger-det FSM */ 313 ret |= tusb1210_ulpi_write(tusb, TUSB1211_POWER_CONTROL_CLEAR, 314 TUSB1211_POWER_CONTROL_DP_VSRC_EN); 315 316 /* Clear CHGD_IDP_SRC_EN (may have been enabled by the charger-det FSM) */ 317 ret |= tusb1210_ulpi_write(tusb, TUSB1211_VENDOR_SPECIFIC3_CLEAR, 318 TUSB1211_VENDOR_SPECIFIC3_CHGD_IDP_SRC_EN); 319 320 /* If any of the above fails reset the phy */ 321 if (ret) { 322 tusb1210_reset(tusb); 323 msleep(TUSB1210_RESET_TIME_MS); 324 } 325 326 /* Restore phy-parameters and OTG_CTRL register */ 327 tusb1210_ulpi_write(tusb, ULPI_OTG_CTRL, tusb->otg_ctrl); 328 tusb1210_ulpi_write(tusb, TUSB1210_VENDOR_SPECIFIC2, 329 tusb->vendor_specific2); 330 331 mutex_unlock(&tusb->phy->mutex); 332 333 pm_runtime_put(tusb->ulpi->dev.parent); 334 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_CONNECTED, 0); 335 break; 336 case TUSB1210_CHG_DET_CONNECTED: 337 if (!vbus_present) 338 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_DISCONNECTING, 0); 339 break; 340 case TUSB1210_CHG_DET_DISCONNECTING: 341 /* 342 * The phy seems to take approx. 600ms longer then the charger 343 * chip (which is used to get vbus_present) to determine Vbus 344 * session end. Wait 800ms to ensure the phy has detected and 345 * signalled Vbus session end. 346 */ 347 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_DISCONNECTING_DONE, 800); 348 break; 349 case TUSB1210_CHG_DET_DISCONNECTING_DONE: 350 /* 351 * The phy often stops reacting to ulpi_read()/_write requests 352 * after a Vbus-session end. Reset it to work around this. 353 */ 354 tusb1210_reset(tusb); 355 tusb1210_chg_det_set_type(tusb, POWER_SUPPLY_USB_TYPE_UNKNOWN); 356 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_DISCONNECTED, 0); 357 break; 358 case TUSB1210_CHG_DET_DISCONNECTED: 359 if (vbus_present) 360 tusb1210_chg_det_set_state(tusb, TUSB1210_CHG_DET_CONNECTING, 0); 361 break; 362 } 363} 364 365static int tusb1210_psy_notifier(struct notifier_block *nb, 366 unsigned long event, void *ptr) 367{ 368 struct tusb1210 *tusb = container_of(nb, struct tusb1210, psy_nb); 369 struct power_supply *psy = ptr; 370 371 if (psy != tusb->psy && psy->desc->type == POWER_SUPPLY_TYPE_USB) 372 queue_delayed_work(system_long_wq, &tusb->chg_det_work, 0); 373 374 return NOTIFY_OK; 375} 376 377static int tusb1210_psy_get_prop(struct power_supply *psy, 378 enum power_supply_property psp, 379 union power_supply_propval *val) 380{ 381 struct tusb1210 *tusb = power_supply_get_drvdata(psy); 382 383 switch (psp) { 384 case POWER_SUPPLY_PROP_ONLINE: 385 val->intval = tusb1210_get_online(tusb); 386 break; 387 case POWER_SUPPLY_PROP_USB_TYPE: 388 val->intval = tusb->chg_type; 389 break; 390 case POWER_SUPPLY_PROP_CURRENT_MAX: 391 if (tusb->chg_type == POWER_SUPPLY_USB_TYPE_DCP) 392 val->intval = 2000000; 393 else 394 val->intval = 500000; 395 break; 396 default: 397 return -EINVAL; 398 } 399 400 return 0; 401} 402 403static const enum power_supply_usb_type tusb1210_psy_usb_types[] = { 404 POWER_SUPPLY_USB_TYPE_SDP, 405 POWER_SUPPLY_USB_TYPE_DCP, 406 POWER_SUPPLY_USB_TYPE_UNKNOWN, 407}; 408 409static const enum power_supply_property tusb1210_psy_props[] = { 410 POWER_SUPPLY_PROP_ONLINE, 411 POWER_SUPPLY_PROP_USB_TYPE, 412 POWER_SUPPLY_PROP_CURRENT_MAX, 413}; 414 415static const struct power_supply_desc tusb1210_psy_desc = { 416 .name = "tusb1211-charger-detect", 417 .type = POWER_SUPPLY_TYPE_USB, 418 .usb_types = tusb1210_psy_usb_types, 419 .num_usb_types = ARRAY_SIZE(tusb1210_psy_usb_types), 420 .properties = tusb1210_psy_props, 421 .num_properties = ARRAY_SIZE(tusb1210_psy_props), 422 .get_property = tusb1210_psy_get_prop, 423}; 424 425/* Setup charger detection if requested, on errors continue without chg-det */ 426static void tusb1210_probe_charger_detect(struct tusb1210 *tusb) 427{ 428 struct power_supply_config psy_cfg = { .drv_data = tusb }; 429 struct device *dev = &tusb->ulpi->dev; 430 int ret; 431 432 if (!device_property_read_bool(dev->parent, "linux,phy_charger_detect")) 433 return; 434 435 if (tusb->ulpi->id.product != 0x1508) { 436 dev_err(dev, "error charger detection is only supported on the TUSB1211\n"); 437 return; 438 } 439 440 ret = tusb1210_ulpi_read(tusb, ULPI_OTG_CTRL, &tusb->otg_ctrl); 441 if (ret) 442 return; 443 444 tusb->psy = power_supply_register(dev, &tusb1210_psy_desc, &psy_cfg); 445 if (IS_ERR(tusb->psy)) 446 return; 447 448 /* 449 * Delay initial run by 2 seconds to allow the charger driver, 450 * which is used to determine vbus_present, to load. 451 */ 452 tusb->chg_det_state = TUSB1210_CHG_DET_DISCONNECTED; 453 INIT_DELAYED_WORK(&tusb->chg_det_work, tusb1210_chg_det_work); 454 queue_delayed_work(system_long_wq, &tusb->chg_det_work, 2 * HZ); 455 456 tusb->psy_nb.notifier_call = tusb1210_psy_notifier; 457 power_supply_reg_notifier(&tusb->psy_nb); 458} 459 460static void tusb1210_remove_charger_detect(struct tusb1210 *tusb) 461{ 462 463 if (!IS_ERR_OR_NULL(tusb->psy)) { 464 power_supply_unreg_notifier(&tusb->psy_nb); 465 cancel_delayed_work_sync(&tusb->chg_det_work); 466 power_supply_unregister(tusb->psy); 467 } 468 469 if (tusb->charger) 470 power_supply_put(tusb->charger); 471} 472#else 473static void tusb1210_probe_charger_detect(struct tusb1210 *tusb) { } 474static void tusb1210_remove_charger_detect(struct tusb1210 *tusb) { } 475#endif 476 477static const struct phy_ops phy_ops = { 478 .power_on = tusb1210_power_on, 479 .power_off = tusb1210_power_off, 480 .set_mode = tusb1210_set_mode, 481 .owner = THIS_MODULE, 482}; 483 484static int tusb1210_probe(struct ulpi *ulpi) 485{ 486 struct tusb1210 *tusb; 487 u8 val, reg; 488 int ret; 489 490 tusb = devm_kzalloc(&ulpi->dev, sizeof(*tusb), GFP_KERNEL); 491 if (!tusb) 492 return -ENOMEM; 493 494 tusb->ulpi = ulpi; 495 496 tusb->gpio_reset = devm_gpiod_get_optional(&ulpi->dev, "reset", 497 GPIOD_OUT_LOW); 498 if (IS_ERR(tusb->gpio_reset)) 499 return PTR_ERR(tusb->gpio_reset); 500 501 gpiod_set_value_cansleep(tusb->gpio_reset, 1); 502 503 tusb->gpio_cs = devm_gpiod_get_optional(&ulpi->dev, "cs", 504 GPIOD_OUT_LOW); 505 if (IS_ERR(tusb->gpio_cs)) 506 return PTR_ERR(tusb->gpio_cs); 507 508 gpiod_set_value_cansleep(tusb->gpio_cs, 1); 509 510 /* 511 * VENDOR_SPECIFIC2 register in TUSB1210 can be used for configuring eye 512 * diagram optimization and DP/DM swap. 513 */ 514 515 ret = tusb1210_ulpi_read(tusb, TUSB1210_VENDOR_SPECIFIC2, ®); 516 if (ret) 517 return ret; 518 519 /* High speed output drive strength configuration */ 520 if (!device_property_read_u8(&ulpi->dev, "ihstx", &val)) 521 u8p_replace_bits(®, val, (u8)TUSB1210_VENDOR_SPECIFIC2_IHSTX_MASK); 522 523 /* High speed output impedance configuration */ 524 if (!device_property_read_u8(&ulpi->dev, "zhsdrv", &val)) 525 u8p_replace_bits(®, val, (u8)TUSB1210_VENDOR_SPECIFIC2_ZHSDRV_MASK); 526 527 /* DP/DM swap control */ 528 if (!device_property_read_u8(&ulpi->dev, "datapolarity", &val)) 529 u8p_replace_bits(®, val, (u8)TUSB1210_VENDOR_SPECIFIC2_DP_MASK); 530 531 ret = tusb1210_ulpi_write(tusb, TUSB1210_VENDOR_SPECIFIC2, reg); 532 if (ret) 533 return ret; 534 535 tusb->vendor_specific2 = reg; 536 537 tusb1210_probe_charger_detect(tusb); 538 539 tusb->phy = ulpi_phy_create(ulpi, &phy_ops); 540 if (IS_ERR(tusb->phy)) { 541 ret = PTR_ERR(tusb->phy); 542 goto err_remove_charger; 543 } 544 545 phy_set_drvdata(tusb->phy, tusb); 546 ulpi_set_drvdata(ulpi, tusb); 547 return 0; 548 549err_remove_charger: 550 tusb1210_remove_charger_detect(tusb); 551 return ret; 552} 553 554static void tusb1210_remove(struct ulpi *ulpi) 555{ 556 struct tusb1210 *tusb = ulpi_get_drvdata(ulpi); 557 558 ulpi_phy_destroy(ulpi, tusb->phy); 559 tusb1210_remove_charger_detect(tusb); 560} 561 562#define TI_VENDOR_ID 0x0451 563 564static const struct ulpi_device_id tusb1210_ulpi_id[] = { 565 { TI_VENDOR_ID, 0x1507, }, /* TUSB1210 */ 566 { TI_VENDOR_ID, 0x1508, }, /* TUSB1211 */ 567 { }, 568}; 569MODULE_DEVICE_TABLE(ulpi, tusb1210_ulpi_id); 570 571static struct ulpi_driver tusb1210_driver = { 572 .id_table = tusb1210_ulpi_id, 573 .probe = tusb1210_probe, 574 .remove = tusb1210_remove, 575 .driver = { 576 .name = "tusb1210", 577 .owner = THIS_MODULE, 578 }, 579}; 580 581module_ulpi_driver(tusb1210_driver); 582 583MODULE_AUTHOR("Intel Corporation"); 584MODULE_LICENSE("GPL v2"); 585MODULE_DESCRIPTION("TUSB1210 ULPI PHY driver");