From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Igor Pecovnik 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > 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 > X-Git-Archeology: Subject: rockchip: bump edge kernel to 6.12 > X-Git-Archeology: > X-Git-Archeology: - Revision 54628d7d3e11824e560b77e905f69d52feb0fbd0: https://github.com/armbian/build/commit/54628d7d3e11824e560b77e905f69d52feb0fbd0 > X-Git-Archeology: Date: Wed, 01 Jan 2025 19:38:55 +0100 > X-Git-Archeology: From: Paolo Sabatino > X-Git-Archeology: Subject: rockchip: bump edge kernel to 6.13-rc5 > X-Git-Archeology: > X-Git-Archeology: - Revision 7c55b4fce91f38383398a7498dde1c6d69a70495: https://github.com/armbian/build/commit/7c55b4fce91f38383398a7498dde1c6d69a70495 > X-Git-Archeology: Date: Wed, 26 Mar 2025 22:23:29 +0100 > X-Git-Archeology: From: Paolo Sabatino > X-Git-Archeology: Subject: bump rockchip 32bit edge kernel to v6.14 > X-Git-Archeology: > X-Git-Archeology: - Revision cc4cb72d4069147ea1b5e6936de3b49aace21967: https://github.com/armbian/build/commit/cc4cb72d4069147ea1b5e6936de3b49aace21967 > X-Git-Archeology: Date: Tue, 03 Jun 2025 09:53:37 +0200 > X-Git-Archeology: From: Paolo Sabatino > X-Git-Archeology: Subject: bump rockchip 32 bit edge kernel to 6.15 > X-Git-Archeology: > X-Git-Archeology: - Revision 96fe7dee19eaec6d9c5159a5cc50e33ca9c96096: https://github.com/armbian/build/commit/96fe7dee19eaec6d9c5159a5cc50e33ca9c96096 > X-Git-Archeology: Date: Mon, 28 Jul 2025 20:45:52 +0800 > X-Git-Archeology: From: Paolo Sabatino > X-Git-Archeology: Subject: bump rockchip edge to kernel 6.16 > X-Git-Archeology: > X-Git-Archeology: - Revision 29317c6f7e33f2cc509acc0da23b615a7d9d8c31: https://github.com/armbian/build/commit/29317c6f7e33f2cc509acc0da23b615a7d9d8c31 > X-Git-Archeology: Date: Thu, 18 Sep 2025 22:48:06 +0200 > X-Git-Archeology: From: Paolo Sabatino > X-Git-Archeology: Subject: update rockchip 32 bit edge kernel to 6.17 > 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 @@ -1468,6 +1468,12 @@ gic: interrupt-controller@ffc01000 { interrupts = ; }; + 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 + * 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 +#include +#include +#include +#include +#include +#include +#include +#include + +#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 "); \ No newline at end of file -- Armbian