diff options
author | Jean Delvare <khali@linux-fr.org> | 2006-08-15 12:30:24 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-09-26 18:38:50 -0400 |
commit | defcb46ed4666095677c8f52904b9e328587a20d (patch) | |
tree | 99ff28198c12230510a9864d64971268c2d75617 /drivers | |
parent | b119c6c952a086f74202ccda4b7ed72161bb6522 (diff) |
i2c: __must_check fixes, i2c-dev
i2c: __must_check fixes (i2c-dev)
Check for error on sysfs file creation.
Check for error on device creation.
Delete sysfs file on device destruction.
I couldn't test this one beyond compilation, as it applies on top of
another patch in Greg's tree [1] which breaks all my systems when I
apply it (my udev isn't recent enough.) Anyone with bleeding edge udev
is welcome to test and report.
[1] http://www.kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/patches/i2c/i2c-dev-device.patch
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/i2c/i2c-dev.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/i2c/i2c-dev.c b/drivers/i2c/i2c-dev.c index 2ce083391292..567fb05aeccc 100644 --- a/drivers/i2c/i2c-dev.c +++ b/drivers/i2c/i2c-dev.c | |||
@@ -406,6 +406,7 @@ static struct class *i2c_dev_class; | |||
406 | static int i2cdev_attach_adapter(struct i2c_adapter *adap) | 406 | static int i2cdev_attach_adapter(struct i2c_adapter *adap) |
407 | { | 407 | { |
408 | struct i2c_dev *i2c_dev; | 408 | struct i2c_dev *i2c_dev; |
409 | int res; | ||
409 | 410 | ||
410 | i2c_dev = get_free_i2c_dev(adap); | 411 | i2c_dev = get_free_i2c_dev(adap); |
411 | if (IS_ERR(i2c_dev)) | 412 | if (IS_ERR(i2c_dev)) |
@@ -419,14 +420,20 @@ static int i2cdev_attach_adapter(struct i2c_adapter *adap) | |||
419 | MKDEV(I2C_MAJOR, adap->nr), | 420 | MKDEV(I2C_MAJOR, adap->nr), |
420 | &adap->dev, "i2c-%d", | 421 | &adap->dev, "i2c-%d", |
421 | adap->nr); | 422 | adap->nr); |
422 | if (!i2c_dev->class_dev) | 423 | if (!i2c_dev->class_dev) { |
424 | res = -ENODEV; | ||
423 | goto error; | 425 | goto error; |
424 | class_device_create_file(i2c_dev->class_dev, &class_device_attr_name); | 426 | } |
427 | res = class_device_create_file(i2c_dev->class_dev, &class_device_attr_name); | ||
428 | if (res) | ||
429 | goto error_destroy; | ||
425 | return 0; | 430 | return 0; |
431 | error_destroy: | ||
432 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); | ||
426 | error: | 433 | error: |
427 | return_i2c_dev(i2c_dev); | 434 | return_i2c_dev(i2c_dev); |
428 | kfree(i2c_dev); | 435 | kfree(i2c_dev); |
429 | return -ENODEV; | 436 | return res; |
430 | } | 437 | } |
431 | 438 | ||
432 | static int i2cdev_detach_adapter(struct i2c_adapter *adap) | 439 | static int i2cdev_detach_adapter(struct i2c_adapter *adap) |
@@ -437,6 +444,7 @@ static int i2cdev_detach_adapter(struct i2c_adapter *adap) | |||
437 | if (!i2c_dev) | 444 | if (!i2c_dev) |
438 | return -ENODEV; | 445 | return -ENODEV; |
439 | 446 | ||
447 | class_device_remove_file(i2c_dev->class_dev, &class_device_attr_name); | ||
440 | return_i2c_dev(i2c_dev); | 448 | return_i2c_dev(i2c_dev); |
441 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); | 449 | class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr)); |
442 | kfree(i2c_dev); | 450 | kfree(i2c_dev); |