repeater-qti-pmic-eusb2.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #include <linux/debugfs.h>
  6. #include <linux/err.h>
  7. #include <linux/kernel.h>
  8. #include <linux/module.h>
  9. #include <linux/of.h>
  10. #include <linux/platform_device.h>
  11. #include <linux/regmap.h>
  12. #include <linux/regulator/consumer.h>
  13. #include <linux/usb/dwc3-msm.h>
  14. #include <linux/usb/repeater.h>
  15. #define EUSB2_3P0_VOL_MIN 3075000 /* uV */
  16. #define EUSB2_3P0_VOL_MAX 3300000 /* uV */
  17. #define EUSB2_3P0_HPM_LOAD 3500 /* uA */
  18. #define EUSB2_1P8_VOL_MIN 1800000 /* uV */
  19. #define EUSB2_1P8_VOL_MAX 1800000 /* uV */
  20. #define EUSB2_1P8_HPM_LOAD 32000 /* uA */
  21. /* Repeater REVID registers */
  22. #define EUSB2_REVISION1 0x00
  23. /* eUSB2 status registers */
  24. #define EUSB2_RPTR_STATUS 0x08
  25. #define RPTR_OK BIT(7)
  26. #define EUSB2_RPTR_INFRA_STATUS 0x09
  27. #define EUSB2_RPTR_DROPOUT_REASON 0x0A
  28. /* eUSB2 control registers */
  29. #define EUSB2_MODE_CTL 0x40
  30. #define HOST_SEL BIT(1)
  31. #define PERIPH_SEL BIT(0)
  32. #define EUSB2_USB_HIZ_CTL 0x41
  33. #define HIZ_EN BIT(7)
  34. #define EUSB2_AUTO_RESUME_EN 0x42
  35. #define AUTO_RESUME_EN BIT(7)
  36. #define EUSB2_EN_CTL1 0x46
  37. #define EUSB2_RPTR_EN BIT(7)
  38. /* eUSB2 tuning parameters registers */
  39. #define EUSB2_TUNE_USB2_CROSSOVER 0x50
  40. #define TUNE_USB2_CROSSOVER_MASK 0x07
  41. #define EUSB2_TUNE_IUSB2 0x51
  42. #define TUNE_IUSB2_MASK 0x0F
  43. #define EUSB2_TUNE_RES_FSDIF 0x52
  44. #define TUNE_RES_FSIDF_MASK 0x07
  45. #define EUSB2_TUNE_HSDISC 0x53
  46. #define TUNE_HSDISC_MASK 0x07
  47. #define EUSB2_TUNE_SQUELCH_U 0x54
  48. #define TUNE_SQELCH_U_MASK 0x07
  49. #define EUSB2_TUNE_USB2_SLEW 0x55
  50. #define TUNE_USB2_SLEW_MASK 0x03
  51. #define EUSB2_TUNE_USB2_EQU 0x56
  52. #define TUNE_USB2_EQU_MASK 0x03
  53. #define EUSB2_TUNE_USB2_PREEM 0x57
  54. #define TUNE_USB2_PREEM_MASK 0x07
  55. #define EUSB2_TUNE_USB2_HS_COMP_CUR 0x58
  56. #define TUNE_USB2_HS_COMP_CURRENT_MASK 0x03
  57. #define EUSB2_TUNE_EUSB_SLEW 0x59
  58. #define TUNE_EUSB_SLEW_MASK 0x03
  59. #define EUSB2_TUNE_EUSB_EQU 0x5A
  60. #define TUNE_EUSB_EQU_MASK 0x03
  61. #define EUSB2_TUNE_EUSB_HS_COMP_CUR 0x5B
  62. #define TUNE_EUSB_HS_COMP_CUR_MASK 0x03
  63. /* Force Enable registers */
  64. #define EUSB2_FORCE_EN_5 0xE8
  65. #define F_CLK_19P2M_EN BIT(6)
  66. #define F_CLK_19P2M_EN_SHIFT 6
  67. #define EUSB2_FORCE_VAL_5 0xED
  68. #define V_CLK_19P2M_EN BIT(6)
  69. #define V_CLK_19P2M_EN_SHIFT 6
  70. struct eusb2_repeater {
  71. struct usb_repeater ur;
  72. struct regmap *regmap;
  73. u16 reg_base;
  74. struct regulator *vdd18;
  75. struct regulator *vdd3;
  76. bool power_enabled;
  77. struct dentry *root;
  78. u8 usb2_crossover;
  79. u8 iusb2;
  80. u8 res_fsdif;
  81. u8 hsdisc;
  82. u8 squelch_u;
  83. u8 usb2_slew;
  84. u8 usb2_equ;
  85. u8 usb2_preem;
  86. u8 hs_comp_current;
  87. u8 eusb_slew;
  88. u8 eusb_equ;
  89. u8 eusb_hs_comp_current;
  90. u32 *param_override_seq;
  91. u32 *host_param_override_seq;
  92. u8 param_override_seq_cnt;
  93. u8 host_param_override_seq_cnt;
  94. };
  95. /* Perform one or more register read */
  96. static int eusb2_repeater_reg_read(struct eusb2_repeater *er,
  97. u8 *read_val, u16 reg_offset, size_t reg_count)
  98. {
  99. int ret;
  100. ret = regmap_bulk_read(er->regmap, er->reg_base + reg_offset,
  101. read_val, reg_count);
  102. if (ret)
  103. dev_err(er->ur.dev, "read failed: addr=0x%04x, ret=%d\n",
  104. er->reg_base + reg_offset, ret);
  105. return ret;
  106. }
  107. /* Perform multiple registers write using given block of data */
  108. static int eusb2_repeater_bulk_reg_write(struct eusb2_repeater *er,
  109. u16 reg_offset, const void *write_val, size_t reg_count)
  110. {
  111. int ret;
  112. ret = regmap_bulk_write(er->regmap, er->reg_base + reg_offset,
  113. write_val, reg_count);
  114. if (ret)
  115. dev_err(er->ur.dev, "bulk write failed: addr=0x%04x, ret=%d\n",
  116. er->reg_base + reg_offset, ret);
  117. return ret;
  118. }
  119. /* Perform specific register write using given byte value */
  120. static inline int eusb2_repeater_reg_write(struct eusb2_repeater *er,
  121. u16 reg_offset, u8 write_val)
  122. {
  123. return eusb2_repeater_bulk_reg_write(er, reg_offset, &write_val, 1);
  124. }
  125. /* Update specified register using given bit mask and value */
  126. static int eusb2_repeater_masked_write(struct eusb2_repeater *er,
  127. u16 reg_offset, u8 mask, u8 write_val)
  128. {
  129. int ret;
  130. ret = regmap_update_bits(er->regmap, er->reg_base + reg_offset,
  131. mask, write_val);
  132. if (ret)
  133. dev_err(er->ur.dev, "write failed: addr=0x%04x, ret=%d\n",
  134. er->reg_base + reg_offset, ret);
  135. return ret;
  136. }
  137. static void eusb2_repeater_update_seq(struct eusb2_repeater *er,
  138. u32 *seq, u8 cnt)
  139. {
  140. int i;
  141. dev_dbg(er->ur.dev, "param override seq count:%d\n", cnt);
  142. for (i = 0; i < cnt; i = i+2) {
  143. dev_dbg(er->ur.dev, "write 0x%02x to 0x%02x\n",
  144. seq[i], seq[i+1]);
  145. eusb2_repeater_reg_write(er, seq[i+1], seq[i]);
  146. }
  147. }
  148. static int eusb2_repeater_get_version(struct usb_repeater *ur)
  149. {
  150. struct eusb2_repeater *er =
  151. container_of(ur, struct eusb2_repeater, ur);
  152. u8 reg;
  153. eusb2_repeater_reg_read(er, &reg, EUSB2_REVISION1, 1);
  154. return reg;
  155. }
  156. static void eusb2_repeater_create_debugfs(struct eusb2_repeater *er)
  157. {
  158. er->usb2_crossover = U8_MAX;
  159. er->iusb2 = U8_MAX;
  160. er->res_fsdif = U8_MAX;
  161. er->hsdisc = U8_MAX;
  162. er->squelch_u = U8_MAX;
  163. er->usb2_slew = U8_MAX;
  164. er->usb2_equ = U8_MAX;
  165. er->usb2_preem = U8_MAX;
  166. er->hs_comp_current = U8_MAX;
  167. er->eusb_slew = U8_MAX;
  168. er->eusb_equ = U8_MAX;
  169. er->eusb_hs_comp_current = U8_MAX;
  170. er->root = debugfs_create_dir(dev_name(er->ur.dev), NULL);
  171. debugfs_create_x8("usb2_crossover", 0644, er->root,
  172. &er->usb2_crossover);
  173. debugfs_create_x8("iusb2", 0644, er->root, &er->iusb2);
  174. debugfs_create_x8("res_fsdif", 0644, er->root, &er->res_fsdif);
  175. debugfs_create_x8("hsdisc", 0644, er->root, &er->hsdisc);
  176. debugfs_create_x8("squelch_u", 0644, er->root, &er->squelch_u);
  177. debugfs_create_x8("usb2_slew", 0644, er->root, &er->usb2_slew);
  178. debugfs_create_x8("usb2_equ", 0644, er->root, &er->usb2_equ);
  179. debugfs_create_x8("usb2_preem", 0644, er->root, &er->usb2_preem);
  180. debugfs_create_x8("hs_comp_current", 0644, er->root,
  181. &er->hs_comp_current);
  182. debugfs_create_x8("eusb_slew", 0644, er->root, &er->eusb_slew);
  183. debugfs_create_x8("eusb_equ", 0644, er->root, &er->eusb_equ);
  184. debugfs_create_x8("eusb_hs_comp_current", 0644, er->root,
  185. &er->eusb_hs_comp_current);
  186. }
  187. static int eusb2_repeater_power(struct eusb2_repeater *er, bool on)
  188. {
  189. int ret = 0;
  190. dev_dbg(er->ur.dev, "%s turn %s regulators. power_enabled:%d\n",
  191. __func__, on ? "on" : "off", er->power_enabled);
  192. if (er->power_enabled == on) {
  193. dev_dbg(er->ur.dev, "regulators' regulators are already ON.\n");
  194. return 0;
  195. }
  196. if (!on)
  197. goto disable_vdd3;
  198. ret = regulator_set_load(er->vdd18, EUSB2_1P8_HPM_LOAD);
  199. if (ret < 0) {
  200. dev_err(er->ur.dev, "Unable to set HPM of vdd18:%d\n", ret);
  201. goto err_vdd18;
  202. }
  203. ret = regulator_set_voltage(er->vdd18, EUSB2_1P8_VOL_MIN,
  204. EUSB2_1P8_VOL_MAX);
  205. if (ret) {
  206. dev_err(er->ur.dev,
  207. "Unable to set voltage for vdd18:%d\n", ret);
  208. goto put_vdd18_lpm;
  209. }
  210. ret = regulator_enable(er->vdd18);
  211. if (ret) {
  212. dev_err(er->ur.dev, "Unable to enable vdd18:%d\n", ret);
  213. goto unset_vdd18;
  214. }
  215. ret = regulator_set_load(er->vdd3, EUSB2_3P0_HPM_LOAD);
  216. if (ret < 0) {
  217. dev_err(er->ur.dev, "Unable to set HPM of vdd3:%d\n", ret);
  218. goto disable_vdd18;
  219. }
  220. ret = regulator_set_voltage(er->vdd3, EUSB2_3P0_VOL_MIN,
  221. EUSB2_3P0_VOL_MAX);
  222. if (ret) {
  223. dev_err(er->ur.dev,
  224. "Unable to set voltage for vdd3:%d\n", ret);
  225. goto put_vdd3_lpm;
  226. }
  227. ret = regulator_enable(er->vdd3);
  228. if (ret) {
  229. dev_err(er->ur.dev, "Unable to enable vdd3:%d\n", ret);
  230. goto unset_vdd3;
  231. }
  232. er->power_enabled = true;
  233. dev_dbg(er->ur.dev, "eUSB2 repeater egulators are turned ON.\n");
  234. return ret;
  235. disable_vdd3:
  236. ret = regulator_disable(er->vdd3);
  237. if (ret)
  238. dev_err(er->ur.dev, "Unable to disable vdd3:%d\n", ret);
  239. unset_vdd3:
  240. ret = regulator_set_voltage(er->vdd3, 0, EUSB2_3P0_VOL_MAX);
  241. if (ret)
  242. dev_err(er->ur.dev,
  243. "Unable to set (0) voltage for vdd3:%d\n", ret);
  244. put_vdd3_lpm:
  245. ret = regulator_set_load(er->vdd3, 0);
  246. if (ret < 0)
  247. dev_err(er->ur.dev, "Unable to set (0) HPM of vdd3\n");
  248. disable_vdd18:
  249. ret = regulator_disable(er->vdd18);
  250. if (ret)
  251. dev_err(er->ur.dev, "Unable to disable vdd18:%d\n", ret);
  252. unset_vdd18:
  253. ret = regulator_set_voltage(er->vdd18, 0, EUSB2_1P8_VOL_MAX);
  254. if (ret)
  255. dev_err(er->ur.dev,
  256. "Unable to set (0) voltage for vdd18:%d\n", ret);
  257. put_vdd18_lpm:
  258. ret = regulator_set_load(er->vdd18, 0);
  259. if (ret < 0)
  260. dev_err(er->ur.dev, "Unable to set LPM of vdd18\n");
  261. err_vdd18:
  262. /* case handling when regulator turning on failed */
  263. if (!er->power_enabled)
  264. return -EINVAL;
  265. er->power_enabled = false;
  266. dev_dbg(er->ur.dev, "eUSB2 repeater's regulators are turned OFF.\n");
  267. return ret;
  268. }
  269. #define INIT_MAX_CNT 5
  270. static int eusb2_repeater_init(struct usb_repeater *ur)
  271. {
  272. u8 status;
  273. struct eusb2_repeater *er =
  274. container_of(ur, struct eusb2_repeater, ur);
  275. unsigned int rptr_init_cnt = INIT_MAX_CNT;
  276. /* override init sequence using devicetree based values */
  277. eusb2_repeater_update_seq(er, er->param_override_seq,
  278. er->param_override_seq_cnt);
  279. if (ur->flags & PHY_HOST_MODE)
  280. eusb2_repeater_update_seq(er, er->host_param_override_seq,
  281. er->host_param_override_seq_cnt);
  282. /* override tune params using debugfs based values */
  283. if (er->usb2_crossover <= 0x7)
  284. eusb2_repeater_masked_write(er, EUSB2_TUNE_USB2_CROSSOVER,
  285. TUNE_USB2_CROSSOVER_MASK, er->usb2_crossover);
  286. if (er->iusb2 <= 0xf)
  287. eusb2_repeater_masked_write(er, EUSB2_TUNE_IUSB2,
  288. TUNE_IUSB2_MASK, er->iusb2);
  289. if (er->res_fsdif <= 0x7)
  290. eusb2_repeater_masked_write(er, EUSB2_TUNE_RES_FSDIF,
  291. TUNE_RES_FSIDF_MASK, er->res_fsdif);
  292. if (er->hsdisc <= 0x7)
  293. eusb2_repeater_masked_write(er, EUSB2_TUNE_HSDISC,
  294. TUNE_HSDISC_MASK, er->hsdisc);
  295. if (er->squelch_u <= 0x7)
  296. eusb2_repeater_masked_write(er, EUSB2_TUNE_SQUELCH_U,
  297. TUNE_SQELCH_U_MASK, er->squelch_u);
  298. if (er->usb2_slew <= 0x3)
  299. eusb2_repeater_masked_write(er, EUSB2_TUNE_USB2_SLEW,
  300. TUNE_USB2_SLEW_MASK, er->usb2_slew);
  301. if (er->usb2_equ <= 0x3)
  302. eusb2_repeater_masked_write(er, EUSB2_TUNE_USB2_EQU,
  303. TUNE_USB2_EQU_MASK, er->usb2_equ);
  304. if (er->usb2_preem <= 0x7)
  305. eusb2_repeater_masked_write(er, EUSB2_TUNE_USB2_PREEM,
  306. TUNE_USB2_PREEM_MASK, er->usb2_preem);
  307. if (er->hs_comp_current <= 0x3)
  308. eusb2_repeater_masked_write(er, EUSB2_TUNE_USB2_HS_COMP_CUR,
  309. TUNE_USB2_HS_COMP_CURRENT_MASK, er->hs_comp_current);
  310. if (er->eusb_slew <= 0x3)
  311. eusb2_repeater_masked_write(er, EUSB2_TUNE_EUSB_SLEW,
  312. TUNE_EUSB_SLEW_MASK, er->eusb_slew);
  313. if (er->eusb_equ <= 0x3)
  314. eusb2_repeater_masked_write(er, EUSB2_TUNE_EUSB_EQU,
  315. TUNE_EUSB_EQU_MASK, er->eusb_equ);
  316. if (er->eusb_hs_comp_current <= 0x3)
  317. eusb2_repeater_masked_write(er, EUSB2_TUNE_EUSB_HS_COMP_CUR,
  318. TUNE_EUSB_HS_COMP_CUR_MASK, er->eusb_hs_comp_current);
  319. /*
  320. * CM.Lx is prohibited when repeater is already into Lx state as
  321. * per eUSB 1.2 Spec. Below implement software workaround until
  322. * PHY and controller is fixing seen observation.
  323. */
  324. if (ur->flags & PHY_HOST_MODE) {
  325. eusb2_repeater_masked_write(er, EUSB2_FORCE_EN_5,
  326. F_CLK_19P2M_EN, (1 << F_CLK_19P2M_EN_SHIFT));
  327. eusb2_repeater_masked_write(er, EUSB2_FORCE_VAL_5,
  328. V_CLK_19P2M_EN, (1 << V_CLK_19P2M_EN_SHIFT));
  329. } else {
  330. /*
  331. * In device mode clear host mode related workaround as there
  332. * is no repeater reset available, and enable/disable of
  333. * repeater doesn't clear previous value due to shared
  334. * regulators (say host <-> device mode switch).
  335. */
  336. eusb2_repeater_masked_write(er, EUSB2_FORCE_EN_5,
  337. F_CLK_19P2M_EN, (0 << F_CLK_19P2M_EN_SHIFT));
  338. eusb2_repeater_masked_write(er, EUSB2_FORCE_VAL_5,
  339. V_CLK_19P2M_EN, (0 << V_CLK_19P2M_EN_SHIFT));
  340. }
  341. /* Wait for RPTR_STATUS for OK */
  342. do {
  343. eusb2_repeater_reg_read(er, &status, EUSB2_RPTR_STATUS, 1);
  344. if (status & RPTR_OK)
  345. break;
  346. usleep_range(10, 20);
  347. } while (--rptr_init_cnt);
  348. dev_info(er->ur.dev, "eUSB2 repeater status:%s\n",
  349. (status & RPTR_OK) ? "OK" : "NOT OK");
  350. return 0;
  351. }
  352. static int eusb2_repeater_reset(struct usb_repeater *ur,
  353. bool bring_out_of_reset)
  354. {
  355. struct eusb2_repeater *er =
  356. container_of(ur, struct eusb2_repeater, ur);
  357. dev_dbg(ur->dev, "eUSB2 repeater %s\n",
  358. bring_out_of_reset ? "out of reset" : "hold into reset");
  359. eusb2_repeater_masked_write(er, EUSB2_EN_CTL1, EUSB2_RPTR_EN,
  360. bring_out_of_reset ? EUSB2_RPTR_EN : 0x0);
  361. return 0;
  362. }
  363. static int eusb2_repeater_powerup(struct usb_repeater *ur)
  364. {
  365. struct eusb2_repeater *er =
  366. container_of(ur, struct eusb2_repeater, ur);
  367. return eusb2_repeater_power(er, true);
  368. }
  369. static int eusb2_repeater_powerdown(struct usb_repeater *ur)
  370. {
  371. struct eusb2_repeater *er =
  372. container_of(ur, struct eusb2_repeater, ur);
  373. return eusb2_repeater_power(er, false);
  374. }
  375. static int eusb2_repeater_read_overrides(struct device *dev, const char *prop,
  376. u32 **seq, u8 *seq_cnt)
  377. {
  378. int num_elem, ret;
  379. num_elem = of_property_count_elems_of_size(dev->of_node, prop, sizeof(**seq));
  380. if (num_elem > 0) {
  381. if (num_elem % 2) {
  382. dev_err(dev, "invalid len for %s\n", prop);
  383. return -EINVAL;
  384. }
  385. *seq_cnt = num_elem;
  386. *seq = devm_kcalloc(dev, num_elem, sizeof(**seq), GFP_KERNEL);
  387. if (!*seq)
  388. return -ENOMEM;
  389. ret = of_property_read_u32_array(dev->of_node, prop, *seq, num_elem);
  390. if (ret) {
  391. dev_err(dev, "%s read failed %d\n", prop, ret);
  392. return ret;
  393. }
  394. }
  395. return 0;
  396. }
  397. static int eusb2_repeater_probe(struct platform_device *pdev)
  398. {
  399. struct eusb2_repeater *er;
  400. struct device *dev = &pdev->dev;
  401. int ret = 0, base;
  402. er = devm_kzalloc(dev, sizeof(*er), GFP_KERNEL);
  403. if (!er) {
  404. ret = -ENOMEM;
  405. goto err_probe;
  406. }
  407. er->regmap = dev_get_regmap(pdev->dev.parent, NULL);
  408. if (!er->regmap) {
  409. dev_err(&pdev->dev, "failed to get parent's regmap\n");
  410. ret = -EINVAL;
  411. goto err_probe;
  412. }
  413. ret = of_property_read_u32(pdev->dev.of_node, "reg", &base);
  414. if (ret < 0) {
  415. dev_err(&pdev->dev, "failed to get reg base address:%d\n", ret);
  416. goto err_probe;
  417. }
  418. er->reg_base = base;
  419. er->vdd3 = devm_regulator_get(dev, "vdd3");
  420. if (IS_ERR(er->vdd3)) {
  421. dev_err(dev, "unable to get vdd3 supply\n");
  422. ret = PTR_ERR(er->vdd3);
  423. goto err_probe;
  424. }
  425. er->vdd18 = devm_regulator_get(dev, "vdd18");
  426. if (IS_ERR(er->vdd18)) {
  427. dev_err(dev, "unable to get vdd18 supply\n");
  428. ret = PTR_ERR(er->vdd18);
  429. goto err_probe;
  430. }
  431. ret = eusb2_repeater_read_overrides(dev, "qcom,param-override-seq",
  432. &er->param_override_seq, &er->param_override_seq_cnt);
  433. if (ret < 0)
  434. goto err_probe;
  435. ret = eusb2_repeater_read_overrides(dev, "qcom,host-param-override-seq",
  436. &er->host_param_override_seq, &er->host_param_override_seq_cnt);
  437. if (ret < 0)
  438. goto err_probe;
  439. er->ur.dev = dev;
  440. platform_set_drvdata(pdev, er);
  441. er->ur.init = eusb2_repeater_init;
  442. er->ur.reset = eusb2_repeater_reset;
  443. er->ur.powerup = eusb2_repeater_powerup;
  444. er->ur.powerdown = eusb2_repeater_powerdown;
  445. er->ur.get_version = eusb2_repeater_get_version;
  446. ret = usb_add_repeater_dev(&er->ur);
  447. if (ret)
  448. goto err_probe;
  449. eusb2_repeater_create_debugfs(er);
  450. return 0;
  451. err_probe:
  452. return ret;
  453. }
  454. static int eusb2_repeater_remove(struct platform_device *pdev)
  455. {
  456. struct eusb2_repeater *er = platform_get_drvdata(pdev);
  457. if (!er)
  458. return 0;
  459. debugfs_remove_recursive(er->root);
  460. usb_remove_repeater_dev(&er->ur);
  461. eusb2_repeater_power(er, false);
  462. return 0;
  463. }
  464. static const struct of_device_id eusb2_repeater_id_table[] = {
  465. {
  466. .compatible = "qcom,pmic-eusb2-repeater",
  467. },
  468. { },
  469. };
  470. MODULE_DEVICE_TABLE(of, eusb2_repeater_id_table);
  471. static struct platform_driver eusb2_repeater_driver = {
  472. .probe = eusb2_repeater_probe,
  473. .remove = eusb2_repeater_remove,
  474. .driver = {
  475. .name = "eusb2-repeater",
  476. .of_match_table = of_match_ptr(eusb2_repeater_id_table),
  477. },
  478. };
  479. module_platform_driver(eusb2_repeater_driver);
  480. MODULE_DESCRIPTION("QTI PMIC eUSB2 repeater driver");
  481. MODULE_LICENSE("GPL");