518 lines
20 KiB
Diff
518 lines
20 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
|
Date: Thu, 24 May 2018 15:44:15 +0200
|
|
Subject: [ARCHEOLOGY] Merging Rockchip family
|
|
|
|
> X-Git-Archeology: - Revision 7d2f3af08f23049c91c88eec5062613bbfbc85d4: https://github.com/armbian/build/commit/7d2f3af08f23049c91c88eec5062613bbfbc85d4
|
|
> X-Git-Archeology: Date: Thu, 24 May 2018 15:44:15 +0200
|
|
> X-Git-Archeology: From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
|
> X-Git-Archeology: Subject: Merging Rockchip family
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision fafd26db7e055a87e775fdc18de8e64f95e53d41: https://github.com/armbian/build/commit/fafd26db7e055a87e775fdc18de8e64f95e53d41
|
|
> X-Git-Archeology: Date: Thu, 28 Jun 2018 22:11:59 -0400
|
|
> X-Git-Archeology: From: Tony <tonymckahan@gmail.com>
|
|
> X-Git-Archeology: Subject: Rockchip default merge (#1026)
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 96e78c102f8c9a3719b9cb4a9eb6becb063891ce: https://github.com/armbian/build/commit/96e78c102f8c9a3719b9cb4a9eb6becb063891ce
|
|
> X-Git-Archeology: Date: Sun, 08 Jul 2018 13:19:07 -0700
|
|
> X-Git-Archeology: From: Rabit <home@rabits.org>
|
|
> X-Git-Archeology: Subject: ASUS Tinkerboard: Restore justice - author of the gpiomem port
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 106685906579e4c5528fcd22abf79c6719d633fb: https://github.com/armbian/build/commit/106685906579e4c5528fcd22abf79c6719d633fb
|
|
> X-Git-Archeology: Date: Sun, 08 Jul 2018 14:12:15 -0700
|
|
> X-Git-Archeology: From: Rabit <home@rabits.org>
|
|
> X-Git-Archeology: Subject: ASUS Tinkerboard: Added gpio & i2c groups with udev rules to devices
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision de41d3dbce3ed5e467019c0f74ac93dbeb866ded: https://github.com/armbian/build/commit/de41d3dbce3ed5e467019c0f74ac93dbeb866ded
|
|
> X-Git-Archeology: Date: Fri, 10 Aug 2018 10:33:42 +0200
|
|
> X-Git-Archeology: From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
|
> X-Git-Archeology: Subject: Rockchip default cleanup. (Temporally) moving back to Rockchip upstream. This source builds but doesn't boot ...
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision fc1715450015ae62374a13d77f19b0ab53bb1d4c: https://github.com/armbian/build/commit/fc1715450015ae62374a13d77f19b0ab53bb1d4c
|
|
> X-Git-Archeology: Date: Sat, 13 Jul 2019 15:14:54 +0200
|
|
> X-Git-Archeology: From: Igor Pecovnik <igor.pecovnik@gmail.com>
|
|
> X-Git-Archeology: Subject: rockchip-dev: bump to 5.2, adjust pathes, add gpio_mem driver
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 150ac0c2afa147d9e3b036c8ecd8238fe5648cf3: https://github.com/armbian/build/commit/150ac0c2afa147d9e3b036c8ecd8238fe5648cf3
|
|
> X-Git-Archeology: Date: Tue, 19 Nov 2019 23:25:39 +0100
|
|
> X-Git-Archeology: From: Igor Pecovnik <igorpecovnik@users.noreply.github.com>
|
|
> X-Git-Archeology: Subject: Remove K<4, change branches, new features (#1586)
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 0cdffb29b07305209efb12cf3b5ac6032d3a1153: https://github.com/armbian/build/commit/0cdffb29b07305209efb12cf3b5ac6032d3a1153
|
|
> X-Git-Archeology: Date: Wed, 24 Mar 2021 19:01:53 +0100
|
|
> X-Git-Archeology: From: Igor Pecovnik <igorpecovnik@users.noreply.github.com>
|
|
> X-Git-Archeology: Subject: Renaming DEV branch to EDGE (#2704)
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 744ea89a589d62cb6f409baab60fc6664520bc39: https://github.com/armbian/build/commit/744ea89a589d62cb6f409baab60fc6664520bc39
|
|
> X-Git-Archeology: Date: Wed, 08 Sep 2021 17:51:34 +0200
|
|
> X-Git-Archeology: From: Igor Pecovnik <igorpecovnik@users.noreply.github.com>
|
|
> X-Git-Archeology: Subject: Bumping EDGE kernel to 5.14.y (#3125)
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision a1d044de8e0bb6ca504386bc31f5615a9d169067: https://github.com/armbian/build/commit/a1d044de8e0bb6ca504386bc31f5615a9d169067
|
|
> X-Git-Archeology: Date: Tue, 12 Oct 2021 15:59:01 +0200
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: rockchip: update support for edge kernel 5.14
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 4c3dcbf4fcd3616999cb91a1dddfa74668eb6de9: https://github.com/armbian/build/commit/4c3dcbf4fcd3616999cb91a1dddfa74668eb6de9
|
|
> X-Git-Archeology: Date: Tue, 09 Nov 2021 21:58:35 +0100
|
|
> X-Git-Archeology: From: Paolo <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: Rockchip 5.15 (#3242)
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 3f704692a7933a67b5e8cc6ff690d92ef3a5e735: https://github.com/armbian/build/commit/3f704692a7933a67b5e8cc6ff690d92ef3a5e735
|
|
> X-Git-Archeology: Date: Fri, 24 Mar 2023 23:12:56 +0100
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: rockchip: bump edge kernel to 6.2
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 4605bcab83d3d0c0360da7dd0f9ee90e884b58e4: https://github.com/armbian/build/commit/4605bcab83d3d0c0360da7dd0f9ee90e884b58e4
|
|
> X-Git-Archeology: Date: Sun, 09 Jul 2023 11:24:10 +0200
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: bump rockchip edge kernel to 6.4
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 06d5054cce5d269b3fe8a0e23918c0c31a91140c: https://github.com/armbian/build/commit/06d5054cce5d269b3fe8a0e23918c0c31a91140c
|
|
> X-Git-Archeology: Date: Sun, 24 Sep 2023 19:22:37 +0200
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: rockchip: bump edge kernel to 6.5
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision f08dcd48677d2a34f349bf571c979cd422bffcc3: https://github.com/armbian/build/commit/f08dcd48677d2a34f349bf571c979cd422bffcc3
|
|
> X-Git-Archeology: Date: Tue, 31 Oct 2023 08:13:23 +0100
|
|
> X-Git-Archeology: From: Paolo <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: rockchip,rk322x: bump edge kernel to 6.6 (#5875)
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 562d96128ba6a511a8a06c0f4d29946ab80b8969: https://github.com/armbian/build/commit/562d96128ba6a511a8a06c0f4d29946ab80b8969
|
|
> X-Git-Archeology: Date: Tue, 26 Dec 2023 16:45:30 +0100
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: consolidate rk322x and rockchip 32 bit families
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 47d2e8287e34fed3e47f37ab076d0f34ed0ac399: https://github.com/armbian/build/commit/47d2e8287e34fed3e47f37ab076d0f34ed0ac399
|
|
> X-Git-Archeology: Date: Mon, 25 Mar 2024 19:38:38 +0100
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: rockchip: bump edge kernel to 6.8
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 724573bf7a21e61b0b626f835031a4c3206bb8ba: https://github.com/armbian/build/commit/724573bf7a21e61b0b626f835031a4c3206bb8ba
|
|
> X-Git-Archeology: Date: Wed, 05 Jun 2024 22:18:51 +0200
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: bump rockchip family edge kernel to 6.9
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 7da7bbf61cb776a054219e35926d391dad9a67a7: https://github.com/armbian/build/commit/7da7bbf61cb776a054219e35926d391dad9a67a7
|
|
> X-Git-Archeology: Date: Mon, 22 Jul 2024 19:18:14 +0200
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: rockchip: bump edge kernel to 6.10
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision 94ec783de0dad381b3e2e71d646d8428af4d5051: https://github.com/armbian/build/commit/94ec783de0dad381b3e2e71d646d8428af4d5051
|
|
> X-Git-Archeology: Date: Wed, 18 Sep 2024 14:03:19 +0200
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: bump rockchip 32 bit edge kernel to 6.11
|
|
> X-Git-Archeology:
|
|
> X-Git-Archeology: - Revision c90a0f7890bddc8e755847fc8227e15828950251: https://github.com/armbian/build/commit/c90a0f7890bddc8e755847fc8227e15828950251
|
|
> X-Git-Archeology: Date: Sat, 30 Nov 2024 13:07:31 +0100
|
|
> X-Git-Archeology: From: Paolo Sabatino <paolo.sabatino@gmail.com>
|
|
> X-Git-Archeology: Subject: rockchip: bump edge kernel to 6.12
|
|
> X-Git-Archeology:
|
|
---
|
|
arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi | 3 +
|
|
arch/arm/boot/dts/rockchip/rk3288.dtsi | 6 +
|
|
drivers/char/Kconfig | 1 +
|
|
drivers/char/Makefile | 2 +
|
|
drivers/char/rockchip/Kconfig | 16 +
|
|
drivers/char/rockchip/Makefile | 1 +
|
|
drivers/char/rockchip/rk3288-gpiomem.c | 303 ++++++++++
|
|
7 files changed, 332 insertions(+)
|
|
|
|
diff --git a/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi b/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
|
|
index 111111111111..222222222222 100644
|
|
--- a/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
|
|
+++ b/arch/arm/boot/dts/rockchip/rk3288-tinker.dtsi
|
|
@@ -544,3 +544,6 @@ &vopl_mmu {
|
|
&wdt {
|
|
status = "okay";
|
|
};
|
|
+&gpiomem {
|
|
+ status = "okay";
|
|
+};
|
|
diff --git a/arch/arm/boot/dts/rockchip/rk3288.dtsi b/arch/arm/boot/dts/rockchip/rk3288.dtsi
|
|
index 111111111111..222222222222 100644
|
|
--- a/arch/arm/boot/dts/rockchip/rk3288.dtsi
|
|
+++ b/arch/arm/boot/dts/rockchip/rk3288.dtsi
|
|
@@ -1479,6 +1479,12 @@ gic: interrupt-controller@ffc01000 {
|
|
interrupts = <GIC_PPI 9 0xf04>;
|
|
};
|
|
|
|
+ gpiomem: rk3288-gpiomem@ff750000 {
|
|
+ compatible = "rockchip,rk3288-gpiomem";
|
|
+ reg = <0x0 0xff750000 0x0 0x1000>;
|
|
+ status = "disabled";
|
|
+ };
|
|
+
|
|
pinctrl: pinctrl {
|
|
compatible = "rockchip,rk3288-pinctrl";
|
|
rockchip,grf = <&grf>;
|
|
diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/char/Kconfig
|
|
+++ b/drivers/char/Kconfig
|
|
@@ -6,6 +6,7 @@
|
|
menu "Character devices"
|
|
|
|
source "drivers/tty/Kconfig"
|
|
+source "drivers/char/rockchip/Kconfig"
|
|
|
|
config TTY_PRINTK
|
|
tristate "TTY driver to output user messages via printk"
|
|
diff --git a/drivers/char/Makefile b/drivers/char/Makefile
|
|
index 111111111111..222222222222 100644
|
|
--- a/drivers/char/Makefile
|
|
+++ b/drivers/char/Makefile
|
|
@@ -40,6 +40,8 @@ obj-$(CONFIG_TCG_TPM) += tpm/
|
|
|
|
obj-$(CONFIG_PS3_FLASH) += ps3flash.o
|
|
|
|
+obj-$(CONFIG_ARCH_ROCKCHIP) += rockchip/
|
|
+
|
|
obj-$(CONFIG_XILLYBUS_CLASS) += xillybus/
|
|
obj-$(CONFIG_POWERNV_OP_PANEL) += powernv-op-panel.o
|
|
obj-$(CONFIG_ADI) += adi.o
|
|
diff --git a/drivers/char/rockchip/Kconfig b/drivers/char/rockchip/Kconfig
|
|
new file mode 100644
|
|
index 000000000000..111111111111
|
|
--- /dev/null
|
|
+++ b/drivers/char/rockchip/Kconfig
|
|
@@ -0,0 +1,16 @@
|
|
+#
|
|
+# Broadcom char driver config
|
|
+#
|
|
+
|
|
+menuconfig RK_CHAR_DRIVERS
|
|
+ bool "Rockchip Char Drivers"
|
|
+ help
|
|
+ Rockchip's char drivers
|
|
+
|
|
+config RK3288_DEVGPIOMEM
|
|
+ tristate "/dev/gpiomem rootless GPIO access via mmap() on the RK3288"
|
|
+ default y
|
|
+ help
|
|
+ Provides users with root-free access to the GPIO registers
|
|
+ on the 3288. Calling mmap(/dev/gpiomem) will map the GPIO
|
|
+ register page to the user's pointer.
|
|
\ No newline at end of file
|
|
diff --git a/drivers/char/rockchip/Makefile b/drivers/char/rockchip/Makefile
|
|
new file mode 100644
|
|
index 000000000000..111111111111
|
|
--- /dev/null
|
|
+++ b/drivers/char/rockchip/Makefile
|
|
@@ -0,0 +1 @@
|
|
+obj-$(CONFIG_RK3288_DEVGPIOMEM)+= rk3288-gpiomem.o
|
|
\ No newline at end of file
|
|
diff --git a/drivers/char/rockchip/rk3288-gpiomem.c b/drivers/char/rockchip/rk3288-gpiomem.c
|
|
new file mode 100644
|
|
index 000000000000..111111111111
|
|
--- /dev/null
|
|
+++ b/drivers/char/rockchip/rk3288-gpiomem.c
|
|
@@ -0,0 +1,303 @@
|
|
+/**
|
|
+ * GPIO memory device driver
|
|
+ *
|
|
+ * Creates a chardev /dev/gpiomem which will provide user access to
|
|
+ * the rk3288's GPIO registers when it is mmap()'d.
|
|
+ * No longer need root for user GPIO access, but without relaxing permissions
|
|
+ * on /dev/mem.
|
|
+ *
|
|
+ * Written by Luke Wren <luke@raspberrypi.org>
|
|
+ * Copyright (c) 2015, Raspberry Pi (Trading) Ltd.
|
|
+ *
|
|
+ * Redistribution and use in source and binary forms, with or without
|
|
+ * modification, are permitted provided that the following conditions
|
|
+ * are met:
|
|
+ * 1. Redistributions of source code must retain the above copyright
|
|
+ * notice, this list of conditions, and the following disclaimer,
|
|
+ * without modification.
|
|
+ * 2. Redistributions in binary form must reproduce the above copyright
|
|
+ * notice, this list of conditions and the following disclaimer in the
|
|
+ * documentation and/or other materials provided with the distribution.
|
|
+ * 3. The names of the above-listed copyright holders may not be used
|
|
+ * to endorse or promote products derived from this software without
|
|
+ * specific prior written permission.
|
|
+ *
|
|
+ * ALTERNATIVELY, this software may be distributed under the terms of the
|
|
+ * GNU General Public License ("GPL") version 2, as published by the Free
|
|
+ * Software Foundation.
|
|
+ *
|
|
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
|
|
+ * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
|
|
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
|
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
|
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
+ */
|
|
+
|
|
+#include <linux/kernel.h>
|
|
+#include <linux/module.h>
|
|
+#include <linux/of.h>
|
|
+#include <linux/platform_device.h>
|
|
+#include <linux/mm.h>
|
|
+#include <linux/slab.h>
|
|
+#include <linux/cdev.h>
|
|
+#include <linux/pagemap.h>
|
|
+#include <linux/io.h>
|
|
+
|
|
+#define DEVICE_NAME "rk3288-gpiomem"
|
|
+#define DRIVER_NAME "gpiomem-rk3288"
|
|
+#define DEVICE_MINOR 0
|
|
+
|
|
+struct rk3288_gpiomem_instance {
|
|
+ unsigned long gpio_regs_phys;
|
|
+ struct device *dev;
|
|
+};
|
|
+
|
|
+static struct cdev rk3288_gpiomem_cdev;
|
|
+static dev_t rk3288_gpiomem_devid;
|
|
+static struct class *rk3288_gpiomem_class;
|
|
+static struct device *rk3288_gpiomem_dev;
|
|
+static struct rk3288_gpiomem_instance *inst;
|
|
+
|
|
+
|
|
+/****************************************************************************
|
|
+*
|
|
+* GPIO mem chardev file ops
|
|
+*
|
|
+***************************************************************************/
|
|
+
|
|
+static int rk3288_gpiomem_open(struct inode *inode, struct file *file)
|
|
+{
|
|
+ int dev = iminor(inode);
|
|
+ int ret = 0;
|
|
+
|
|
+ if (dev != DEVICE_MINOR) {
|
|
+ dev_err(inst->dev, "Unknown minor device: %d", dev);
|
|
+ ret = -ENXIO;
|
|
+ }
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static int rk3288_gpiomem_release(struct inode *inode, struct file *file)
|
|
+{
|
|
+ int dev = iminor(inode);
|
|
+ int ret = 0;
|
|
+
|
|
+ if (dev != DEVICE_MINOR) {
|
|
+ dev_err(inst->dev, "Unknown minor device %d", dev);
|
|
+ ret = -ENXIO;
|
|
+ }
|
|
+ return ret;
|
|
+}
|
|
+
|
|
+static const struct vm_operations_struct rk3288_gpiomem_vm_ops = {
|
|
+#ifdef CONFIG_HAVE_IOREMAP_PROT
|
|
+ .access = generic_access_phys
|
|
+#endif
|
|
+};
|
|
+static int address_is_allowed(unsigned long pfn, unsigned long size)
|
|
+{
|
|
+ unsigned long address = pfn << PAGE_SHIFT;
|
|
+
|
|
+ dev_info(inst->dev, "address_is_allowed.pfn: 0x%08lx", address);
|
|
+
|
|
+ switch(address) {
|
|
+
|
|
+ case 0xff750000:
|
|
+ case 0xff760000:
|
|
+ case 0xff780000:
|
|
+ case 0xff790000:
|
|
+ case 0xff7a0000:
|
|
+ case 0xff7b0000:
|
|
+ case 0xff7c0000:
|
|
+ case 0xff7d0000:
|
|
+ case 0xff7e0000:
|
|
+ case 0xff7f0000:
|
|
+ case 0xff7f2000:
|
|
+ case 0xff770000:
|
|
+ case 0xff730000:
|
|
+ case 0xff680000:
|
|
+ dev_info(inst->dev, "address_is_allowed.return 1");
|
|
+ return 1;
|
|
+ break;
|
|
+ default :
|
|
+ dev_info(inst->dev, "address_is_allowed.return 0");
|
|
+ return 0;
|
|
+ }
|
|
+}
|
|
+
|
|
+static int rk3288_gpiomem_mmap(struct file *file, struct vm_area_struct *vma)
|
|
+{
|
|
+
|
|
+ size_t size;
|
|
+
|
|
+ size = vma->vm_end - vma->vm_start;
|
|
+
|
|
+
|
|
+ if (!address_is_allowed(vma->vm_pgoff, size))
|
|
+ return -EPERM;
|
|
+
|
|
+ vma->vm_page_prot = phys_mem_access_prot(file, vma->vm_pgoff,
|
|
+ size,
|
|
+ vma->vm_page_prot);
|
|
+
|
|
+ vma->vm_ops = &rk3288_gpiomem_vm_ops;
|
|
+
|
|
+ /* Remap-pfn-range will mark the range VM_IO */
|
|
+ if (remap_pfn_range(vma,
|
|
+ vma->vm_start,
|
|
+ vma->vm_pgoff,
|
|
+ size,
|
|
+ vma->vm_page_prot)) {
|
|
+ return -EAGAIN;
|
|
+ }
|
|
+
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+static const struct file_operations
|
|
+rk3288_gpiomem_fops = {
|
|
+ .owner = THIS_MODULE,
|
|
+ .open = rk3288_gpiomem_open,
|
|
+ .release = rk3288_gpiomem_release,
|
|
+ .mmap = rk3288_gpiomem_mmap,
|
|
+};
|
|
+
|
|
+static int rk3288_gpiomem_dev_uevent(const struct device *dev, struct kobj_uevent_env *env)
|
|
+{
|
|
+ add_uevent_var(env, "DEVMODE=%#o", 0666);
|
|
+ return 0;
|
|
+}
|
|
+
|
|
+ /****************************************************************************
|
|
+*
|
|
+* Probe and remove functions
|
|
+*
|
|
+***************************************************************************/
|
|
+
|
|
+
|
|
+static int rk3288_gpiomem_probe(struct platform_device *pdev)
|
|
+{
|
|
+ int err;
|
|
+ void *ptr_err;
|
|
+ struct device *dev = &pdev->dev;
|
|
+ struct resource *ioresource;
|
|
+
|
|
+ /* Allocate buffers and instance data */
|
|
+
|
|
+ inst = kzalloc(sizeof(struct rk3288_gpiomem_instance), GFP_KERNEL);
|
|
+
|
|
+ if (!inst) {
|
|
+ err = -ENOMEM;
|
|
+ goto failed_inst_alloc;
|
|
+ }
|
|
+
|
|
+ inst->dev = dev;
|
|
+
|
|
+ ioresource = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
|
+ if (ioresource) {
|
|
+ inst->gpio_regs_phys = ioresource->start;
|
|
+ } else {
|
|
+ dev_err(inst->dev, "failed to get IO resource");
|
|
+ err = -ENOENT;
|
|
+ goto failed_get_resource;
|
|
+ }
|
|
+
|
|
+ /* Create character device entries */
|
|
+
|
|
+ err = alloc_chrdev_region(&rk3288_gpiomem_devid,
|
|
+ DEVICE_MINOR, 1, DEVICE_NAME);
|
|
+ if (err != 0) {
|
|
+ dev_err(inst->dev, "unable to allocate device number");
|
|
+ goto failed_alloc_chrdev;
|
|
+ }
|
|
+ cdev_init(&rk3288_gpiomem_cdev, &rk3288_gpiomem_fops);
|
|
+ rk3288_gpiomem_cdev.owner = THIS_MODULE;
|
|
+ err = cdev_add(&rk3288_gpiomem_cdev, rk3288_gpiomem_devid, 1);
|
|
+ if (err != 0) {
|
|
+ dev_err(inst->dev, "unable to register device");
|
|
+ goto failed_cdev_add;
|
|
+ }
|
|
+
|
|
+ /* Create sysfs entries */
|
|
+
|
|
+ rk3288_gpiomem_class = class_create(DEVICE_NAME);
|
|
+ ptr_err = rk3288_gpiomem_class;
|
|
+ if (IS_ERR(ptr_err))
|
|
+ goto failed_class_create;
|
|
+ rk3288_gpiomem_class->dev_uevent = rk3288_gpiomem_dev_uevent;
|
|
+ rk3288_gpiomem_dev = device_create(rk3288_gpiomem_class, NULL,
|
|
+ rk3288_gpiomem_devid, NULL,
|
|
+ "gpiomem");
|
|
+ ptr_err = rk3288_gpiomem_dev;
|
|
+ if (IS_ERR(ptr_err))
|
|
+ goto failed_device_create;
|
|
+
|
|
+ dev_info(inst->dev, "Initialised: Registers at 0x%08lx",
|
|
+ inst->gpio_regs_phys);
|
|
+
|
|
+ return 0;
|
|
+
|
|
+failed_device_create:
|
|
+ class_destroy(rk3288_gpiomem_class);
|
|
+failed_class_create:
|
|
+ cdev_del(&rk3288_gpiomem_cdev);
|
|
+ err = PTR_ERR(ptr_err);
|
|
+failed_cdev_add:
|
|
+ unregister_chrdev_region(rk3288_gpiomem_devid, 1);
|
|
+failed_alloc_chrdev:
|
|
+failed_get_resource:
|
|
+ kfree(inst);
|
|
+failed_inst_alloc:
|
|
+ dev_err(inst->dev, "could not load rk3288_gpiomem");
|
|
+ return err;
|
|
+}
|
|
+
|
|
+static void rk3288_gpiomem_remove(struct platform_device *pdev)
|
|
+{
|
|
+ struct device *dev = inst->dev;
|
|
+
|
|
+ kfree(inst);
|
|
+ device_destroy(rk3288_gpiomem_class, rk3288_gpiomem_devid);
|
|
+ class_destroy(rk3288_gpiomem_class);
|
|
+ cdev_del(&rk3288_gpiomem_cdev);
|
|
+ unregister_chrdev_region(rk3288_gpiomem_devid, 1);
|
|
+
|
|
+ dev_info(dev, "GPIO mem driver removed - OK");
|
|
+ return;
|
|
+}
|
|
+
|
|
+ /****************************************************************************
|
|
+*
|
|
+* Register the driver with device tree
|
|
+*
|
|
+***************************************************************************/
|
|
+
|
|
+static const struct of_device_id rk3288_gpiomem_of_match[] = {
|
|
+ {.compatible = "rockchip,rk3288-gpiomem",},
|
|
+ { /* sentinel */ },
|
|
+};
|
|
+
|
|
+MODULE_DEVICE_TABLE(of, rk3288_gpiomem_of_match);
|
|
+
|
|
+static struct platform_driver rk3288_gpiomem_driver = {
|
|
+ .probe = rk3288_gpiomem_probe,
|
|
+ .remove = rk3288_gpiomem_remove,
|
|
+ .driver = {
|
|
+ .name = DRIVER_NAME,
|
|
+ .owner = THIS_MODULE,
|
|
+ .of_match_table = rk3288_gpiomem_of_match,
|
|
+ },
|
|
+};
|
|
+
|
|
+module_platform_driver(rk3288_gpiomem_driver);
|
|
+
|
|
+MODULE_ALIAS("platform:gpiomem-rk3288");
|
|
+MODULE_LICENSE("GPL");
|
|
+MODULE_DESCRIPTION("gpiomem driver for accessing GPIO from userspace");
|
|
+MODULE_AUTHOR("Luke Wren <luke@raspberrypi.org>");
|
|
\ No newline at end of file
|
|
--
|
|
Armbian
|
|
|