Module: xenomai-forge Branch: next Commit: 1d82566c28932b825cb39c7efc202a9504d1a8e9 URL: http://git.xenomai.org/?p=xenomai-forge.git;a=commit;h=1d82566c28932b825cb39c7efc202a9504d1a8e9
Author: Philippe Gerum <r...@xenomai.org> Date: Fri Sep 19 11:39:08 2014 +0200 cobalt/rtdm: group all RTDM devices into a generic sysfs class All RTDM device classes are supposed to be unique within the RTDM namespace, but RTDM class names might conflict with regular device class names. Move all RTDM devices under the generic /sys/class/rtdm hierarchy to prevent namespace clashes. --- include/cobalt/kernel/rtdm/driver.h | 1 - kernel/cobalt/rtdm/device.c | 41 +++++++++++++++-------------------- 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/include/cobalt/kernel/rtdm/driver.h b/include/cobalt/kernel/rtdm/driver.h index da5bcbd..9db9e1b 100644 --- a/include/cobalt/kernel/rtdm/driver.h +++ b/include/cobalt/kernel/rtdm/driver.h @@ -258,7 +258,6 @@ struct rtdm_device_class { int major; } named; }; - struct class *kclass; atomic_t refcount; }; }; diff --git a/kernel/cobalt/rtdm/device.c b/kernel/cobalt/rtdm/device.c index b381950..69de887 100644 --- a/kernel/cobalt/rtdm/device.c +++ b/kernel/cobalt/rtdm/device.c @@ -40,6 +40,8 @@ struct rb_root rtdm_protocol_devices; struct semaphore nrt_dev_lock; DEFINE_XNLOCK(rt_dev_lock); +static struct class *rtdm_class; + static int enosys(void) { return -ENOSYS; @@ -187,7 +189,6 @@ ATTRIBUTE_GROUPS(rtdm); static int register_device_class(struct rtdm_device_class *class) { - struct class *kclass; dev_t rdev; int ret; @@ -210,26 +211,15 @@ static int register_device_class(struct rtdm_device_class *class) if (class->device_count <= 0) return -EINVAL; - kclass = class_create(THIS_MODULE, class->profile_info.name); - if (IS_ERR(kclass)) { - printk(XENO_WARN "cannot create device class %s\n", - class->profile_info.name); - return PTR_ERR(kclass); - } - kclass->dev_groups = rtdm_groups; - class->kclass = kclass; - if ((class->device_flags & RTDM_NAMED_DEVICE) == 0) goto done; - kclass->devnode = rtdm_devnode; - ret = alloc_chrdev_region(&rdev, 0, class->device_count, class->profile_info.name); if (ret) { printk(XENO_WARN "cannot allocate chrdev region %s[0..%d]\n", class->profile_info.name, class->device_count - 1); - goto fail_chrdev; + return ret; } cdev_init(&class->named.cdev, &rtdm_dumb_fops); @@ -246,8 +236,6 @@ done: fail_cdev: unregister_chrdev_region(rdev, class->device_count); -fail_chrdev: - class_destroy(kclass); return ret; } @@ -264,8 +252,6 @@ static void unregister_device_class(struct rtdm_device_class *class) unregister_chrdev_region(MKDEV(class->named.major, 0), class->device_count); } - - class_destroy(class->kclass); } /** @@ -360,7 +346,7 @@ int rtdm_dev_register(struct rtdm_device *device) goto fail; rdev = MKDEV(major, minor); - kdev = device_create(class->kclass, NULL, rdev, + kdev = device_create(rtdm_class, NULL, rdev, device, device->label, minor); if (IS_ERR(kdev)) { xnregistry_remove(device->named.handle); @@ -379,7 +365,7 @@ int rtdm_dev_register(struct rtdm_device *device) } rdev = MKDEV(0, 0); - kdev = device_create(class->kclass, NULL, rdev, + kdev = device_create(rtdm_class, NULL, rdev, device, device->name); if (IS_ERR(kdev)) { ret = PTR_ERR(kdev); @@ -405,7 +391,7 @@ int rtdm_dev_register(struct rtdm_device *device) return 0; fail: if (kdev) - device_destroy(class->kclass, rdev); + device_destroy(rtdm_class, rdev); unregister_device_class(class); @@ -462,7 +448,7 @@ void rtdm_dev_unregister(struct rtdm_device *device) if (handle) xnregistry_remove(handle); - device_destroy(class->kclass, device->rdev); + device_destroy(rtdm_class, device->rdev); unregister_device_class(class); @@ -484,14 +470,23 @@ int __init rtdm_dev_init(void) INIT_LIST_HEAD(&rtdm_named_devices); xntree_init(&rtdm_protocol_devices); + rtdm_class = class_create(THIS_MODULE, "rtdm"); + if (IS_ERR(rtdm_class)) { + printk(XENO_ERR "cannot create RTDM sysfs class\n"); + return PTR_ERR(rtdm_class); + } + rtdm_class->dev_groups = rtdm_groups; + rtdm_class->devnode = rtdm_devnode; + return 0; } void rtdm_dev_cleanup(void) { + class_destroy(rtdm_class); /* - * Note: no need to flush the cleanup_queue as no device is allowed - * to deregister as long as there are references. + * NOTE: no need to flush the cleanup_queue as no device is + * allowed to unregister as long as there are references. */ } _______________________________________________ Xenomai-git mailing list Xenomai-git@xenomai.org http://www.xenomai.org/mailman/listinfo/xenomai-git