mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-27 14:14:24 +08:00
comedi: make all 'class' structures const
Now that the driver core allows for struct class to be in read-only memory, making all 'class' structures to be declared at build time placing them into read-only memory, instead of having to be dynamically allocated at load time. Cc: Ian Abbott <abbotti@mev.co.uk> Cc: H Hartley Sweeten <hsweeten@visionengravers.com> Cc: Benjamin Tissoires <benjamin.tissoires@redhat.com> Cc: Ivan Orlov <ivan.orlov0322@gmail.com> Cc: Xuezhi Zhang <zhangxuezhi1@coolpad.com> Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Ivan Orlov <ivan.orlov0322@gmail.com> Link: https://lore.kernel.org/r/20230620144137.581406-2-gregkh@linuxfoundation.org Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
9ee202e69e
commit
3b7a628dec
@ -97,7 +97,6 @@ static DEFINE_MUTEX(comedi_subdevice_minor_table_lock);
|
||||
static struct comedi_subdevice
|
||||
*comedi_subdevice_minor_table[COMEDI_NUM_SUBDEVICE_MINORS];
|
||||
|
||||
static struct class *comedi_class;
|
||||
static struct cdev comedi_cdev;
|
||||
|
||||
static void comedi_device_init(struct comedi_device *dev)
|
||||
@ -187,18 +186,6 @@ static struct comedi_device *comedi_clear_board_minor(unsigned int minor)
|
||||
return dev;
|
||||
}
|
||||
|
||||
static void comedi_free_board_dev(struct comedi_device *dev)
|
||||
{
|
||||
if (dev) {
|
||||
comedi_device_cleanup(dev);
|
||||
if (dev->class_dev) {
|
||||
device_destroy(comedi_class,
|
||||
MKDEV(COMEDI_MAJOR, dev->minor));
|
||||
}
|
||||
comedi_dev_put(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static struct comedi_subdevice *
|
||||
comedi_subdevice_from_minor(const struct comedi_device *dev, unsigned int minor)
|
||||
{
|
||||
@ -611,6 +598,23 @@ static struct attribute *comedi_dev_attrs[] = {
|
||||
};
|
||||
ATTRIBUTE_GROUPS(comedi_dev);
|
||||
|
||||
static const struct class comedi_class = {
|
||||
.name = "comedi",
|
||||
.dev_groups = comedi_dev_groups,
|
||||
};
|
||||
|
||||
static void comedi_free_board_dev(struct comedi_device *dev)
|
||||
{
|
||||
if (dev) {
|
||||
comedi_device_cleanup(dev);
|
||||
if (dev->class_dev) {
|
||||
device_destroy(&comedi_class,
|
||||
MKDEV(COMEDI_MAJOR, dev->minor));
|
||||
}
|
||||
comedi_dev_put(dev);
|
||||
}
|
||||
}
|
||||
|
||||
static void __comedi_clear_subdevice_runflags(struct comedi_subdevice *s,
|
||||
unsigned int bits)
|
||||
{
|
||||
@ -3263,7 +3267,7 @@ struct comedi_device *comedi_alloc_board_minor(struct device *hardware_device)
|
||||
return ERR_PTR(-EBUSY);
|
||||
}
|
||||
dev->minor = i;
|
||||
csdev = device_create(comedi_class, hardware_device,
|
||||
csdev = device_create(&comedi_class, hardware_device,
|
||||
MKDEV(COMEDI_MAJOR, i), NULL, "comedi%i", i);
|
||||
if (!IS_ERR(csdev))
|
||||
dev->class_dev = get_device(csdev);
|
||||
@ -3312,7 +3316,7 @@ int comedi_alloc_subdevice_minor(struct comedi_subdevice *s)
|
||||
}
|
||||
i += COMEDI_NUM_BOARD_MINORS;
|
||||
s->minor = i;
|
||||
csdev = device_create(comedi_class, dev->class_dev,
|
||||
csdev = device_create(&comedi_class, dev->class_dev,
|
||||
MKDEV(COMEDI_MAJOR, i), NULL, "comedi%i_subd%i",
|
||||
dev->minor, s->index);
|
||||
if (!IS_ERR(csdev))
|
||||
@ -3337,7 +3341,7 @@ void comedi_free_subdevice_minor(struct comedi_subdevice *s)
|
||||
comedi_subdevice_minor_table[i] = NULL;
|
||||
mutex_unlock(&comedi_subdevice_minor_table_lock);
|
||||
if (s->class_dev) {
|
||||
device_destroy(comedi_class, MKDEV(COMEDI_MAJOR, s->minor));
|
||||
device_destroy(&comedi_class, MKDEV(COMEDI_MAJOR, s->minor));
|
||||
s->class_dev = NULL;
|
||||
}
|
||||
}
|
||||
@ -3383,15 +3387,12 @@ static int __init comedi_init(void)
|
||||
if (retval)
|
||||
goto out_unregister_chrdev_region;
|
||||
|
||||
comedi_class = class_create("comedi");
|
||||
if (IS_ERR(comedi_class)) {
|
||||
retval = PTR_ERR(comedi_class);
|
||||
retval = class_register(&comedi_class);
|
||||
if (retval) {
|
||||
pr_err("failed to create class\n");
|
||||
goto out_cdev_del;
|
||||
}
|
||||
|
||||
comedi_class->dev_groups = comedi_dev_groups;
|
||||
|
||||
/* create devices files for legacy/manual use */
|
||||
for (i = 0; i < comedi_num_legacy_minors; i++) {
|
||||
struct comedi_device *dev;
|
||||
@ -3413,7 +3414,7 @@ static int __init comedi_init(void)
|
||||
|
||||
out_cleanup_board_minors:
|
||||
comedi_cleanup_board_minors();
|
||||
class_destroy(comedi_class);
|
||||
class_unregister(&comedi_class);
|
||||
out_cdev_del:
|
||||
cdev_del(&comedi_cdev);
|
||||
out_unregister_chrdev_region:
|
||||
@ -3425,7 +3426,7 @@ module_init(comedi_init);
|
||||
static void __exit comedi_cleanup(void)
|
||||
{
|
||||
comedi_cleanup_board_minors();
|
||||
class_destroy(comedi_class);
|
||||
class_unregister(&comedi_class);
|
||||
cdev_del(&comedi_cdev);
|
||||
unregister_chrdev_region(MKDEV(COMEDI_MAJOR, 0), COMEDI_NUM_MINORS);
|
||||
|
||||
|
@ -60,7 +60,9 @@
|
||||
static bool config_mode;
|
||||
static unsigned int set_amplitude;
|
||||
static unsigned int set_period;
|
||||
static struct class *ctcls;
|
||||
static const struct class ctcls = {
|
||||
.name = CLASS_NAME,
|
||||
};
|
||||
static struct device *ctdev;
|
||||
|
||||
module_param_named(noauto, config_mode, bool, 0444);
|
||||
@ -795,13 +797,13 @@ static int __init comedi_test_init(void)
|
||||
}
|
||||
|
||||
if (!config_mode) {
|
||||
ctcls = class_create(CLASS_NAME);
|
||||
if (IS_ERR(ctcls)) {
|
||||
ret = class_register(&ctcls);
|
||||
if (ret) {
|
||||
pr_warn("comedi_test: unable to create class\n");
|
||||
goto clean3;
|
||||
}
|
||||
|
||||
ctdev = device_create(ctcls, NULL, MKDEV(0, 0), NULL, DEV_NAME);
|
||||
ctdev = device_create(&ctcls, NULL, MKDEV(0, 0), NULL, DEV_NAME);
|
||||
if (IS_ERR(ctdev)) {
|
||||
pr_warn("comedi_test: unable to create device\n");
|
||||
goto clean2;
|
||||
@ -817,13 +819,10 @@ static int __init comedi_test_init(void)
|
||||
return 0;
|
||||
|
||||
clean:
|
||||
device_destroy(ctcls, MKDEV(0, 0));
|
||||
device_destroy(&ctcls, MKDEV(0, 0));
|
||||
clean2:
|
||||
class_destroy(ctcls);
|
||||
ctdev = NULL;
|
||||
class_unregister(&ctcls);
|
||||
clean3:
|
||||
ctcls = NULL;
|
||||
|
||||
return 0;
|
||||
}
|
||||
module_init(comedi_test_init);
|
||||
@ -833,9 +832,9 @@ static void __exit comedi_test_exit(void)
|
||||
if (ctdev)
|
||||
comedi_auto_unconfig(ctdev);
|
||||
|
||||
if (ctcls) {
|
||||
device_destroy(ctcls, MKDEV(0, 0));
|
||||
class_destroy(ctcls);
|
||||
if (class_is_registered(&ctcls)) {
|
||||
device_destroy(&ctcls, MKDEV(0, 0));
|
||||
class_unregister(&ctcls);
|
||||
}
|
||||
|
||||
comedi_driver_unregister(&waveform_driver);
|
||||
|
Loading…
Reference in New Issue
Block a user