diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-24 16:53:15 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-07-24 16:53:15 -0400 |
commit | 08da591e14cf87247ec09b17c350235157a92fc3 (patch) | |
tree | d00a02154071c7013c31bc8dd1d3c12c86d5daca /drivers/ide/ide.c | |
parent | 6cdf6eb357c2681596b7b1672b92396ba82333d4 (diff) |
ide: add ide_device_{get,put}() helpers
* Add 'struct ide_host *host' field to ide_hwif_t and set it
in ide_host_alloc_all().
* Add ide_device_{get,put}() helpers loosely based on SCSI's
scsi_device_{get,put}() ones.
* Convert IDE device drivers to use ide_device_{get,put}().
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide.c')
-rw-r--r-- | drivers/ide/ide.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/ide/ide.c b/drivers/ide/ide.c index 60f0ca66aa93..772451600e4d 100644 --- a/drivers/ide/ide.c +++ b/drivers/ide/ide.c | |||
@@ -618,6 +618,53 @@ set_val: | |||
618 | 618 | ||
619 | EXPORT_SYMBOL(generic_ide_ioctl); | 619 | EXPORT_SYMBOL(generic_ide_ioctl); |
620 | 620 | ||
621 | /** | ||
622 | * ide_device_get - get an additional reference to a ide_drive_t | ||
623 | * @drive: device to get a reference to | ||
624 | * | ||
625 | * Gets a reference to the ide_drive_t and increments the use count of the | ||
626 | * underlying LLDD module. | ||
627 | */ | ||
628 | int ide_device_get(ide_drive_t *drive) | ||
629 | { | ||
630 | struct device *host_dev; | ||
631 | struct module *module; | ||
632 | |||
633 | if (!get_device(&drive->gendev)) | ||
634 | return -ENXIO; | ||
635 | |||
636 | host_dev = drive->hwif->host->dev[0]; | ||
637 | module = host_dev ? host_dev->driver->owner : NULL; | ||
638 | |||
639 | if (module && !try_module_get(module)) { | ||
640 | put_device(&drive->gendev); | ||
641 | return -ENXIO; | ||
642 | } | ||
643 | |||
644 | return 0; | ||
645 | } | ||
646 | EXPORT_SYMBOL_GPL(ide_device_get); | ||
647 | |||
648 | /** | ||
649 | * ide_device_put - release a reference to a ide_drive_t | ||
650 | * @drive: device to release a reference on | ||
651 | * | ||
652 | * Release a reference to the ide_drive_t and decrements the use count of | ||
653 | * the underlying LLDD module. | ||
654 | */ | ||
655 | void ide_device_put(ide_drive_t *drive) | ||
656 | { | ||
657 | #ifdef CONFIG_MODULE_UNLOAD | ||
658 | struct device *host_dev = drive->hwif->host->dev[0]; | ||
659 | struct module *module = host_dev ? host_dev->driver->owner : NULL; | ||
660 | |||
661 | if (module) | ||
662 | module_put(module); | ||
663 | #endif | ||
664 | put_device(&drive->gendev); | ||
665 | } | ||
666 | EXPORT_SYMBOL_GPL(ide_device_put); | ||
667 | |||
621 | static int ide_bus_match(struct device *dev, struct device_driver *drv) | 668 | static int ide_bus_match(struct device *dev, struct device_driver *drv) |
622 | { | 669 | { |
623 | return 1; | 670 | return 1; |