forked from Minki/linux
ide-cd: factor out ioctl handlers from ide_cdrom_audio_ioctl()
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
This commit is contained in:
parent
972560fb9d
commit
ba3fab24d2
@ -1998,6 +1998,24 @@ static int cdrom_read_toc(ide_drive_t *drive, struct request_sense *sense)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ide_cd_read_tochdr(ide_drive_t *drive, void *arg)
|
||||
{
|
||||
struct cdrom_info *cd = drive->driver_data;
|
||||
struct cdrom_tochdr *tochdr = arg;
|
||||
struct atapi_toc *toc;
|
||||
int stat;
|
||||
|
||||
/* Make sure our saved TOC is valid. */
|
||||
stat = cdrom_read_toc(drive, NULL);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
toc = cd->toc;
|
||||
tochdr->cdth_trk0 = toc->hdr.first_track;
|
||||
tochdr->cdth_trk1 = toc->hdr.last_track;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cdrom_read_subchannel(ide_drive_t *drive, int format, char *buf,
|
||||
int buflen, struct request_sense *sense)
|
||||
@ -2092,6 +2110,55 @@ static int cdrom_get_toc_entry(ide_drive_t *drive, int track,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ide_cd_read_tocentry(ide_drive_t *drive, void *arg)
|
||||
{
|
||||
struct cdrom_tocentry *tocentry = arg;
|
||||
struct atapi_toc_entry *toce;
|
||||
int stat;
|
||||
|
||||
stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
tocentry->cdte_ctrl = toce->control;
|
||||
tocentry->cdte_adr = toce->adr;
|
||||
if (tocentry->cdte_format == CDROM_MSF) {
|
||||
lba_to_msf(toce->addr.lba,
|
||||
&tocentry->cdte_addr.msf.minute,
|
||||
&tocentry->cdte_addr.msf.second,
|
||||
&tocentry->cdte_addr.msf.frame);
|
||||
} else
|
||||
tocentry->cdte_addr.lba = toce->addr.lba;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ide_cd_fake_play_trkind(ide_drive_t *drive, void *arg)
|
||||
{
|
||||
struct cdrom_ti *ti = arg;
|
||||
struct atapi_toc_entry *first_toc, *last_toc;
|
||||
unsigned long lba_start, lba_end;
|
||||
int stat;
|
||||
|
||||
stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
if (ti->cdti_trk1 != CDROM_LEADOUT)
|
||||
++last_toc;
|
||||
lba_start = first_toc->addr.lba;
|
||||
lba_end = last_toc->addr.lba;
|
||||
|
||||
if (lba_end <= lba_start)
|
||||
return -EINVAL;
|
||||
|
||||
return cdrom_play_audio(drive, lba_start, lba_end);
|
||||
}
|
||||
|
||||
/* the generic packet interface to cdrom.c */
|
||||
static int ide_cdrom_packet(struct cdrom_device_info *cdi,
|
||||
struct packet_command *cgc)
|
||||
@ -2123,81 +2190,22 @@ static int ide_cdrom_packet(struct cdrom_device_info *cdi,
|
||||
return cgc->stat;
|
||||
}
|
||||
|
||||
static
|
||||
int ide_cdrom_audio_ioctl (struct cdrom_device_info *cdi,
|
||||
unsigned int cmd, void *arg)
|
||||
|
||||
static int ide_cdrom_audio_ioctl(struct cdrom_device_info *cdi,
|
||||
unsigned int cmd, void *arg)
|
||||
{
|
||||
ide_drive_t *drive = cdi->handle;
|
||||
struct cdrom_info *info = drive->driver_data;
|
||||
int stat;
|
||||
|
||||
switch (cmd) {
|
||||
/*
|
||||
* emulate PLAY_AUDIO_TI command with PLAY_AUDIO_10, since
|
||||
* atapi doesn't support it
|
||||
*/
|
||||
case CDROMPLAYTRKIND: {
|
||||
unsigned long lba_start, lba_end;
|
||||
struct cdrom_ti *ti = arg;
|
||||
struct atapi_toc_entry *first_toc, *last_toc;
|
||||
|
||||
stat = cdrom_get_toc_entry(drive, ti->cdti_trk0, &first_toc);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
stat = cdrom_get_toc_entry(drive, ti->cdti_trk1, &last_toc);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
if (ti->cdti_trk1 != CDROM_LEADOUT)
|
||||
++last_toc;
|
||||
lba_start = first_toc->addr.lba;
|
||||
lba_end = last_toc->addr.lba;
|
||||
|
||||
if (lba_end <= lba_start)
|
||||
return -EINVAL;
|
||||
|
||||
return cdrom_play_audio(drive, lba_start, lba_end);
|
||||
}
|
||||
|
||||
case CDROMREADTOCHDR: {
|
||||
struct cdrom_tochdr *tochdr = arg;
|
||||
struct atapi_toc *toc;
|
||||
|
||||
/* Make sure our saved TOC is valid. */
|
||||
stat = cdrom_read_toc(drive, NULL);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
toc = info->toc;
|
||||
tochdr->cdth_trk0 = toc->hdr.first_track;
|
||||
tochdr->cdth_trk1 = toc->hdr.last_track;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
case CDROMREADTOCENTRY: {
|
||||
struct cdrom_tocentry *tocentry = arg;
|
||||
struct atapi_toc_entry *toce;
|
||||
|
||||
stat = cdrom_get_toc_entry(drive, tocentry->cdte_track, &toce);
|
||||
if (stat)
|
||||
return stat;
|
||||
|
||||
tocentry->cdte_ctrl = toce->control;
|
||||
tocentry->cdte_adr = toce->adr;
|
||||
if (tocentry->cdte_format == CDROM_MSF) {
|
||||
lba_to_msf (toce->addr.lba,
|
||||
&tocentry->cdte_addr.msf.minute,
|
||||
&tocentry->cdte_addr.msf.second,
|
||||
&tocentry->cdte_addr.msf.frame);
|
||||
} else
|
||||
tocentry->cdte_addr.lba = toce->addr.lba;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
case CDROMPLAYTRKIND:
|
||||
return ide_cd_fake_play_trkind(drive, arg);
|
||||
case CDROMREADTOCHDR:
|
||||
return ide_cd_read_tochdr(drive, arg);
|
||||
case CDROMREADTOCENTRY:
|
||||
return ide_cd_read_tocentry(drive, arg);
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user