diff options
Diffstat (limited to 'drivers/i2c/busses/i2c-isa.c')
-rw-r--r-- | drivers/i2c/busses/i2c-isa.c | 42 |
1 files changed, 35 insertions, 7 deletions
diff --git a/drivers/i2c/busses/i2c-isa.c b/drivers/i2c/busses/i2c-isa.c index c3e1d3e888d7..4380653748a4 100644 --- a/drivers/i2c/busses/i2c-isa.c +++ b/drivers/i2c/busses/i2c-isa.c | |||
@@ -43,7 +43,7 @@ | |||
43 | static u32 isa_func(struct i2c_adapter *adapter); | 43 | static u32 isa_func(struct i2c_adapter *adapter); |
44 | 44 | ||
45 | /* This is the actual algorithm we define */ | 45 | /* This is the actual algorithm we define */ |
46 | static struct i2c_algorithm isa_algorithm = { | 46 | static const struct i2c_algorithm isa_algorithm = { |
47 | .functionality = isa_func, | 47 | .functionality = isa_func, |
48 | }; | 48 | }; |
49 | 49 | ||
@@ -89,9 +89,14 @@ int i2c_isa_add_driver(struct i2c_driver *driver) | |||
89 | dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->driver.name); | 89 | dev_dbg(&isa_adapter.dev, "Driver %s registered\n", driver->driver.name); |
90 | 90 | ||
91 | /* Now look for clients */ | 91 | /* Now look for clients */ |
92 | driver->attach_adapter(&isa_adapter); | 92 | res = driver->attach_adapter(&isa_adapter); |
93 | 93 | if (res) { | |
94 | return 0; | 94 | dev_err(&isa_adapter.dev, |
95 | "Driver %s failed to attach adapter, unregistering\n", | ||
96 | driver->driver.name); | ||
97 | driver_unregister(&driver->driver); | ||
98 | } | ||
99 | return res; | ||
95 | } | 100 | } |
96 | 101 | ||
97 | int i2c_isa_del_driver(struct i2c_driver *driver) | 102 | int i2c_isa_del_driver(struct i2c_driver *driver) |
@@ -125,6 +130,8 @@ int i2c_isa_del_driver(struct i2c_driver *driver) | |||
125 | 130 | ||
126 | static int __init i2c_isa_init(void) | 131 | static int __init i2c_isa_init(void) |
127 | { | 132 | { |
133 | int err; | ||
134 | |||
128 | mutex_init(&isa_adapter.clist_lock); | 135 | mutex_init(&isa_adapter.clist_lock); |
129 | INIT_LIST_HEAD(&isa_adapter.clients); | 136 | INIT_LIST_HEAD(&isa_adapter.clients); |
130 | 137 | ||
@@ -133,8 +140,16 @@ static int __init i2c_isa_init(void) | |||
133 | sprintf(isa_adapter.dev.bus_id, "i2c-%d", isa_adapter.nr); | 140 | sprintf(isa_adapter.dev.bus_id, "i2c-%d", isa_adapter.nr); |
134 | isa_adapter.dev.driver = &i2c_adapter_driver; | 141 | isa_adapter.dev.driver = &i2c_adapter_driver; |
135 | isa_adapter.dev.release = &i2c_adapter_dev_release; | 142 | isa_adapter.dev.release = &i2c_adapter_dev_release; |
136 | device_register(&isa_adapter.dev); | 143 | err = device_register(&isa_adapter.dev); |
137 | device_create_file(&isa_adapter.dev, &dev_attr_name); | 144 | if (err) { |
145 | printk(KERN_ERR "i2c-isa: Failed to register device\n"); | ||
146 | goto exit; | ||
147 | } | ||
148 | err = device_create_file(&isa_adapter.dev, &dev_attr_name); | ||
149 | if (err) { | ||
150 | printk(KERN_ERR "i2c-isa: Failed to create name file\n"); | ||
151 | goto exit_unregister; | ||
152 | } | ||
138 | 153 | ||
139 | /* Add this adapter to the i2c_adapter class */ | 154 | /* Add this adapter to the i2c_adapter class */ |
140 | memset(&isa_adapter.class_dev, 0x00, sizeof(struct class_device)); | 155 | memset(&isa_adapter.class_dev, 0x00, sizeof(struct class_device)); |
@@ -142,11 +157,24 @@ static int __init i2c_isa_init(void) | |||
142 | isa_adapter.class_dev.class = &i2c_adapter_class; | 157 | isa_adapter.class_dev.class = &i2c_adapter_class; |
143 | strlcpy(isa_adapter.class_dev.class_id, isa_adapter.dev.bus_id, | 158 | strlcpy(isa_adapter.class_dev.class_id, isa_adapter.dev.bus_id, |
144 | BUS_ID_SIZE); | 159 | BUS_ID_SIZE); |
145 | class_device_register(&isa_adapter.class_dev); | 160 | err = class_device_register(&isa_adapter.class_dev); |
161 | if (err) { | ||
162 | printk(KERN_ERR "i2c-isa: Failed to register class device\n"); | ||
163 | goto exit_remove_name; | ||
164 | } | ||
146 | 165 | ||
147 | dev_dbg(&isa_adapter.dev, "%s registered\n", isa_adapter.name); | 166 | dev_dbg(&isa_adapter.dev, "%s registered\n", isa_adapter.name); |
148 | 167 | ||
149 | return 0; | 168 | return 0; |
169 | |||
170 | exit_remove_name: | ||
171 | device_remove_file(&isa_adapter.dev, &dev_attr_name); | ||
172 | exit_unregister: | ||
173 | init_completion(&isa_adapter.dev_released); /* Needed? */ | ||
174 | device_unregister(&isa_adapter.dev); | ||
175 | wait_for_completion(&isa_adapter.dev_released); | ||
176 | exit: | ||
177 | return err; | ||
150 | } | 178 | } |
151 | 179 | ||
152 | static void __exit i2c_isa_exit(void) | 180 | static void __exit i2c_isa_exit(void) |