]> Pileus Git - ~andy/linux/blobdiff - sound/pci/fm801.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/gerg/m68knommu
[~andy/linux] / sound / pci / fm801.c
index 9597ef1eccca39ff5a776c6f5259767ca459ecce..a416ea8af3e9b3c39bef71cb92832f425217380c 100644 (file)
@@ -58,6 +58,7 @@ static bool enable[SNDRV_CARDS] = SNDRV_DEFAULT_ENABLE_PNP;   /* Enable this card
  *  High 16-bits are video (radio) device number + 1
  */
 static int tea575x_tuner[SNDRV_CARDS];
+static int radio_nr[SNDRV_CARDS] = {[0 ... (SNDRV_CARDS - 1)] = -1};
 
 module_param_array(index, int, NULL, 0444);
 MODULE_PARM_DESC(index, "Index value for the FM801 soundcard.");
@@ -67,6 +68,9 @@ module_param_array(enable, bool, NULL, 0444);
 MODULE_PARM_DESC(enable, "Enable FM801 soundcard.");
 module_param_array(tea575x_tuner, int, NULL, 0444);
 MODULE_PARM_DESC(tea575x_tuner, "TEA575x tuner access method (0 = auto, 1 = SF256-PCS, 2=SF256-PCP, 3=SF64-PCR, 8=disable, +16=tuner-only).");
+module_param_array(radio_nr, int, NULL, 0444);
+MODULE_PARM_DESC(radio_nr, "Radio device numbers");
+
 
 #define TUNER_DISABLED         (1<<3)
 #define TUNER_ONLY             (1<<4)
@@ -197,6 +201,7 @@ struct fm801 {
        struct snd_info_entry *proc_entry;
 
 #ifdef CONFIG_SND_FM801_TEA575X_BOOL
+       struct v4l2_device v4l2_dev;
        struct snd_tea575x tea;
 #endif
 
@@ -1154,8 +1159,10 @@ static int snd_fm801_free(struct fm801 *chip)
 
       __end_hw:
 #ifdef CONFIG_SND_FM801_TEA575X_BOOL
-       if (!(chip->tea575x_tuner & TUNER_DISABLED))
+       if (!(chip->tea575x_tuner & TUNER_DISABLED)) {
                snd_tea575x_exit(&chip->tea);
+               v4l2_device_unregister(&chip->v4l2_dev);
+       }
 #endif
        if (chip->irq >= 0)
                free_irq(chip->irq, chip);
@@ -1175,6 +1182,7 @@ static int snd_fm801_dev_free(struct snd_device *device)
 static int __devinit snd_fm801_create(struct snd_card *card,
                                      struct pci_dev * pci,
                                      int tea575x_tuner,
+                                     int radio_nr,
                                      struct fm801 ** rchip)
 {
        struct fm801 *chip;
@@ -1234,6 +1242,13 @@ static int __devinit snd_fm801_create(struct snd_card *card,
        snd_card_set_dev(card, &pci->dev);
 
 #ifdef CONFIG_SND_FM801_TEA575X_BOOL
+       err = v4l2_device_register(&pci->dev, &chip->v4l2_dev);
+       if (err < 0) {
+               snd_fm801_free(chip);
+               return err;
+       }
+       chip->tea.v4l2_dev = &chip->v4l2_dev;
+       chip->tea.radio_nr = radio_nr;
        chip->tea.private_data = chip;
        chip->tea.ops = &snd_fm801_tea_ops;
        sprintf(chip->tea.bus_info, "PCI:%s", pci_name(pci));
@@ -1241,6 +1256,7 @@ static int __devinit snd_fm801_create(struct snd_card *card,
            (tea575x_tuner & TUNER_TYPE_MASK) < 4) {
                if (snd_tea575x_init(&chip->tea)) {
                        snd_printk(KERN_ERR "TEA575x radio not found\n");
+                       snd_fm801_free(chip);
                        return -ENODEV;
                }
        } else if ((tea575x_tuner & TUNER_TYPE_MASK) == 0) {
@@ -1287,7 +1303,7 @@ static int __devinit snd_card_fm801_probe(struct pci_dev *pci,
        err = snd_card_create(index[dev], id[dev], THIS_MODULE, 0, &card);
        if (err < 0)
                return err;
-       if ((err = snd_fm801_create(card, pci, tea575x_tuner[dev], &chip)) < 0) {
+       if ((err = snd_fm801_create(card, pci, tea575x_tuner[dev], radio_nr[dev], &chip)) < 0) {
                snd_card_free(card);
                return err;
        }