aspeed-uart-routing.c 14 KB

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