dp_usbpd.c 14 KB

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