diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2005-11-30 22:20:28 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2005-11-30 22:20:28 -0800 |
commit | f72486aeeb282ba3eabd5ddb686bc18243e0f8a0 (patch) | |
tree | 675c8353bacb3d0d581e58dae585be883f36c813 /i2c | |
parent | 301ff3650ad942229ee5d3f37d1c4de55caf9f66 (diff) | |
download | patches-f72486aeeb282ba3eabd5ddb686bc18243e0f8a0.tar.gz |
i2c patch from me
Diffstat (limited to 'i2c')
-rw-r--r-- | i2c/i2c-dev-dynamic_class.patch | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/i2c/i2c-dev-dynamic_class.patch b/i2c/i2c-dev-dynamic_class.patch new file mode 100644 index 0000000000000..e6802fe54d8e7 --- /dev/null +++ b/i2c/i2c-dev-dynamic_class.patch @@ -0,0 +1,123 @@ +--- + drivers/i2c/i2c-dev.c | 50 ++++++++++++++++++++------------------------------ + 1 file changed, 20 insertions(+), 30 deletions(-) + +--- gregkh-2.6.orig/drivers/i2c/i2c-dev.c ++++ gregkh-2.6/drivers/i2c/i2c-dev.c +@@ -42,8 +42,7 @@ static struct i2c_client i2cdev_client_t + struct i2c_dev { + int minor; + struct i2c_adapter *adap; +- struct class_device class_dev; +- struct completion released; /* FIXME, we need a class_device_unregister() */ ++ struct class_device *class_dev; + }; + #define to_i2c_dev(d) container_of(d, struct i2c_dev, class_dev) + +@@ -105,7 +104,10 @@ static void return_i2c_dev(struct i2c_de + + static ssize_t show_adapter_name(struct class_device *class_dev, char *buf) + { +- struct i2c_dev *i2c_dev = to_i2c_dev(class_dev); ++ struct i2c_dev *i2c_dev = i2c_dev_get_by_minor(MINOR(class_dev->devt)); ++ ++ if (!i2c_dev) ++ return -ENODEV; + return sprintf(buf, "%s\n", i2c_dev->adap->name); + } + static CLASS_DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL); +@@ -408,21 +410,12 @@ static struct file_operations i2cdev_fop + .release = i2cdev_release, + }; + +-static void release_i2c_dev(struct class_device *dev) +-{ +- struct i2c_dev *i2c_dev = to_i2c_dev(dev); +- complete(&i2c_dev->released); +-} +- +-static struct class i2c_dev_class = { +- .name = "i2c-dev", +- .release = &release_i2c_dev, +-}; ++static struct class *i2c_dev_class; + + static int i2cdev_attach_adapter(struct i2c_adapter *adap) + { + struct i2c_dev *i2c_dev; +- int retval; ++ struct device *dev; + + i2c_dev = get_free_i2c_dev(adap); + if (IS_ERR(i2c_dev)) +@@ -434,21 +427,20 @@ static int i2cdev_attach_adapter(struct + /* register this i2c device with the driver core */ + i2c_dev->adap = adap; + if (adap->dev.parent == &platform_bus) +- i2c_dev->class_dev.dev = &adap->dev; ++ dev = &adap->dev; + else +- i2c_dev->class_dev.dev = adap->dev.parent; +- i2c_dev->class_dev.class = &i2c_dev_class; +- i2c_dev->class_dev.devt = MKDEV(I2C_MAJOR, i2c_dev->minor); +- snprintf(i2c_dev->class_dev.class_id, BUS_ID_SIZE, "i2c-%d", i2c_dev->minor); +- retval = class_device_register(&i2c_dev->class_dev); +- if (retval) ++ dev = adap->dev.parent; ++ i2c_dev->class_dev = class_device_create(i2c_dev_class, NULL, ++ MKDEV(I2C_MAJOR, i2c_dev->minor), ++ dev, "i2c-%d", i2c_dev->minor); ++ if (!i2c_dev->class_dev) + goto error; +- class_device_create_file(&i2c_dev->class_dev, &class_device_attr_name); ++ class_device_create_file(i2c_dev->class_dev, &class_device_attr_name); + return 0; + error: + return_i2c_dev(i2c_dev); + kfree(i2c_dev); +- return retval; ++ return -ENODEV; + } + + static int i2cdev_detach_adapter(struct i2c_adapter *adap) +@@ -459,10 +451,8 @@ static int i2cdev_detach_adapter(struct + if (!i2c_dev) + return -ENODEV; + +- init_completion(&i2c_dev->released); + return_i2c_dev(i2c_dev); +- class_device_unregister(&i2c_dev->class_dev); +- wait_for_completion(&i2c_dev->released); ++ class_device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, i2c_dev->minor)); + kfree(i2c_dev); + + pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name); +@@ -508,8 +498,8 @@ static int __init i2c_dev_init(void) + if (res) + goto out; + +- res = class_register(&i2c_dev_class); +- if (res) ++ i2c_dev_class = class_create(THIS_MODULE, "i2c-dev"); ++ if (IS_ERR(i2c_dev_class)) + goto out_unreg_chrdev; + + res = i2c_add_driver(&i2cdev_driver); +@@ -519,7 +509,7 @@ static int __init i2c_dev_init(void) + return 0; + + out_unreg_class: +- class_unregister(&i2c_dev_class); ++ class_destroy(i2c_dev_class); + out_unreg_chrdev: + unregister_chrdev(I2C_MAJOR, "i2c"); + out: +@@ -530,7 +520,7 @@ out: + static void __exit i2c_dev_exit(void) + { + i2c_del_driver(&i2cdev_driver); +- class_unregister(&i2c_dev_class); ++ class_destroy(i2c_dev_class); + unregister_chrdev(I2C_MAJOR,"i2c"); + } + |