phy-msm-snps-eusb2.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2021-2023, Qualcomm Innovation Center, Inc. All rights reserved.
  4. * Copyright (c) 2023-2024 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #define pr_fmt(fmt) "eusb2_phy: %s: " fmt, __func__
  7. #include <linux/clk.h>
  8. #include <linux/debugfs.h>
  9. #include <linux/delay.h>
  10. #include <linux/err.h>
  11. #include <linux/io.h>
  12. #include <linux/iopoll.h>
  13. #include <linux/kernel.h>
  14. #include <linux/module.h>
  15. #include <linux/of.h>
  16. #include <linux/platform_device.h>
  17. #include <linux/power_supply.h>
  18. #include <linux/qcom_scm.h>
  19. #include <linux/reset.h>
  20. #include <linux/slab.h>
  21. #include <linux/types.h>
  22. #include <linux/regulator/consumer.h>
  23. #include <linux/usb/dwc3-msm.h>
  24. #include <linux/usb/phy.h>
  25. #include <linux/usb/repeater.h>
  26. #if IS_ENABLED(CONFIG_USB_CONFIGFS_F_SS_MON_GADGET)
  27. #include <linux/usb/f_ss_mon_gadget.h>
  28. #endif
  29. #define USB_PHY_UTMI_CTRL0 (0x3c)
  30. #define OPMODE_MASK (0x3 << 3)
  31. #define OPMODE_NONDRIVING (0x1 << 3)
  32. #define SLEEPM BIT(0)
  33. #define USB_PHY_UTMI_CTRL5 (0x50)
  34. #define POR BIT(1)
  35. #define USB_PHY_HS_PHY_CTRL_COMMON0 (0x54)
  36. #define PHY_ENABLE BIT(0)
  37. #define SIDDQ_SEL BIT(1)
  38. #define SIDDQ BIT(2)
  39. #define RETENABLEN BIT(3)
  40. #define FSEL (0x7 << 4)
  41. #define FSEL_19_2_MHZ_VAL (0x0 << 4)
  42. #define FSEL_38_4_MHZ_VAL (0x4 << 4)
  43. #define USB_PHY_CFG_CTRL_1 (0x58)
  44. #define PHY_CFG_PLL_CPBIAS_CNTRL (0xfe)
  45. #define PHY_CFG_PLL_CPBIAS_CNTRL_SHIFT (0x1)
  46. #define USB_PHY_CFG_CTRL_2 (0x5c)
  47. #define PHY_CFG_PLL_FB_DIV_7_0 (0xff)
  48. #define DIV_7_0_19_2_MHZ_VAL (0x90)
  49. #define DIV_7_0_38_4_MHZ_VAL (0xc8)
  50. #define USB_PHY_CFG_CTRL_3 (0x60)
  51. #define PHY_CFG_PLL_FB_DIV_11_8 (0xf)
  52. #define DIV_11_8_19_2_MHZ_VAL (0x1)
  53. #define DIV_11_8_38_4_MHZ_VAL (0x0)
  54. #define PHY_CFG_PLL_REF_DIV (0xf << 4)
  55. #define PLL_REF_DIV_VAL (0x0)
  56. #define USB_PHY_HS_PHY_CTRL2 (0x64)
  57. #define VBUSVLDEXT0 BIT(0)
  58. #define USB2_SUSPEND_N BIT(2)
  59. #define USB2_SUSPEND_N_SEL BIT(3)
  60. #define VBUS_DET_EXT_SEL BIT(4)
  61. #define USB_PHY_CFG_CTRL_4 (0x68)
  62. #define PHY_CFG_PLL_GMP_CNTRL (0x3)
  63. #define PHY_CFG_PLL_GMP_CNTRL_SHIFT (0x0)
  64. #define PHY_CFG_PLL_INT_CNTRL (0xfc)
  65. #define PHY_CFG_PLL_INT_CNTRL_SHIFT (0x2)
  66. #define USB_PHY_CFG_CTRL_5 (0x6c)
  67. #define PHY_CFG_PLL_PROP_CNTRL (0x1f)
  68. #define PHY_CFG_PLL_PROP_CNTRL_SHIFT (0x0)
  69. #define PHY_CFG_PLL_VREF_TUNE (0x3 << 6)
  70. #define PHY_CFG_PLL_VREF_TUNE_SHIFT (6)
  71. #define USB_PHY_CFG_CTRL_6 (0x70)
  72. #define PHY_CFG_PLL_VCO_CNTRL (0x7)
  73. #define PHY_CFG_PLL_VCO_CNTRL_SHIFT (0x0)
  74. #define USB_PHY_CFG_CTRL_7 (0x74)
  75. #define USB_PHY_CFG_CTRL_8 (0x78)
  76. #define PHY_CFG_TX_FSLS_VREF_TUNE (0x3)
  77. #define PHY_CFG_TX_FSLS_VREG_BYPASS BIT(2)
  78. #define PHY_CFG_TX_HS_VREF_TUNE (0x7 << 3)
  79. #define PHY_CFG_TX_HS_VREF_TUNE_SHIFT (0x3)
  80. #define PHY_CFG_TX_HS_XV_TUNE (0x3 << 6)
  81. #define PHY_CFG_TX_HS_XV_TUNE_SHIFT (6)
  82. #define USB_PHY_CFG_CTRL_9 (0x7c)
  83. #define PHY_CFG_TX_PREEMP_TUNE (0x7)
  84. #define PHY_CFG_TX_PREEMP_TUNE_SHIFT (0x0)
  85. #define PHY_CFG_TX_RES_TUNE (0x3 << 3)
  86. #define PHY_CFG_TX_RES_TUNE_SHIFT (0x3)
  87. #define PHY_CFG_TX_RISE_TUNE (0x3 << 5)
  88. #define PHY_CFG_TX_RISE_TUNE_SHIFT (0x5)
  89. #define PHY_CFG_RCAL_BYPASS BIT(7)
  90. #define PHY_CFG_RCAL_BYPASS_SHIFT (0x7)
  91. #define USB_PHY_CFG_CTRL_10 (0x80)
  92. #define USB_PHY_CFG0 (0x94)
  93. #define DATAPATH_CTRL_OVERRIDE_EN BIT(0)
  94. #define CMN_CTRL_OVERRIDE_EN BIT(1)
  95. #define UTMI_PHY_CMN_CTRL0 (0x98)
  96. #define TESTBURNIN BIT(6)
  97. #define USB_PHY_FSEL_SEL (0xb8)
  98. #define FSEL_SEL BIT(0)
  99. #define USB_PHY_APB_ACCESS_CMD (0x130)
  100. #define RW_ACCESS BIT(0)
  101. #define APB_START_CMD BIT(1)
  102. #define APB_LOGIC_RESET BIT(2)
  103. #define USB_PHY_APB_ACCESS_STATUS (0x134)
  104. #define ACCESS_DONE BIT(0)
  105. #define TIMED_OUT BIT(1)
  106. #define ACCESS_ERROR BIT(2)
  107. #define ACCESS_IN_PROGRESS BIT(3)
  108. #define USB_PHY_APB_ADDRESS (0x138)
  109. #define APB_REG_ADDR (0xff)
  110. #define USB_PHY_APB_WRDATA_LSB (0x13c)
  111. #define APB_REG_WRDATA_7_0 (0xf)
  112. #define USB_PHY_APB_WRDATA_MSB (0x140)
  113. #define APB_REG_WRDATA_15_8 (0xf0)
  114. #define USB_PHY_APB_RDDATA_LSB (0x144)
  115. #define APB_REG_RDDATA_7_0 (0xf)
  116. #define USB_PHY_APB_RDDATA_MSB (0x148)
  117. #define APB_REG_RDDATA_15_8 (0xf0)
  118. /* EUD CSR field */
  119. #define EUD_EN2 BIT(0)
  120. /* VIOCTL_EUD_DETECT register based EUD_DETECT field */
  121. #define EUD_DETECT BIT(0)
  122. #define USB_HSPHY_1P2_VOL_MIN 1200000 /* uV */
  123. #define USB_HSPHY_1P2_VOL_MAX 1200000 /* uV */
  124. #define USB_HSPHY_1P2_HPM_LOAD 5905 /* uA */
  125. #define USB_HSPHY_VDD_HPM_LOAD 7757 /* uA */
  126. #undef dev_dbg
  127. #define dev_dbg dev_err
  128. struct msm_eusb2_phy {
  129. struct usb_phy phy;
  130. void __iomem *base;
  131. /* EUD related parameters */
  132. phys_addr_t eud_reg;
  133. void __iomem *eud_enable_reg;
  134. void __iomem *eud_detect_reg;
  135. bool re_enable_eud;
  136. struct clk *ref_clk_src;
  137. struct clk *ref_clk;
  138. struct reset_control *phy_reset;
  139. struct regulator *vdd;
  140. struct regulator *vdda12;
  141. int vdd_levels[3]; /* none, low, high */
  142. bool clocks_enabled;
  143. bool power_enabled;
  144. bool suspended;
  145. bool cable_connected;
  146. struct power_supply *usb_psy;
  147. unsigned int vbus_draw;
  148. struct work_struct vbus_draw_work;
  149. int *param_override_seq;
  150. int param_override_seq_cnt;
  151. /* debugfs entries */
  152. struct dentry *root;
  153. u8 tx_pre_emphasis;
  154. u8 tx_rise_fall_time;
  155. u8 tx_src_impedence;
  156. u8 tx_dc_vref;
  157. u8 tx_xv;
  158. struct usb_repeater *ur;
  159. };
  160. static inline bool is_eud_debug_mode_active(struct msm_eusb2_phy *phy)
  161. {
  162. if (phy->eud_enable_reg &&
  163. (readl_relaxed(phy->eud_enable_reg) & EUD_EN2))
  164. return true;
  165. return false;
  166. }
  167. static void msm_eusb2_phy_clocks(struct msm_eusb2_phy *phy, bool on)
  168. {
  169. dev_dbg(phy->phy.dev, "clocks_enabled:%d on:%d\n",
  170. phy->clocks_enabled, on);
  171. if (phy->clocks_enabled == on)
  172. return;
  173. if (on) {
  174. clk_prepare_enable(phy->ref_clk_src);
  175. clk_prepare_enable(phy->ref_clk);
  176. } else {
  177. clk_disable_unprepare(phy->ref_clk);
  178. clk_disable_unprepare(phy->ref_clk_src);
  179. }
  180. phy->clocks_enabled = on;
  181. }
  182. static void msm_eusb2_phy_update_eud_detect(struct msm_eusb2_phy *phy, bool set)
  183. {
  184. if (set)
  185. writel_relaxed(EUD_DETECT, phy->eud_detect_reg);
  186. else
  187. writel_relaxed(readl_relaxed(phy->eud_detect_reg) & ~EUD_DETECT,
  188. phy->eud_detect_reg);
  189. }
  190. static int msm_eusb2_phy_power(struct msm_eusb2_phy *phy, bool on)
  191. {
  192. int ret = 0;
  193. dev_dbg(phy->phy.dev, "turn %s regulators. power_enabled:%d\n",
  194. on ? "on" : "off", phy->power_enabled);
  195. if (phy->power_enabled == on)
  196. return 0;
  197. if (!on)
  198. goto clear_eud_det;
  199. ret = regulator_set_load(phy->vdd, USB_HSPHY_VDD_HPM_LOAD);
  200. if (ret < 0) {
  201. dev_err(phy->phy.dev, "Unable to set HPM of vdd:%d\n", ret);
  202. goto err_vdd;
  203. }
  204. ret = regulator_set_voltage(phy->vdd, phy->vdd_levels[1],
  205. phy->vdd_levels[2]);
  206. if (ret) {
  207. dev_err(phy->phy.dev, "Unable to set voltage for hsusb vdd\n");
  208. goto put_vdd_lpm;
  209. }
  210. ret = regulator_enable(phy->vdd);
  211. if (ret) {
  212. dev_err(phy->phy.dev, "Unable to enable VDD\n");
  213. goto unconfig_vdd;
  214. }
  215. ret = regulator_set_load(phy->vdda12, USB_HSPHY_1P2_HPM_LOAD);
  216. if (ret < 0) {
  217. dev_err(phy->phy.dev, "Unable to set HPM of vdda12:%d\n", ret);
  218. goto disable_vdd;
  219. }
  220. ret = regulator_set_voltage(phy->vdda12, USB_HSPHY_1P2_VOL_MIN,
  221. USB_HSPHY_1P2_VOL_MAX);
  222. if (ret) {
  223. dev_err(phy->phy.dev,
  224. "Unable to set voltage for vdda12:%d\n", ret);
  225. goto put_vdda12_lpm;
  226. }
  227. ret = regulator_enable(phy->vdda12);
  228. if (ret) {
  229. dev_err(phy->phy.dev, "Unable to enable vdda12:%d\n", ret);
  230. goto unset_vdda12;
  231. }
  232. /* Make sure all the writes are processed before setting EUD_DETECT */
  233. mb();
  234. /* Set eud_detect_reg after powering on eUSB PHY rails to bring EUD out of reset */
  235. msm_eusb2_phy_update_eud_detect(phy, true);
  236. phy->power_enabled = true;
  237. pr_debug("eUSB2_PHY's regulators are turned ON.\n");
  238. return ret;
  239. clear_eud_det:
  240. /* Clear eud_detect_reg to put EUD in reset */
  241. msm_eusb2_phy_update_eud_detect(phy, false);
  242. /* Make sure clearing EUD_DETECT is completed before turning off the regulators */
  243. mb();
  244. ret = regulator_disable(phy->vdda12);
  245. if (ret)
  246. dev_err(phy->phy.dev, "Unable to disable vdda12:%d\n", ret);
  247. unset_vdda12:
  248. ret = regulator_set_voltage(phy->vdda12, 0, USB_HSPHY_1P2_VOL_MAX);
  249. if (ret)
  250. dev_err(phy->phy.dev,
  251. "Unable to set (0) voltage for vdda12:%d\n", ret);
  252. put_vdda12_lpm:
  253. ret = regulator_set_load(phy->vdda12, 0);
  254. if (ret < 0)
  255. dev_err(phy->phy.dev, "Unable to set LPM of vdda12\n");
  256. disable_vdd:
  257. ret = regulator_disable(phy->vdd);
  258. if (ret)
  259. dev_err(phy->phy.dev, "Unable to disable vdd:%d\n", ret);
  260. unconfig_vdd:
  261. ret = regulator_set_voltage(phy->vdd, phy->vdd_levels[0],
  262. phy->vdd_levels[2]);
  263. if (ret)
  264. dev_err(phy->phy.dev, "unable to set voltage for hsusb vdd\n");
  265. put_vdd_lpm:
  266. ret = regulator_set_load(phy->vdd, 0);
  267. if (ret < 0)
  268. dev_err(phy->phy.dev, "Unable to set LPM of vdd\n");
  269. /* case handling when regulator turning on failed */
  270. if (!phy->power_enabled)
  271. return -EINVAL;
  272. err_vdd:
  273. phy->power_enabled = false;
  274. dev_dbg(phy->phy.dev, "eusb2_PHY's regulators are turned OFF.\n");
  275. return ret;
  276. }
  277. static void msm_eusb2_write_readback(void __iomem *base, u32 offset,
  278. const u32 mask, u32 val)
  279. {
  280. u32 write_val, tmp = readl_relaxed(base + offset);
  281. tmp &= ~mask;
  282. write_val = tmp | val;
  283. writel_relaxed(write_val, base + offset);
  284. /* Read back to see if val was written */
  285. tmp = readl_relaxed(base + offset);
  286. tmp &= mask;
  287. if (tmp != val)
  288. pr_err("write: %x to offset: %x FAILED\n", val, offset);
  289. }
  290. static void eusb2_phy_reset_seq(struct msm_eusb2_phy *phy)
  291. {
  292. writel(APB_LOGIC_RESET, phy->base + USB_PHY_APB_ACCESS_CMD);
  293. writel(0x00, phy->base + USB_PHY_APB_ACCESS_CMD);
  294. }
  295. #define APB_ACCESS_TIMEOUT 10 /* in us */
  296. #define APB_ACCESS_POLL_DELAY 1 /* in us */
  297. #define APB_READ_ACCESS_DONE 1
  298. static int eusb2_phy_apb_cmd_wait(struct msm_eusb2_phy *phy)
  299. {
  300. int ret;
  301. u8 val; /* to read cmd status */
  302. /* poll for cmd completion */
  303. ret = readl_poll_timeout(phy->base + USB_PHY_APB_ACCESS_STATUS,
  304. val, APB_READ_ACCESS_DONE,
  305. APB_ACCESS_POLL_DELAY, APB_ACCESS_TIMEOUT);
  306. if (ret < 0) {
  307. dev_err(phy->phy.dev, "APB_ACCESS_STAUS(%x) timeout\n", val);
  308. eusb2_phy_reset_seq(phy);
  309. return val;
  310. }
  311. return 0;
  312. }
  313. static void eusb2_phy_apb_reg_write(struct msm_eusb2_phy *phy,
  314. u8 reg_index, u16 val)
  315. {
  316. int ret;
  317. /* program register index to update requested register */
  318. writel(reg_index, phy->base + USB_PHY_APB_ADDRESS);
  319. /* value to be program */
  320. writel(((val >> 8) & 0xF), phy->base + USB_PHY_APB_WRDATA_MSB);
  321. writel((val & 0xF), phy->base + USB_PHY_APB_WRDATA_LSB);
  322. /* send cmd to update reg_index with above programmed value */
  323. writel(RW_ACCESS | APB_START_CMD, phy->base + USB_PHY_APB_ACCESS_CMD);
  324. /* poll for cmd completion */
  325. ret = eusb2_phy_apb_cmd_wait(phy);
  326. if (ret) {
  327. dev_err(phy->phy.dev, "APB reg(%x) write failed\n", reg_index);
  328. return;
  329. }
  330. /* write access completed */
  331. writel(0x0, phy->base + USB_PHY_APB_ACCESS_CMD);
  332. dev_info(phy->phy.dev, "APB reg(%x) updated with %x\n", reg_index, val);
  333. }
  334. static void eusb2_phy_apb_reg_read(struct msm_eusb2_phy *phy, u8 reg_index)
  335. {
  336. int ret;
  337. u32 rddata_lsb;
  338. u32 rddata_msb;
  339. /* program register which is required to read */
  340. writel(reg_index, phy->base + USB_PHY_APB_ADDRESS);
  341. /* send cmd to read reg_index based register value */
  342. writel(APB_START_CMD, phy->base + USB_PHY_APB_ACCESS_CMD);
  343. /* poll for cmd completion */
  344. ret = eusb2_phy_apb_cmd_wait(phy);
  345. if (ret) {
  346. dev_err(phy->phy.dev, "APB reg(%x) read failed\n", reg_index);
  347. return;
  348. }
  349. /* read data of reg_index register */
  350. rddata_lsb = readl(phy->base + USB_PHY_APB_RDDATA_LSB);
  351. rddata_msb = readl(phy->base + USB_PHY_APB_RDDATA_MSB);
  352. /* read access completed */
  353. writel(0x0, phy->base + USB_PHY_APB_ACCESS_CMD);
  354. dev_info(phy->phy.dev, "APB reg(%x) read success, val:%x\n",
  355. reg_index, ((rddata_msb << 8) | rddata_lsb));
  356. }
  357. static int apb_reg_rw_open(struct inode *inode, struct file *file)
  358. {
  359. return single_open(file, NULL, inode->i_private);
  360. }
  361. static ssize_t apb_reg_rw_write(struct file *file,
  362. const char __user *ubuf, size_t count, loff_t *ppos)
  363. {
  364. struct seq_file *s = file->private_data;
  365. struct msm_eusb2_phy *phy = s->private;
  366. char buf[32];
  367. bool read;
  368. char *field, *p;
  369. u8 reg_index;
  370. u16 val;
  371. if (!phy->cable_connected) {
  372. dev_err(phy->phy.dev, "eUSB2 PHY is not out of reset.\n");
  373. return -EINVAL;
  374. }
  375. if (copy_from_user(&buf, ubuf, min_t(size_t, sizeof(buf) - 1, count)))
  376. return -EFAULT;
  377. /*
  378. * For reading APB register: read <offset> e.g. read 0x33
  379. * For writing value into APB register: write <offset> <value>
  380. * e.g. write 0xff 0xd
  381. * Valid range for offset: 0x00 - 0xFF
  382. * Valid range for value: 0x0000 - 0xFFFF
  383. */
  384. p = buf;
  385. field = strsep(&p, " ");
  386. if (!field || !*field)
  387. goto err_out;
  388. if (strcmp(field, "read") == 0)
  389. read = true;
  390. else if (strcmp(field, "write") == 0)
  391. read = false;
  392. else
  393. goto err_out;
  394. /* get register offset */
  395. field = strsep(&p, " ");
  396. if (!field) {
  397. dev_err(phy->phy.dev, "Provide register offset\n");
  398. goto err_out;
  399. }
  400. if (kstrtou8(field, 16, &reg_index)) {
  401. dev_err(phy->phy.dev, "Invalid register offset\n");
  402. goto err_out;
  403. }
  404. /* read apb register */
  405. if (read) {
  406. eusb2_phy_apb_reg_read(phy, reg_index);
  407. goto done;
  408. }
  409. /* get value to update register for write */
  410. field = strsep(&p, " ");
  411. if (!field) {
  412. dev_err(phy->phy.dev, "Provide value to update register\n");
  413. goto err_out;
  414. }
  415. if (kstrtou16(field, 16, &val)) {
  416. dev_err(phy->phy.dev, "Invalid value\n");
  417. goto err_out;
  418. }
  419. eusb2_phy_apb_reg_write(phy, reg_index, val);
  420. goto done;
  421. err_out:
  422. pr_info("Error: enter proper values to read OR write APB register.\n");
  423. pr_info("To read APB register: read <offset>\n");
  424. pr_info("To write APB register: write <offset> <value>\n");
  425. pr_info("Valid range for offset: 0x00 - 0xFF\n");
  426. pr_info("Valid range for value: 0x0000 - 0xFFFF\n");
  427. done:
  428. return count;
  429. }
  430. static const struct file_operations apb_reg_rw_fops = {
  431. .open = apb_reg_rw_open,
  432. .write = apb_reg_rw_write,
  433. .release = single_release,
  434. };
  435. static void msm_eusb2_phy_reset(struct msm_eusb2_phy *phy)
  436. {
  437. int ret;
  438. ret = reset_control_assert(phy->phy_reset);
  439. if (ret)
  440. dev_err(phy->phy.dev, "phy reset assert failed\n");
  441. usleep_range(100, 150);
  442. ret = reset_control_deassert(phy->phy_reset);
  443. if (ret)
  444. dev_err(phy->phy.dev, "phy reset deassert failed\n");
  445. }
  446. static void eusb2_phy_write_seq(void __iomem *base, u32 *seq, int cnt)
  447. {
  448. int i;
  449. pr_debug("Seq count:%d\n", cnt);
  450. for (i = 0; i < cnt; i = i+2) {
  451. pr_debug("write 0x%02x to 0x%02x\n", seq[i], seq[i+1]);
  452. writel_relaxed(seq[i], base + seq[i+1]);
  453. }
  454. }
  455. static void msm_eusb2_parameter_override(struct msm_eusb2_phy *phy)
  456. {
  457. /* default parameters: tx pre-emphasis */
  458. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_9,
  459. PHY_CFG_TX_PREEMP_TUNE, (0 << PHY_CFG_TX_PREEMP_TUNE_SHIFT));
  460. /* tx rise/fall time */
  461. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_9,
  462. PHY_CFG_TX_RISE_TUNE, (0x2 << PHY_CFG_TX_RISE_TUNE_SHIFT));
  463. /* source impedance adjustment */
  464. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_9,
  465. PHY_CFG_TX_RES_TUNE, (0x1 << PHY_CFG_TX_RES_TUNE_SHIFT));
  466. /* dc voltage level adjustement */
  467. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_8,
  468. PHY_CFG_TX_HS_VREF_TUNE, (0x3 << PHY_CFG_TX_HS_VREF_TUNE_SHIFT));
  469. /* transmitter HS crossover adjustement */
  470. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_8,
  471. PHY_CFG_TX_HS_XV_TUNE, (0x0 << PHY_CFG_TX_HS_XV_TUNE_SHIFT));
  472. /* override init sequence using devicetree based values */
  473. eusb2_phy_write_seq(phy->base, phy->param_override_seq,
  474. phy->param_override_seq_cnt);
  475. /* override tune params using debugfs based values */
  476. if (phy->tx_pre_emphasis && phy->tx_pre_emphasis <= 7)
  477. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_9,
  478. PHY_CFG_TX_PREEMP_TUNE,
  479. (phy->tx_pre_emphasis << PHY_CFG_TX_PREEMP_TUNE_SHIFT));
  480. if (phy->tx_rise_fall_time && phy->tx_rise_fall_time <= 4)
  481. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_9,
  482. PHY_CFG_TX_RISE_TUNE,
  483. (phy->tx_rise_fall_time << PHY_CFG_TX_RISE_TUNE_SHIFT));
  484. if (phy->tx_src_impedence && phy->tx_src_impedence <= 4)
  485. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_9,
  486. PHY_CFG_TX_RES_TUNE,
  487. (phy->tx_src_impedence << PHY_CFG_TX_RES_TUNE_SHIFT));
  488. if (phy->tx_dc_vref && phy->tx_dc_vref <= 7)
  489. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_8,
  490. PHY_CFG_TX_HS_VREF_TUNE,
  491. (phy->tx_dc_vref << PHY_CFG_TX_HS_VREF_TUNE_SHIFT));
  492. if (phy->tx_xv && phy->tx_xv <= 4)
  493. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_8,
  494. PHY_CFG_TX_HS_XV_TUNE,
  495. (phy->tx_xv << PHY_CFG_TX_HS_XV_TUNE_SHIFT));
  496. }
  497. static void msm_eusb2_ref_clk_init(struct usb_phy *uphy)
  498. {
  499. unsigned long ref_clk_freq;
  500. struct msm_eusb2_phy *phy = container_of(uphy, struct msm_eusb2_phy, phy);
  501. ref_clk_freq = clk_get_rate(phy->ref_clk_src);
  502. switch (ref_clk_freq) {
  503. case 19200000:
  504. msm_eusb2_write_readback(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
  505. FSEL, FSEL_19_2_MHZ_VAL);
  506. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_2,
  507. PHY_CFG_PLL_FB_DIV_7_0, DIV_7_0_19_2_MHZ_VAL);
  508. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_3,
  509. PHY_CFG_PLL_FB_DIV_11_8, DIV_11_8_19_2_MHZ_VAL);
  510. break;
  511. case 38400000:
  512. msm_eusb2_write_readback(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
  513. FSEL, FSEL_38_4_MHZ_VAL);
  514. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_2,
  515. PHY_CFG_PLL_FB_DIV_7_0, DIV_7_0_38_4_MHZ_VAL);
  516. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_3,
  517. PHY_CFG_PLL_FB_DIV_11_8, DIV_11_8_38_4_MHZ_VAL);
  518. break;
  519. default:
  520. dev_err(uphy->dev, "unsupported ref_clk_freq:%lu\n",
  521. ref_clk_freq);
  522. }
  523. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_3,
  524. PHY_CFG_PLL_REF_DIV, PLL_REF_DIV_VAL);
  525. }
  526. static int msm_eusb2_repeater_reset_and_init(struct msm_eusb2_phy *phy)
  527. {
  528. int ret;
  529. if (phy->ur)
  530. phy->ur->flags = phy->phy.flags;
  531. ret = usb_repeater_powerup(phy->ur);
  532. if (ret)
  533. dev_err(phy->phy.dev, "repeater powerup failed.\n");
  534. ret = usb_repeater_reset(phy->ur, true);
  535. if (ret)
  536. dev_err(phy->phy.dev, "repeater reset failed.\n");
  537. #if IS_ENABLED(CONFIG_USB_PHY_SETTING_QCOM)
  538. if (phy->ur) {
  539. if (phy->phy.flags & PHY_HOST_MODE)
  540. phy->ur->is_host = true;
  541. else
  542. phy->ur->is_host = false;
  543. } else
  544. dev_err(phy->phy.dev, "phy->ur is null.\n");
  545. /* device start up time. TI 3ms, NXP 1ms */
  546. usleep_range(3000, 3500);
  547. #endif
  548. ret = usb_repeater_init(phy->ur);
  549. if (ret)
  550. dev_err(phy->phy.dev, "repeater init failed.\n");
  551. return ret;
  552. }
  553. static int msm_eusb2_phy_init(struct usb_phy *uphy)
  554. {
  555. struct msm_eusb2_phy *phy = container_of(uphy, struct msm_eusb2_phy, phy);
  556. int ret;
  557. dev_dbg(uphy->dev, "phy_flags:%x\n", phy->phy.flags);
  558. if (is_eud_debug_mode_active(phy)) {
  559. /* if in host mode, disable EUD debug mode */
  560. if (phy->phy.flags & PHY_HOST_MODE) {
  561. qcom_scm_io_writel(phy->eud_reg, 0x0);
  562. phy->re_enable_eud = true;
  563. } else {
  564. msm_eusb2_phy_power(phy, true);
  565. msm_eusb2_phy_clocks(phy, true);
  566. return msm_eusb2_repeater_reset_and_init(phy);
  567. }
  568. }
  569. ret = msm_eusb2_phy_power(phy, true);
  570. if (ret)
  571. return ret;
  572. /* Bring eUSB2 repeater out of reset and initialized before eUSB2 PHY */
  573. ret = msm_eusb2_repeater_reset_and_init(phy);
  574. if (ret)
  575. return ret;
  576. msm_eusb2_phy_clocks(phy, true);
  577. msm_eusb2_phy_reset(phy);
  578. msm_eusb2_write_readback(phy->base, USB_PHY_CFG0,
  579. CMN_CTRL_OVERRIDE_EN, CMN_CTRL_OVERRIDE_EN);
  580. msm_eusb2_write_readback(phy->base, USB_PHY_UTMI_CTRL5, POR, POR);
  581. msm_eusb2_write_readback(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
  582. PHY_ENABLE | RETENABLEN, PHY_ENABLE | RETENABLEN);
  583. msm_eusb2_write_readback(phy->base, USB_PHY_APB_ACCESS_CMD,
  584. APB_LOGIC_RESET, APB_LOGIC_RESET);
  585. msm_eusb2_write_readback(phy->base, UTMI_PHY_CMN_CTRL0, TESTBURNIN, 0);
  586. msm_eusb2_write_readback(phy->base, USB_PHY_FSEL_SEL,
  587. FSEL_SEL, FSEL_SEL);
  588. /* update ref_clk related registers */
  589. msm_eusb2_ref_clk_init(uphy);
  590. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_1,
  591. PHY_CFG_PLL_CPBIAS_CNTRL,
  592. (0x1 << PHY_CFG_PLL_CPBIAS_CNTRL_SHIFT));
  593. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_4,
  594. PHY_CFG_PLL_INT_CNTRL,
  595. (0x8 << PHY_CFG_PLL_INT_CNTRL_SHIFT));
  596. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_4,
  597. PHY_CFG_PLL_GMP_CNTRL,
  598. (0x1 << PHY_CFG_PLL_GMP_CNTRL_SHIFT));
  599. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_5,
  600. PHY_CFG_PLL_PROP_CNTRL,
  601. (0x10 << PHY_CFG_PLL_PROP_CNTRL_SHIFT));
  602. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_6,
  603. PHY_CFG_PLL_VCO_CNTRL,
  604. (0x0 << PHY_CFG_PLL_VCO_CNTRL_SHIFT));
  605. msm_eusb2_write_readback(phy->base, USB_PHY_CFG_CTRL_5,
  606. PHY_CFG_PLL_VREF_TUNE,
  607. (0x1 << PHY_CFG_PLL_VREF_TUNE_SHIFT));
  608. msm_eusb2_write_readback(phy->base, USB_PHY_HS_PHY_CTRL2,
  609. VBUS_DET_EXT_SEL, VBUS_DET_EXT_SEL);
  610. /* set parameter override if needed */
  611. msm_eusb2_parameter_override(phy);
  612. msm_eusb2_write_readback(phy->base, USB_PHY_HS_PHY_CTRL2,
  613. USB2_SUSPEND_N_SEL | USB2_SUSPEND_N,
  614. USB2_SUSPEND_N_SEL | USB2_SUSPEND_N);
  615. msm_eusb2_write_readback(phy->base, USB_PHY_UTMI_CTRL0, SLEEPM, SLEEPM);
  616. msm_eusb2_write_readback(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
  617. SIDDQ_SEL, SIDDQ_SEL);
  618. msm_eusb2_write_readback(phy->base, USB_PHY_HS_PHY_CTRL_COMMON0,
  619. SIDDQ, 0);
  620. msm_eusb2_write_readback(phy->base, USB_PHY_UTMI_CTRL5, POR, 0);
  621. msm_eusb2_write_readback(phy->base, USB_PHY_HS_PHY_CTRL2,
  622. USB2_SUSPEND_N_SEL, 0);
  623. msm_eusb2_write_readback(phy->base, USB_PHY_CFG0,
  624. CMN_CTRL_OVERRIDE_EN, 0x00);
  625. return 0;
  626. }
  627. static int msm_eusb2_phy_set_suspend(struct usb_phy *uphy, int suspend)
  628. {
  629. struct msm_eusb2_phy *phy = container_of(uphy, struct msm_eusb2_phy, phy);
  630. if (phy->suspended && suspend) {
  631. dev_dbg(uphy->dev, "USB PHY is already suspended\n");
  632. return 0;
  633. }
  634. dev_dbg(uphy->dev, "phy->flags:0x%x\n", phy->phy.flags);
  635. if (suspend) {
  636. /* Bus suspend handling */
  637. if (phy->cable_connected ||
  638. (phy->phy.flags & PHY_HOST_MODE)) {
  639. msm_eusb2_phy_clocks(phy, false);
  640. goto suspend_exit;
  641. }
  642. /* Cable disconnect handling */
  643. if (phy->re_enable_eud) {
  644. dev_dbg(uphy->dev, "re-enabling EUD\n");
  645. qcom_scm_io_writel(phy->eud_reg, 0x1);
  646. phy->re_enable_eud = false;
  647. }
  648. /* With EUD spoof disconnect, keep clk and ldos on */
  649. if ((phy->phy.flags & EUD_SPOOF_DISCONNECT) || is_eud_debug_mode_active(phy))
  650. goto suspend_exit;
  651. msm_eusb2_phy_clocks(phy, false);
  652. msm_eusb2_phy_power(phy, false);
  653. /* Hold repeater into reset after powering down PHY */
  654. usb_repeater_reset(phy->ur, false);
  655. usb_repeater_powerdown(phy->ur);
  656. } else {
  657. /* Bus resume and cable connect handling */
  658. msm_eusb2_phy_power(phy, true);
  659. msm_eusb2_phy_clocks(phy, true);
  660. }
  661. suspend_exit:
  662. phy->suspended = !!suspend;
  663. return 0;
  664. }
  665. static int msm_eusb2_phy_notify_connect(struct usb_phy *uphy,
  666. enum usb_device_speed speed)
  667. {
  668. struct msm_eusb2_phy *phy = container_of(uphy, struct msm_eusb2_phy, phy);
  669. phy->cable_connected = true;
  670. /*
  671. * SW WA for CV9 RESET DEVICE TEST(TD 9.23) compliance test failure.
  672. * During HS to SS transitions UTMI_TX Valid signal remains high causing
  673. * the next HS connect to fail. The below sequence sends an extra TX_READY
  674. * signal when the link transitions from HS to SS mode to lower down the
  675. * TX_VALID signal.
  676. */
  677. if (!(phy->phy.flags & PHY_HOST_MODE) && (speed >= USB_SPEED_SUPER)) {
  678. msm_eusb2_write_readback(phy->base, USB_PHY_APB_ACCESS_CMD, 0xff, 0x0);
  679. msm_eusb2_write_readback(phy->base, USB_PHY_APB_ADDRESS, 0xff, 0x5);
  680. msm_eusb2_write_readback(phy->base, USB_PHY_APB_WRDATA_LSB, 0xff, 0xc0);
  681. msm_eusb2_write_readback(phy->base, USB_PHY_APB_ACCESS_CMD, 0xff, 0x3);
  682. udelay(2);
  683. msm_eusb2_write_readback(phy->base, USB_PHY_APB_ACCESS_CMD, 0xff, 0x0);
  684. msm_eusb2_write_readback(phy->base, USB_PHY_APB_WRDATA_LSB, 0xff, 0x0);
  685. msm_eusb2_write_readback(phy->base, USB_PHY_APB_ACCESS_CMD, 0xff, 0x3);
  686. udelay(2);
  687. msm_eusb2_write_readback(phy->base, USB_PHY_APB_ACCESS_CMD, 0xff, 0x0);
  688. }
  689. return 0;
  690. }
  691. static int msm_eusb2_phy_notify_disconnect(struct usb_phy *uphy,
  692. enum usb_device_speed speed)
  693. {
  694. struct msm_eusb2_phy *phy = container_of(uphy, struct msm_eusb2_phy, phy);
  695. if (is_eud_debug_mode_active(phy) && !(phy->phy.flags & EUD_SPOOF_DISCONNECT)) {
  696. msm_eusb2_phy_update_eud_detect(phy, false);
  697. /* Ensure that EUD disable occurs before re-enabling */
  698. mb();
  699. msm_eusb2_phy_update_eud_detect(phy, true);
  700. }
  701. phy->cable_connected = false;
  702. return 0;
  703. }
  704. static void msm_eusb2_phy_vbus_draw_work(struct work_struct *w)
  705. {
  706. struct msm_eusb2_phy *phy = container_of(w, struct msm_eusb2_phy,
  707. vbus_draw_work);
  708. union power_supply_propval val = {0};
  709. int ret;
  710. if (!phy->usb_psy) {
  711. phy->usb_psy = power_supply_get_by_name("usb");
  712. if (!phy->usb_psy) {
  713. dev_err(phy->phy.dev, "Could not get usb psy\n");
  714. return;
  715. }
  716. }
  717. #if IS_ENABLED(CONFIG_USB_CONFIGFS_F_SS_MON_GADGET)
  718. /* USB SUSPEND CURRENT SETTINGS */
  719. if (phy->vbus_draw == 2) {
  720. pr_err("[USB] make suspend currrent event\n");
  721. make_suspend_current_event();
  722. }
  723. #endif
  724. dev_info(phy->phy.dev, "Avail curr from USB = %u\n", phy->vbus_draw);
  725. /* Set max current limit in uA */
  726. val.intval = 1000 * phy->vbus_draw;
  727. ret = power_supply_set_property(phy->usb_psy,
  728. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &val);
  729. if (ret) {
  730. dev_dbg(phy->phy.dev, "Error setting ICL:(%d)\n", ret);
  731. return;
  732. }
  733. }
  734. static int msm_eusb2_phy_set_power(struct usb_phy *uphy, unsigned int mA)
  735. {
  736. struct msm_eusb2_phy *phy = container_of(uphy, struct msm_eusb2_phy, phy);
  737. if (phy->cable_connected && (mA == 0))
  738. return 0;
  739. phy->vbus_draw = mA;
  740. schedule_work(&phy->vbus_draw_work);
  741. return 0;
  742. }
  743. static void msm_eusb2_phy_create_debugfs(struct msm_eusb2_phy *phy)
  744. {
  745. phy->root = debugfs_create_dir(dev_name(phy->phy.dev), NULL);
  746. debugfs_create_x8("tx_pre_emphasis", 0644, phy->root,
  747. &phy->tx_pre_emphasis);
  748. debugfs_create_x8("tx_rise_fall_time", 0644, phy->root,
  749. &phy->tx_rise_fall_time);
  750. debugfs_create_x8("tx_src_imp", 0644, phy->root,
  751. &phy->tx_src_impedence);
  752. debugfs_create_x8("tx_dc_vref", 0644, phy->root, &phy->tx_dc_vref);
  753. debugfs_create_x8("tx_xv", 0644, phy->root, &phy->tx_xv);
  754. debugfs_create_file("apb_reg_rw", 0200, phy->root, phy,
  755. &apb_reg_rw_fops);
  756. }
  757. static int msm_eusb2_phy_probe(struct platform_device *pdev)
  758. {
  759. struct msm_eusb2_phy *phy;
  760. struct device *dev = &pdev->dev;
  761. struct resource *res;
  762. int ret = 0;
  763. struct usb_repeater *ur = NULL;
  764. pr_info("%s\n", __func__);
  765. phy = devm_kzalloc(dev, sizeof(*phy), GFP_KERNEL);
  766. if (!phy) {
  767. ret = -ENOMEM;
  768. goto err_ret;
  769. }
  770. ur = devm_usb_get_repeater_by_phandle(dev, "usb-repeater", 0);
  771. if (IS_ERR(ur)) {
  772. ret = PTR_ERR(ur);
  773. goto err_ret;
  774. }
  775. res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  776. "eusb2_phy_base");
  777. if (!res) {
  778. dev_err(dev, "missing eusb2phy memory resource\n");
  779. ret = -ENODEV;
  780. goto err_ret;
  781. }
  782. phy->base = devm_ioremap_resource(dev, res);
  783. if (IS_ERR(phy->base)) {
  784. dev_err(dev, "ioremap failed\n");
  785. ret = -ENODEV;
  786. goto err_ret;
  787. }
  788. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eud_enable_reg");
  789. if (res) {
  790. phy->eud_enable_reg = devm_ioremap_resource(dev, res);
  791. if (IS_ERR(phy->eud_enable_reg)) {
  792. ret = PTR_ERR(phy->eud_enable_reg);
  793. dev_err(dev, "eud_enable_reg ioremap err:%d\n", ret);
  794. goto err_ret;
  795. }
  796. phy->eud_reg = res->start;
  797. }
  798. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eud_detect_reg");
  799. if (!res) {
  800. dev_err(dev, "missing eud_detect register address\n");
  801. ret = -ENODEV;
  802. goto err_ret;
  803. }
  804. phy->eud_detect_reg = devm_ioremap_resource(dev, res);
  805. if (IS_ERR(phy->eud_detect_reg)) {
  806. ret = PTR_ERR(phy->eud_detect_reg);
  807. dev_err(dev, "eud_detect_reg ioremap err:%d\n", ret);
  808. goto err_ret;
  809. }
  810. phy->ref_clk_src = devm_clk_get(dev, "ref_clk_src");
  811. if (IS_ERR(phy->ref_clk_src)) {
  812. dev_err(dev, "clk get failed for ref_clk_src\n");
  813. ret = PTR_ERR(phy->ref_clk_src);
  814. goto err_ret;
  815. }
  816. phy->ref_clk = devm_clk_get_optional(dev, "ref_clk");
  817. if (IS_ERR(phy->ref_clk)) {
  818. dev_err(dev, "clk get failed for ref_clk\n");
  819. ret = PTR_ERR(phy->ref_clk);
  820. goto err_ret;
  821. }
  822. phy->phy_reset = devm_reset_control_get(dev, "phy_reset");
  823. if (IS_ERR(phy->phy_reset)) {
  824. ret = PTR_ERR(phy->phy_reset);
  825. goto err_ret;
  826. }
  827. ret = of_property_read_u32_array(dev->of_node, "qcom,vdd-voltage-level",
  828. (u32 *) phy->vdd_levels,
  829. ARRAY_SIZE(phy->vdd_levels));
  830. if (ret) {
  831. dev_err(dev, "error reading qcom,vdd-voltage-level property\n");
  832. goto err_ret;
  833. }
  834. phy->vdd = devm_regulator_get(dev, "vdd");
  835. if (IS_ERR(phy->vdd)) {
  836. dev_err(dev, "unable to get vdd supply\n");
  837. ret = PTR_ERR(phy->vdd);
  838. goto err_ret;
  839. }
  840. phy->vdda12 = devm_regulator_get(dev, "vdda12");
  841. if (IS_ERR(phy->vdda12)) {
  842. dev_err(dev, "unable to get vdda12 supply\n");
  843. ret = PTR_ERR(phy->vdda12);
  844. goto err_ret;
  845. }
  846. phy->param_override_seq_cnt = of_property_count_elems_of_size(
  847. dev->of_node, "qcom,param-override-seq",
  848. sizeof(*phy->param_override_seq));
  849. if (phy->param_override_seq_cnt % 2) {
  850. dev_err(dev, "invalid param_override_seq_len\n");
  851. ret = -EINVAL;
  852. goto err_ret;
  853. }
  854. if (phy->param_override_seq_cnt > 0) {
  855. phy->param_override_seq = devm_kcalloc(dev,
  856. phy->param_override_seq_cnt,
  857. sizeof(*phy->param_override_seq),
  858. GFP_KERNEL);
  859. if (!phy->param_override_seq) {
  860. ret = -ENOMEM;
  861. goto err_ret;
  862. }
  863. ret = of_property_read_u32_array(dev->of_node,
  864. "qcom,param-override-seq",
  865. phy->param_override_seq,
  866. phy->param_override_seq_cnt);
  867. if (ret) {
  868. dev_err(dev, "qcom,param-override-seq read failed %d\n",
  869. ret);
  870. goto err_ret;
  871. }
  872. }
  873. phy->ur = ur;
  874. phy->phy.dev = dev;
  875. platform_set_drvdata(pdev, phy);
  876. phy->phy.init = msm_eusb2_phy_init;
  877. phy->phy.set_suspend = msm_eusb2_phy_set_suspend;
  878. phy->phy.notify_connect = msm_eusb2_phy_notify_connect;
  879. phy->phy.notify_disconnect = msm_eusb2_phy_notify_disconnect;
  880. phy->phy.set_power = msm_eusb2_phy_set_power;
  881. phy->phy.type = USB_PHY_TYPE_USB2;
  882. ret = usb_add_phy_dev(&phy->phy);
  883. if (ret)
  884. goto err_ret;
  885. INIT_WORK(&phy->vbus_draw_work, msm_eusb2_phy_vbus_draw_work);
  886. msm_eusb2_phy_create_debugfs(phy);
  887. /*
  888. * EUD may be enable in boot loader and to keep EUD session alive across
  889. * kernel boot till USB phy driver is initialized based on cable status,
  890. * keep LDOs, clocks and repeater on here.
  891. */
  892. if (is_eud_debug_mode_active(phy)) {
  893. msm_eusb2_phy_power(phy, true);
  894. msm_eusb2_phy_clocks(phy, true);
  895. msm_eusb2_repeater_reset_and_init(phy);
  896. }
  897. pr_info("%s done\n", __func__);
  898. return 0;
  899. err_ret:
  900. pr_info("%s failed. ret(%d)\n", __func__, ret);
  901. return ret;
  902. }
  903. static int msm_eusb2_phy_remove(struct platform_device *pdev)
  904. {
  905. struct msm_eusb2_phy *phy = platform_get_drvdata(pdev);
  906. if (!phy)
  907. return 0;
  908. flush_work(&phy->vbus_draw_work);
  909. if (phy->usb_psy)
  910. power_supply_put(phy->usb_psy);
  911. debugfs_remove_recursive(phy->root);
  912. usb_remove_phy(&phy->phy);
  913. clk_disable_unprepare(phy->ref_clk);
  914. clk_disable_unprepare(phy->ref_clk_src);
  915. msm_eusb2_phy_clocks(phy, false);
  916. msm_eusb2_phy_power(phy, false);
  917. return 0;
  918. }
  919. static const struct of_device_id msm_usb_id_table[] = {
  920. {
  921. .compatible = "qcom,usb-snps-eusb2-phy",
  922. },
  923. { },
  924. };
  925. MODULE_DEVICE_TABLE(of, msm_usb_id_table);
  926. static struct platform_driver msm_eusb2_phy_driver = {
  927. .probe = msm_eusb2_phy_probe,
  928. .remove = msm_eusb2_phy_remove,
  929. .driver = {
  930. .name = "msm_eusb2_phy",
  931. .of_match_table = of_match_ptr(msm_usb_id_table),
  932. },
  933. };
  934. module_platform_driver(msm_eusb2_phy_driver);
  935. MODULE_DESCRIPTION("MSM USB eUSB2 PHY driver");
  936. MODULE_LICENSE("GPL v2");