diff options
Diffstat (limited to 'sound/pci/fm801.c')
-rw-r--r-- | sound/pci/fm801.c | 32 |
1 files changed, 19 insertions, 13 deletions
diff --git a/sound/pci/fm801.c b/sound/pci/fm801.c index a30257fa6dbc..88a3e9f3224a 100644 --- a/sound/pci/fm801.c +++ b/sound/pci/fm801.c | |||
@@ -160,6 +160,7 @@ struct fm801 { | |||
160 | unsigned int multichannel: 1, /* multichannel support */ | 160 | unsigned int multichannel: 1, /* multichannel support */ |
161 | secondary: 1; /* secondary codec */ | 161 | secondary: 1; /* secondary codec */ |
162 | unsigned char secondary_addr; /* address of the secondary codec */ | 162 | unsigned char secondary_addr; /* address of the secondary codec */ |
163 | unsigned int tea575x_tuner; /* tuner flags */ | ||
163 | 164 | ||
164 | unsigned short ply_ctrl; /* playback control */ | 165 | unsigned short ply_ctrl; /* playback control */ |
165 | unsigned short cap_ctrl; /* capture control */ | 166 | unsigned short cap_ctrl; /* capture control */ |
@@ -1255,7 +1256,7 @@ static int snd_fm801_chip_init(struct fm801 *chip, int resume) | |||
1255 | int id; | 1256 | int id; |
1256 | unsigned short cmdw; | 1257 | unsigned short cmdw; |
1257 | 1258 | ||
1258 | if (tea575x_tuner & 0x0010) | 1259 | if (chip->tea575x_tuner & 0x0010) |
1259 | goto __ac97_ok; | 1260 | goto __ac97_ok; |
1260 | 1261 | ||
1261 | /* codec cold reset + AC'97 warm reset */ | 1262 | /* codec cold reset + AC'97 warm reset */ |
@@ -1295,6 +1296,8 @@ static int snd_fm801_chip_init(struct fm801 *chip, int resume) | |||
1295 | wait_for_codec(chip, 0, AC97_VENDOR_ID1, msecs_to_jiffies(750)); | 1296 | wait_for_codec(chip, 0, AC97_VENDOR_ID1, msecs_to_jiffies(750)); |
1296 | } | 1297 | } |
1297 | 1298 | ||
1299 | __ac97_ok: | ||
1300 | |||
1298 | /* init volume */ | 1301 | /* init volume */ |
1299 | outw(0x0808, FM801_REG(chip, PCM_VOL)); | 1302 | outw(0x0808, FM801_REG(chip, PCM_VOL)); |
1300 | outw(0x9f1f, FM801_REG(chip, FM_VOL)); | 1303 | outw(0x9f1f, FM801_REG(chip, FM_VOL)); |
@@ -1303,9 +1306,12 @@ static int snd_fm801_chip_init(struct fm801 *chip, int resume) | |||
1303 | /* I2S control - I2S mode */ | 1306 | /* I2S control - I2S mode */ |
1304 | outw(0x0003, FM801_REG(chip, I2S_MODE)); | 1307 | outw(0x0003, FM801_REG(chip, I2S_MODE)); |
1305 | 1308 | ||
1306 | /* interrupt setup - unmask MPU, PLAYBACK & CAPTURE */ | 1309 | /* interrupt setup */ |
1307 | cmdw = inw(FM801_REG(chip, IRQ_MASK)); | 1310 | cmdw = inw(FM801_REG(chip, IRQ_MASK)); |
1308 | cmdw &= ~0x0083; | 1311 | if (chip->irq < 0) |
1312 | cmdw |= 0x00c3; /* mask everything, no PCM nor MPU */ | ||
1313 | else | ||
1314 | cmdw &= ~0x0083; /* unmask MPU, PLAYBACK & CAPTURE */ | ||
1309 | outw(cmdw, FM801_REG(chip, IRQ_MASK)); | 1315 | outw(cmdw, FM801_REG(chip, IRQ_MASK)); |
1310 | 1316 | ||
1311 | /* interrupt clear */ | 1317 | /* interrupt clear */ |
@@ -1370,20 +1376,23 @@ static int __devinit snd_fm801_create(struct snd_card *card, | |||
1370 | chip->card = card; | 1376 | chip->card = card; |
1371 | chip->pci = pci; | 1377 | chip->pci = pci; |
1372 | chip->irq = -1; | 1378 | chip->irq = -1; |
1379 | chip->tea575x_tuner = tea575x_tuner; | ||
1373 | if ((err = pci_request_regions(pci, "FM801")) < 0) { | 1380 | if ((err = pci_request_regions(pci, "FM801")) < 0) { |
1374 | kfree(chip); | 1381 | kfree(chip); |
1375 | pci_disable_device(pci); | 1382 | pci_disable_device(pci); |
1376 | return err; | 1383 | return err; |
1377 | } | 1384 | } |
1378 | chip->port = pci_resource_start(pci, 0); | 1385 | chip->port = pci_resource_start(pci, 0); |
1379 | if (request_irq(pci->irq, snd_fm801_interrupt, IRQF_DISABLED|IRQF_SHARED, | 1386 | if ((tea575x_tuner & 0x0010) == 0) { |
1380 | "FM801", chip)) { | 1387 | if (request_irq(pci->irq, snd_fm801_interrupt, IRQF_DISABLED|IRQF_SHARED, |
1381 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->irq); | 1388 | "FM801", chip)) { |
1382 | snd_fm801_free(chip); | 1389 | snd_printk(KERN_ERR "unable to grab IRQ %d\n", chip->irq); |
1383 | return -EBUSY; | 1390 | snd_fm801_free(chip); |
1391 | return -EBUSY; | ||
1392 | } | ||
1393 | chip->irq = pci->irq; | ||
1394 | pci_set_master(pci); | ||
1384 | } | 1395 | } |
1385 | chip->irq = pci->irq; | ||
1386 | pci_set_master(pci); | ||
1387 | 1396 | ||
1388 | pci_read_config_byte(pci, PCI_REVISION_ID, &rev); | 1397 | pci_read_config_byte(pci, PCI_REVISION_ID, &rev); |
1389 | if (rev >= 0xb1) /* FM801-AU */ | 1398 | if (rev >= 0xb1) /* FM801-AU */ |
@@ -1406,9 +1415,6 @@ static int __devinit snd_fm801_create(struct snd_card *card, | |||
1406 | chip->tea.private_data = chip; | 1415 | chip->tea.private_data = chip; |
1407 | chip->tea.ops = &snd_fm801_tea_ops[(tea575x_tuner & 0x000f) - 1]; | 1416 | chip->tea.ops = &snd_fm801_tea_ops[(tea575x_tuner & 0x000f) - 1]; |
1408 | snd_tea575x_init(&chip->tea); | 1417 | snd_tea575x_init(&chip->tea); |
1409 | |||
1410 | /* Mute FM tuner */ | ||
1411 | outw(0xf800, FM801_REG(chip, GPIO_CTRL)); | ||
1412 | } | 1418 | } |
1413 | #endif | 1419 | #endif |
1414 | 1420 | ||