OSDN Git Service

staging: vchiq: convert to use a miscdevice
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 7 Sep 2021 11:50:45 +0000 (13:50 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 13 Sep 2021 06:49:53 +0000 (08:49 +0200)
Using a struct class, a cdev, and another device just for a single minor
device is total overkill.  Just use a dynamic misc device instead,
saving lots of logic and memory.

Cc: Nicolas Saenz Julienne <nsaenz@kernel.org>
Cc: Stefan Wahren <stefan.wahren@i2se.com>
Cc: Arnd Bergmann <arnd@arndb.de>
Cc: Dan Carpenter <dan.carpenter@oracle.com>
Cc: Ojaswin Mujoo <ojaswin98@gmail.com>
Cc: Phil Elwell <phil@raspberrypi.com>
Cc: bcm-kernel-feedback-list@broadcom.com
Cc: linux-rpi-kernel@lists.infradead.org
Cc: linux-arm-kernel@lists.infradead.org
Link: https://lore.kernel.org/r/20210907115045.2206083-1-gregkh@linuxfoundation.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/vc04_services/interface/vchiq_arm/vchiq_dev.c

index bf1a88c..788fa5a 100644 (file)
@@ -9,18 +9,13 @@
 #include <linux/device.h>
 #include <linux/slab.h>
 #include <linux/compat.h>
+#include <linux/miscdevice.h>
 
 #include "vchiq_core.h"
 #include "vchiq_ioctl.h"
 #include "vchiq_arm.h"
 #include "vchiq_debugfs.h"
 
-#define DEVICE_NAME "vchiq"
-
-static struct cdev    vchiq_cdev;
-static dev_t          vchiq_devid;
-static struct class  *vchiq_class;
-
 static const char *const ioctl_names[] = {
        "CONNECT",
        "SHUTDOWN",
@@ -1364,6 +1359,13 @@ vchiq_fops = {
        .read = vchiq_read
 };
 
+static struct miscdevice vchiq_miscdev = {
+       .fops = &vchiq_fops,
+       .minor = MISC_DYNAMIC_MINOR,
+       .name = "vchiq",
+
+};
+
 /**
  *     vchiq_register_chrdev - Register the char driver for vchiq
  *                             and create the necessary class and
@@ -1374,57 +1376,9 @@ vchiq_fops = {
  */
 int vchiq_register_chrdev(struct device *parent)
 {
-       struct device *vchiq_dev;
-       int ret;
-
-       vchiq_class = class_create(THIS_MODULE, DEVICE_NAME);
-       if (IS_ERR(vchiq_class)) {
-               pr_err("Failed to create vchiq class\n");
-               ret = PTR_ERR(vchiq_class);
-               goto error_exit;
-       }
-
-       ret = alloc_chrdev_region(&vchiq_devid, 0, 1, DEVICE_NAME);
-       if (ret) {
-               pr_err("vchiq: Failed to allocate vchiq's chrdev region\n");
-               goto alloc_region_error;
-       }
-
-       cdev_init(&vchiq_cdev, &vchiq_fops);
-       vchiq_cdev.owner = THIS_MODULE;
-       ret = cdev_add(&vchiq_cdev, vchiq_devid, 1);
-       if (ret) {
-               vchiq_log_error(vchiq_arm_log_level,
-                               "Unable to register vchiq char device");
-               goto cdev_add_error;
-       }
-
-       vchiq_dev = device_create(vchiq_class, parent, vchiq_devid, NULL,
-                                 DEVICE_NAME);
-       if (IS_ERR(vchiq_dev)) {
-               vchiq_log_error(vchiq_arm_log_level,
-                               "Failed to create vchiq char device node");
-               ret = PTR_ERR(vchiq_dev);
-               goto device_create_error;
-       }
-
-       vchiq_log_info(vchiq_arm_log_level,
-                      "vchiq char dev initialised successfully - device %d.%d",
-                       MAJOR(vchiq_devid), MINOR(vchiq_devid));
+       vchiq_miscdev.parent = parent;
 
-       return 0;
-
-device_create_error:
-       cdev_del(&vchiq_cdev);
-
-cdev_add_error:
-       unregister_chrdev_region(vchiq_devid, 1);
-
-alloc_region_error:
-       class_destroy(vchiq_class);
-
-error_exit:
-       return ret;
+       return misc_register(&vchiq_miscdev);
 }
 
 /**
@@ -1433,8 +1387,5 @@ error_exit:
  */
 void vchiq_deregister_chrdev(void)
 {
-       device_destroy(vchiq_class, vchiq_devid);
-       cdev_del(&vchiq_cdev);
-       unregister_chrdev_region(vchiq_devid, 1);
-       class_destroy(vchiq_class);
+       misc_deregister(&vchiq_miscdev);
 }