0001
0002
0003
0004
0005
0006 #include <linux/device.h>
0007 #include <linux/module.h>
0008 #include <linux/of_device.h>
0009 #include <linux/of_platform.h>
0010 #include <linux/mfd/syscon.h>
0011 #include <linux/regmap.h>
0012 #include <linux/platform_device.h>
0013
0014
0015 #define HICR9 0x98
0016 #define HICRA 0x9c
0017
0018
0019 #define UART_ROUTING_IO1 "io1"
0020 #define UART_ROUTING_IO2 "io2"
0021 #define UART_ROUTING_IO3 "io3"
0022 #define UART_ROUTING_IO4 "io4"
0023 #define UART_ROUTING_IO5 "io5"
0024 #define UART_ROUTING_IO6 "io6"
0025 #define UART_ROUTING_IO10 "io10"
0026 #define UART_ROUTING_UART1 "uart1"
0027 #define UART_ROUTING_UART2 "uart2"
0028 #define UART_ROUTING_UART3 "uart3"
0029 #define UART_ROUTING_UART4 "uart4"
0030 #define UART_ROUTING_UART5 "uart5"
0031 #define UART_ROUTING_UART6 "uart6"
0032 #define UART_ROUTING_UART10 "uart10"
0033 #define UART_ROUTING_RES "reserved"
0034
0035 struct aspeed_uart_routing {
0036 struct regmap *map;
0037 struct attribute_group const *attr_grp;
0038 };
0039
0040 struct aspeed_uart_routing_selector {
0041 struct device_attribute dev_attr;
0042 uint8_t reg;
0043 uint8_t mask;
0044 uint8_t shift;
0045 const char *const options[];
0046 };
0047
0048 #define to_routing_selector(_dev_attr) \
0049 container_of(_dev_attr, struct aspeed_uart_routing_selector, dev_attr)
0050
0051 static ssize_t aspeed_uart_routing_show(struct device *dev,
0052 struct device_attribute *attr,
0053 char *buf);
0054
0055 static ssize_t aspeed_uart_routing_store(struct device *dev,
0056 struct device_attribute *attr,
0057 const char *buf, size_t count);
0058
0059 #define ROUTING_ATTR(_name) { \
0060 .attr = {.name = _name, \
0061 .mode = VERIFY_OCTAL_PERMISSIONS(0644) }, \
0062 .show = aspeed_uart_routing_show, \
0063 .store = aspeed_uart_routing_store, \
0064 }
0065
0066
0067 static struct aspeed_uart_routing_selector ast2500_io6_sel = {
0068 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO6),
0069 .reg = HICR9,
0070 .shift = 8,
0071 .mask = 0xf,
0072 .options = {
0073 UART_ROUTING_UART1,
0074 UART_ROUTING_UART2,
0075 UART_ROUTING_UART3,
0076 UART_ROUTING_UART4,
0077 UART_ROUTING_UART5,
0078 UART_ROUTING_IO1,
0079 UART_ROUTING_IO2,
0080 UART_ROUTING_IO3,
0081 UART_ROUTING_IO4,
0082 UART_ROUTING_IO5,
0083 NULL,
0084 },
0085 };
0086
0087 static struct aspeed_uart_routing_selector ast2500_uart5_sel = {
0088 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART5),
0089 .reg = HICRA,
0090 .shift = 28,
0091 .mask = 0xf,
0092 .options = {
0093 UART_ROUTING_IO5,
0094 UART_ROUTING_IO1,
0095 UART_ROUTING_IO2,
0096 UART_ROUTING_IO3,
0097 UART_ROUTING_IO4,
0098 UART_ROUTING_UART1,
0099 UART_ROUTING_UART2,
0100 UART_ROUTING_UART3,
0101 UART_ROUTING_UART4,
0102 UART_ROUTING_IO6,
0103 NULL,
0104 },
0105 };
0106
0107 static struct aspeed_uart_routing_selector ast2500_uart4_sel = {
0108 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART4),
0109 .reg = HICRA,
0110 .shift = 25,
0111 .mask = 0x7,
0112 .options = {
0113 UART_ROUTING_IO4,
0114 UART_ROUTING_IO1,
0115 UART_ROUTING_IO2,
0116 UART_ROUTING_IO3,
0117 UART_ROUTING_UART1,
0118 UART_ROUTING_UART2,
0119 UART_ROUTING_UART3,
0120 UART_ROUTING_IO6,
0121 NULL,
0122 },
0123 };
0124
0125 static struct aspeed_uart_routing_selector ast2500_uart3_sel = {
0126 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
0127 .reg = HICRA,
0128 .shift = 22,
0129 .mask = 0x7,
0130 .options = {
0131 UART_ROUTING_IO3,
0132 UART_ROUTING_IO4,
0133 UART_ROUTING_IO1,
0134 UART_ROUTING_IO2,
0135 UART_ROUTING_UART4,
0136 UART_ROUTING_UART1,
0137 UART_ROUTING_UART2,
0138 UART_ROUTING_IO6,
0139 NULL,
0140 },
0141 };
0142
0143 static struct aspeed_uart_routing_selector ast2500_uart2_sel = {
0144 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
0145 .reg = HICRA,
0146 .shift = 19,
0147 .mask = 0x7,
0148 .options = {
0149 UART_ROUTING_IO2,
0150 UART_ROUTING_IO3,
0151 UART_ROUTING_IO4,
0152 UART_ROUTING_IO1,
0153 UART_ROUTING_UART3,
0154 UART_ROUTING_UART4,
0155 UART_ROUTING_UART1,
0156 UART_ROUTING_IO6,
0157 NULL,
0158 },
0159 };
0160
0161 static struct aspeed_uart_routing_selector ast2500_uart1_sel = {
0162 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
0163 .reg = HICRA,
0164 .shift = 16,
0165 .mask = 0x7,
0166 .options = {
0167 UART_ROUTING_IO1,
0168 UART_ROUTING_IO2,
0169 UART_ROUTING_IO3,
0170 UART_ROUTING_IO4,
0171 UART_ROUTING_UART2,
0172 UART_ROUTING_UART3,
0173 UART_ROUTING_UART4,
0174 UART_ROUTING_IO6,
0175 NULL,
0176 },
0177 };
0178
0179 static struct aspeed_uart_routing_selector ast2500_io5_sel = {
0180 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO5),
0181 .reg = HICRA,
0182 .shift = 12,
0183 .mask = 0x7,
0184 .options = {
0185 UART_ROUTING_UART5,
0186 UART_ROUTING_UART1,
0187 UART_ROUTING_UART2,
0188 UART_ROUTING_UART3,
0189 UART_ROUTING_UART4,
0190 UART_ROUTING_IO1,
0191 UART_ROUTING_IO3,
0192 UART_ROUTING_IO6,
0193 NULL,
0194 },
0195 };
0196
0197 static struct aspeed_uart_routing_selector ast2500_io4_sel = {
0198 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO4),
0199 .reg = HICRA,
0200 .shift = 9,
0201 .mask = 0x7,
0202 .options = {
0203 UART_ROUTING_UART4,
0204 UART_ROUTING_UART5,
0205 UART_ROUTING_UART1,
0206 UART_ROUTING_UART2,
0207 UART_ROUTING_UART3,
0208 UART_ROUTING_IO1,
0209 UART_ROUTING_IO2,
0210 UART_ROUTING_IO6,
0211 NULL,
0212 },
0213 };
0214
0215 static struct aspeed_uart_routing_selector ast2500_io3_sel = {
0216 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
0217 .reg = HICRA,
0218 .shift = 6,
0219 .mask = 0x7,
0220 .options = {
0221 UART_ROUTING_UART3,
0222 UART_ROUTING_UART4,
0223 UART_ROUTING_UART5,
0224 UART_ROUTING_UART1,
0225 UART_ROUTING_UART2,
0226 UART_ROUTING_IO1,
0227 UART_ROUTING_IO2,
0228 UART_ROUTING_IO6,
0229 NULL,
0230 },
0231 };
0232
0233 static struct aspeed_uart_routing_selector ast2500_io2_sel = {
0234 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
0235 .reg = HICRA,
0236 .shift = 3,
0237 .mask = 0x7,
0238 .options = {
0239 UART_ROUTING_UART2,
0240 UART_ROUTING_UART3,
0241 UART_ROUTING_UART4,
0242 UART_ROUTING_UART5,
0243 UART_ROUTING_UART1,
0244 UART_ROUTING_IO3,
0245 UART_ROUTING_IO4,
0246 UART_ROUTING_IO6,
0247 NULL,
0248 },
0249 };
0250
0251 static struct aspeed_uart_routing_selector ast2500_io1_sel = {
0252 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
0253 .reg = HICRA,
0254 .shift = 0,
0255 .mask = 0x7,
0256 .options = {
0257 UART_ROUTING_UART1,
0258 UART_ROUTING_UART2,
0259 UART_ROUTING_UART3,
0260 UART_ROUTING_UART4,
0261 UART_ROUTING_UART5,
0262 UART_ROUTING_IO3,
0263 UART_ROUTING_IO4,
0264 UART_ROUTING_IO6,
0265 NULL,
0266 },
0267 };
0268
0269 static struct attribute *ast2500_uart_routing_attrs[] = {
0270 &ast2500_io6_sel.dev_attr.attr,
0271 &ast2500_uart5_sel.dev_attr.attr,
0272 &ast2500_uart4_sel.dev_attr.attr,
0273 &ast2500_uart3_sel.dev_attr.attr,
0274 &ast2500_uart2_sel.dev_attr.attr,
0275 &ast2500_uart1_sel.dev_attr.attr,
0276 &ast2500_io5_sel.dev_attr.attr,
0277 &ast2500_io4_sel.dev_attr.attr,
0278 &ast2500_io3_sel.dev_attr.attr,
0279 &ast2500_io2_sel.dev_attr.attr,
0280 &ast2500_io1_sel.dev_attr.attr,
0281 NULL,
0282 };
0283
0284 static const struct attribute_group ast2500_uart_routing_attr_group = {
0285 .attrs = ast2500_uart_routing_attrs,
0286 };
0287
0288
0289 static struct aspeed_uart_routing_selector ast2600_uart10_sel = {
0290 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART10),
0291 .reg = HICR9,
0292 .shift = 12,
0293 .mask = 0xf,
0294 .options = {
0295 UART_ROUTING_IO10,
0296 UART_ROUTING_IO1,
0297 UART_ROUTING_IO2,
0298 UART_ROUTING_IO3,
0299 UART_ROUTING_IO4,
0300 UART_ROUTING_RES,
0301 UART_ROUTING_UART1,
0302 UART_ROUTING_UART2,
0303 UART_ROUTING_UART3,
0304 UART_ROUTING_UART4,
0305 NULL,
0306 },
0307 };
0308
0309 static struct aspeed_uart_routing_selector ast2600_io10_sel = {
0310 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO10),
0311 .reg = HICR9,
0312 .shift = 8,
0313 .mask = 0xf,
0314 .options = {
0315 UART_ROUTING_UART1,
0316 UART_ROUTING_UART2,
0317 UART_ROUTING_UART3,
0318 UART_ROUTING_UART4,
0319 UART_ROUTING_RES,
0320 UART_ROUTING_IO1,
0321 UART_ROUTING_IO2,
0322 UART_ROUTING_IO3,
0323 UART_ROUTING_IO4,
0324 UART_ROUTING_RES,
0325 UART_ROUTING_UART10,
0326 NULL,
0327 },
0328 };
0329
0330 static struct aspeed_uart_routing_selector ast2600_uart4_sel = {
0331 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART4),
0332 .reg = HICRA,
0333 .shift = 25,
0334 .mask = 0x7,
0335 .options = {
0336 UART_ROUTING_IO4,
0337 UART_ROUTING_IO1,
0338 UART_ROUTING_IO2,
0339 UART_ROUTING_IO3,
0340 UART_ROUTING_UART1,
0341 UART_ROUTING_UART2,
0342 UART_ROUTING_UART3,
0343 UART_ROUTING_IO10,
0344 NULL,
0345 },
0346 };
0347
0348 static struct aspeed_uart_routing_selector ast2600_uart3_sel = {
0349 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
0350 .reg = HICRA,
0351 .shift = 22,
0352 .mask = 0x7,
0353 .options = {
0354 UART_ROUTING_IO3,
0355 UART_ROUTING_IO4,
0356 UART_ROUTING_IO1,
0357 UART_ROUTING_IO2,
0358 UART_ROUTING_UART4,
0359 UART_ROUTING_UART1,
0360 UART_ROUTING_UART2,
0361 UART_ROUTING_IO10,
0362 NULL,
0363 },
0364 };
0365
0366 static struct aspeed_uart_routing_selector ast2600_uart2_sel = {
0367 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
0368 .reg = HICRA,
0369 .shift = 19,
0370 .mask = 0x7,
0371 .options = {
0372 UART_ROUTING_IO2,
0373 UART_ROUTING_IO3,
0374 UART_ROUTING_IO4,
0375 UART_ROUTING_IO1,
0376 UART_ROUTING_UART3,
0377 UART_ROUTING_UART4,
0378 UART_ROUTING_UART1,
0379 UART_ROUTING_IO10,
0380 NULL,
0381 },
0382 };
0383
0384 static struct aspeed_uart_routing_selector ast2600_uart1_sel = {
0385 .dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
0386 .reg = HICRA,
0387 .shift = 16,
0388 .mask = 0x7,
0389 .options = {
0390 UART_ROUTING_IO1,
0391 UART_ROUTING_IO2,
0392 UART_ROUTING_IO3,
0393 UART_ROUTING_IO4,
0394 UART_ROUTING_UART2,
0395 UART_ROUTING_UART3,
0396 UART_ROUTING_UART4,
0397 UART_ROUTING_IO10,
0398 NULL,
0399 },
0400 };
0401
0402 static struct aspeed_uart_routing_selector ast2600_io4_sel = {
0403 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO4),
0404 .reg = HICRA,
0405 .shift = 9,
0406 .mask = 0x7,
0407 .options = {
0408 UART_ROUTING_UART4,
0409 UART_ROUTING_UART10,
0410 UART_ROUTING_UART1,
0411 UART_ROUTING_UART2,
0412 UART_ROUTING_UART3,
0413 UART_ROUTING_IO1,
0414 UART_ROUTING_IO2,
0415 UART_ROUTING_IO10,
0416 NULL,
0417 },
0418 };
0419
0420 static struct aspeed_uart_routing_selector ast2600_io3_sel = {
0421 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
0422 .reg = HICRA,
0423 .shift = 6,
0424 .mask = 0x7,
0425 .options = {
0426 UART_ROUTING_UART3,
0427 UART_ROUTING_UART4,
0428 UART_ROUTING_UART10,
0429 UART_ROUTING_UART1,
0430 UART_ROUTING_UART2,
0431 UART_ROUTING_IO1,
0432 UART_ROUTING_IO2,
0433 UART_ROUTING_IO10,
0434 NULL,
0435 },
0436 };
0437
0438 static struct aspeed_uart_routing_selector ast2600_io2_sel = {
0439 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
0440 .reg = HICRA,
0441 .shift = 3,
0442 .mask = 0x7,
0443 .options = {
0444 UART_ROUTING_UART2,
0445 UART_ROUTING_UART3,
0446 UART_ROUTING_UART4,
0447 UART_ROUTING_UART10,
0448 UART_ROUTING_UART1,
0449 UART_ROUTING_IO3,
0450 UART_ROUTING_IO4,
0451 UART_ROUTING_IO10,
0452 NULL,
0453 },
0454 };
0455
0456 static struct aspeed_uart_routing_selector ast2600_io1_sel = {
0457 .dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
0458 .reg = HICRA,
0459 .shift = 0,
0460 .mask = 0x7,
0461 .options = {
0462 UART_ROUTING_UART1,
0463 UART_ROUTING_UART2,
0464 UART_ROUTING_UART3,
0465 UART_ROUTING_UART4,
0466 UART_ROUTING_UART10,
0467 UART_ROUTING_IO3,
0468 UART_ROUTING_IO4,
0469 UART_ROUTING_IO10,
0470 NULL,
0471 },
0472 };
0473
0474 static struct attribute *ast2600_uart_routing_attrs[] = {
0475 &ast2600_uart10_sel.dev_attr.attr,
0476 &ast2600_io10_sel.dev_attr.attr,
0477 &ast2600_uart4_sel.dev_attr.attr,
0478 &ast2600_uart3_sel.dev_attr.attr,
0479 &ast2600_uart2_sel.dev_attr.attr,
0480 &ast2600_uart1_sel.dev_attr.attr,
0481 &ast2600_io4_sel.dev_attr.attr,
0482 &ast2600_io3_sel.dev_attr.attr,
0483 &ast2600_io2_sel.dev_attr.attr,
0484 &ast2600_io1_sel.dev_attr.attr,
0485 NULL,
0486 };
0487
0488 static const struct attribute_group ast2600_uart_routing_attr_group = {
0489 .attrs = ast2600_uart_routing_attrs,
0490 };
0491
0492 static ssize_t aspeed_uart_routing_show(struct device *dev,
0493 struct device_attribute *attr,
0494 char *buf)
0495 {
0496 struct aspeed_uart_routing *uart_routing = dev_get_drvdata(dev);
0497 struct aspeed_uart_routing_selector *sel = to_routing_selector(attr);
0498 int val, pos, len;
0499
0500 regmap_read(uart_routing->map, sel->reg, &val);
0501 val = (val >> sel->shift) & sel->mask;
0502
0503 len = 0;
0504 for (pos = 0; sel->options[pos] != NULL; ++pos) {
0505 if (pos == val)
0506 len += sysfs_emit_at(buf, len, "[%s] ", sel->options[pos]);
0507 else
0508 len += sysfs_emit_at(buf, len, "%s ", sel->options[pos]);
0509 }
0510
0511 if (val >= pos)
0512 len += sysfs_emit_at(buf, len, "[unknown(%d)]", val);
0513
0514 len += sysfs_emit_at(buf, len, "\n");
0515
0516 return len;
0517 }
0518
0519 static ssize_t aspeed_uart_routing_store(struct device *dev,
0520 struct device_attribute *attr,
0521 const char *buf, size_t count)
0522 {
0523 struct aspeed_uart_routing *uart_routing = dev_get_drvdata(dev);
0524 struct aspeed_uart_routing_selector *sel = to_routing_selector(attr);
0525 int val;
0526
0527 val = match_string(sel->options, -1, buf);
0528 if (val < 0) {
0529 dev_err(dev, "invalid value \"%s\"\n", buf);
0530 return -EINVAL;
0531 }
0532
0533 regmap_update_bits(uart_routing->map, sel->reg,
0534 (sel->mask << sel->shift),
0535 (val & sel->mask) << sel->shift);
0536
0537 return count;
0538 }
0539
0540 static int aspeed_uart_routing_probe(struct platform_device *pdev)
0541 {
0542 int rc;
0543 struct device *dev = &pdev->dev;
0544 struct aspeed_uart_routing *uart_routing;
0545
0546 uart_routing = devm_kzalloc(&pdev->dev, sizeof(*uart_routing), GFP_KERNEL);
0547 if (!uart_routing)
0548 return -ENOMEM;
0549
0550 uart_routing->map = syscon_node_to_regmap(dev->parent->of_node);
0551 if (IS_ERR(uart_routing->map)) {
0552 dev_err(dev, "cannot get regmap\n");
0553 return PTR_ERR(uart_routing->map);
0554 }
0555
0556 uart_routing->attr_grp = of_device_get_match_data(dev);
0557
0558 rc = sysfs_create_group(&dev->kobj, uart_routing->attr_grp);
0559 if (rc < 0)
0560 return rc;
0561
0562 dev_set_drvdata(dev, uart_routing);
0563
0564 dev_info(dev, "module loaded\n");
0565
0566 return 0;
0567 }
0568
0569 static int aspeed_uart_routing_remove(struct platform_device *pdev)
0570 {
0571 struct device *dev = &pdev->dev;
0572 struct aspeed_uart_routing *uart_routing = platform_get_drvdata(pdev);
0573
0574 sysfs_remove_group(&dev->kobj, uart_routing->attr_grp);
0575
0576 return 0;
0577 }
0578
0579 static const struct of_device_id aspeed_uart_routing_table[] = {
0580 { .compatible = "aspeed,ast2400-uart-routing",
0581 .data = &ast2500_uart_routing_attr_group },
0582 { .compatible = "aspeed,ast2500-uart-routing",
0583 .data = &ast2500_uart_routing_attr_group },
0584 { .compatible = "aspeed,ast2600-uart-routing",
0585 .data = &ast2600_uart_routing_attr_group },
0586 { },
0587 };
0588
0589 static struct platform_driver aspeed_uart_routing_driver = {
0590 .driver = {
0591 .name = "aspeed-uart-routing",
0592 .of_match_table = aspeed_uart_routing_table,
0593 },
0594 .probe = aspeed_uart_routing_probe,
0595 .remove = aspeed_uart_routing_remove,
0596 };
0597
0598 module_platform_driver(aspeed_uart_routing_driver);
0599
0600 MODULE_AUTHOR("Oskar Senft <osk@google.com>");
0601 MODULE_AUTHOR("Chia-Wei Wang <chiawei_wang@aspeedtech.com>");
0602 MODULE_LICENSE("GPL v2");
0603 MODULE_DESCRIPTION("Driver to configure Aspeed UART routing");