Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0+
0002 /*
0003  * Copyright (c) 2018 Google LLC
0004  * Copyright (c) 2021 Aspeed Technology Inc.
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 /* register offsets */
0015 #define HICR9   0x98
0016 #define HICRA   0x9c
0017 
0018 /* attributes options */
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 /* routing selector for AST25xx */
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 /* routing selector for AST26xx */
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");