diff options
author | Jean Delvare <khali@linux-fr.org> | 2009-09-18 16:45:46 -0400 |
---|---|---|
committer | Jean Delvare <khali@linux-fr.org> | 2009-09-18 16:45:46 -0400 |
commit | 4f8cf8240a0c8b232c2ae22e019a4ba1d5f19ccd (patch) | |
tree | 786bc29c40c4fbc8b28802c1688b162002900ec8 /drivers/i2c/i2c-core.c | |
parent | 51298d1257b9f0a356ad66650c9fe2ca5bfa5ae3 (diff) |
i2c: Convert i2c adapters to bus devices
Kay says i2c adapters shouldn't be class devices but bus devices.
Convert them that way, using a device type.
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Cc: Kay Sievers <kay.sievers@vrfy.org>
Diffstat (limited to 'drivers/i2c/i2c-core.c')
-rw-r--r-- | drivers/i2c/i2c-core.c | 75 |
1 files changed, 40 insertions, 35 deletions
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index f236b34296ee..a18a251dabf9 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
@@ -46,6 +46,7 @@ static DEFINE_MUTEX(core_lock); | |||
46 | static DEFINE_IDR(i2c_adapter_idr); | 46 | static DEFINE_IDR(i2c_adapter_idr); |
47 | static LIST_HEAD(userspace_devices); | 47 | static LIST_HEAD(userspace_devices); |
48 | 48 | ||
49 | static struct device_type i2c_client_type; | ||
49 | static int i2c_check_addr(struct i2c_adapter *adapter, int addr); | 50 | static int i2c_check_addr(struct i2c_adapter *adapter, int addr); |
50 | static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver); | 51 | static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver); |
51 | 52 | ||
@@ -186,10 +187,10 @@ static void i2c_client_dev_release(struct device *dev) | |||
186 | } | 187 | } |
187 | 188 | ||
188 | static ssize_t | 189 | static ssize_t |
189 | show_client_name(struct device *dev, struct device_attribute *attr, char *buf) | 190 | show_name(struct device *dev, struct device_attribute *attr, char *buf) |
190 | { | 191 | { |
191 | struct i2c_client *client = to_i2c_client(dev); | 192 | return sprintf(buf, "%s\n", dev->type == &i2c_client_type ? |
192 | return sprintf(buf, "%s\n", client->name); | 193 | to_i2c_client(dev)->name : to_i2c_adapter(dev)->name); |
193 | } | 194 | } |
194 | 195 | ||
195 | static ssize_t | 196 | static ssize_t |
@@ -199,7 +200,7 @@ show_modalias(struct device *dev, struct device_attribute *attr, char *buf) | |||
199 | return sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name); | 200 | return sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name); |
200 | } | 201 | } |
201 | 202 | ||
202 | static DEVICE_ATTR(name, S_IRUGO, show_client_name, NULL); | 203 | static DEVICE_ATTR(name, S_IRUGO, show_name, NULL); |
203 | static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); | 204 | static DEVICE_ATTR(modalias, S_IRUGO, show_modalias, NULL); |
204 | 205 | ||
205 | static struct attribute *i2c_dev_attrs[] = { | 206 | static struct attribute *i2c_dev_attrs[] = { |
@@ -395,13 +396,6 @@ static void i2c_adapter_dev_release(struct device *dev) | |||
395 | complete(&adap->dev_released); | 396 | complete(&adap->dev_released); |
396 | } | 397 | } |
397 | 398 | ||
398 | static ssize_t | ||
399 | show_adapter_name(struct device *dev, struct device_attribute *attr, char *buf) | ||
400 | { | ||
401 | struct i2c_adapter *adap = to_i2c_adapter(dev); | ||
402 | return sprintf(buf, "%s\n", adap->name); | ||
403 | } | ||
404 | |||
405 | /* | 399 | /* |
406 | * Let users instantiate I2C devices through sysfs. This can be used when | 400 | * Let users instantiate I2C devices through sysfs. This can be used when |
407 | * platform initialization code doesn't contain the proper data for | 401 | * platform initialization code doesn't contain the proper data for |
@@ -520,17 +514,28 @@ i2c_sysfs_delete_device(struct device *dev, struct device_attribute *attr, | |||
520 | return res; | 514 | return res; |
521 | } | 515 | } |
522 | 516 | ||
523 | static struct device_attribute i2c_adapter_attrs[] = { | 517 | static DEVICE_ATTR(new_device, S_IWUSR, NULL, i2c_sysfs_new_device); |
524 | __ATTR(name, S_IRUGO, show_adapter_name, NULL), | 518 | static DEVICE_ATTR(delete_device, S_IWUSR, NULL, i2c_sysfs_delete_device); |
525 | __ATTR(new_device, S_IWUSR, NULL, i2c_sysfs_new_device), | 519 | |
526 | __ATTR(delete_device, S_IWUSR, NULL, i2c_sysfs_delete_device), | 520 | static struct attribute *i2c_adapter_attrs[] = { |
527 | { }, | 521 | &dev_attr_name.attr, |
522 | &dev_attr_new_device.attr, | ||
523 | &dev_attr_delete_device.attr, | ||
524 | NULL | ||
525 | }; | ||
526 | |||
527 | static struct attribute_group i2c_adapter_attr_group = { | ||
528 | .attrs = i2c_adapter_attrs, | ||
528 | }; | 529 | }; |
529 | 530 | ||
530 | static struct class i2c_adapter_class = { | 531 | static const struct attribute_group *i2c_adapter_attr_groups[] = { |
531 | .owner = THIS_MODULE, | 532 | &i2c_adapter_attr_group, |
532 | .name = "i2c-adapter", | 533 | NULL |
533 | .dev_attrs = i2c_adapter_attrs, | 534 | }; |
535 | |||
536 | static struct device_type i2c_adapter_type = { | ||
537 | .groups = i2c_adapter_attr_groups, | ||
538 | .release = i2c_adapter_dev_release, | ||
534 | }; | 539 | }; |
535 | 540 | ||
536 | static void i2c_scan_static_board_info(struct i2c_adapter *adapter) | 541 | static void i2c_scan_static_board_info(struct i2c_adapter *adapter) |
@@ -582,8 +587,8 @@ static int i2c_register_adapter(struct i2c_adapter *adap) | |||
582 | adap->timeout = HZ; | 587 | adap->timeout = HZ; |
583 | 588 | ||
584 | dev_set_name(&adap->dev, "i2c-%d", adap->nr); | 589 | dev_set_name(&adap->dev, "i2c-%d", adap->nr); |
585 | adap->dev.release = &i2c_adapter_dev_release; | 590 | adap->dev.bus = &i2c_bus_type; |
586 | adap->dev.class = &i2c_adapter_class; | 591 | adap->dev.type = &i2c_adapter_type; |
587 | res = device_register(&adap->dev); | 592 | res = device_register(&adap->dev); |
588 | if (res) | 593 | if (res) |
589 | goto out_list; | 594 | goto out_list; |
@@ -795,9 +800,13 @@ EXPORT_SYMBOL(i2c_del_adapter); | |||
795 | 800 | ||
796 | static int __attach_adapter(struct device *dev, void *data) | 801 | static int __attach_adapter(struct device *dev, void *data) |
797 | { | 802 | { |
798 | struct i2c_adapter *adapter = to_i2c_adapter(dev); | 803 | struct i2c_adapter *adapter; |
799 | struct i2c_driver *driver = data; | 804 | struct i2c_driver *driver = data; |
800 | 805 | ||
806 | if (dev->type != &i2c_adapter_type) | ||
807 | return 0; | ||
808 | adapter = to_i2c_adapter(dev); | ||
809 | |||
801 | i2c_detect(adapter, driver); | 810 | i2c_detect(adapter, driver); |
802 | 811 | ||
803 | /* Legacy drivers scan i2c busses directly */ | 812 | /* Legacy drivers scan i2c busses directly */ |
@@ -836,8 +845,7 @@ int i2c_register_driver(struct module *owner, struct i2c_driver *driver) | |||
836 | INIT_LIST_HEAD(&driver->clients); | 845 | INIT_LIST_HEAD(&driver->clients); |
837 | /* Walk the adapters that are already present */ | 846 | /* Walk the adapters that are already present */ |
838 | mutex_lock(&core_lock); | 847 | mutex_lock(&core_lock); |
839 | class_for_each_device(&i2c_adapter_class, NULL, driver, | 848 | bus_for_each_dev(&i2c_bus_type, NULL, driver, __attach_adapter); |
840 | __attach_adapter); | ||
841 | mutex_unlock(&core_lock); | 849 | mutex_unlock(&core_lock); |
842 | 850 | ||
843 | return 0; | 851 | return 0; |
@@ -846,10 +854,14 @@ EXPORT_SYMBOL(i2c_register_driver); | |||
846 | 854 | ||
847 | static int __detach_adapter(struct device *dev, void *data) | 855 | static int __detach_adapter(struct device *dev, void *data) |
848 | { | 856 | { |
849 | struct i2c_adapter *adapter = to_i2c_adapter(dev); | 857 | struct i2c_adapter *adapter; |
850 | struct i2c_driver *driver = data; | 858 | struct i2c_driver *driver = data; |
851 | struct i2c_client *client, *_n; | 859 | struct i2c_client *client, *_n; |
852 | 860 | ||
861 | if (dev->type != &i2c_adapter_type) | ||
862 | return 0; | ||
863 | adapter = to_i2c_adapter(dev); | ||
864 | |||
853 | /* Remove the devices we created ourselves as the result of hardware | 865 | /* Remove the devices we created ourselves as the result of hardware |
854 | * probing (using a driver's detect method) */ | 866 | * probing (using a driver's detect method) */ |
855 | list_for_each_entry_safe(client, _n, &driver->clients, detected) { | 867 | list_for_each_entry_safe(client, _n, &driver->clients, detected) { |
@@ -877,8 +889,7 @@ static int __detach_adapter(struct device *dev, void *data) | |||
877 | void i2c_del_driver(struct i2c_driver *driver) | 889 | void i2c_del_driver(struct i2c_driver *driver) |
878 | { | 890 | { |
879 | mutex_lock(&core_lock); | 891 | mutex_lock(&core_lock); |
880 | class_for_each_device(&i2c_adapter_class, NULL, driver, | 892 | bus_for_each_dev(&i2c_bus_type, NULL, driver, __detach_adapter); |
881 | __detach_adapter); | ||
882 | mutex_unlock(&core_lock); | 893 | mutex_unlock(&core_lock); |
883 | 894 | ||
884 | driver_unregister(&driver->driver); | 895 | driver_unregister(&driver->driver); |
@@ -967,16 +978,11 @@ static int __init i2c_init(void) | |||
967 | retval = bus_register(&i2c_bus_type); | 978 | retval = bus_register(&i2c_bus_type); |
968 | if (retval) | 979 | if (retval) |
969 | return retval; | 980 | return retval; |
970 | retval = class_register(&i2c_adapter_class); | ||
971 | if (retval) | ||
972 | goto bus_err; | ||
973 | retval = i2c_add_driver(&dummy_driver); | 981 | retval = i2c_add_driver(&dummy_driver); |
974 | if (retval) | 982 | if (retval) |
975 | goto class_err; | 983 | goto bus_err; |
976 | return 0; | 984 | return 0; |
977 | 985 | ||
978 | class_err: | ||
979 | class_unregister(&i2c_adapter_class); | ||
980 | bus_err: | 986 | bus_err: |
981 | bus_unregister(&i2c_bus_type); | 987 | bus_unregister(&i2c_bus_type); |
982 | return retval; | 988 | return retval; |
@@ -985,7 +991,6 @@ bus_err: | |||
985 | static void __exit i2c_exit(void) | 991 | static void __exit i2c_exit(void) |
986 | { | 992 | { |
987 | i2c_del_driver(&dummy_driver); | 993 | i2c_del_driver(&dummy_driver); |
988 | class_unregister(&i2c_adapter_class); | ||
989 | bus_unregister(&i2c_bus_type); | 994 | bus_unregister(&i2c_bus_type); |
990 | } | 995 | } |
991 | 996 | ||