diff options
Diffstat (limited to 'net/rfkill/rfkill.c')
| -rw-r--r-- | net/rfkill/rfkill.c | 37 |
1 files changed, 20 insertions, 17 deletions
diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c index 51d151c0e962..73d60a307129 100644 --- a/net/rfkill/rfkill.c +++ b/net/rfkill/rfkill.c | |||
| @@ -27,6 +27,10 @@ | |||
| 27 | #include <linux/mutex.h> | 27 | #include <linux/mutex.h> |
| 28 | #include <linux/rfkill.h> | 28 | #include <linux/rfkill.h> |
| 29 | 29 | ||
| 30 | /* Get declaration of rfkill_switch_all() to shut up sparse. */ | ||
| 31 | #include "rfkill-input.h" | ||
| 32 | |||
| 33 | |||
| 30 | MODULE_AUTHOR("Ivo van Doorn <IvDoorn@gmail.com>"); | 34 | MODULE_AUTHOR("Ivo van Doorn <IvDoorn@gmail.com>"); |
| 31 | MODULE_VERSION("1.0"); | 35 | MODULE_VERSION("1.0"); |
| 32 | MODULE_DESCRIPTION("RF switch support"); | 36 | MODULE_DESCRIPTION("RF switch support"); |
| @@ -276,21 +280,17 @@ static struct class rfkill_class = { | |||
| 276 | 280 | ||
| 277 | static int rfkill_add_switch(struct rfkill *rfkill) | 281 | static int rfkill_add_switch(struct rfkill *rfkill) |
| 278 | { | 282 | { |
| 279 | int retval; | 283 | int error; |
| 280 | |||
| 281 | retval = mutex_lock_interruptible(&rfkill_mutex); | ||
| 282 | if (retval) | ||
| 283 | return retval; | ||
| 284 | 284 | ||
| 285 | retval = rfkill_toggle_radio(rfkill, rfkill_states[rfkill->type]); | 285 | mutex_lock(&rfkill_mutex); |
| 286 | if (retval) | ||
| 287 | goto out; | ||
| 288 | 286 | ||
| 289 | list_add_tail(&rfkill->node, &rfkill_list); | 287 | error = rfkill_toggle_radio(rfkill, rfkill_states[rfkill->type]); |
| 288 | if (!error) | ||
| 289 | list_add_tail(&rfkill->node, &rfkill_list); | ||
| 290 | 290 | ||
| 291 | out: | ||
| 292 | mutex_unlock(&rfkill_mutex); | 291 | mutex_unlock(&rfkill_mutex); |
| 293 | return retval; | 292 | |
| 293 | return error; | ||
| 294 | } | 294 | } |
| 295 | 295 | ||
| 296 | static void rfkill_remove_switch(struct rfkill *rfkill) | 296 | static void rfkill_remove_switch(struct rfkill *rfkill) |
| @@ -387,20 +387,23 @@ int rfkill_register(struct rfkill *rfkill) | |||
| 387 | 387 | ||
| 388 | if (!rfkill->toggle_radio) | 388 | if (!rfkill->toggle_radio) |
| 389 | return -EINVAL; | 389 | return -EINVAL; |
| 390 | if (rfkill->type >= RFKILL_TYPE_MAX) | ||
| 391 | return -EINVAL; | ||
| 392 | |||
| 393 | snprintf(dev->bus_id, sizeof(dev->bus_id), | ||
| 394 | "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); | ||
| 395 | |||
| 396 | rfkill_led_trigger_register(rfkill); | ||
| 390 | 397 | ||
| 391 | error = rfkill_add_switch(rfkill); | 398 | error = rfkill_add_switch(rfkill); |
| 392 | if (error) | 399 | if (error) |
| 393 | return error; | 400 | return error; |
| 394 | 401 | ||
| 395 | snprintf(dev->bus_id, sizeof(dev->bus_id), | ||
| 396 | "rfkill%ld", (long)atomic_inc_return(&rfkill_no) - 1); | ||
| 397 | |||
| 398 | error = device_add(dev); | 402 | error = device_add(dev); |
| 399 | if (error) { | 403 | if (error) { |
| 400 | rfkill_remove_switch(rfkill); | 404 | rfkill_remove_switch(rfkill); |
| 401 | return error; | 405 | return error; |
| 402 | } | 406 | } |
| 403 | rfkill_led_trigger_register(rfkill); | ||
| 404 | 407 | ||
| 405 | return 0; | 408 | return 0; |
| 406 | } | 409 | } |
| @@ -416,9 +419,9 @@ EXPORT_SYMBOL(rfkill_register); | |||
| 416 | */ | 419 | */ |
| 417 | void rfkill_unregister(struct rfkill *rfkill) | 420 | void rfkill_unregister(struct rfkill *rfkill) |
| 418 | { | 421 | { |
| 419 | rfkill_led_trigger_unregister(rfkill); | ||
| 420 | device_del(&rfkill->dev); | 422 | device_del(&rfkill->dev); |
| 421 | rfkill_remove_switch(rfkill); | 423 | rfkill_remove_switch(rfkill); |
| 424 | rfkill_led_trigger_unregister(rfkill); | ||
| 422 | put_device(&rfkill->dev); | 425 | put_device(&rfkill->dev); |
| 423 | } | 426 | } |
| 424 | EXPORT_SYMBOL(rfkill_unregister); | 427 | EXPORT_SYMBOL(rfkill_unregister); |
| @@ -448,5 +451,5 @@ static void __exit rfkill_exit(void) | |||
| 448 | class_unregister(&rfkill_class); | 451 | class_unregister(&rfkill_class); |
| 449 | } | 452 | } |
| 450 | 453 | ||
| 451 | module_init(rfkill_init); | 454 | subsys_initcall(rfkill_init); |
| 452 | module_exit(rfkill_exit); | 455 | module_exit(rfkill_exit); |
