unsigned int bttv_num;                 /* number of Bt848s in use */
-struct bttv bttvs[BTTV_MAX];
+struct bttv *bttvs[BTTV_MAX];
 
 unsigned int bttv_debug;
 unsigned int bttv_verbose = 1;
 static int bttv_open(struct file *file)
 {
        int minor = video_devdata(file)->minor;
-       struct bttv *btv = NULL;
+       struct bttv *btv = video_drvdata(file);
        struct bttv_fh *fh;
        enum v4l2_buf_type type = 0;
-       unsigned int i;
 
        dprintk(KERN_DEBUG "bttv: open minor=%d\n",minor);
 
        lock_kernel();
-       for (i = 0; i < bttv_num; i++) {
-               if (bttvs[i].video_dev &&
-                   bttvs[i].video_dev->minor == minor) {
-                       btv = &bttvs[i];
-                       type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
-                       break;
-               }
-               if (bttvs[i].vbi_dev &&
-                   bttvs[i].vbi_dev->minor == minor) {
-                       btv = &bttvs[i];
-                       type = V4L2_BUF_TYPE_VBI_CAPTURE;
-                       break;
-               }
-       }
-       if (NULL == btv) {
+       if (btv->video_dev->minor == minor) {
+               type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+       } else if (btv->vbi_dev->minor == minor) {
+               type = V4L2_BUF_TYPE_VBI_CAPTURE;
+       } else {
+               WARN_ON(1);
                unlock_kernel();
                return -ENODEV;
        }
 static int radio_open(struct file *file)
 {
        int minor = video_devdata(file)->minor;
-       struct bttv *btv = NULL;
+       struct bttv *btv = video_drvdata(file);
        struct bttv_fh *fh;
-       unsigned int i;
 
        dprintk("bttv: open minor=%d\n",minor);
 
        lock_kernel();
-       for (i = 0; i < bttv_num; i++) {
-               if (bttvs[i].radio_dev && bttvs[i].radio_dev->minor == minor) {
-                       btv = &bttvs[i];
-                       break;
-               }
-       }
-       if (NULL == btv) {
+       WARN_ON(btv->radio_dev && btv->radio_dev->minor != minor);
+       if (!btv->radio_dev || btv->radio_dev->minor != minor) {
                unlock_kernel();
                return -ENODEV;
        }
        vfd->parent  = &btv->c.pci->dev;
        vfd->release = video_device_release;
        vfd->debug   = bttv_debug;
+       video_set_drvdata(vfd, btv);
        snprintf(vfd->name, sizeof(vfd->name), "BT%d%s %s (%s)",
                 btv->id, (btv->id==848 && btv->revision==0x12) ? "A" : "",
                 type_name, bttv_tvcards[btv->c.type].name);
        if (bttv_num == BTTV_MAX)
                return -ENOMEM;
        printk(KERN_INFO "bttv: Bt8xx card found (%d).\n", bttv_num);
-       btv=&bttvs[bttv_num];
-       memset(btv,0,sizeof(*btv));
+       bttvs[bttv_num] = btv = kzalloc(sizeof(*btv), GFP_KERNEL);
        btv->c.nr  = bttv_num;
        sprintf(btv->c.name,"bttv%d",btv->c.nr);
 
                           pci_resource_len(btv->c.pci,0));
 
        pci_set_drvdata(pci_dev, NULL);
+       bttvs[btv->c.nr] = NULL;
+       kfree(btv);
+
        return;
 }