phy-tusb1210.c 16 KB

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