blob: b68edbc1212bb0f0b577f9847c63720f5a778385 [file] [log] [blame]
Patrick Williams864cc432023-02-09 14:54:44 -06001From 19eabe2a5fb97530820dd2a22fe6bc143a8d693f Mon Sep 17 00:00:00 2001
Patrick Williams8dd68482022-10-04 07:57:18 -05002From: Emekcan <emekcan.aras@arm.com>
3Date: Fri, 19 Aug 2022 14:51:08 +0100
Patrick Williams864cc432023-02-09 14:54:44 -06004Subject: [PATCH 2/6] Add external system driver
Patrick Williams8dd68482022-10-04 07:57:18 -05005
6Adds external system driver to control it
7from user-space. It provides run and reset
8functionality at the moment.
9
Patrick Williams864cc432023-02-09 14:54:44 -060010Upstream-Status: Pending[Not submitted to upstream yet]
Patrick Williams8dd68482022-10-04 07:57:18 -050011Signed-off-by: Emekcan Aras <emekcan.aras@arm.com>
Patrick Williams864cc432023-02-09 14:54:44 -060012Signed-off-by: Rui Miguel Silva <rui.silva@linaro.org>
Patrick Williams8dd68482022-10-04 07:57:18 -050013---
Patrick Williams864cc432023-02-09 14:54:44 -060014 drivers/misc/Kconfig | 1 +
Patrick Williams8dd68482022-10-04 07:57:18 -050015 drivers/misc/Makefile | 1 +
16 drivers/misc/arm/Kconfig | 5 ++
17 drivers/misc/arm/Makefile | 1 +
18 drivers/misc/arm/extsys_ctrl.c | 151 +++++++++++++++++++++++++++++++++
Patrick Williams864cc432023-02-09 14:54:44 -060019 5 files changed, 159 insertions(+)
Patrick Williams8dd68482022-10-04 07:57:18 -050020 create mode 100644 drivers/misc/arm/Kconfig
21 create mode 100644 drivers/misc/arm/Makefile
22 create mode 100644 drivers/misc/arm/extsys_ctrl.c
23
24diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
Patrick Williams864cc432023-02-09 14:54:44 -060025index 358ad56f6524..fd8654ffdab0 100644
Patrick Williams8dd68482022-10-04 07:57:18 -050026--- a/drivers/misc/Kconfig
27+++ b/drivers/misc/Kconfig
Patrick Williams864cc432023-02-09 14:54:44 -060028@@ -514,4 +514,5 @@ source "drivers/misc/habanalabs/Kconfig"
Patrick Williams8dd68482022-10-04 07:57:18 -050029 source "drivers/misc/uacce/Kconfig"
30 source "drivers/misc/pvpanic/Kconfig"
Patrick Williams864cc432023-02-09 14:54:44 -060031 source "drivers/misc/mchp_pci1xxxx/Kconfig"
Patrick Williams8dd68482022-10-04 07:57:18 -050032+source "drivers/misc/arm/Kconfig"
Patrick Williams8dd68482022-10-04 07:57:18 -050033 endmenu
34diff --git a/drivers/misc/Makefile b/drivers/misc/Makefile
Patrick Williams864cc432023-02-09 14:54:44 -060035index ac9b3e757ba1..f7852e4fd63d 100644
Patrick Williams8dd68482022-10-04 07:57:18 -050036--- a/drivers/misc/Makefile
37+++ b/drivers/misc/Makefile
Patrick Williams864cc432023-02-09 14:54:44 -060038@@ -62,3 +62,4 @@ obj-$(CONFIG_HI6421V600_IRQ) += hi6421v600-irq.o
39 obj-$(CONFIG_OPEN_DICE) += open-dice.o
40 obj-$(CONFIG_GP_PCI1XXXX) += mchp_pci1xxxx/
41 obj-$(CONFIG_VCPU_STALL_DETECTOR) += vcpu_stall_detector.o
Patrick Williams8dd68482022-10-04 07:57:18 -050042+obj-y += arm/
43diff --git a/drivers/misc/arm/Kconfig b/drivers/misc/arm/Kconfig
44new file mode 100644
Patrick Williams864cc432023-02-09 14:54:44 -060045index 000000000000..9f1eb284e530
Patrick Williams8dd68482022-10-04 07:57:18 -050046--- /dev/null
47+++ b/drivers/misc/arm/Kconfig
48@@ -0,0 +1,5 @@
49+config EXTSYS_CTRL
50+ tristate "Arm External System control driver"
51+ help
52+ Say y here to enable support for external system control
53+ driver for the Arm Corstone-700 and Corstone1000 platform
54\ No newline at end of file
55diff --git a/drivers/misc/arm/Makefile b/drivers/misc/arm/Makefile
56new file mode 100644
57index 000000000000..1ca3084cf8a0
58--- /dev/null
59+++ b/drivers/misc/arm/Makefile
60@@ -0,0 +1 @@
61+obj-$(CONFIG_EXTSYS_CTRL) += extsys_ctrl.o
62diff --git a/drivers/misc/arm/extsys_ctrl.c b/drivers/misc/arm/extsys_ctrl.c
63new file mode 100644
Patrick Williams864cc432023-02-09 14:54:44 -060064index 000000000000..7929070ff43d
Patrick Williams8dd68482022-10-04 07:57:18 -050065--- /dev/null
66+++ b/drivers/misc/arm/extsys_ctrl.c
67@@ -0,0 +1,151 @@
68+// SPDX-License-Identifier: GPL-2.0
69+/*
70+ * Arm Corstone700 and Corstone1000 external system reset control driver
71+ *
72+ * Copyright (C) 2019 Arm Ltd.
73+ *
74+ */
75+
76+#include <linux/fs.h>
77+#include <linux/clk.h>
78+#include <linux/err.h>
79+#include <linux/interrupt.h>
80+#include <linux/io.h>
81+#include <linux/kernel.h>
82+#include <linux/mod_devicetable.h>
83+#include <linux/module.h>
84+#include <linux/platform_device.h>
85+#include <linux/miscdevice.h>
86+#include <linux/init.h>
87+
88+#define EXTSYS_DRV_NAME "extsys_ctrl"
89+#define EXTSYS_MAX_DEVS 4
90+
91+#define EXTSYS_RST_SIZE U(0x8)
92+#define EXTSYS_RST_CTRL_OFF U(0x0)
93+#define EXTSYS_RST_ST_OFF U(0x4)
94+
95+/* External system reset control indexes */
96+#define EXTSYS_CPU_WAIT (0x0)
97+#define EXTSYS_RST_REQ (0x1)
98+
99+/* External system reset status masks */
100+#define EXTSYS_RST_ST_ACK_OFF U(0x1)
101+
102+/* No Reset Requested */
103+#define EXTSYS_RST_ST_ACK_NRR (0x0 << EXTSYS_RST_ST_ACK_OFF)
104+
105+/* Reset Request Complete */
106+#define EXTSYS_RST_ST_ACK_RRC (0x2 << EXTSYS_RST_ST_ACK_OFF)
107+
108+/* Reset Request Unable to Complete */
109+#define EXTSYS_RST_ST_ACK_RRUC (0x3 << EXTSYS_RST_ST_ACK_OFF)
110+
111+/* IOCTL commands */
112+#define EXTSYS_CPU_WAIT_DISABLE 0x0
113+#define EXTSYS_RESET_REQ_ENABLE 0x1
114+
115+struct extsys_ctrl {
116+ struct miscdevice miscdev;
117+ void __iomem *reset_reg;
118+ void __iomem *set_reg;
119+};
120+
121+#define CLEAR_BIT(addr, index) writel(readl(addr) & ~(1UL << index), addr)
122+#define SET_BIT(addr, index) writel(readl(addr) | (1UL << index), addr)
123+
124+static long extsys_ctrl_ioctl(struct file *f, unsigned int cmd,
125+ unsigned long arg)
126+{
127+ struct extsys_ctrl *extsys;
128+
129+ extsys = container_of(f->private_data, struct extsys_ctrl, miscdev);
130+
131+ switch (cmd) {
132+ case EXTSYS_CPU_WAIT_DISABLE:
133+ CLEAR_BIT(extsys->reset_reg, EXTSYS_CPU_WAIT);
134+ break;
135+ case EXTSYS_RESET_REQ_ENABLE:
136+ SET_BIT(extsys->reset_reg, EXTSYS_RST_REQ);
137+ break;
138+ default:
139+ break;
140+ }
141+
142+ return 0;
143+}
144+
145+static const struct file_operations extsys_ctrl_fops = {
146+ .owner = THIS_MODULE,
147+ .unlocked_ioctl = extsys_ctrl_ioctl,
148+};
149+
150+static int extsys_ctrl_probe(struct platform_device *pdev)
151+{
152+ struct device *dev = &pdev->dev;
153+ struct extsys_ctrl *extsys;
154+ struct resource *res;
155+ void __iomem *reset_reg;
156+ void __iomem *set_reg;
157+ int ret;
158+
159+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rstreg");
160+ reset_reg = devm_ioremap_resource(dev, res);
161+ if (IS_ERR(reset_reg))
162+ return PTR_ERR(reset_reg);
163+
164+ res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "streg");
165+ set_reg = devm_ioremap_resource(dev, res);
166+ if (IS_ERR(set_reg))
167+ return PTR_ERR(set_reg);
168+
169+ extsys = devm_kzalloc(dev, sizeof(*extsys), GFP_KERNEL);
170+ if (!extsys)
171+ return -ENOMEM;
172+
173+ extsys->reset_reg = reset_reg;
174+ extsys->set_reg = set_reg;
175+
176+ extsys->miscdev.minor = MISC_DYNAMIC_MINOR;
177+ extsys->miscdev.name = EXTSYS_DRV_NAME;
178+ extsys->miscdev.fops = &extsys_ctrl_fops;
179+ extsys->miscdev.parent = dev;
180+
181+ ret = misc_register(&extsys->miscdev);
182+ if (ret)
183+ return ret;
184+
185+ dev_info(dev, "external system controller ready\n");
186+
187+ return 0;
188+}
189+
190+static int extsys_ctrl_remove(struct platform_device *pdev)
191+{
192+ struct extsys_ctrl *extsys = dev_get_drvdata(&pdev->dev);
193+
194+ misc_deregister(&extsys->miscdev);
195+
196+ return 0;
197+}
198+
199+static const struct of_device_id extsys_ctrl_match[] = {
200+ { .compatible = "arm,extsys_ctrl" },
201+ { },
202+};
203+MODULE_DEVICE_TABLE(of, extsys_ctrl_match);
204+
205+static struct platform_driver extsys_ctrl_driver = {
206+ .driver = {
207+ .name = EXTSYS_DRV_NAME,
208+ .of_match_table = extsys_ctrl_match,
209+ },
210+ .probe = extsys_ctrl_probe,
211+ .remove = extsys_ctrl_remove,
212+};
213+module_platform_driver(extsys_ctrl_driver);
214+
215+MODULE_LICENSE("GPL v2");
216+MODULE_DESCRIPTION("Arm External System Control Driver");
217+MODULE_AUTHOR("Morten Borup Petersen");
218+MODULE_AUTHOR("Rui Miguel Silva <rui.silva@arm.com>");
219--
Patrick Williams864cc432023-02-09 14:54:44 -06002202.39.0
Patrick Williams8dd68482022-10-04 07:57:18 -0500221