|
|
STATIC dev_t control_id; | STATIC dev_t control_id; |
STATIC dev_t status_id; | STATIC dev_t status_id; |
| |
static struct class_simple *fusd_class; |
static struct class *fusd_class; |
| |
static struct class_device *fusd_control_class_device; | static struct class_device *fusd_control_class_device; |
static struct class_device *fusd_status_class_device; | static struct class_device *fusd_status_class_device; |
|
|
} | } |
else | else |
{ | { |
fusd_dev->clazz = class_simple_create(THIS_MODULE, fusd_dev->class_name); |
fusd_dev->clazz = class_create(THIS_MODULE, fusd_dev->class_name); |
if(IS_ERR(fusd_dev->clazz)) | if(IS_ERR(fusd_dev->clazz)) |
{ | { |
error = PTR_ERR(fusd_dev->clazz); | error = PTR_ERR(fusd_dev->clazz); |
|
|
fusd_dev->owns_class = 1; | fusd_dev->owns_class = 1; |
} | } |
| |
fusd_dev->class_device = class_simple_device_add(fusd_dev->clazz, fusd_dev->dev_id, NULL, fusd_dev->dev_name); |
fusd_dev->class_device = class_device_create(fusd_dev->clazz, fusd_dev->dev_id, NULL, fusd_dev->dev_name); |
if(fusd_dev->class_device == NULL) | if(fusd_dev->class_device == NULL) |
{ | { |
error = PTR_ERR(fusd_dev->class_device); | error = PTR_ERR(fusd_dev->class_device); |
printk("class_simple_device_add failed status: %d\n", error); |
printk("class_device_create failed status: %d\n", error); |
goto register_failed5; | goto register_failed5; |
} | } |
| |
|
|
return 0; | return 0; |
| |
register_failed5: | register_failed5: |
class_simple_destroy(fusd_dev->clazz); |
class_destroy(fusd_dev->clazz); |
register_failed4: | register_failed4: |
cdev_del(fusd_dev->handle); | cdev_del(fusd_dev->handle); |
register_failed3: | register_failed3: |
|
|
| |
if(fusd_dev->handle) | if(fusd_dev->handle) |
{ | { |
class_simple_device_remove(fusd_dev->dev_id); |
class_device_destroy(fusd_class, fusd_dev->dev_id); |
if(fusd_dev->owns_class) | if(fusd_dev->owns_class) |
{ | { |
class_simple_destroy(fusd_dev->clazz); |
class_destroy(fusd_dev->clazz); |
} | } |
cdev_del(fusd_dev->handle); | cdev_del(fusd_dev->handle); |
#ifdef CONFIG_DEVFS_FS | #ifdef CONFIG_DEVFS_FS |
|
|
fusd_control_device = NULL; | fusd_control_device = NULL; |
fusd_status_device = NULL; | fusd_status_device = NULL; |
| |
fusd_class = class_simple_create(THIS_MODULE, "fusd"); |
fusd_class = class_create(THIS_MODULE, "fusd"); |
if(IS_ERR(fusd_class)) | if(IS_ERR(fusd_class)) |
{ | { |
retval = PTR_ERR(fusd_class); | retval = PTR_ERR(fusd_class); |
printk("class_simple_create failed status: %d\n", retval); |
printk("class_create failed status: %d\n", retval); |
goto fail0; | goto fail0; |
} | } |
| |
|
|
goto fail4; | goto fail4; |
} | } |
| |
fusd_control_class_device = class_simple_device_add(fusd_class, control_id, NULL, "control"); |
fusd_control_class_device = class_device_create(fusd_class, control_id, NULL, "control"); |
if(fusd_control_class_device == NULL) | if(fusd_control_class_device == NULL) |
{ | { |
retval = PTR_ERR(fusd_control_class_device); | retval = PTR_ERR(fusd_control_class_device); |
printk("class_simple_device_add failed status: %d\n", retval); |
printk("class_device_create failed status: %d\n", retval); |
goto fail5; | goto fail5; |
} | } |
| |
|
|
goto fail9; | goto fail9; |
} | } |
| |
fusd_status_class_device = class_simple_device_add(fusd_class, status_id, NULL, "status"); |
fusd_status_class_device = class_device_create(fusd_class, status_id, NULL, "status"); |
if(fusd_status_class_device == NULL) | if(fusd_status_class_device == NULL) |
{ | { |
printk("class_simple_device_add failed status: %d\n", retval); |
printk("class_device_create failed status: %d\n", retval); |
retval = PTR_ERR(fusd_status_class_device); | retval = PTR_ERR(fusd_status_class_device); |
goto fail10; | goto fail10; |
} | } |
|
|
fail7: | fail7: |
unregister_chrdev_region(status_id, 1); | unregister_chrdev_region(status_id, 1); |
fail6: | fail6: |
class_simple_device_remove(control_id); |
class_device_destroy(fusd_class, control_id); |
fail5: | fail5: |
cdev_del(fusd_control_device); | cdev_del(fusd_control_device); |
fail4: | fail4: |
|
|
fail2: | fail2: |
unregister_chrdev_region(control_id, 1); | unregister_chrdev_region(control_id, 1); |
fail1: | fail1: |
class_simple_destroy(fusd_class); |
class_destroy(fusd_class); |
fail0: | fail0: |
return retval; | return retval; |
} | } |
|
|
{ | { |
RDEBUG(1, "cleaning up"); | RDEBUG(1, "cleaning up"); |
| |
class_simple_device_remove(status_id); |
class_device_destroy(fusd_class, status_id); |
class_simple_device_remove(control_id); |
class_device_destroy(fusd_class, control_id); |
| |
cdev_del(fusd_control_device); | cdev_del(fusd_control_device); |
cdev_del(fusd_status_device); | cdev_del(fusd_status_device); |
|
|
devfs_remove(FUSD_STATUS_FILENAME); | devfs_remove(FUSD_STATUS_FILENAME); |
| |
| |
class_simple_destroy(fusd_class); |
class_destroy(fusd_class); |
| |
#ifdef CONFIG_FUSD_MEMDEBUG | #ifdef CONFIG_FUSD_MEMDEBUG |
fusd_mem_cleanup(); | fusd_mem_cleanup(); |