aspeed-uart-routing.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /*
  3. * Copyright (c) 2018 Google LLC
  4. * Copyright (c) 2021 Aspeed Technology Inc.
  5. */
  6. #include <linux/device.h>
  7. #include <linux/module.h>
  8. #include <linux/of.h>
  9. #include <linux/mfd/syscon.h>
  10. #include <linux/regmap.h>
  11. #include <linux/platform_device.h>
  12. /* register offsets */
  13. #define HICR9 0x98
  14. #define HICRA 0x9c
  15. /* attributes options */
  16. #define UART_ROUTING_IO1 "io1"
  17. #define UART_ROUTING_IO2 "io2"
  18. #define UART_ROUTING_IO3 "io3"
  19. #define UART_ROUTING_IO4 "io4"
  20. #define UART_ROUTING_IO5 "io5"
  21. #define UART_ROUTING_IO6 "io6"
  22. #define UART_ROUTING_IO10 "io10"
  23. #define UART_ROUTING_UART1 "uart1"
  24. #define UART_ROUTING_UART2 "uart2"
  25. #define UART_ROUTING_UART3 "uart3"
  26. #define UART_ROUTING_UART4 "uart4"
  27. #define UART_ROUTING_UART5 "uart5"
  28. #define UART_ROUTING_UART6 "uart6"
  29. #define UART_ROUTING_UART10 "uart10"
  30. #define UART_ROUTING_RES "reserved"
  31. struct aspeed_uart_routing {
  32. struct regmap *map;
  33. struct attribute_group const *attr_grp;
  34. };
  35. struct aspeed_uart_routing_selector {
  36. struct device_attribute dev_attr;
  37. uint8_t reg;
  38. uint8_t mask;
  39. uint8_t shift;
  40. const char *const options[];
  41. };
  42. #define to_routing_selector(_dev_attr) \
  43. container_of(_dev_attr, struct aspeed_uart_routing_selector, dev_attr)
  44. static ssize_t aspeed_uart_routing_show(struct device *dev,
  45. struct device_attribute *attr,
  46. char *buf);
  47. static ssize_t aspeed_uart_routing_store(struct device *dev,
  48. struct device_attribute *attr,
  49. const char *buf, size_t count);
  50. #define ROUTING_ATTR(_name) { \
  51. .attr = {.name = _name, \
  52. .mode = VERIFY_OCTAL_PERMISSIONS(0644) }, \
  53. .show = aspeed_uart_routing_show, \
  54. .store = aspeed_uart_routing_store, \
  55. }
  56. /* routing selector for AST25xx */
  57. static struct aspeed_uart_routing_selector ast2500_io6_sel = {
  58. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO6),
  59. .reg = HICR9,
  60. .shift = 8,
  61. .mask = 0xf,
  62. .options = {
  63. UART_ROUTING_UART1,
  64. UART_ROUTING_UART2,
  65. UART_ROUTING_UART3,
  66. UART_ROUTING_UART4,
  67. UART_ROUTING_UART5,
  68. UART_ROUTING_IO1,
  69. UART_ROUTING_IO2,
  70. UART_ROUTING_IO3,
  71. UART_ROUTING_IO4,
  72. UART_ROUTING_IO5,
  73. NULL,
  74. },
  75. };
  76. static struct aspeed_uart_routing_selector ast2500_uart5_sel = {
  77. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART5),
  78. .reg = HICRA,
  79. .shift = 28,
  80. .mask = 0xf,
  81. .options = {
  82. UART_ROUTING_IO5,
  83. UART_ROUTING_IO1,
  84. UART_ROUTING_IO2,
  85. UART_ROUTING_IO3,
  86. UART_ROUTING_IO4,
  87. UART_ROUTING_UART1,
  88. UART_ROUTING_UART2,
  89. UART_ROUTING_UART3,
  90. UART_ROUTING_UART4,
  91. UART_ROUTING_IO6,
  92. NULL,
  93. },
  94. };
  95. static struct aspeed_uart_routing_selector ast2500_uart4_sel = {
  96. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART4),
  97. .reg = HICRA,
  98. .shift = 25,
  99. .mask = 0x7,
  100. .options = {
  101. UART_ROUTING_IO4,
  102. UART_ROUTING_IO1,
  103. UART_ROUTING_IO2,
  104. UART_ROUTING_IO3,
  105. UART_ROUTING_UART1,
  106. UART_ROUTING_UART2,
  107. UART_ROUTING_UART3,
  108. UART_ROUTING_IO6,
  109. NULL,
  110. },
  111. };
  112. static struct aspeed_uart_routing_selector ast2500_uart3_sel = {
  113. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
  114. .reg = HICRA,
  115. .shift = 22,
  116. .mask = 0x7,
  117. .options = {
  118. UART_ROUTING_IO3,
  119. UART_ROUTING_IO4,
  120. UART_ROUTING_IO1,
  121. UART_ROUTING_IO2,
  122. UART_ROUTING_UART4,
  123. UART_ROUTING_UART1,
  124. UART_ROUTING_UART2,
  125. UART_ROUTING_IO6,
  126. NULL,
  127. },
  128. };
  129. static struct aspeed_uart_routing_selector ast2500_uart2_sel = {
  130. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
  131. .reg = HICRA,
  132. .shift = 19,
  133. .mask = 0x7,
  134. .options = {
  135. UART_ROUTING_IO2,
  136. UART_ROUTING_IO3,
  137. UART_ROUTING_IO4,
  138. UART_ROUTING_IO1,
  139. UART_ROUTING_UART3,
  140. UART_ROUTING_UART4,
  141. UART_ROUTING_UART1,
  142. UART_ROUTING_IO6,
  143. NULL,
  144. },
  145. };
  146. static struct aspeed_uart_routing_selector ast2500_uart1_sel = {
  147. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
  148. .reg = HICRA,
  149. .shift = 16,
  150. .mask = 0x7,
  151. .options = {
  152. UART_ROUTING_IO1,
  153. UART_ROUTING_IO2,
  154. UART_ROUTING_IO3,
  155. UART_ROUTING_IO4,
  156. UART_ROUTING_UART2,
  157. UART_ROUTING_UART3,
  158. UART_ROUTING_UART4,
  159. UART_ROUTING_IO6,
  160. NULL,
  161. },
  162. };
  163. static struct aspeed_uart_routing_selector ast2500_io5_sel = {
  164. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO5),
  165. .reg = HICRA,
  166. .shift = 12,
  167. .mask = 0x7,
  168. .options = {
  169. UART_ROUTING_UART5,
  170. UART_ROUTING_UART1,
  171. UART_ROUTING_UART2,
  172. UART_ROUTING_UART3,
  173. UART_ROUTING_UART4,
  174. UART_ROUTING_IO1,
  175. UART_ROUTING_IO3,
  176. UART_ROUTING_IO6,
  177. NULL,
  178. },
  179. };
  180. static struct aspeed_uart_routing_selector ast2500_io4_sel = {
  181. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO4),
  182. .reg = HICRA,
  183. .shift = 9,
  184. .mask = 0x7,
  185. .options = {
  186. UART_ROUTING_UART4,
  187. UART_ROUTING_UART5,
  188. UART_ROUTING_UART1,
  189. UART_ROUTING_UART2,
  190. UART_ROUTING_UART3,
  191. UART_ROUTING_IO1,
  192. UART_ROUTING_IO2,
  193. UART_ROUTING_IO6,
  194. NULL,
  195. },
  196. };
  197. static struct aspeed_uart_routing_selector ast2500_io3_sel = {
  198. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
  199. .reg = HICRA,
  200. .shift = 6,
  201. .mask = 0x7,
  202. .options = {
  203. UART_ROUTING_UART3,
  204. UART_ROUTING_UART4,
  205. UART_ROUTING_UART5,
  206. UART_ROUTING_UART1,
  207. UART_ROUTING_UART2,
  208. UART_ROUTING_IO1,
  209. UART_ROUTING_IO2,
  210. UART_ROUTING_IO6,
  211. NULL,
  212. },
  213. };
  214. static struct aspeed_uart_routing_selector ast2500_io2_sel = {
  215. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
  216. .reg = HICRA,
  217. .shift = 3,
  218. .mask = 0x7,
  219. .options = {
  220. UART_ROUTING_UART2,
  221. UART_ROUTING_UART3,
  222. UART_ROUTING_UART4,
  223. UART_ROUTING_UART5,
  224. UART_ROUTING_UART1,
  225. UART_ROUTING_IO3,
  226. UART_ROUTING_IO4,
  227. UART_ROUTING_IO6,
  228. NULL,
  229. },
  230. };
  231. static struct aspeed_uart_routing_selector ast2500_io1_sel = {
  232. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
  233. .reg = HICRA,
  234. .shift = 0,
  235. .mask = 0x7,
  236. .options = {
  237. UART_ROUTING_UART1,
  238. UART_ROUTING_UART2,
  239. UART_ROUTING_UART3,
  240. UART_ROUTING_UART4,
  241. UART_ROUTING_UART5,
  242. UART_ROUTING_IO3,
  243. UART_ROUTING_IO4,
  244. UART_ROUTING_IO6,
  245. NULL,
  246. },
  247. };
  248. static struct attribute *ast2500_uart_routing_attrs[] = {
  249. &ast2500_io6_sel.dev_attr.attr,
  250. &ast2500_uart5_sel.dev_attr.attr,
  251. &ast2500_uart4_sel.dev_attr.attr,
  252. &ast2500_uart3_sel.dev_attr.attr,
  253. &ast2500_uart2_sel.dev_attr.attr,
  254. &ast2500_uart1_sel.dev_attr.attr,
  255. &ast2500_io5_sel.dev_attr.attr,
  256. &ast2500_io4_sel.dev_attr.attr,
  257. &ast2500_io3_sel.dev_attr.attr,
  258. &ast2500_io2_sel.dev_attr.attr,
  259. &ast2500_io1_sel.dev_attr.attr,
  260. NULL,
  261. };
  262. static const struct attribute_group ast2500_uart_routing_attr_group = {
  263. .attrs = ast2500_uart_routing_attrs,
  264. };
  265. /* routing selector for AST26xx */
  266. static struct aspeed_uart_routing_selector ast2600_uart10_sel = {
  267. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART10),
  268. .reg = HICR9,
  269. .shift = 12,
  270. .mask = 0xf,
  271. .options = {
  272. UART_ROUTING_IO10,
  273. UART_ROUTING_IO1,
  274. UART_ROUTING_IO2,
  275. UART_ROUTING_IO3,
  276. UART_ROUTING_IO4,
  277. UART_ROUTING_RES,
  278. UART_ROUTING_UART1,
  279. UART_ROUTING_UART2,
  280. UART_ROUTING_UART3,
  281. UART_ROUTING_UART4,
  282. NULL,
  283. },
  284. };
  285. static struct aspeed_uart_routing_selector ast2600_io10_sel = {
  286. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO10),
  287. .reg = HICR9,
  288. .shift = 8,
  289. .mask = 0xf,
  290. .options = {
  291. UART_ROUTING_UART1,
  292. UART_ROUTING_UART2,
  293. UART_ROUTING_UART3,
  294. UART_ROUTING_UART4,
  295. UART_ROUTING_RES,
  296. UART_ROUTING_IO1,
  297. UART_ROUTING_IO2,
  298. UART_ROUTING_IO3,
  299. UART_ROUTING_IO4,
  300. UART_ROUTING_RES,
  301. UART_ROUTING_UART10,
  302. NULL,
  303. },
  304. };
  305. static struct aspeed_uart_routing_selector ast2600_uart4_sel = {
  306. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART4),
  307. .reg = HICRA,
  308. .shift = 25,
  309. .mask = 0x7,
  310. .options = {
  311. UART_ROUTING_IO4,
  312. UART_ROUTING_IO1,
  313. UART_ROUTING_IO2,
  314. UART_ROUTING_IO3,
  315. UART_ROUTING_UART1,
  316. UART_ROUTING_UART2,
  317. UART_ROUTING_UART3,
  318. UART_ROUTING_IO10,
  319. NULL,
  320. },
  321. };
  322. static struct aspeed_uart_routing_selector ast2600_uart3_sel = {
  323. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
  324. .reg = HICRA,
  325. .shift = 22,
  326. .mask = 0x7,
  327. .options = {
  328. UART_ROUTING_IO3,
  329. UART_ROUTING_IO4,
  330. UART_ROUTING_IO1,
  331. UART_ROUTING_IO2,
  332. UART_ROUTING_UART4,
  333. UART_ROUTING_UART1,
  334. UART_ROUTING_UART2,
  335. UART_ROUTING_IO10,
  336. NULL,
  337. },
  338. };
  339. static struct aspeed_uart_routing_selector ast2600_uart2_sel = {
  340. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
  341. .reg = HICRA,
  342. .shift = 19,
  343. .mask = 0x7,
  344. .options = {
  345. UART_ROUTING_IO2,
  346. UART_ROUTING_IO3,
  347. UART_ROUTING_IO4,
  348. UART_ROUTING_IO1,
  349. UART_ROUTING_UART3,
  350. UART_ROUTING_UART4,
  351. UART_ROUTING_UART1,
  352. UART_ROUTING_IO10,
  353. NULL,
  354. },
  355. };
  356. static struct aspeed_uart_routing_selector ast2600_uart1_sel = {
  357. .dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
  358. .reg = HICRA,
  359. .shift = 16,
  360. .mask = 0x7,
  361. .options = {
  362. UART_ROUTING_IO1,
  363. UART_ROUTING_IO2,
  364. UART_ROUTING_IO3,
  365. UART_ROUTING_IO4,
  366. UART_ROUTING_UART2,
  367. UART_ROUTING_UART3,
  368. UART_ROUTING_UART4,
  369. UART_ROUTING_IO10,
  370. NULL,
  371. },
  372. };
  373. static struct aspeed_uart_routing_selector ast2600_io4_sel = {
  374. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO4),
  375. .reg = HICRA,
  376. .shift = 9,
  377. .mask = 0x7,
  378. .options = {
  379. UART_ROUTING_UART4,
  380. UART_ROUTING_UART10,
  381. UART_ROUTING_UART1,
  382. UART_ROUTING_UART2,
  383. UART_ROUTING_UART3,
  384. UART_ROUTING_IO1,
  385. UART_ROUTING_IO2,
  386. UART_ROUTING_IO10,
  387. NULL,
  388. },
  389. };
  390. static struct aspeed_uart_routing_selector ast2600_io3_sel = {
  391. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
  392. .reg = HICRA,
  393. .shift = 6,
  394. .mask = 0x7,
  395. .options = {
  396. UART_ROUTING_UART3,
  397. UART_ROUTING_UART4,
  398. UART_ROUTING_UART10,
  399. UART_ROUTING_UART1,
  400. UART_ROUTING_UART2,
  401. UART_ROUTING_IO1,
  402. UART_ROUTING_IO2,
  403. UART_ROUTING_IO10,
  404. NULL,
  405. },
  406. };
  407. static struct aspeed_uart_routing_selector ast2600_io2_sel = {
  408. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
  409. .reg = HICRA,
  410. .shift = 3,
  411. .mask = 0x7,
  412. .options = {
  413. UART_ROUTING_UART2,
  414. UART_ROUTING_UART3,
  415. UART_ROUTING_UART4,
  416. UART_ROUTING_UART10,
  417. UART_ROUTING_UART1,
  418. UART_ROUTING_IO3,
  419. UART_ROUTING_IO4,
  420. UART_ROUTING_IO10,
  421. NULL,
  422. },
  423. };
  424. static struct aspeed_uart_routing_selector ast2600_io1_sel = {
  425. .dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
  426. .reg = HICRA,
  427. .shift = 0,
  428. .mask = 0x7,
  429. .options = {
  430. UART_ROUTING_UART1,
  431. UART_ROUTING_UART2,
  432. UART_ROUTING_UART3,
  433. UART_ROUTING_UART4,
  434. UART_ROUTING_UART10,
  435. UART_ROUTING_IO3,
  436. UART_ROUTING_IO4,
  437. UART_ROUTING_IO10,
  438. NULL,
  439. },
  440. };
  441. static struct attribute *ast2600_uart_routing_attrs[] = {
  442. &ast2600_uart10_sel.dev_attr.attr,
  443. &ast2600_io10_sel.dev_attr.attr,
  444. &ast2600_uart4_sel.dev_attr.attr,
  445. &ast2600_uart3_sel.dev_attr.attr,
  446. &ast2600_uart2_sel.dev_attr.attr,
  447. &ast2600_uart1_sel.dev_attr.attr,
  448. &ast2600_io4_sel.dev_attr.attr,
  449. &ast2600_io3_sel.dev_attr.attr,
  450. &ast2600_io2_sel.dev_attr.attr,
  451. &ast2600_io1_sel.dev_attr.attr,
  452. NULL,
  453. };
  454. static const struct attribute_group ast2600_uart_routing_attr_group = {
  455. .attrs = ast2600_uart_routing_attrs,
  456. };
  457. static ssize_t aspeed_uart_routing_show(struct device *dev,
  458. struct device_attribute *attr,
  459. char *buf)
  460. {
  461. struct aspeed_uart_routing *uart_routing = dev_get_drvdata(dev);
  462. struct aspeed_uart_routing_selector *sel = to_routing_selector(attr);
  463. int val, pos, len;
  464. regmap_read(uart_routing->map, sel->reg, &val);
  465. val = (val >> sel->shift) & sel->mask;
  466. len = 0;
  467. for (pos = 0; sel->options[pos] != NULL; ++pos) {
  468. if (pos == val)
  469. len += sysfs_emit_at(buf, len, "[%s] ", sel->options[pos]);
  470. else
  471. len += sysfs_emit_at(buf, len, "%s ", sel->options[pos]);
  472. }
  473. if (val >= pos)
  474. len += sysfs_emit_at(buf, len, "[unknown(%d)]", val);
  475. len += sysfs_emit_at(buf, len, "\n");
  476. return len;
  477. }
  478. static ssize_t aspeed_uart_routing_store(struct device *dev,
  479. struct device_attribute *attr,
  480. const char *buf, size_t count)
  481. {
  482. struct aspeed_uart_routing *uart_routing = dev_get_drvdata(dev);
  483. struct aspeed_uart_routing_selector *sel = to_routing_selector(attr);
  484. int val;
  485. val = __sysfs_match_string(sel->options, -1, buf);
  486. if (val < 0) {
  487. dev_err(dev, "invalid value \"%s\"\n", buf);
  488. return -EINVAL;
  489. }
  490. regmap_update_bits(uart_routing->map, sel->reg,
  491. (sel->mask << sel->shift),
  492. (val & sel->mask) << sel->shift);
  493. return count;
  494. }
  495. static int aspeed_uart_routing_probe(struct platform_device *pdev)
  496. {
  497. int rc;
  498. struct device *dev = &pdev->dev;
  499. struct aspeed_uart_routing *uart_routing;
  500. uart_routing = devm_kzalloc(&pdev->dev, sizeof(*uart_routing), GFP_KERNEL);
  501. if (!uart_routing)
  502. return -ENOMEM;
  503. uart_routing->map = syscon_node_to_regmap(dev->parent->of_node);
  504. if (IS_ERR(uart_routing->map)) {
  505. dev_err(dev, "cannot get regmap\n");
  506. return PTR_ERR(uart_routing->map);
  507. }
  508. uart_routing->attr_grp = of_device_get_match_data(dev);
  509. rc = sysfs_create_group(&dev->kobj, uart_routing->attr_grp);
  510. if (rc < 0)
  511. return rc;
  512. dev_set_drvdata(dev, uart_routing);
  513. dev_info(dev, "module loaded\n");
  514. return 0;
  515. }
  516. static void aspeed_uart_routing_remove(struct platform_device *pdev)
  517. {
  518. struct device *dev = &pdev->dev;
  519. struct aspeed_uart_routing *uart_routing = platform_get_drvdata(pdev);
  520. sysfs_remove_group(&dev->kobj, uart_routing->attr_grp);
  521. }
  522. static const struct of_device_id aspeed_uart_routing_table[] = {
  523. { .compatible = "aspeed,ast2400-uart-routing",
  524. .data = &ast2500_uart_routing_attr_group },
  525. { .compatible = "aspeed,ast2500-uart-routing",
  526. .data = &ast2500_uart_routing_attr_group },
  527. { .compatible = "aspeed,ast2600-uart-routing",
  528. .data = &ast2600_uart_routing_attr_group },
  529. { },
  530. };
  531. static struct platform_driver aspeed_uart_routing_driver = {
  532. .driver = {
  533. .name = "aspeed-uart-routing",
  534. .of_match_table = aspeed_uart_routing_table,
  535. },
  536. .probe = aspeed_uart_routing_probe,
  537. .remove_new = aspeed_uart_routing_remove,
  538. };
  539. module_platform_driver(aspeed_uart_routing_driver);
  540. MODULE_AUTHOR("Oskar Senft <osk@google.com>");
  541. MODULE_AUTHOR("Chia-Wei Wang <chiawei_wang@aspeedtech.com>");
  542. MODULE_LICENSE("GPL v2");
  543. MODULE_DESCRIPTION("Driver to configure Aspeed UART routing");