Commit 1c27030b authored by Tejun Heo's avatar Tejun Heo

gdrom,viocd: Convert to bdops->check_events()

Convert gdrom and viocd from ->media_changed() to ->check_events().

It's unclear how the conditions are cleared and it's possible that it
may generate spurious events when polled.
Signed-off-by: default avatarTejun Heo <tj@kernel.org>
Cc: Jens Axboe <axboe@kernel.dk>
Cc: Kay Sievers <kay.sievers@vrfy.org>
parent 1a8a74f0
...@@ -395,10 +395,12 @@ static int gdrom_drivestatus(struct cdrom_device_info *cd_info, int ignore) ...@@ -395,10 +395,12 @@ static int gdrom_drivestatus(struct cdrom_device_info *cd_info, int ignore)
return CDS_NO_INFO; return CDS_NO_INFO;
} }
static int gdrom_mediachanged(struct cdrom_device_info *cd_info, int ignore) static unsigned int gdrom_check_events(struct cdrom_device_info *cd_info,
unsigned int clearing, int ignore)
{ {
/* check the sense key */ /* check the sense key */
return (__raw_readb(GDROM_ERROR_REG) & 0xF0) == 0x60; return (__raw_readb(GDROM_ERROR_REG) & 0xF0) == 0x60 ?
DISK_EVENT_MEDIA_CHANGE : 0;
} }
/* reset the G1 bus */ /* reset the G1 bus */
...@@ -483,7 +485,7 @@ static struct cdrom_device_ops gdrom_ops = { ...@@ -483,7 +485,7 @@ static struct cdrom_device_ops gdrom_ops = {
.open = gdrom_open, .open = gdrom_open,
.release = gdrom_release, .release = gdrom_release,
.drive_status = gdrom_drivestatus, .drive_status = gdrom_drivestatus,
.media_changed = gdrom_mediachanged, .check_events = gdrom_check_events,
.get_last_session = gdrom_get_last_session, .get_last_session = gdrom_get_last_session,
.reset = gdrom_hardreset, .reset = gdrom_hardreset,
.audio_ioctl = gdrom_audio_ioctl, .audio_ioctl = gdrom_audio_ioctl,
...@@ -509,9 +511,10 @@ static int gdrom_bdops_release(struct gendisk *disk, fmode_t mode) ...@@ -509,9 +511,10 @@ static int gdrom_bdops_release(struct gendisk *disk, fmode_t mode)
return 0; return 0;
} }
static int gdrom_bdops_mediachanged(struct gendisk *disk) static unsigned int gdrom_bdops_check_events(struct gendisk *disk,
unsigned int clearing)
{ {
return cdrom_media_changed(gd.cd_info); return cdrom_check_events(gd.cd_info, clearing);
} }
static int gdrom_bdops_ioctl(struct block_device *bdev, fmode_t mode, static int gdrom_bdops_ioctl(struct block_device *bdev, fmode_t mode,
...@@ -530,7 +533,7 @@ static const struct block_device_operations gdrom_bdops = { ...@@ -530,7 +533,7 @@ static const struct block_device_operations gdrom_bdops = {
.owner = THIS_MODULE, .owner = THIS_MODULE,
.open = gdrom_bdops_open, .open = gdrom_bdops_open,
.release = gdrom_bdops_release, .release = gdrom_bdops_release,
.media_changed = gdrom_bdops_mediachanged, .check_events = gdrom_bdops_check_events,
.ioctl = gdrom_bdops_ioctl, .ioctl = gdrom_bdops_ioctl,
}; };
...@@ -800,6 +803,7 @@ static int __devinit probe_gdrom(struct platform_device *devptr) ...@@ -800,6 +803,7 @@ static int __devinit probe_gdrom(struct platform_device *devptr)
goto probe_fail_cdrom_register; goto probe_fail_cdrom_register;
} }
gd.disk->fops = &gdrom_bdops; gd.disk->fops = &gdrom_bdops;
gd.disk->events = DISK_EVENT_MEDIA_CHANGE;
/* latch on to the interrupt */ /* latch on to the interrupt */
err = gdrom_set_interrupt_handlers(); err = gdrom_set_interrupt_handlers();
if (err) if (err)
......
...@@ -186,10 +186,11 @@ static int viocd_blk_ioctl(struct block_device *bdev, fmode_t mode, ...@@ -186,10 +186,11 @@ static int viocd_blk_ioctl(struct block_device *bdev, fmode_t mode,
return ret; return ret;
} }
static int viocd_blk_media_changed(struct gendisk *disk) static unsigned int viocd_blk_check_events(struct gendisk *disk,
unsigned int clearing)
{ {
struct disk_info *di = disk->private_data; struct disk_info *di = disk->private_data;
return cdrom_media_changed(&di->viocd_info); return cdrom_check_events(&di->viocd_info, clearing);
} }
static const struct block_device_operations viocd_fops = { static const struct block_device_operations viocd_fops = {
...@@ -197,7 +198,7 @@ static const struct block_device_operations viocd_fops = { ...@@ -197,7 +198,7 @@ static const struct block_device_operations viocd_fops = {
.open = viocd_blk_open, .open = viocd_blk_open,
.release = viocd_blk_release, .release = viocd_blk_release,
.ioctl = viocd_blk_ioctl, .ioctl = viocd_blk_ioctl,
.media_changed = viocd_blk_media_changed, .check_events = viocd_blk_check_events,
}; };
static int viocd_open(struct cdrom_device_info *cdi, int purpose) static int viocd_open(struct cdrom_device_info *cdi, int purpose)
...@@ -320,7 +321,8 @@ static void do_viocd_request(struct request_queue *q) ...@@ -320,7 +321,8 @@ static void do_viocd_request(struct request_queue *q)
} }
} }
static int viocd_media_changed(struct cdrom_device_info *cdi, int disc_nr) static unsigned int viocd_check_events(struct cdrom_device_info *cdi,
unsigned int clearing, int disc_nr)
{ {
struct viocd_waitevent we; struct viocd_waitevent we;
HvLpEvent_Rc hvrc; HvLpEvent_Rc hvrc;
...@@ -340,7 +342,7 @@ static int viocd_media_changed(struct cdrom_device_info *cdi, int disc_nr) ...@@ -340,7 +342,7 @@ static int viocd_media_changed(struct cdrom_device_info *cdi, int disc_nr)
if (hvrc != 0) { if (hvrc != 0) {
pr_warning("bad rc on HvCallEvent_signalLpEventFast %d\n", pr_warning("bad rc on HvCallEvent_signalLpEventFast %d\n",
(int)hvrc); (int)hvrc);
return -EIO; return 0;
} }
wait_for_completion(&we.com); wait_for_completion(&we.com);
...@@ -354,7 +356,7 @@ static int viocd_media_changed(struct cdrom_device_info *cdi, int disc_nr) ...@@ -354,7 +356,7 @@ static int viocd_media_changed(struct cdrom_device_info *cdi, int disc_nr)
return 0; return 0;
} }
return we.changed; return we.changed ? DISK_EVENT_MEDIA_CHANGE : 0;
} }
static int viocd_lock_door(struct cdrom_device_info *cdi, int locking) static int viocd_lock_door(struct cdrom_device_info *cdi, int locking)
...@@ -550,7 +552,7 @@ static int viocd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd, ...@@ -550,7 +552,7 @@ static int viocd_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
static struct cdrom_device_ops viocd_dops = { static struct cdrom_device_ops viocd_dops = {
.open = viocd_open, .open = viocd_open,
.release = viocd_release, .release = viocd_release,
.media_changed = viocd_media_changed, .check_events = viocd_check_events,
.lock_door = viocd_lock_door, .lock_door = viocd_lock_door,
.generic_packet = viocd_packet, .generic_packet = viocd_packet,
.audio_ioctl = viocd_audio_ioctl, .audio_ioctl = viocd_audio_ioctl,
...@@ -624,6 +626,7 @@ static int viocd_probe(struct vio_dev *vdev, const struct vio_device_id *id) ...@@ -624,6 +626,7 @@ static int viocd_probe(struct vio_dev *vdev, const struct vio_device_id *id)
gendisk->queue = q; gendisk->queue = q;
gendisk->fops = &viocd_fops; gendisk->fops = &viocd_fops;
gendisk->flags = GENHD_FL_CD|GENHD_FL_REMOVABLE; gendisk->flags = GENHD_FL_CD|GENHD_FL_REMOVABLE;
gendisk->events = DISK_EVENT_MEDIA_CHANGE;
set_capacity(gendisk, 0); set_capacity(gendisk, 0);
gendisk->private_data = d; gendisk->private_data = d;
d->viocd_disk = gendisk; d->viocd_disk = gendisk;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment