blob: e2716df7c65644f2f4774f03b8d9e615caa8c91e [file] [log] [blame]
From fcfb127412e24417b704f343c67a8c3ad1cd6537 Mon Sep 17 00:00:00 2001
From: Elliot She <elliot.tc.she@fii-na.corp-partner.google.com>
Date: Tue, 21 Jan 2025 09:48:06 +0800
Subject: [PATCH] add uart routing
add uart routing
Source:
AspeedTech-BMC github:
https://github.com/AspeedTech-BMC/linux/blob/aspeed-master-v6.6/drivers/soc/aspeed/aspeed-uart-routing.c
(cherry picked from commit 4730e2c83d0fdd01a1df86135d5c7630ac074e49)
Signed-off-by:Elliot She<elliot.tc.she@fii-na.corp-partner.google.com>
---
drivers/soc/aspeed/aspeed-uart-routing.c | 430 ++++++++++++++++++++++-
1 file changed, 426 insertions(+), 4 deletions(-)
diff --git a/drivers/soc/aspeed/aspeed-uart-routing.c b/drivers/soc/aspeed/aspeed-uart-routing.c
index 3a4c1f28c..3b3a856cf 100644
--- a/drivers/soc/aspeed/aspeed-uart-routing.c
+++ b/drivers/soc/aspeed/aspeed-uart-routing.c
@@ -15,20 +15,30 @@
#define HICRA 0x9c
/* attributes options */
+#define UART_ROUTING_IO0 "io0"
#define UART_ROUTING_IO1 "io1"
#define UART_ROUTING_IO2 "io2"
#define UART_ROUTING_IO3 "io3"
#define UART_ROUTING_IO4 "io4"
#define UART_ROUTING_IO5 "io5"
#define UART_ROUTING_IO6 "io6"
+#define UART_ROUTING_IO7 "io7"
+#define UART_ROUTING_IO8 "io8"
+#define UART_ROUTING_IO9 "io9"
#define UART_ROUTING_IO10 "io10"
+#define UART_ROUTING_IO12 "io12"
+#define UART_ROUTING_UART0 "uart0"
#define UART_ROUTING_UART1 "uart1"
#define UART_ROUTING_UART2 "uart2"
#define UART_ROUTING_UART3 "uart3"
#define UART_ROUTING_UART4 "uart4"
#define UART_ROUTING_UART5 "uart5"
#define UART_ROUTING_UART6 "uart6"
+#define UART_ROUTING_UART7 "uart7"
+#define UART_ROUTING_UART8 "uart8"
+#define UART_ROUTING_UART9 "uart9"
#define UART_ROUTING_UART10 "uart10"
+#define UART_ROUTING_UART12 "uart12"
#define UART_ROUTING_RES "reserved"
struct aspeed_uart_routing {
@@ -488,6 +498,416 @@ static const struct attribute_group ast2600_uart_routing_attr_group = {
.attrs = ast2600_uart_routing_attrs,
};
+/* routing selector for AST27xx node 0 */
+static struct aspeed_uart_routing_selector ast2700n0_uart9_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART9),
+ .reg = HICR9,
+ .shift = 12,
+ .mask = 0xf,
+ .options = {
+ UART_ROUTING_IO9,
+ UART_ROUTING_IO0,
+ UART_ROUTING_IO1,
+ UART_ROUTING_IO2,
+ UART_ROUTING_IO3,
+ UART_ROUTING_RES,
+ UART_ROUTING_UART0,
+ UART_ROUTING_UART1,
+ UART_ROUTING_UART2,
+ UART_ROUTING_UART3,
+ UART_ROUTING_UART12,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_io9_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO9),
+ .reg = HICR9,
+ .shift = 8,
+ .mask = 0xf,
+ .options = {
+ UART_ROUTING_UART0,
+ UART_ROUTING_UART1,
+ UART_ROUTING_UART2,
+ UART_ROUTING_UART3,
+ UART_ROUTING_UART12,
+ UART_ROUTING_IO0,
+ UART_ROUTING_IO1,
+ UART_ROUTING_IO2,
+ UART_ROUTING_IO3,
+ UART_ROUTING_RES,
+ UART_ROUTING_UART9,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_uart3_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART3),
+ .reg = HICRA,
+ .shift = 25,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_IO3,
+ UART_ROUTING_IO0,
+ UART_ROUTING_IO1,
+ UART_ROUTING_IO2,
+ UART_ROUTING_UART0,
+ UART_ROUTING_UART1,
+ UART_ROUTING_UART2,
+ UART_ROUTING_IO9,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_uart2_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART2),
+ .reg = HICRA,
+ .shift = 22,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_IO2,
+ UART_ROUTING_IO3,
+ UART_ROUTING_IO0,
+ UART_ROUTING_IO1,
+ UART_ROUTING_UART3,
+ UART_ROUTING_UART0,
+ UART_ROUTING_UART1,
+ UART_ROUTING_IO9,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_uart1_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART1),
+ .reg = HICRA,
+ .shift = 19,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_IO1,
+ UART_ROUTING_IO2,
+ UART_ROUTING_IO3,
+ UART_ROUTING_IO0,
+ UART_ROUTING_UART2,
+ UART_ROUTING_UART3,
+ UART_ROUTING_UART0,
+ UART_ROUTING_IO9,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_uart0_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART0),
+ .reg = HICRA,
+ .shift = 16,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_IO0,
+ UART_ROUTING_IO1,
+ UART_ROUTING_IO2,
+ UART_ROUTING_IO3,
+ UART_ROUTING_UART1,
+ UART_ROUTING_UART2,
+ UART_ROUTING_UART3,
+ UART_ROUTING_IO9,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_io3_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO3),
+ .reg = HICRA,
+ .shift = 9,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_UART3,
+ UART_ROUTING_UART9,
+ UART_ROUTING_UART0,
+ UART_ROUTING_UART1,
+ UART_ROUTING_UART2,
+ UART_ROUTING_IO0,
+ UART_ROUTING_IO1,
+ UART_ROUTING_IO9,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_io2_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO2),
+ .reg = HICRA,
+ .shift = 6,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_UART2,
+ UART_ROUTING_UART3,
+ UART_ROUTING_UART9,
+ UART_ROUTING_UART0,
+ UART_ROUTING_UART1,
+ UART_ROUTING_IO0,
+ UART_ROUTING_IO1,
+ UART_ROUTING_IO9,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_io1_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO1),
+ .reg = HICRA,
+ .shift = 3,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_UART1,
+ UART_ROUTING_UART2,
+ UART_ROUTING_UART3,
+ UART_ROUTING_UART9,
+ UART_ROUTING_UART0,
+ UART_ROUTING_IO2,
+ UART_ROUTING_IO3,
+ UART_ROUTING_IO9,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n0_io0_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO0),
+ .reg = HICRA,
+ .shift = 0,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_UART0,
+ UART_ROUTING_UART1,
+ UART_ROUTING_UART2,
+ UART_ROUTING_UART3,
+ UART_ROUTING_UART9,
+ UART_ROUTING_IO2,
+ UART_ROUTING_IO3,
+ UART_ROUTING_IO9,
+ NULL,
+ },
+};
+
+static struct attribute *ast2700n0_uart_routing_attrs[] = {
+ &ast2700n0_uart9_sel.dev_attr.attr,
+ &ast2700n0_io9_sel.dev_attr.attr,
+ &ast2700n0_uart3_sel.dev_attr.attr,
+ &ast2700n0_uart2_sel.dev_attr.attr,
+ &ast2700n0_uart1_sel.dev_attr.attr,
+ &ast2700n0_uart0_sel.dev_attr.attr,
+ &ast2700n0_io3_sel.dev_attr.attr,
+ &ast2700n0_io2_sel.dev_attr.attr,
+ &ast2700n0_io1_sel.dev_attr.attr,
+ &ast2700n0_io0_sel.dev_attr.attr,
+ NULL,
+};
+
+static const struct attribute_group ast2700n0_uart_routing_attr_group = {
+ .attrs = ast2700n0_uart_routing_attrs,
+};
+
+/* routing selector for AST27xx node 1 */
+static struct aspeed_uart_routing_selector ast2700n1_uart10_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART10),
+ .reg = HICR9,
+ .shift = 12,
+ .mask = 0xf,
+ .options = {
+ UART_ROUTING_IO10,
+ UART_ROUTING_IO5,
+ UART_ROUTING_IO6,
+ UART_ROUTING_IO7,
+ UART_ROUTING_IO8,
+ UART_ROUTING_RES,
+ UART_ROUTING_UART5,
+ UART_ROUTING_UART6,
+ UART_ROUTING_UART7,
+ UART_ROUTING_UART8,
+ UART_ROUTING_UART12,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_io10_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO10),
+ .reg = HICR9,
+ .shift = 8,
+ .mask = 0xf,
+ .options = {
+ UART_ROUTING_UART5,
+ UART_ROUTING_UART6,
+ UART_ROUTING_UART7,
+ UART_ROUTING_UART8,
+ UART_ROUTING_UART12,
+ UART_ROUTING_IO5,
+ UART_ROUTING_IO6,
+ UART_ROUTING_IO7,
+ UART_ROUTING_IO8,
+ UART_ROUTING_RES,
+ UART_ROUTING_UART10,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_uart8_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART8),
+ .reg = HICRA,
+ .shift = 25,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_IO8,
+ UART_ROUTING_IO5,
+ UART_ROUTING_IO6,
+ UART_ROUTING_IO7,
+ UART_ROUTING_UART5,
+ UART_ROUTING_UART6,
+ UART_ROUTING_UART7,
+ UART_ROUTING_IO10,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_uart7_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART7),
+ .reg = HICRA,
+ .shift = 22,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_IO7,
+ UART_ROUTING_IO8,
+ UART_ROUTING_IO5,
+ UART_ROUTING_IO6,
+ UART_ROUTING_UART8,
+ UART_ROUTING_UART5,
+ UART_ROUTING_UART6,
+ UART_ROUTING_IO10,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_uart6_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART6),
+ .reg = HICRA,
+ .shift = 19,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_IO6,
+ UART_ROUTING_IO7,
+ UART_ROUTING_IO8,
+ UART_ROUTING_IO5,
+ UART_ROUTING_UART7,
+ UART_ROUTING_UART8,
+ UART_ROUTING_UART5,
+ UART_ROUTING_IO10,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_uart5_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_UART0),
+ .reg = HICRA,
+ .shift = 16,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_IO5,
+ UART_ROUTING_IO6,
+ UART_ROUTING_IO7,
+ UART_ROUTING_IO8,
+ UART_ROUTING_UART6,
+ UART_ROUTING_UART7,
+ UART_ROUTING_UART8,
+ UART_ROUTING_IO10,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_io8_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO8),
+ .reg = HICRA,
+ .shift = 9,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_UART8,
+ UART_ROUTING_UART10,
+ UART_ROUTING_UART5,
+ UART_ROUTING_UART6,
+ UART_ROUTING_UART7,
+ UART_ROUTING_IO5,
+ UART_ROUTING_IO6,
+ UART_ROUTING_IO10,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_io7_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO7),
+ .reg = HICRA,
+ .shift = 6,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_UART7,
+ UART_ROUTING_UART8,
+ UART_ROUTING_UART10,
+ UART_ROUTING_UART5,
+ UART_ROUTING_UART6,
+ UART_ROUTING_IO5,
+ UART_ROUTING_IO6,
+ UART_ROUTING_IO10,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_io6_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO6),
+ .reg = HICRA,
+ .shift = 3,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_UART6,
+ UART_ROUTING_UART7,
+ UART_ROUTING_UART8,
+ UART_ROUTING_UART10,
+ UART_ROUTING_UART5,
+ UART_ROUTING_IO7,
+ UART_ROUTING_IO8,
+ UART_ROUTING_IO10,
+ NULL,
+ },
+};
+
+static struct aspeed_uart_routing_selector ast2700n1_io5_sel = {
+ .dev_attr = ROUTING_ATTR(UART_ROUTING_IO0),
+ .reg = HICRA,
+ .shift = 0,
+ .mask = 0x7,
+ .options = {
+ UART_ROUTING_UART5,
+ UART_ROUTING_UART6,
+ UART_ROUTING_UART7,
+ UART_ROUTING_UART8,
+ UART_ROUTING_UART10,
+ UART_ROUTING_IO7,
+ UART_ROUTING_IO8,
+ UART_ROUTING_IO10,
+ NULL,
+ },
+};
+
+static struct attribute *ast2700n1_uart_routing_attrs[] = {
+ &ast2700n1_uart10_sel.dev_attr.attr,
+ &ast2700n1_io10_sel.dev_attr.attr,
+ &ast2700n1_uart8_sel.dev_attr.attr,
+ &ast2700n1_uart7_sel.dev_attr.attr,
+ &ast2700n1_uart6_sel.dev_attr.attr,
+ &ast2700n1_uart5_sel.dev_attr.attr,
+ &ast2700n1_io8_sel.dev_attr.attr,
+ &ast2700n1_io7_sel.dev_attr.attr,
+ &ast2700n1_io6_sel.dev_attr.attr,
+ &ast2700n1_io5_sel.dev_attr.attr,
+ NULL,
+};
+
+static const struct attribute_group ast2700n1_uart_routing_attr_group = {
+ .attrs = ast2700n1_uart_routing_attrs,
+};
+
static ssize_t aspeed_uart_routing_show(struct device *dev,
struct device_attribute *attr,
char *buf)
@@ -565,14 +985,12 @@ static int aspeed_uart_routing_probe(struct platform_device *pdev)
return 0;
}
-static int aspeed_uart_routing_remove(struct platform_device *pdev)
+static void aspeed_uart_routing_remove(struct platform_device *pdev)
{
struct device *dev = &pdev->dev;
struct aspeed_uart_routing *uart_routing = platform_get_drvdata(pdev);
sysfs_remove_group(&dev->kobj, uart_routing->attr_grp);
-
- return 0;
}
static const struct of_device_id aspeed_uart_routing_table[] = {
@@ -582,6 +1000,10 @@ static const struct of_device_id aspeed_uart_routing_table[] = {
.data = &ast2500_uart_routing_attr_group },
{ .compatible = "aspeed,ast2600-uart-routing",
.data = &ast2600_uart_routing_attr_group },
+ { .compatible = "aspeed,ast2700n0-uart-routing",
+ .data = &ast2700n0_uart_routing_attr_group },
+ { .compatible = "aspeed,ast2700n1-uart-routing",
+ .data = &ast2700n1_uart_routing_attr_group },
{ },
};
@@ -591,7 +1013,7 @@ static struct platform_driver aspeed_uart_routing_driver = {
.of_match_table = aspeed_uart_routing_table,
},
.probe = aspeed_uart_routing_probe,
- .remove = aspeed_uart_routing_remove,
+ .remove_new = aspeed_uart_routing_remove,
};
module_platform_driver(aspeed_uart_routing_driver);
--
2.34.1