return drive->present;
}
+static void hwif_release_dev (struct device *dev)
+{
+ ide_hwif_t *hwif = container_of(dev, ide_hwif_t, gendev);
+
+ up(&hwif->gendev_rel_sem);
+}
+
static void hwif_register (ide_hwif_t *hwif)
{
/* register with global device tree */
/* Would like to do = &device_legacy */
hwif->gendev.parent = NULL;
}
+ hwif->gendev.release = hwif_release_dev;
device_register(&hwif->gendev);
}
return -ENOMEM;
}
+static void drive_release_dev (struct device *dev)
+{
+ ide_drive_t *drive = container_of(dev, ide_drive_t, gendev);
+
+ up(&drive->gendev_rel_sem);
+}
+
/*
* init_gendisk() (as opposed to ide_geninit) is called for each major device,
* after probing for drives, to allocate partition tables and other data
drive->gendev.parent = &hwif->gendev;
drive->gendev.bus = &ide_bus_type;
drive->gendev.driver_data = drive;
+ drive->gendev.release = drive_release_dev;
if (drive->present) {
device_register(&drive->gendev);
sprintf(drive->devfs_name, "ide/host%d/bus%d/target%d/lun%d",
hwif->mwdma_mask = 0x80; /* disable all mwdma */
hwif->swdma_mask = 0x80; /* disable all swdma */
+ sema_init(&hwif->gendev_rel_sem, 0);
+
default_hwif_iops(hwif);
default_hwif_transport(hwif);
for (unit = 0; unit < MAX_DRIVES; ++unit) {
drive->driver = &idedefault_driver;
drive->vdma = 0;
INIT_LIST_HEAD(&drive->list);
+ sema_init(&drive->gendev_rel_sem, 0);
}
}
spin_unlock_irq(&ide_lock);
blk_cleanup_queue(drive->queue);
device_unregister(&drive->gendev);
+ down(&drive->gendev_rel_sem);
spin_lock_irq(&ide_lock);
drive->queue = NULL;
}
/* More messed up locking ... */
spin_unlock_irq(&ide_lock);
device_unregister(&hwif->gendev);
+ down(&hwif->gendev_rel_sem);
/*
* Remove us from the kernel's knowledge
#include <asm/system.h>
#include <asm/hdreg.h>
#include <asm/io.h>
+#include <asm/semaphore.h>
#define DEBUG_PM
int crc_count; /* crc counter to reduce drive speed */
struct list_head list;
struct device gendev;
+ struct semaphore gendev_rel_sem; /* to deal with device release() */
struct gendisk *disk;
} ide_drive_t;
unsigned auto_poll : 1; /* supports nop auto-poll */
struct device gendev;
+ struct semaphore gendev_rel_sem; /* To deal with device release() */
void *hwif_data; /* extra hwif data */