ide-cd: factor out ioctl handlers from ide_cdrom_audio_ioctl()
authorBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 1 Feb 2008 22:09:23 +0000 (23:09 +0100)
committerBartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Fri, 1 Feb 2008 22:09:23 +0000 (23:09 +0100)
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
drivers/ide/ide-cd.c

index f4a0264..1826c58 100644 (file)
@@ -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;
        }