linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / drivers / cdrom / cm206.c
index f43a988..ce127f7 100644 (file)
@@ -218,12 +218,12 @@ static int cm206_base = CM206_BASE;
 static int cm206_irq = CM206_IRQ;
 #ifdef MODULE
 static int cm206[2] = { 0, 0 };        /* for compatible `insmod' parameter passing */
-module_param_array(cm206, int, NULL, 0);       /* base,irq or irq,base */
 #endif
 
-module_param(cm206_base, int, 0);      /* base */
-module_param(cm206_irq, int, 0);       /* irq */
-module_param(auto_probe, bool, 0);     /* auto probe base and irq */
+MODULE_PARM(cm206_base, "i");  /* base */
+MODULE_PARM(cm206_irq, "i");   /* irq */
+MODULE_PARM(cm206, "1-2i");    /* base,irq or irq,base */
+MODULE_PARM(auto_probe, "i");  /* auto probe base and irq */
 MODULE_LICENSE("GPL");
 
 #define POLLOOP 100            /* milliseconds */
@@ -1157,6 +1157,32 @@ static int cm206_audio_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
        }
 }
 
+/* Ioctl. These ioctls are specific to the cm206 driver. I have made
+   some driver statistics accessible through ioctl calls.
+ */
+
+static int cm206_ioctl(struct cdrom_device_info *cdi, unsigned int cmd,
+                      unsigned long arg)
+{
+       switch (cmd) {
+#ifdef STATISTICS
+       case CM206CTL_GET_STAT:
+               if (arg >= NR_STATS)
+                       return -EINVAL;
+               else
+                       return cd->stats[arg];
+       case CM206CTL_GET_LAST_STAT:
+               if (arg >= NR_STATS)
+                       return -EINVAL;
+               else
+                       return cd->last_stat[arg];
+#endif
+       default:
+               debug(("Unknown ioctl call 0x%x\n", cmd));
+               return -EINVAL;
+       }
+}
+
 static int cm206_media_changed(struct cdrom_device_info *cdi, int disc_nr)
 {
        if (cd != NULL) {
@@ -1295,10 +1321,11 @@ static struct cdrom_device_ops cm206_dops = {
        .get_mcn                = cm206_get_upc,
        .reset                  = cm206_reset,
        .audio_ioctl            = cm206_audio_ioctl,
+       .dev_ioctl              = cm206_ioctl,
        .capability             = CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK |
                                  CDC_MULTI_SESSION | CDC_MEDIA_CHANGED |
                                  CDC_MCN | CDC_PLAY_AUDIO | CDC_SELECT_SPEED |
-                                 CDC_DRIVE_STATUS,
+                                 CDC_IOCTLS | CDC_DRIVE_STATUS,
        .n_minors               = 1,
 };
 
@@ -1323,21 +1350,6 @@ static int cm206_block_release(struct inode *inode, struct file *file)
 static int cm206_block_ioctl(struct inode *inode, struct file *file,
                                unsigned cmd, unsigned long arg)
 {
-       switch (cmd) {
-#ifdef STATISTICS
-       case CM206CTL_GET_STAT:
-               if (arg >= NR_STATS)
-                       return -EINVAL;
-               return cd->stats[arg];
-       case CM206CTL_GET_LAST_STAT:
-               if (arg >= NR_STATS)
-                       return -EINVAL;
-               return cd->last_stat[arg];
-#endif
-       default:
-               break;
-       }
-
        return cdrom_ioctl(file, &cm206_info, inode, cmd, arg);
 }