eud.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved.
  4. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  5. */
  6. #include <linux/kernel.h>
  7. #include <linux/module.h>
  8. #include <linux/slab.h>
  9. #include <linux/interrupt.h>
  10. #include <linux/err.h>
  11. #include <linux/of.h>
  12. #include <linux/platform_device.h>
  13. #include <linux/extcon.h>
  14. #include <linux/extcon-provider.h>
  15. #include <linux/delay.h>
  16. #include <linux/sysfs.h>
  17. #include <linux/io.h>
  18. #include <linux/of.h>
  19. #include <linux/bitops.h>
  20. #include <linux/tty.h>
  21. #include <linux/tty_flip.h>
  22. #include <linux/serial_core.h>
  23. #include <linux/serial.h>
  24. #include <linux/clk.h>
  25. #include <linux/workqueue.h>
  26. #include <linux/power_supply.h>
  27. #include <linux/qcom_scm.h>
  28. #include <linux/delay.h>
  29. #define EUD_ENABLE_CMD 1
  30. #define EUD_DISABLE_CMD 0
  31. #define EUD_REG_COM_TX_ID 0x0000
  32. #define EUD_REG_COM_TX_LEN 0x0004
  33. #define EUD_REG_COM_TX_DAT 0x0008
  34. #define EUD_REG_COM_RX_ID 0x000C
  35. #define EUD_REG_COM_RX_LEN 0x0010
  36. #define EUD_REG_COM_RX_DAT 0x0014
  37. #define EUD_REG_EUD_EN2 0x0000
  38. #define EUD_REG_INT1_EN_MASK 0x0024
  39. #define EUD_REG_INT_STATUS_1 0x0044
  40. #define EUD_REG_CTL_OUT_1 0x0074
  41. #define EUD_REG_VBUS_INT_CLR 0x0080
  42. #define EUD_REG_CHGR_INT_CLR 0x0084
  43. #define EUD_REG_CSR_EUD_EN 0x1014
  44. #define EUD_REG_SW_ATTACH_DET 0x1018
  45. #define EUD_REG_UTMI_DELAY_LSB 0x1030
  46. #define EUD_REG_UTMI_DELAY_MSB 0x1034
  47. #define EUD_INT_RX BIT(0)
  48. #define EUD_INT_TX BIT(1)
  49. #define EUD_INT_VBUS BIT(2)
  50. #define EUD_INT_CHGR BIT(3)
  51. #define EUD_INT_SAFE_MODE BIT(4)
  52. #define EUD_INT_ALL (EUD_INT_RX | EUD_INT_TX | \
  53. EUD_INT_VBUS | EUD_INT_CHGR | \
  54. EUD_INT_SAFE_MODE)
  55. #define EUD_NR 1
  56. #define EUD_CONSOLE NULL
  57. #define UART_ID 0x90
  58. #define MAX_FIFO_SIZE 14
  59. #define EUD_UTMI_DELAY_MASK 0xff
  60. #define EUD_UTMI_DELAY_MIN 28
  61. #define PORT_EUD_UART 300
  62. #define EUD_TCSR_ENABLE_BIT BIT(0)
  63. struct eud_chip {
  64. struct device *dev;
  65. int eud_irq;
  66. unsigned int extcon_id;
  67. unsigned int int_status;
  68. bool usb_attach;
  69. bool chgr_enable;
  70. void __iomem *eud_reg_base;
  71. struct extcon_dev *extcon;
  72. struct uart_port port;
  73. struct work_struct eud_work;
  74. struct power_supply *usb_psy;
  75. bool secure_eud_en;
  76. bool need_phy_clk_vote;
  77. phys_addr_t eud_mode_mgr2_phys_base;
  78. struct clk *eud_ahb2phy_clk;
  79. struct clk *eud_clkref_clk;
  80. bool eud_clkref_enabled;
  81. bool eud_enabled;
  82. u16 utmi_switch_delay;
  83. };
  84. static const unsigned int eud_extcon_cable[] = {
  85. EXTCON_USB,
  86. EXTCON_CHG_USB_SDP,
  87. EXTCON_JIG,
  88. EXTCON_NONE,
  89. };
  90. static int enable = EUD_DISABLE_CMD;
  91. static bool eud_ready;
  92. static struct platform_device *eud_private;
  93. static int msm_eud_clkref_en(struct eud_chip *chip, bool enable)
  94. {
  95. int ret = 0;
  96. if (chip->eud_clkref_enabled == enable)
  97. return 0;
  98. if (enable) {
  99. /* Vote for EUD USB reference clk, needed to keep QREF enabled */
  100. ret = clk_prepare_enable(chip->eud_clkref_clk);
  101. if (ret) {
  102. dev_err(chip->dev,
  103. "Failed to enable eud_clkref_clk\n");
  104. return ret;
  105. }
  106. } else {
  107. clk_disable_unprepare(chip->eud_clkref_clk);
  108. }
  109. chip->eud_clkref_enabled = enable;
  110. return 0;
  111. }
  112. static inline void msm_eud_enable_irqs(struct eud_chip *chip)
  113. {
  114. /* Enable vbus, chgr & safe mode warning interrupts */
  115. writel_relaxed(EUD_INT_VBUS | EUD_INT_CHGR | EUD_INT_SAFE_MODE,
  116. chip->eud_reg_base + EUD_REG_INT1_EN_MASK);
  117. }
  118. static int msm_eud_hw_is_enabled(struct platform_device *pdev)
  119. {
  120. struct eud_chip *chip = platform_get_drvdata(pdev);
  121. int sec_eud_enabled = 0;
  122. if (chip->secure_eud_en) {
  123. int ret = qcom_scm_io_readl(
  124. chip->eud_mode_mgr2_phys_base + EUD_REG_EUD_EN2,
  125. &sec_eud_enabled);
  126. if (ret) {
  127. dev_err(&pdev->dev,
  128. "qcom_scm_io_readl failed with rc: %d\n", ret);
  129. return 0;
  130. }
  131. return sec_eud_enabled;
  132. }
  133. return readl_relaxed(chip->eud_reg_base + EUD_REG_CSR_EUD_EN) & BIT(0);
  134. }
  135. static int set_eud_utmi_switch_delay(struct eud_chip *chip)
  136. {
  137. u8 val;
  138. if (chip->utmi_switch_delay) {
  139. val = (chip->utmi_switch_delay >> 8) & EUD_UTMI_DELAY_MASK;
  140. writew_relaxed(val, chip->eud_reg_base + EUD_REG_UTMI_DELAY_MSB);
  141. val = chip->utmi_switch_delay & EUD_UTMI_DELAY_MASK;
  142. writew_relaxed(val, chip->eud_reg_base + EUD_REG_UTMI_DELAY_LSB);
  143. }
  144. return 0;
  145. }
  146. static int check_eud_mode_mgr2(struct eud_chip *chip)
  147. {
  148. u32 val;
  149. qcom_scm_io_readl(chip->eud_mode_mgr2_phys_base, &val);
  150. return val & BIT(0);
  151. }
  152. static void enable_eud(struct platform_device *pdev)
  153. {
  154. struct eud_chip *priv = platform_get_drvdata(pdev);
  155. int ret;
  156. /* No need to notify USB and modify EUD CSR if already enabled */
  157. if (priv->eud_enabled)
  158. return;
  159. /*
  160. * Set the default cable state to usb connect and charger
  161. * enable
  162. */
  163. extcon_set_state_sync(priv->extcon, EXTCON_USB, true);
  164. /* indicate that the eud enable is due to the module param */
  165. extcon_set_state(priv->extcon, EXTCON_JIG, false);
  166. /* perform spoof disconnect as recommended */
  167. extcon_set_state_sync(priv->extcon, EXTCON_USB, false);
  168. msm_eud_clkref_en(priv, true);
  169. set_eud_utmi_switch_delay(priv);
  170. /* write into CSR to enable EUD */
  171. writel_relaxed(BIT(0), priv->eud_reg_base + EUD_REG_CSR_EUD_EN);
  172. msm_eud_enable_irqs(priv);
  173. /* Enable secure eud if supported */
  174. if (priv->secure_eud_en && !check_eud_mode_mgr2(priv)) {
  175. ret = qcom_scm_io_writel(priv->eud_mode_mgr2_phys_base +
  176. EUD_REG_EUD_EN2, EUD_ENABLE_CMD);
  177. if (ret)
  178. dev_err(&pdev->dev,
  179. "qcom_scm_io_writel failed with rc:%d\n", ret);
  180. }
  181. /* Ensure Register Writes Complete */
  182. wmb();
  183. usleep_range(50, 100);
  184. /* perform spoof connect as recommended */
  185. extcon_set_state_sync(priv->extcon, EXTCON_USB, true);
  186. extcon_set_state_sync(priv->extcon, EXTCON_CHG_USB_SDP, true);
  187. priv->eud_enabled = true;
  188. dev_dbg(&pdev->dev, "%s: EUD is Enabled\n", __func__);
  189. }
  190. static void disable_eud(struct platform_device *pdev)
  191. {
  192. struct eud_chip *priv = platform_get_drvdata(pdev);
  193. int ret;
  194. if (!priv->eud_enabled)
  195. return;
  196. /* indicate that the eud enable is due to the module param */
  197. extcon_set_state(priv->extcon, EXTCON_JIG, false);
  198. /* perform spoof disconnect as recommended */
  199. extcon_set_state_sync(priv->extcon, EXTCON_USB, false);
  200. /* write into CSR to disable EUD */
  201. writel_relaxed(0, priv->eud_reg_base + EUD_REG_CSR_EUD_EN);
  202. /* Disable secure eud if supported */
  203. if (priv->secure_eud_en) {
  204. ret = qcom_scm_io_writel(priv->eud_mode_mgr2_phys_base +
  205. EUD_REG_EUD_EN2, EUD_DISABLE_CMD);
  206. if (ret)
  207. dev_err(&pdev->dev,
  208. "qcom_scm_io_write failed with rc:%d\n", ret);
  209. }
  210. msm_eud_clkref_en(priv, false);
  211. usleep_range(50, 100);
  212. /* perform spoof connect as recommended */
  213. extcon_set_state_sync(priv->extcon, EXTCON_USB, true);
  214. priv->eud_enabled = false;
  215. dev_dbg(&pdev->dev, "%s: EUD Disabled!\n", __func__);
  216. }
  217. static int param_eud_set(const char *val, const struct kernel_param *kp)
  218. {
  219. int enable = 0;
  220. if (sscanf(val, "%du", &enable) != 1)
  221. return -EINVAL;
  222. if (enable != EUD_ENABLE_CMD && enable != EUD_DISABLE_CMD)
  223. return -EINVAL;
  224. *((uint *)kp->arg) = enable;
  225. if (!eud_ready)
  226. return 0;
  227. if (enable == EUD_ENABLE_CMD) {
  228. pr_debug("%s: Enbling EUD\n", __func__);
  229. enable_eud(eud_private);
  230. } else if (enable == EUD_DISABLE_CMD) {
  231. pr_debug("%s: Disabling EUD\n", __func__);
  232. disable_eud(eud_private);
  233. }
  234. return 0;
  235. }
  236. static const struct kernel_param_ops eud_param_ops = {
  237. .set = param_eud_set,
  238. .get = param_get_int,
  239. };
  240. module_param_cb(enable, &eud_param_ops, &enable, 0644);
  241. static bool is_usb_psy_available(struct eud_chip *chip)
  242. {
  243. if (!chip->usb_psy)
  244. chip->usb_psy = power_supply_get_by_name("usb");
  245. if (!chip->usb_psy)
  246. return false;
  247. return true;
  248. }
  249. static void eud_event_notifier(struct work_struct *eud_work)
  250. {
  251. struct eud_chip *chip = container_of(eud_work, struct eud_chip,
  252. eud_work);
  253. union power_supply_propval pval;
  254. if (chip->int_status == EUD_INT_VBUS) {
  255. extcon_set_state(chip->extcon, EXTCON_JIG, true);
  256. extcon_set_state_sync(chip->extcon, chip->extcon_id,
  257. chip->usb_attach);
  258. } else if (chip->int_status == EUD_INT_CHGR) {
  259. if (is_usb_psy_available(chip)) {
  260. int ret;
  261. pval.intval = chip->chgr_enable ? -EINVAL :
  262. chip->chgr_enable;
  263. ret = power_supply_set_property(chip->usb_psy,
  264. POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT, &pval);
  265. if (ret < 0)
  266. dev_err(chip->dev,
  267. "Failed to set the powersupply property: %d\n",
  268. ret);
  269. }
  270. }
  271. }
  272. static void usb_attach_detach(struct eud_chip *chip)
  273. {
  274. u32 reg;
  275. chip->extcon_id = EXTCON_USB;
  276. /* read ctl_out_1[4] to find USB attach or detach event */
  277. reg = readl_relaxed(chip->eud_reg_base + EUD_REG_CTL_OUT_1);
  278. if (reg & BIT(4))
  279. chip->usb_attach = true;
  280. else
  281. chip->usb_attach = false;
  282. schedule_work(&chip->eud_work);
  283. /* set and clear vbus_int_clr[0] to clear interrupt */
  284. writel_relaxed(BIT(0), chip->eud_reg_base + EUD_REG_VBUS_INT_CLR);
  285. /* Ensure Register Writes Complete */
  286. wmb();
  287. writel_relaxed(0, chip->eud_reg_base + EUD_REG_VBUS_INT_CLR);
  288. }
  289. static void chgr_enable_disable(struct eud_chip *chip)
  290. {
  291. u32 reg;
  292. chip->extcon_id = EXTCON_CHG_USB_SDP;
  293. /* read ctl_out_1[6] to find charger enable or disable event */
  294. reg = readl_relaxed(chip->eud_reg_base + EUD_REG_CTL_OUT_1);
  295. if (reg & BIT(6))
  296. chip->chgr_enable = true;
  297. else
  298. chip->chgr_enable = false;
  299. schedule_work(&chip->eud_work);
  300. /* set and clear chgr_int_clr[0] to clear interrupt */
  301. writel_relaxed(BIT(0), chip->eud_reg_base + EUD_REG_CHGR_INT_CLR);
  302. /* Ensure Register Writes Complete */
  303. wmb();
  304. writel_relaxed(0, chip->eud_reg_base + EUD_REG_CHGR_INT_CLR);
  305. }
  306. static void pet_eud(struct eud_chip *chip)
  307. {
  308. u32 reg;
  309. /* read sw_attach_det[0] to find attach/detach event */
  310. reg = readl_relaxed(chip->eud_reg_base + EUD_REG_SW_ATTACH_DET);
  311. if (reg & BIT(0)) {
  312. /* Detach & Attach pet for EUD */
  313. writel_relaxed(0, chip->eud_reg_base + EUD_REG_SW_ATTACH_DET);
  314. /* Ensure Register Writes Complete */
  315. wmb();
  316. /* Delay to make sure detach pet is done before attach pet */
  317. udelay(100);
  318. writel_relaxed(BIT(0), chip->eud_reg_base +
  319. EUD_REG_SW_ATTACH_DET);
  320. /* Ensure Register Writes Complete */
  321. wmb();
  322. } else {
  323. /* Attach pet for EUD */
  324. writel_relaxed(BIT(0), chip->eud_reg_base +
  325. EUD_REG_SW_ATTACH_DET);
  326. /* Ensure Register Writes Complete */
  327. wmb();
  328. }
  329. }
  330. static unsigned int eud_tx_empty(struct uart_port *port)
  331. {
  332. u32 reg;
  333. /* read status register and cross check for Tx interrupt */
  334. reg = readl_relaxed(port->membase + EUD_REG_INT_STATUS_1);
  335. if (reg & EUD_INT_TX)
  336. return TIOCSER_TEMT;
  337. else
  338. return 0;
  339. }
  340. static void eud_set_mctrl(struct uart_port *port, unsigned int mctrl)
  341. {
  342. /* Nothing to set */
  343. }
  344. static unsigned int eud_get_mctrl(struct uart_port *port)
  345. {
  346. return 0;
  347. }
  348. static void eud_set_termios(struct uart_port *port, struct ktermios *new,
  349. const struct ktermios *old)
  350. {
  351. /* Nothing to do here, but to satisfy the serial core */
  352. }
  353. static void eud_stop_tx(struct uart_port *port)
  354. {
  355. /* Disable Tx interrupt */
  356. writel_relaxed((__force u32)~EUD_INT_TX, port->membase + EUD_REG_INT_STATUS_1);
  357. /* Ensure Register Writes Complete */
  358. wmb();
  359. }
  360. static void eud_start_tx(struct uart_port *port)
  361. {
  362. /* Enable Tx interrupt */
  363. writel_relaxed(EUD_INT_TX, port->membase + EUD_REG_INT_STATUS_1);
  364. /* Ensure Register Writes Complete */
  365. wmb();
  366. }
  367. static void eud_stop_rx(struct uart_port *port)
  368. {
  369. /* Disable Rx interrupt */
  370. writel_relaxed((__force u32)~EUD_INT_RX, port->membase + EUD_REG_INT_STATUS_1);
  371. /* Ensure Register Writes Complete */
  372. wmb();
  373. }
  374. static int eud_startup(struct uart_port *port)
  375. {
  376. /* Enable Rx interrupt */
  377. writel_relaxed(EUD_INT_RX, port->membase + EUD_REG_INT_STATUS_1);
  378. /* Ensure Register Writes Complete */
  379. wmb();
  380. return 0;
  381. }
  382. static void eud_shutdown(struct uart_port *port)
  383. {
  384. /* Disable both Tx & Rx interrupts */
  385. writel_relaxed((__force u32)(~EUD_INT_TX | ~EUD_INT_RX),
  386. port->membase + EUD_REG_INT_STATUS_1);
  387. /* Ensure Register Writes Complete */
  388. wmb();
  389. }
  390. static const char *eud_type(struct uart_port *port)
  391. {
  392. return (port->type == PORT_EUD_UART) ? "EUD UART" : NULL;
  393. }
  394. static int eud_request_port(struct uart_port *port)
  395. {
  396. /* Nothing to request */
  397. return 0;
  398. }
  399. static void eud_release_port(struct uart_port *port)
  400. {
  401. /* Nothing to release */
  402. }
  403. static void eud_config_port(struct uart_port *port, int flags)
  404. {
  405. /* set port type, clear Tx and Rx interrupts */
  406. port->type = PORT_EUD_UART;
  407. writel_relaxed((__force u32)(~EUD_INT_TX | ~EUD_INT_RX),
  408. port->membase + EUD_REG_INT_STATUS_1);
  409. /* Ensure Register Writes Complete */
  410. wmb();
  411. }
  412. static int eud_verify_port(struct uart_port *port,
  413. struct serial_struct *ser)
  414. {
  415. if (ser->type != PORT_UNKNOWN && ser->type != PORT_EUD_UART)
  416. return -EINVAL;
  417. return 0;
  418. }
  419. /* serial functions supported */
  420. static const struct uart_ops eud_uart_ops = {
  421. .tx_empty = eud_tx_empty,
  422. .set_mctrl = eud_set_mctrl,
  423. .get_mctrl = eud_get_mctrl,
  424. .set_termios = eud_set_termios,
  425. .stop_tx = eud_stop_tx,
  426. .start_tx = eud_start_tx,
  427. .stop_rx = eud_stop_rx,
  428. .startup = eud_startup,
  429. .shutdown = eud_shutdown,
  430. .type = eud_type,
  431. .release_port = eud_release_port,
  432. .request_port = eud_request_port,
  433. .config_port = eud_config_port,
  434. .verify_port = eud_verify_port,
  435. };
  436. static struct uart_driver eud_uart_driver = {
  437. .owner = THIS_MODULE,
  438. .driver_name = "msm-eud",
  439. .dev_name = "ttyEUD",
  440. .nr = EUD_NR,
  441. .cons = EUD_CONSOLE,
  442. };
  443. static void eud_uart_rx(struct eud_chip *chip)
  444. {
  445. struct uart_port *port = &chip->port;
  446. u32 reg;
  447. unsigned int len;
  448. unsigned char ch, flag;
  449. int i;
  450. reg = readl_relaxed(chip->eud_reg_base + EUD_REG_COM_RX_ID);
  451. if (reg != UART_ID) {
  452. dev_dbg(chip->dev, "Rx interrupt isn't for us\n");
  453. return;
  454. }
  455. /* Read Rx Len & Data registers */
  456. spin_lock(&port->lock);
  457. len = readl_relaxed(chip->eud_reg_base + EUD_REG_COM_RX_LEN);
  458. for (i = 0; i < len; i++) {
  459. ch = readl_relaxed(chip->eud_reg_base + EUD_REG_COM_RX_DAT);
  460. flag = TTY_NORMAL;
  461. port->icount.rx++;
  462. if (uart_handle_sysrq_char(port, ch))
  463. continue;
  464. uart_insert_char(port, 0, 0, ch, flag);
  465. }
  466. spin_unlock(&port->lock);
  467. tty_flip_buffer_push(&port->state->port);
  468. }
  469. static void eud_uart_tx(struct eud_chip *chip)
  470. {
  471. struct uart_port *port = &chip->port;
  472. struct circ_buf *xmit = &port->state->xmit;
  473. unsigned int len;
  474. u32 reg;
  475. writel_relaxed(UART_ID, chip->eud_reg_base + EUD_REG_COM_TX_ID);
  476. reg = readl_relaxed(chip->eud_reg_base + EUD_REG_COM_TX_ID);
  477. if (reg != UART_ID) {
  478. dev_dbg(chip->dev, "Tx interrupt isn't for us\n");
  479. return;
  480. }
  481. /* Write to Tx Len & Data registers */
  482. spin_lock(&port->lock);
  483. len = uart_circ_chars_pending(xmit);
  484. if (len > 0) {
  485. if (len > port->fifosize)
  486. len = port->fifosize;
  487. while (len--) {
  488. writel_relaxed(xmit->buf[xmit->tail],
  489. port->membase + EUD_REG_COM_TX_DAT);
  490. xmit->tail = (xmit->tail + 1) & (UART_XMIT_SIZE - 1);
  491. port->icount.tx++;
  492. }
  493. }
  494. spin_unlock(&port->lock);
  495. }
  496. static irqreturn_t handle_eud_irq(int irq, void *data)
  497. {
  498. struct eud_chip *chip = data;
  499. u8 reg;
  500. u32 int_mask_en1 = readl_relaxed(chip->eud_reg_base +
  501. EUD_REG_INT1_EN_MASK);
  502. /* read status register and find out which interrupt triggered */
  503. reg = readb_relaxed(chip->eud_reg_base + EUD_REG_INT_STATUS_1);
  504. dev_dbg(chip->dev, "EUD Interrupt is received status:%x\n", reg);
  505. if (reg & EUD_INT_RX) {
  506. dev_dbg(chip->dev, "EUD RX Interrupt is received\n");
  507. eud_uart_rx(chip);
  508. reg &= ~EUD_INT_RX;
  509. }
  510. if (reg & EUD_INT_TX) {
  511. if (EUD_INT_TX & int_mask_en1) {
  512. dev_dbg(chip->dev, "EUD TX Interrupt is received\n");
  513. eud_uart_tx(chip);
  514. }
  515. reg &= ~EUD_INT_TX;
  516. }
  517. if (reg & EUD_INT_VBUS) {
  518. dev_dbg(chip->dev, "EUD VBUS Interrupt is received\n");
  519. chip->int_status = EUD_INT_VBUS;
  520. usb_attach_detach(chip);
  521. reg &= ~EUD_INT_VBUS;
  522. }
  523. if (reg & EUD_INT_CHGR) {
  524. dev_dbg(chip->dev, "EUD CHGR Interrupt is received\n");
  525. chip->int_status = EUD_INT_CHGR;
  526. chgr_enable_disable(chip);
  527. reg &= ~EUD_INT_CHGR;
  528. }
  529. if (reg & EUD_INT_SAFE_MODE) {
  530. dev_dbg(chip->dev, "EUD SAFE MODE Interrupt is received\n");
  531. pet_eud(chip);
  532. reg &= ~EUD_INT_SAFE_MODE;
  533. }
  534. if (reg) {
  535. dev_dbg(chip->dev, "Unhandled EUD interrupt status:%x\n", reg);
  536. return IRQ_NONE;
  537. }
  538. return IRQ_HANDLED;
  539. }
  540. static int msm_eud_suspend(struct device *dev)
  541. {
  542. struct eud_chip *chip = dev_get_drvdata(dev);
  543. if (chip->need_phy_clk_vote && chip->eud_ahb2phy_clk)
  544. clk_disable_unprepare(chip->eud_ahb2phy_clk);
  545. return 0;
  546. }
  547. static int msm_eud_resume(struct device *dev)
  548. {
  549. struct eud_chip *chip = dev_get_drvdata(dev);
  550. int ret = 0;
  551. if (chip->need_phy_clk_vote && chip->eud_ahb2phy_clk) {
  552. ret = clk_prepare_enable(chip->eud_ahb2phy_clk);
  553. if (ret)
  554. dev_err(chip->dev, "%s failed to vote ahb2phy clk %d\n",
  555. __func__, ret);
  556. }
  557. return ret;
  558. }
  559. static int msm_eud_probe(struct platform_device *pdev)
  560. {
  561. struct eud_chip *chip;
  562. struct uart_port *port;
  563. struct resource *res;
  564. int ret;
  565. bool eud_tcsr_check_state;
  566. phys_addr_t eud_tcsr_check;
  567. chip = devm_kzalloc(&pdev->dev, sizeof(*chip), GFP_KERNEL);
  568. if (!chip)
  569. return -ENOMEM;
  570. platform_set_drvdata(pdev, chip);
  571. chip->dev = &pdev->dev;
  572. chip->extcon = devm_extcon_dev_allocate(&pdev->dev, eud_extcon_cable);
  573. if (IS_ERR(chip->extcon)) {
  574. dev_err(chip->dev, "%s: failed to allocate extcon device\n",
  575. __func__);
  576. return PTR_ERR(chip->extcon);
  577. }
  578. ret = devm_extcon_dev_register(&pdev->dev, chip->extcon);
  579. if (ret) {
  580. dev_err(chip->dev, "%s: failed to register extcon device\n",
  581. __func__);
  582. return ret;
  583. }
  584. res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "eud_base");
  585. if (!res) {
  586. dev_err(chip->dev, "%s: failed to get resource eud_base\n",
  587. __func__);
  588. return -ENOMEM;
  589. }
  590. chip->eud_reg_base = devm_ioremap_resource(&pdev->dev, res);
  591. if (IS_ERR(chip->eud_reg_base))
  592. return PTR_ERR(chip->eud_reg_base);
  593. chip->eud_irq = platform_get_irq_byname(pdev, "eud_irq");
  594. chip->secure_eud_en = of_property_read_bool(pdev->dev.of_node,
  595. "qcom,secure-eud-en");
  596. if (chip->secure_eud_en) {
  597. res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  598. "eud_mode_mgr2");
  599. if (!res) {
  600. dev_err(chip->dev,
  601. "%s: failed to get resource eud_mode_mgr2\n",
  602. __func__);
  603. return -ENOMEM;
  604. }
  605. chip->eud_mode_mgr2_phys_base = res->start;
  606. }
  607. chip->need_phy_clk_vote = of_property_read_bool(pdev->dev.of_node,
  608. "qcom,eud-clock-vote-req");
  609. if (chip->need_phy_clk_vote) {
  610. chip->eud_ahb2phy_clk = devm_clk_get(&pdev->dev,
  611. "eud_ahb2phy_clk");
  612. if (IS_ERR(chip->eud_ahb2phy_clk)) {
  613. ret = PTR_ERR(chip->eud_ahb2phy_clk);
  614. return ret;
  615. }
  616. ret = clk_prepare_enable(chip->eud_ahb2phy_clk);
  617. if (ret)
  618. return ret;
  619. }
  620. chip->eud_clkref_clk = devm_clk_get(&pdev->dev, "eud_clkref_clk");
  621. if (IS_ERR(chip->eud_clkref_clk))
  622. chip->eud_clkref_clk = NULL;
  623. ret = devm_request_irq(&pdev->dev, chip->eud_irq, handle_eud_irq,
  624. IRQF_TRIGGER_HIGH, "eud_irq", chip);
  625. if (ret) {
  626. dev_err(chip->dev, "request failed for eud irq\n");
  627. goto error;
  628. }
  629. ret = of_property_read_u16(pdev->dev.of_node, "qcom,eud-utmi-delay",
  630. &chip->utmi_switch_delay);
  631. if (ret || (chip->utmi_switch_delay < EUD_UTMI_DELAY_MIN))
  632. /*
  633. * Leave default POR value if not defined. According to
  634. * EUD team, a zero value written to the UTMI SWITCH delay
  635. * register is not valid. Requires a minimum value of 28.
  636. */
  637. chip->utmi_switch_delay = 0;
  638. device_init_wakeup(&pdev->dev, true);
  639. enable_irq_wake(chip->eud_irq);
  640. INIT_WORK(&chip->eud_work, eud_event_notifier);
  641. pdev->id = 0;
  642. port = &chip->port;
  643. port->line = pdev->id;
  644. port->type = PORT_EUD_UART;
  645. port->dev = chip->dev;
  646. port->fifosize = MAX_FIFO_SIZE;
  647. port->iotype = SERIAL_IO_MEM;
  648. port->flags = UPF_BOOT_AUTOCONF;
  649. port->membase = chip->eud_reg_base;
  650. port->irq = chip->eud_irq;
  651. port->ops = &eud_uart_ops;
  652. /*
  653. * Before enabling EUD, check for TCSR register
  654. * and if present, enable it.
  655. */
  656. eud_tcsr_check_state = of_property_read_bool(
  657. pdev->dev.of_node, "qcom,eud-tcsr-check-enable");
  658. if (eud_tcsr_check_state) {
  659. res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
  660. "eud_tcsr_check_reg");
  661. if (res) {
  662. eud_tcsr_check = res->start;
  663. ret = qcom_scm_io_writel(eud_tcsr_check,
  664. EUD_TCSR_ENABLE_BIT);
  665. if (ret) {
  666. dev_err(&pdev->dev,
  667. "TCSR qcom_scm_io_writel failed with rc:%d\n",
  668. ret);
  669. }
  670. } else {
  671. dev_err(chip->dev,
  672. "Failed to get resource for tcsr check!\n");
  673. goto error;
  674. }
  675. }
  676. if (chip->secure_eud_en && check_eud_mode_mgr2(chip))
  677. enable = 1;
  678. ret = uart_add_one_port(&eud_uart_driver, port);
  679. if (ret) {
  680. dev_err(chip->dev, "failed to add uart port!\n");
  681. goto error;
  682. }
  683. eud_private = pdev;
  684. eud_ready = true;
  685. /* Proceed enable other EUD elements if bootloader has enabled it */
  686. if (msm_eud_hw_is_enabled(pdev)) {
  687. /*
  688. * UEFI USB driver should have already enabled this clock, but
  689. * enable it here as well, so the clk driver can track the use
  690. * count if we disable EUD from the module param.
  691. */
  692. msm_eud_clkref_en(chip, true);
  693. set_eud_utmi_switch_delay(chip);
  694. msm_eud_enable_irqs(chip);
  695. /*
  696. * Set the default cable state to usb connect and charger
  697. * enable
  698. */
  699. ret = extcon_set_state_sync(chip->extcon, EXTCON_USB, true);
  700. if (ret)
  701. dev_warn(&pdev->dev, "Failed to set EXTCON_USB (%d)\n",
  702. ret);
  703. ret = extcon_set_state_sync(chip->extcon,
  704. EXTCON_CHG_USB_SDP, true);
  705. if (ret)
  706. dev_warn(&pdev->dev,
  707. "Failed to set EXTCON_CHG_USB_SDP (%d)\n", ret);
  708. enable = EUD_ENABLE_CMD;
  709. chip->eud_enabled = true;
  710. }
  711. return 0;
  712. error:
  713. if (chip->need_phy_clk_vote && chip->eud_ahb2phy_clk)
  714. clk_disable_unprepare(chip->eud_ahb2phy_clk);
  715. return ret;
  716. }
  717. static int msm_eud_remove(struct platform_device *pdev)
  718. {
  719. struct eud_chip *chip = platform_get_drvdata(pdev);
  720. struct uart_port *port = &chip->port;
  721. if (chip->usb_psy)
  722. power_supply_put(chip->usb_psy);
  723. uart_remove_one_port(&eud_uart_driver, port);
  724. device_init_wakeup(chip->dev, false);
  725. if (chip->need_phy_clk_vote)
  726. clk_disable_unprepare(chip->eud_ahb2phy_clk);
  727. return 0;
  728. }
  729. static const struct of_device_id msm_eud_dt_match[] = {
  730. {.compatible = "qcom,msm-eud"},
  731. {},
  732. };
  733. MODULE_DEVICE_TABLE(of, msm_eud_dt_match);
  734. static const struct dev_pm_ops msm_eud_dev_pm_ops = {
  735. SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(msm_eud_suspend, msm_eud_resume)
  736. };
  737. static struct platform_driver msm_eud_driver = {
  738. .probe = msm_eud_probe,
  739. .remove = msm_eud_remove,
  740. .driver = {
  741. .name = "msm-eud",
  742. .pm = &msm_eud_dev_pm_ops,
  743. .of_match_table = msm_eud_dt_match,
  744. },
  745. };
  746. static int __init msm_eud_init(void)
  747. {
  748. int ret;
  749. ret = uart_register_driver(&eud_uart_driver);
  750. if (ret) {
  751. pr_err("%s: Failed to register EUD UART driver\n",
  752. __func__);
  753. return ret;
  754. }
  755. ret = platform_driver_register(&msm_eud_driver);
  756. if (ret) {
  757. pr_err("%s: Failed to register EUD driver\n",
  758. __func__);
  759. uart_unregister_driver(&eud_uart_driver);
  760. return ret;
  761. }
  762. return 0;
  763. }
  764. module_init(msm_eud_init);
  765. static void __exit msm_eud_exit(void)
  766. {
  767. platform_driver_unregister(&msm_eud_driver);
  768. uart_unregister_driver(&eud_uart_driver);
  769. }
  770. module_exit(msm_eud_exit);
  771. MODULE_DESCRIPTION("QTI EUD driver");
  772. MODULE_LICENSE("GPL");