diff options
Diffstat (limited to 'drivers/pnp/manager.c')
-rw-r--r-- | drivers/pnp/manager.c | 78 |
1 files changed, 59 insertions, 19 deletions
diff --git a/drivers/pnp/manager.c b/drivers/pnp/manager.c index 261668618b2d..c4256aa32bcb 100644 --- a/drivers/pnp/manager.c +++ b/drivers/pnp/manager.c | |||
@@ -470,6 +470,53 @@ int pnp_auto_config_dev(struct pnp_dev *dev) | |||
470 | } | 470 | } |
471 | 471 | ||
472 | /** | 472 | /** |
473 | * pnp_start_dev - low-level start of the PnP device | ||
474 | * @dev: pointer to the desired device | ||
475 | * | ||
476 | * assumes that resources have alread been allocated | ||
477 | */ | ||
478 | |||
479 | int pnp_start_dev(struct pnp_dev *dev) | ||
480 | { | ||
481 | if (!pnp_can_write(dev)) { | ||
482 | pnp_info("Device %s does not supported activation.", dev->dev.bus_id); | ||
483 | return -EINVAL; | ||
484 | } | ||
485 | |||
486 | if (dev->protocol->set(dev, &dev->res)<0) { | ||
487 | pnp_err("Failed to activate device %s.", dev->dev.bus_id); | ||
488 | return -EIO; | ||
489 | } | ||
490 | |||
491 | pnp_info("Device %s activated.", dev->dev.bus_id); | ||
492 | |||
493 | return 0; | ||
494 | } | ||
495 | |||
496 | /** | ||
497 | * pnp_stop_dev - low-level disable of the PnP device | ||
498 | * @dev: pointer to the desired device | ||
499 | * | ||
500 | * does not free resources | ||
501 | */ | ||
502 | |||
503 | int pnp_stop_dev(struct pnp_dev *dev) | ||
504 | { | ||
505 | if (!pnp_can_disable(dev)) { | ||
506 | pnp_info("Device %s does not supported disabling.", dev->dev.bus_id); | ||
507 | return -EINVAL; | ||
508 | } | ||
509 | if (dev->protocol->disable(dev)<0) { | ||
510 | pnp_err("Failed to disable device %s.", dev->dev.bus_id); | ||
511 | return -EIO; | ||
512 | } | ||
513 | |||
514 | pnp_info("Device %s disabled.", dev->dev.bus_id); | ||
515 | |||
516 | return 0; | ||
517 | } | ||
518 | |||
519 | /** | ||
473 | * pnp_activate_dev - activates a PnP device for use | 520 | * pnp_activate_dev - activates a PnP device for use |
474 | * @dev: pointer to the desired device | 521 | * @dev: pointer to the desired device |
475 | * | 522 | * |
@@ -477,6 +524,8 @@ int pnp_auto_config_dev(struct pnp_dev *dev) | |||
477 | */ | 524 | */ |
478 | int pnp_activate_dev(struct pnp_dev *dev) | 525 | int pnp_activate_dev(struct pnp_dev *dev) |
479 | { | 526 | { |
527 | int error; | ||
528 | |||
480 | if (!dev) | 529 | if (!dev) |
481 | return -EINVAL; | 530 | return -EINVAL; |
482 | if (dev->active) { | 531 | if (dev->active) { |
@@ -487,18 +536,11 @@ int pnp_activate_dev(struct pnp_dev *dev) | |||
487 | if (pnp_auto_config_dev(dev)) | 536 | if (pnp_auto_config_dev(dev)) |
488 | return -EBUSY; | 537 | return -EBUSY; |
489 | 538 | ||
490 | if (!pnp_can_write(dev)) { | 539 | error = pnp_start_dev(dev); |
491 | pnp_info("Device %s does not supported activation.", dev->dev.bus_id); | 540 | if (error) |
492 | return -EINVAL; | 541 | return error; |
493 | } | ||
494 | |||
495 | if (dev->protocol->set(dev, &dev->res)<0) { | ||
496 | pnp_err("Failed to activate device %s.", dev->dev.bus_id); | ||
497 | return -EIO; | ||
498 | } | ||
499 | 542 | ||
500 | dev->active = 1; | 543 | dev->active = 1; |
501 | pnp_info("Device %s activated.", dev->dev.bus_id); | ||
502 | 544 | ||
503 | return 1; | 545 | return 1; |
504 | } | 546 | } |
@@ -511,23 +553,19 @@ int pnp_activate_dev(struct pnp_dev *dev) | |||
511 | */ | 553 | */ |
512 | int pnp_disable_dev(struct pnp_dev *dev) | 554 | int pnp_disable_dev(struct pnp_dev *dev) |
513 | { | 555 | { |
556 | int error; | ||
557 | |||
514 | if (!dev) | 558 | if (!dev) |
515 | return -EINVAL; | 559 | return -EINVAL; |
516 | if (!dev->active) { | 560 | if (!dev->active) { |
517 | return 0; /* the device is already disabled */ | 561 | return 0; /* the device is already disabled */ |
518 | } | 562 | } |
519 | 563 | ||
520 | if (!pnp_can_disable(dev)) { | 564 | error = pnp_stop_dev(dev); |
521 | pnp_info("Device %s does not supported disabling.", dev->dev.bus_id); | 565 | if (error) |
522 | return -EINVAL; | 566 | return error; |
523 | } | ||
524 | if (dev->protocol->disable(dev)<0) { | ||
525 | pnp_err("Failed to disable device %s.", dev->dev.bus_id); | ||
526 | return -EIO; | ||
527 | } | ||
528 | 567 | ||
529 | dev->active = 0; | 568 | dev->active = 0; |
530 | pnp_info("Device %s disabled.", dev->dev.bus_id); | ||
531 | 569 | ||
532 | /* release the resources so that other devices can use them */ | 570 | /* release the resources so that other devices can use them */ |
533 | down(&pnp_res_mutex); | 571 | down(&pnp_res_mutex); |
@@ -558,6 +596,8 @@ EXPORT_SYMBOL(pnp_manual_config_dev); | |||
558 | #if 0 | 596 | #if 0 |
559 | EXPORT_SYMBOL(pnp_auto_config_dev); | 597 | EXPORT_SYMBOL(pnp_auto_config_dev); |
560 | #endif | 598 | #endif |
599 | EXPORT_SYMBOL(pnp_start_dev); | ||
600 | EXPORT_SYMBOL(pnp_stop_dev); | ||
561 | EXPORT_SYMBOL(pnp_activate_dev); | 601 | EXPORT_SYMBOL(pnp_activate_dev); |
562 | EXPORT_SYMBOL(pnp_disable_dev); | 602 | EXPORT_SYMBOL(pnp_disable_dev); |
563 | EXPORT_SYMBOL(pnp_resource_change); | 603 | EXPORT_SYMBOL(pnp_resource_change); |