diff options
| -rw-r--r-- | drivers/macintosh/windfarm_core.c | 53 |
1 files changed, 27 insertions, 26 deletions
diff --git a/drivers/macintosh/windfarm_core.c b/drivers/macintosh/windfarm_core.c index 6c2a471ea6c0..32d466441ac2 100644 --- a/drivers/macintosh/windfarm_core.c +++ b/drivers/macintosh/windfarm_core.c | |||
| @@ -33,6 +33,7 @@ | |||
| 33 | #include <linux/reboot.h> | 33 | #include <linux/reboot.h> |
| 34 | #include <linux/device.h> | 34 | #include <linux/device.h> |
| 35 | #include <linux/platform_device.h> | 35 | #include <linux/platform_device.h> |
| 36 | #include <linux/mutex.h> | ||
| 36 | 37 | ||
| 37 | #include "windfarm.h" | 38 | #include "windfarm.h" |
| 38 | 39 | ||
| @@ -48,7 +49,7 @@ | |||
| 48 | 49 | ||
| 49 | static LIST_HEAD(wf_controls); | 50 | static LIST_HEAD(wf_controls); |
| 50 | static LIST_HEAD(wf_sensors); | 51 | static LIST_HEAD(wf_sensors); |
| 51 | static DECLARE_MUTEX(wf_lock); | 52 | static DEFINE_MUTEX(wf_lock); |
| 52 | static struct notifier_block *wf_client_list; | 53 | static struct notifier_block *wf_client_list; |
| 53 | static int wf_client_count; | 54 | static int wf_client_count; |
| 54 | static unsigned int wf_overtemp; | 55 | static unsigned int wf_overtemp; |
| @@ -160,12 +161,12 @@ int wf_register_control(struct wf_control *new_ct) | |||
| 160 | { | 161 | { |
| 161 | struct wf_control *ct; | 162 | struct wf_control *ct; |
| 162 | 163 | ||
| 163 | down(&wf_lock); | 164 | mutex_lock(&wf_lock); |
| 164 | list_for_each_entry(ct, &wf_controls, link) { | 165 | list_for_each_entry(ct, &wf_controls, link) { |
| 165 | if (!strcmp(ct->name, new_ct->name)) { | 166 | if (!strcmp(ct->name, new_ct->name)) { |
| 166 | printk(KERN_WARNING "windfarm: trying to register" | 167 | printk(KERN_WARNING "windfarm: trying to register" |
| 167 | " duplicate control %s\n", ct->name); | 168 | " duplicate control %s\n", ct->name); |
| 168 | up(&wf_lock); | 169 | mutex_unlock(&wf_lock); |
| 169 | return -EEXIST; | 170 | return -EEXIST; |
| 170 | } | 171 | } |
| 171 | } | 172 | } |
| @@ -175,7 +176,7 @@ int wf_register_control(struct wf_control *new_ct) | |||
| 175 | DBG("wf: Registered control %s\n", new_ct->name); | 176 | DBG("wf: Registered control %s\n", new_ct->name); |
| 176 | 177 | ||
| 177 | wf_notify(WF_EVENT_NEW_CONTROL, new_ct); | 178 | wf_notify(WF_EVENT_NEW_CONTROL, new_ct); |
| 178 | up(&wf_lock); | 179 | mutex_unlock(&wf_lock); |
| 179 | 180 | ||
| 180 | return 0; | 181 | return 0; |
| 181 | } | 182 | } |
| @@ -183,9 +184,9 @@ EXPORT_SYMBOL_GPL(wf_register_control); | |||
| 183 | 184 | ||
| 184 | void wf_unregister_control(struct wf_control *ct) | 185 | void wf_unregister_control(struct wf_control *ct) |
| 185 | { | 186 | { |
| 186 | down(&wf_lock); | 187 | mutex_lock(&wf_lock); |
| 187 | list_del(&ct->link); | 188 | list_del(&ct->link); |
| 188 | up(&wf_lock); | 189 | mutex_unlock(&wf_lock); |
| 189 | 190 | ||
| 190 | DBG("wf: Unregistered control %s\n", ct->name); | 191 | DBG("wf: Unregistered control %s\n", ct->name); |
| 191 | 192 | ||
| @@ -197,16 +198,16 @@ struct wf_control * wf_find_control(const char *name) | |||
| 197 | { | 198 | { |
| 198 | struct wf_control *ct; | 199 | struct wf_control *ct; |
| 199 | 200 | ||
| 200 | down(&wf_lock); | 201 | mutex_lock(&wf_lock); |
| 201 | list_for_each_entry(ct, &wf_controls, link) { | 202 | list_for_each_entry(ct, &wf_controls, link) { |
| 202 | if (!strcmp(ct->name, name)) { | 203 | if (!strcmp(ct->name, name)) { |
| 203 | if (wf_get_control(ct)) | 204 | if (wf_get_control(ct)) |
| 204 | ct = NULL; | 205 | ct = NULL; |
| 205 | up(&wf_lock); | 206 | mutex_unlock(&wf_lock); |
| 206 | return ct; | 207 | return ct; |
| 207 | } | 208 | } |
| 208 | } | 209 | } |
| 209 | up(&wf_lock); | 210 | mutex_unlock(&wf_lock); |
| 210 | return NULL; | 211 | return NULL; |
| 211 | } | 212 | } |
| 212 | EXPORT_SYMBOL_GPL(wf_find_control); | 213 | EXPORT_SYMBOL_GPL(wf_find_control); |
| @@ -250,12 +251,12 @@ int wf_register_sensor(struct wf_sensor *new_sr) | |||
| 250 | { | 251 | { |
| 251 | struct wf_sensor *sr; | 252 | struct wf_sensor *sr; |
| 252 | 253 | ||
| 253 | down(&wf_lock); | 254 | mutex_lock(&wf_lock); |
| 254 | list_for_each_entry(sr, &wf_sensors, link) { | 255 | list_for_each_entry(sr, &wf_sensors, link) { |
| 255 | if (!strcmp(sr->name, new_sr->name)) { | 256 | if (!strcmp(sr->name, new_sr->name)) { |
| 256 | printk(KERN_WARNING "windfarm: trying to register" | 257 | printk(KERN_WARNING "windfarm: trying to register" |
| 257 | " duplicate sensor %s\n", sr->name); | 258 | " duplicate sensor %s\n", sr->name); |
| 258 | up(&wf_lock); | 259 | mutex_unlock(&wf_lock); |
| 259 | return -EEXIST; | 260 | return -EEXIST; |
| 260 | } | 261 | } |
| 261 | } | 262 | } |
| @@ -265,7 +266,7 @@ int wf_register_sensor(struct wf_sensor *new_sr) | |||
| 265 | DBG("wf: Registered sensor %s\n", new_sr->name); | 266 | DBG("wf: Registered sensor %s\n", new_sr->name); |
| 266 | 267 | ||
| 267 | wf_notify(WF_EVENT_NEW_SENSOR, new_sr); | 268 | wf_notify(WF_EVENT_NEW_SENSOR, new_sr); |
| 268 | up(&wf_lock); | 269 | mutex_unlock(&wf_lock); |
| 269 | 270 | ||
| 270 | return 0; | 271 | return 0; |
| 271 | } | 272 | } |
| @@ -273,9 +274,9 @@ EXPORT_SYMBOL_GPL(wf_register_sensor); | |||
| 273 | 274 | ||
| 274 | void wf_unregister_sensor(struct wf_sensor *sr) | 275 | void wf_unregister_sensor(struct wf_sensor *sr) |
| 275 | { | 276 | { |
| 276 | down(&wf_lock); | 277 | mutex_lock(&wf_lock); |
| 277 | list_del(&sr->link); | 278 | list_del(&sr->link); |
| 278 | up(&wf_lock); | 279 | mutex_unlock(&wf_lock); |
| 279 | 280 | ||
| 280 | DBG("wf: Unregistered sensor %s\n", sr->name); | 281 | DBG("wf: Unregistered sensor %s\n", sr->name); |
| 281 | 282 | ||
| @@ -287,16 +288,16 @@ struct wf_sensor * wf_find_sensor(const char *name) | |||
| 287 | { | 288 | { |
| 288 | struct wf_sensor *sr; | 289 | struct wf_sensor *sr; |
| 289 | 290 | ||
| 290 | down(&wf_lock); | 291 | mutex_lock(&wf_lock); |
| 291 | list_for_each_entry(sr, &wf_sensors, link) { | 292 | list_for_each_entry(sr, &wf_sensors, link) { |
| 292 | if (!strcmp(sr->name, name)) { | 293 | if (!strcmp(sr->name, name)) { |
| 293 | if (wf_get_sensor(sr)) | 294 | if (wf_get_sensor(sr)) |
| 294 | sr = NULL; | 295 | sr = NULL; |
| 295 | up(&wf_lock); | 296 | mutex_unlock(&wf_lock); |
| 296 | return sr; | 297 | return sr; |
| 297 | } | 298 | } |
| 298 | } | 299 | } |
| 299 | up(&wf_lock); | 300 | mutex_unlock(&wf_lock); |
| 300 | return NULL; | 301 | return NULL; |
| 301 | } | 302 | } |
| 302 | EXPORT_SYMBOL_GPL(wf_find_sensor); | 303 | EXPORT_SYMBOL_GPL(wf_find_sensor); |
| @@ -329,7 +330,7 @@ int wf_register_client(struct notifier_block *nb) | |||
| 329 | struct wf_control *ct; | 330 | struct wf_control *ct; |
| 330 | struct wf_sensor *sr; | 331 | struct wf_sensor *sr; |
| 331 | 332 | ||
| 332 | down(&wf_lock); | 333 | mutex_lock(&wf_lock); |
| 333 | rc = notifier_chain_register(&wf_client_list, nb); | 334 | rc = notifier_chain_register(&wf_client_list, nb); |
| 334 | if (rc != 0) | 335 | if (rc != 0) |
| 335 | goto bail; | 336 | goto bail; |
| @@ -341,19 +342,19 @@ int wf_register_client(struct notifier_block *nb) | |||
| 341 | if (wf_client_count == 1) | 342 | if (wf_client_count == 1) |
| 342 | wf_start_thread(); | 343 | wf_start_thread(); |
| 343 | bail: | 344 | bail: |
| 344 | up(&wf_lock); | 345 | mutex_unlock(&wf_lock); |
| 345 | return rc; | 346 | return rc; |
| 346 | } | 347 | } |
| 347 | EXPORT_SYMBOL_GPL(wf_register_client); | 348 | EXPORT_SYMBOL_GPL(wf_register_client); |
| 348 | 349 | ||
| 349 | int wf_unregister_client(struct notifier_block *nb) | 350 | int wf_unregister_client(struct notifier_block *nb) |
| 350 | { | 351 | { |
| 351 | down(&wf_lock); | 352 | mutex_lock(&wf_lock); |
| 352 | notifier_chain_unregister(&wf_client_list, nb); | 353 | notifier_chain_unregister(&wf_client_list, nb); |
| 353 | wf_client_count++; | 354 | wf_client_count++; |
| 354 | if (wf_client_count == 0) | 355 | if (wf_client_count == 0) |
| 355 | wf_stop_thread(); | 356 | wf_stop_thread(); |
| 356 | up(&wf_lock); | 357 | mutex_unlock(&wf_lock); |
| 357 | 358 | ||
| 358 | return 0; | 359 | return 0; |
| 359 | } | 360 | } |
| @@ -361,23 +362,23 @@ EXPORT_SYMBOL_GPL(wf_unregister_client); | |||
| 361 | 362 | ||
| 362 | void wf_set_overtemp(void) | 363 | void wf_set_overtemp(void) |
| 363 | { | 364 | { |
| 364 | down(&wf_lock); | 365 | mutex_lock(&wf_lock); |
| 365 | wf_overtemp++; | 366 | wf_overtemp++; |
| 366 | if (wf_overtemp == 1) { | 367 | if (wf_overtemp == 1) { |
| 367 | printk(KERN_WARNING "windfarm: Overtemp condition detected !\n"); | 368 | printk(KERN_WARNING "windfarm: Overtemp condition detected !\n"); |
| 368 | wf_overtemp_counter = 0; | 369 | wf_overtemp_counter = 0; |
| 369 | wf_notify(WF_EVENT_OVERTEMP, NULL); | 370 | wf_notify(WF_EVENT_OVERTEMP, NULL); |
| 370 | } | 371 | } |
| 371 | up(&wf_lock); | 372 | mutex_unlock(&wf_lock); |
| 372 | } | 373 | } |
| 373 | EXPORT_SYMBOL_GPL(wf_set_overtemp); | 374 | EXPORT_SYMBOL_GPL(wf_set_overtemp); |
| 374 | 375 | ||
| 375 | void wf_clear_overtemp(void) | 376 | void wf_clear_overtemp(void) |
| 376 | { | 377 | { |
| 377 | down(&wf_lock); | 378 | mutex_lock(&wf_lock); |
| 378 | WARN_ON(wf_overtemp == 0); | 379 | WARN_ON(wf_overtemp == 0); |
| 379 | if (wf_overtemp == 0) { | 380 | if (wf_overtemp == 0) { |
| 380 | up(&wf_lock); | 381 | mutex_unlock(&wf_lock); |
| 381 | return; | 382 | return; |
| 382 | } | 383 | } |
| 383 | wf_overtemp--; | 384 | wf_overtemp--; |
| @@ -385,7 +386,7 @@ void wf_clear_overtemp(void) | |||
| 385 | printk(KERN_WARNING "windfarm: Overtemp condition cleared !\n"); | 386 | printk(KERN_WARNING "windfarm: Overtemp condition cleared !\n"); |
| 386 | wf_notify(WF_EVENT_NORMALTEMP, NULL); | 387 | wf_notify(WF_EVENT_NORMALTEMP, NULL); |
| 387 | } | 388 | } |
| 388 | up(&wf_lock); | 389 | mutex_unlock(&wf_lock); |
| 389 | } | 390 | } |
| 390 | EXPORT_SYMBOL_GPL(wf_clear_overtemp); | 391 | EXPORT_SYMBOL_GPL(wf_clear_overtemp); |
| 391 | 392 | ||
