dp_usbpd.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2012-2019, The Linux Foundation. All rights reserved.
  4. */
  5. #include <linux/usb/usbpd.h>
  6. #include <linux/slab.h>
  7. #include <linux/device.h>
  8. #include <linux/delay.h>
  9. #include "dp_usbpd.h"
  10. #include "dp_debug.h"
  11. /* DP specific VDM commands */
  12. #define DP_USBPD_VDM_STATUS 0x10
  13. #define DP_USBPD_VDM_CONFIGURE 0x11
  14. /* USBPD-TypeC specific Macros */
  15. #define VDM_VERSION 0x0
  16. #define USB_C_DP_SID 0xFF01
  17. enum dp_usbpd_pin_assignment {
  18. DP_USBPD_PIN_A,
  19. DP_USBPD_PIN_B,
  20. DP_USBPD_PIN_C,
  21. DP_USBPD_PIN_D,
  22. DP_USBPD_PIN_E,
  23. DP_USBPD_PIN_F,
  24. DP_USBPD_PIN_MAX,
  25. };
  26. enum dp_usbpd_events {
  27. DP_USBPD_EVT_DISCOVER,
  28. DP_USBPD_EVT_ENTER,
  29. DP_USBPD_EVT_STATUS,
  30. DP_USBPD_EVT_CONFIGURE,
  31. DP_USBPD_EVT_CC_PIN_POLARITY,
  32. DP_USBPD_EVT_EXIT,
  33. DP_USBPD_EVT_ATTENTION,
  34. };
  35. enum dp_usbpd_alt_mode {
  36. DP_USBPD_ALT_MODE_NONE = 0,
  37. DP_USBPD_ALT_MODE_INIT = BIT(0),
  38. DP_USBPD_ALT_MODE_DISCOVER = BIT(1),
  39. DP_USBPD_ALT_MODE_ENTER = BIT(2),
  40. DP_USBPD_ALT_MODE_STATUS = BIT(3),
  41. DP_USBPD_ALT_MODE_CONFIGURE = BIT(4),
  42. };
  43. struct dp_usbpd_capabilities {
  44. enum dp_usbpd_port port;
  45. bool receptacle_state;
  46. u8 ulink_pin_config;
  47. u8 dlink_pin_config;
  48. };
  49. struct dp_usbpd_private {
  50. bool forced_disconnect;
  51. u32 vdo;
  52. struct device *dev;
  53. struct usbpd *pd;
  54. struct usbpd_svid_handler svid_handler;
  55. struct dp_hpd_cb *dp_cb;
  56. struct dp_usbpd_capabilities cap;
  57. struct dp_usbpd dp_usbpd;
  58. enum dp_usbpd_alt_mode alt_mode;
  59. u32 dp_usbpd_config;
  60. };
  61. static const char *dp_usbpd_pin_name(u8 pin)
  62. {
  63. switch (pin) {
  64. case DP_USBPD_PIN_A: return "DP_USBPD_PIN_ASSIGNMENT_A";
  65. case DP_USBPD_PIN_B: return "DP_USBPD_PIN_ASSIGNMENT_B";
  66. case DP_USBPD_PIN_C: return "DP_USBPD_PIN_ASSIGNMENT_C";
  67. case DP_USBPD_PIN_D: return "DP_USBPD_PIN_ASSIGNMENT_D";
  68. case DP_USBPD_PIN_E: return "DP_USBPD_PIN_ASSIGNMENT_E";
  69. case DP_USBPD_PIN_F: return "DP_USBPD_PIN_ASSIGNMENT_F";
  70. default: return "UNKNOWN";
  71. }
  72. }
  73. static const char *dp_usbpd_port_name(enum dp_usbpd_port port)
  74. {
  75. switch (port) {
  76. case DP_USBPD_PORT_NONE: return "DP_USBPD_PORT_NONE";
  77. case DP_USBPD_PORT_UFP_D: return "DP_USBPD_PORT_UFP_D";
  78. case DP_USBPD_PORT_DFP_D: return "DP_USBPD_PORT_DFP_D";
  79. case DP_USBPD_PORT_D_UFP_D: return "DP_USBPD_PORT_D_UFP_D";
  80. default: return "DP_USBPD_PORT_NONE";
  81. }
  82. }
  83. static const char *dp_usbpd_cmd_name(u8 cmd)
  84. {
  85. switch (cmd) {
  86. case USBPD_SVDM_DISCOVER_MODES: return "USBPD_SVDM_DISCOVER_MODES";
  87. case USBPD_SVDM_ENTER_MODE: return "USBPD_SVDM_ENTER_MODE";
  88. case USBPD_SVDM_ATTENTION: return "USBPD_SVDM_ATTENTION";
  89. case DP_USBPD_VDM_STATUS: return "DP_USBPD_VDM_STATUS";
  90. case DP_USBPD_VDM_CONFIGURE: return "DP_USBPD_VDM_CONFIGURE";
  91. default: return "DP_USBPD_VDM_ERROR";
  92. }
  93. }
  94. static void dp_usbpd_init_port(enum dp_usbpd_port *port, u32 in_port)
  95. {
  96. switch (in_port) {
  97. case 0:
  98. *port = DP_USBPD_PORT_NONE;
  99. break;
  100. case 1:
  101. *port = DP_USBPD_PORT_UFP_D;
  102. break;
  103. case 2:
  104. *port = DP_USBPD_PORT_DFP_D;
  105. break;
  106. case 3:
  107. *port = DP_USBPD_PORT_D_UFP_D;
  108. break;
  109. default:
  110. *port = DP_USBPD_PORT_NONE;
  111. }
  112. DP_DEBUG("port:%s\n", dp_usbpd_port_name(*port));
  113. }
  114. static void dp_usbpd_get_capabilities(struct dp_usbpd_private *pd)
  115. {
  116. struct dp_usbpd_capabilities *cap = &pd->cap;
  117. u32 buf = pd->vdo;
  118. int port = buf & 0x3;
  119. cap->receptacle_state = (buf & BIT(6)) ? true : false;
  120. cap->dlink_pin_config = (buf >> 8) & 0xff;
  121. cap->ulink_pin_config = (buf >> 16) & 0xff;
  122. dp_usbpd_init_port(&cap->port, port);
  123. }
  124. static void dp_usbpd_get_status(struct dp_usbpd_private *pd)
  125. {
  126. struct dp_usbpd *status = &pd->dp_usbpd;
  127. u32 buf = pd->vdo;
  128. int port = buf & 0x3;
  129. status->low_pow_st = (buf & BIT(2)) ? true : false;
  130. status->adaptor_dp_en = (buf & BIT(3)) ? true : false;
  131. status->base.multi_func = (buf & BIT(4)) ? true : false;
  132. status->usb_config_req = (buf & BIT(5)) ? true : false;
  133. status->exit_dp_mode = (buf & BIT(6)) ? true : false;
  134. status->base.hpd_high = (buf & BIT(7)) ? true : false;
  135. status->base.hpd_irq = (buf & BIT(8)) ? true : false;
  136. DP_DEBUG("low_pow_st = %d, adaptor_dp_en = %d, multi_func = %d\n",
  137. status->low_pow_st, status->adaptor_dp_en,
  138. status->base.multi_func);
  139. DP_DEBUG("usb_config_req = %d, exit_dp_mode = %d, hpd_high =%d\n",
  140. status->usb_config_req,
  141. status->exit_dp_mode, status->base.hpd_high);
  142. DP_DEBUG("hpd_irq = %d\n", status->base.hpd_irq);
  143. dp_usbpd_init_port(&status->port, port);
  144. }
  145. static u32 dp_usbpd_gen_config_pkt(struct dp_usbpd_private *pd)
  146. {
  147. u8 pin_cfg, pin;
  148. u32 config = 0;
  149. const u32 ufp_d_config = 0x2, dp_ver = 0x1;
  150. if (pd->cap.receptacle_state)
  151. pin_cfg = pd->cap.ulink_pin_config;
  152. else
  153. pin_cfg = pd->cap.dlink_pin_config;
  154. for (pin = DP_USBPD_PIN_A; pin < DP_USBPD_PIN_MAX; pin++) {
  155. if (pin_cfg & BIT(pin)) {
  156. if (pd->dp_usbpd.base.multi_func) {
  157. if (pin == DP_USBPD_PIN_D)
  158. break;
  159. } else {
  160. break;
  161. }
  162. }
  163. }
  164. if (pin == DP_USBPD_PIN_MAX)
  165. pin = DP_USBPD_PIN_C;
  166. DP_DEBUG("pin assignment: %s\n", dp_usbpd_pin_name(pin));
  167. config |= BIT(pin) << 8;
  168. config |= (dp_ver << 2);
  169. config |= ufp_d_config;
  170. DP_DEBUG("config = 0x%x\n", config);
  171. return config;
  172. }
  173. static void dp_usbpd_send_event(struct dp_usbpd_private *pd,
  174. enum dp_usbpd_events event)
  175. {
  176. u32 config;
  177. switch (event) {
  178. case DP_USBPD_EVT_DISCOVER:
  179. usbpd_send_svdm(pd->pd, USB_C_DP_SID,
  180. USBPD_SVDM_DISCOVER_MODES,
  181. SVDM_CMD_TYPE_INITIATOR, 0x0, 0x0, 0x0);
  182. break;
  183. case DP_USBPD_EVT_ENTER:
  184. usbpd_send_svdm(pd->pd, USB_C_DP_SID,
  185. USBPD_SVDM_ENTER_MODE,
  186. SVDM_CMD_TYPE_INITIATOR, 0x1, 0x0, 0x0);
  187. break;
  188. case DP_USBPD_EVT_EXIT:
  189. usbpd_send_svdm(pd->pd, USB_C_DP_SID,
  190. USBPD_SVDM_EXIT_MODE,
  191. SVDM_CMD_TYPE_INITIATOR, 0x1, 0x0, 0x0);
  192. break;
  193. case DP_USBPD_EVT_STATUS:
  194. config = 0x1; /* DFP_D connected */
  195. usbpd_send_svdm(pd->pd, USB_C_DP_SID, DP_USBPD_VDM_STATUS,
  196. SVDM_CMD_TYPE_INITIATOR, 0x1, &config, 0x1);
  197. break;
  198. case DP_USBPD_EVT_CONFIGURE:
  199. config = dp_usbpd_gen_config_pkt(pd);
  200. usbpd_send_svdm(pd->pd, USB_C_DP_SID, DP_USBPD_VDM_CONFIGURE,
  201. SVDM_CMD_TYPE_INITIATOR, 0x1, &config, 0x1);
  202. break;
  203. default:
  204. DP_ERR("unknown event:%d\n", event);
  205. }
  206. }
  207. static void dp_usbpd_connect_cb(struct usbpd_svid_handler *hdlr,
  208. bool peer_usb_comm)
  209. {
  210. struct dp_usbpd_private *pd;
  211. pd = container_of(hdlr, struct dp_usbpd_private, svid_handler);
  212. if (!pd) {
  213. DP_ERR("get_usbpd phandle failed\n");
  214. return;
  215. }
  216. DP_DEBUG("peer_usb_comm: %d\n");
  217. pd->dp_usbpd.base.peer_usb_comm = peer_usb_comm;
  218. dp_usbpd_send_event(pd, DP_USBPD_EVT_DISCOVER);
  219. }
  220. static void dp_usbpd_disconnect_cb(struct usbpd_svid_handler *hdlr)
  221. {
  222. struct dp_usbpd_private *pd;
  223. pd = container_of(hdlr, struct dp_usbpd_private, svid_handler);
  224. if (!pd) {
  225. DP_ERR("get_usbpd phandle failed\n");
  226. return;
  227. }
  228. pd->alt_mode = DP_USBPD_ALT_MODE_NONE;
  229. pd->dp_usbpd.base.alt_mode_cfg_done = false;
  230. DP_DEBUG("\n");
  231. if (pd->dp_cb && pd->dp_cb->disconnect)
  232. pd->dp_cb->disconnect(pd->dev);
  233. }
  234. static int dp_usbpd_validate_callback(u8 cmd,
  235. enum usbpd_svdm_cmd_type cmd_type, int num_vdos)
  236. {
  237. int ret = 0;
  238. if (cmd_type == SVDM_CMD_TYPE_RESP_NAK) {
  239. DP_ERR("error: NACK\n");
  240. ret = -EINVAL;
  241. goto end;
  242. }
  243. if (cmd_type == SVDM_CMD_TYPE_RESP_BUSY) {
  244. DP_ERR("error: BUSY\n");
  245. ret = -EBUSY;
  246. goto end;
  247. }
  248. if (cmd == USBPD_SVDM_ATTENTION) {
  249. if (cmd_type != SVDM_CMD_TYPE_INITIATOR) {
  250. DP_ERR("error: invalid cmd type for attention\n");
  251. ret = -EINVAL;
  252. goto end;
  253. }
  254. if (!num_vdos) {
  255. DP_ERR("error: no vdo provided\n");
  256. ret = -EINVAL;
  257. goto end;
  258. }
  259. } else {
  260. if (cmd_type != SVDM_CMD_TYPE_RESP_ACK) {
  261. DP_ERR("error: invalid cmd type\n");
  262. ret = -EINVAL;
  263. }
  264. }
  265. end:
  266. return ret;
  267. }
  268. static int dp_usbpd_get_ss_lanes(struct dp_usbpd_private *pd)
  269. {
  270. int rc = 0;
  271. int timeout = 250;
  272. /*
  273. * By default, USB reserves two lanes for Super Speed.
  274. * Which means DP has remaining two lanes to operate on.
  275. * If multi-function is not supported, request USB to
  276. * release the Super Speed lanes so that DP can use
  277. * all four lanes in case DPCD indicates support for
  278. * four lanes.
  279. */
  280. if (!pd->dp_usbpd.base.multi_func) {
  281. while (timeout) {
  282. rc = pd->svid_handler.request_usb_ss_lane(
  283. pd->pd, &pd->svid_handler);
  284. if (rc != -EBUSY)
  285. break;
  286. DP_WARN("USB busy, retry\n");
  287. /* wait for hw recommended delay for usb */
  288. msleep(20);
  289. timeout--;
  290. }
  291. }
  292. return rc;
  293. }
  294. static void dp_usbpd_response_cb(struct usbpd_svid_handler *hdlr, u8 cmd,
  295. enum usbpd_svdm_cmd_type cmd_type,
  296. const u32 *vdos, int num_vdos)
  297. {
  298. struct dp_usbpd_private *pd;
  299. int rc = 0;
  300. pd = container_of(hdlr, struct dp_usbpd_private, svid_handler);
  301. DP_DEBUG("callback -> cmd: %s, *vdos = 0x%x, num_vdos = %d\n",
  302. dp_usbpd_cmd_name(cmd), *vdos, num_vdos);
  303. if (dp_usbpd_validate_callback(cmd, cmd_type, num_vdos)) {
  304. DP_DEBUG("invalid callback received\n");
  305. return;
  306. }
  307. switch (cmd) {
  308. case USBPD_SVDM_DISCOVER_MODES:
  309. pd->vdo = *vdos;
  310. dp_usbpd_get_capabilities(pd);
  311. pd->alt_mode |= DP_USBPD_ALT_MODE_DISCOVER;
  312. if (pd->cap.port & BIT(0))
  313. dp_usbpd_send_event(pd, DP_USBPD_EVT_ENTER);
  314. break;
  315. case USBPD_SVDM_ENTER_MODE:
  316. pd->alt_mode |= DP_USBPD_ALT_MODE_ENTER;
  317. dp_usbpd_send_event(pd, DP_USBPD_EVT_STATUS);
  318. break;
  319. case USBPD_SVDM_ATTENTION:
  320. if (pd->forced_disconnect)
  321. break;
  322. pd->vdo = *vdos;
  323. dp_usbpd_get_status(pd);
  324. if (!pd->dp_usbpd.base.alt_mode_cfg_done) {
  325. if (pd->dp_usbpd.port & BIT(1))
  326. dp_usbpd_send_event(pd, DP_USBPD_EVT_CONFIGURE);
  327. break;
  328. }
  329. if (pd->dp_cb && pd->dp_cb->attention)
  330. pd->dp_cb->attention(pd->dev);
  331. break;
  332. case DP_USBPD_VDM_STATUS:
  333. pd->vdo = *vdos;
  334. dp_usbpd_get_status(pd);
  335. if (!(pd->alt_mode & DP_USBPD_ALT_MODE_CONFIGURE)) {
  336. pd->alt_mode |= DP_USBPD_ALT_MODE_STATUS;
  337. if (pd->dp_usbpd.port & BIT(1))
  338. dp_usbpd_send_event(pd, DP_USBPD_EVT_CONFIGURE);
  339. }
  340. break;
  341. case DP_USBPD_VDM_CONFIGURE:
  342. pd->alt_mode |= DP_USBPD_ALT_MODE_CONFIGURE;
  343. pd->dp_usbpd.base.alt_mode_cfg_done = true;
  344. dp_usbpd_get_status(pd);
  345. pd->dp_usbpd.base.orientation =
  346. usbpd_get_plug_orientation(pd->pd);
  347. rc = dp_usbpd_get_ss_lanes(pd);
  348. if (rc) {
  349. DP_ERR("failed to get SuperSpeed lanes\n");
  350. break;
  351. }
  352. if (pd->dp_cb && pd->dp_cb->configure)
  353. pd->dp_cb->configure(pd->dev);
  354. break;
  355. default:
  356. DP_ERR("unknown cmd: %d\n", cmd);
  357. break;
  358. }
  359. }
  360. static int dp_usbpd_simulate_connect(struct dp_hpd *dp_hpd, bool hpd)
  361. {
  362. int rc = 0;
  363. struct dp_usbpd *dp_usbpd;
  364. struct dp_usbpd_private *pd;
  365. if (!dp_hpd) {
  366. DP_ERR("invalid input\n");
  367. rc = -EINVAL;
  368. goto error;
  369. }
  370. dp_usbpd = container_of(dp_hpd, struct dp_usbpd, base);
  371. pd = container_of(dp_usbpd, struct dp_usbpd_private, dp_usbpd);
  372. dp_usbpd->base.hpd_high = hpd;
  373. pd->forced_disconnect = !hpd;
  374. pd->dp_usbpd.base.alt_mode_cfg_done = hpd;
  375. DP_DEBUG("hpd_high=%d, forced_disconnect=%d, orientation=%d\n",
  376. dp_usbpd->base.hpd_high, pd->forced_disconnect,
  377. pd->dp_usbpd.base.orientation);
  378. if (hpd)
  379. pd->dp_cb->configure(pd->dev);
  380. else
  381. pd->dp_cb->disconnect(pd->dev);
  382. error:
  383. return rc;
  384. }
  385. static int dp_usbpd_simulate_attention(struct dp_hpd *dp_hpd, int vdo)
  386. {
  387. int rc = 0;
  388. struct dp_usbpd *dp_usbpd;
  389. struct dp_usbpd_private *pd;
  390. dp_usbpd = container_of(dp_hpd, struct dp_usbpd, base);
  391. if (!dp_usbpd) {
  392. DP_ERR("invalid input\n");
  393. rc = -EINVAL;
  394. goto error;
  395. }
  396. pd = container_of(dp_usbpd, struct dp_usbpd_private, dp_usbpd);
  397. pd->vdo = vdo;
  398. dp_usbpd_get_status(pd);
  399. if (pd->dp_cb && pd->dp_cb->attention)
  400. pd->dp_cb->attention(pd->dev);
  401. error:
  402. return rc;
  403. }
  404. int dp_usbpd_register(struct dp_hpd *dp_hpd)
  405. {
  406. struct dp_usbpd *dp_usbpd;
  407. struct dp_usbpd_private *usbpd;
  408. int rc = 0;
  409. if (!dp_hpd)
  410. return -EINVAL;
  411. dp_usbpd = container_of(dp_hpd, struct dp_usbpd, base);
  412. usbpd = container_of(dp_usbpd, struct dp_usbpd_private, dp_usbpd);
  413. rc = usbpd_register_svid(usbpd->pd, &usbpd->svid_handler);
  414. if (rc)
  415. DP_ERR("pd registration failed\n");
  416. return rc;
  417. }
  418. static void dp_usbpd_wakeup_phy(struct dp_hpd *dp_hpd, bool wakeup)
  419. {
  420. struct dp_usbpd *dp_usbpd;
  421. struct dp_usbpd_private *usbpd;
  422. dp_usbpd = container_of(dp_hpd, struct dp_usbpd, base);
  423. usbpd = container_of(dp_usbpd, struct dp_usbpd_private, dp_usbpd);
  424. if (!usbpd->pd) {
  425. DP_ERR("usbpd pointer invalid");
  426. return;
  427. }
  428. usbpd_vdm_in_suspend(usbpd->pd, wakeup);
  429. }
  430. struct dp_hpd *dp_usbpd_get(struct device *dev, struct dp_hpd_cb *cb)
  431. {
  432. int rc = 0;
  433. const char *pd_phandle = "qcom,dp-usbpd-detection";
  434. struct usbpd *pd = NULL;
  435. struct dp_usbpd_private *usbpd;
  436. struct dp_usbpd *dp_usbpd;
  437. struct usbpd_svid_handler svid_handler = {
  438. .svid = USB_C_DP_SID,
  439. .vdm_received = NULL,
  440. .connect = &dp_usbpd_connect_cb,
  441. .svdm_received = &dp_usbpd_response_cb,
  442. .disconnect = &dp_usbpd_disconnect_cb,
  443. };
  444. if (!cb) {
  445. DP_ERR("invalid cb data\n");
  446. rc = -EINVAL;
  447. goto error;
  448. }
  449. pd = devm_usbpd_get_by_phandle(dev, pd_phandle);
  450. if (IS_ERR(pd)) {
  451. DP_ERR("usbpd phandle failed (%ld)\n", PTR_ERR(pd));
  452. rc = PTR_ERR(pd);
  453. goto error;
  454. }
  455. usbpd = devm_kzalloc(dev, sizeof(*usbpd), GFP_KERNEL);
  456. if (!usbpd) {
  457. rc = -ENOMEM;
  458. goto error;
  459. }
  460. usbpd->dev = dev;
  461. usbpd->pd = pd;
  462. usbpd->svid_handler = svid_handler;
  463. usbpd->dp_cb = cb;
  464. dp_usbpd = &usbpd->dp_usbpd;
  465. dp_usbpd->base.simulate_connect = dp_usbpd_simulate_connect;
  466. dp_usbpd->base.simulate_attention = dp_usbpd_simulate_attention;
  467. dp_usbpd->base.register_hpd = dp_usbpd_register;
  468. dp_usbpd->base.wakeup_phy = dp_usbpd_wakeup_phy;
  469. return &dp_usbpd->base;
  470. error:
  471. return ERR_PTR(rc);
  472. }
  473. void dp_usbpd_put(struct dp_hpd *dp_hpd)
  474. {
  475. struct dp_usbpd *dp_usbpd;
  476. struct dp_usbpd_private *usbpd;
  477. dp_usbpd = container_of(dp_hpd, struct dp_usbpd, base);
  478. if (!dp_usbpd)
  479. return;
  480. usbpd = container_of(dp_usbpd, struct dp_usbpd_private, dp_usbpd);
  481. usbpd_unregister_svid(usbpd->pd, &usbpd->svid_handler);
  482. devm_kfree(usbpd->dev, usbpd);
  483. }