aboutsummaryrefslogtreecommitdiffstats
path: root/sound/isa/es18xx.c
diff options
context:
space:
mode:
Diffstat (limited to 'sound/isa/es18xx.c')
-rw-r--r--sound/isa/es18xx.c51
1 files changed, 48 insertions, 3 deletions
diff --git a/sound/isa/es18xx.c b/sound/isa/es18xx.c
index 93335000c51e..79785808dd60 100644
--- a/sound/isa/es18xx.c
+++ b/sound/isa/es18xx.c
@@ -49,6 +49,10 @@
49 * - contrarily to some pages in DS_1869.PDF the rates can be set 49 * - contrarily to some pages in DS_1869.PDF the rates can be set
50 * independently. 50 * independently.
51 * 51 *
52 * - Zoom Video is implemented by sharing the FM DAC, thus the user can
53 * have either FM playback or Video playback but not both simultaneously.
54 * The Video Playback Switch mixer control toggles this choice.
55 *
52 * BUGS: 56 * BUGS:
53 * 57 *
54 * - There is a major trouble I noted: 58 * - There is a major trouble I noted:
@@ -63,7 +67,16 @@
63 * 67 *
64 */ 68 */
65 69
66 70/*
71 * ES1879 NOTES:
72 * - When Zoom Video is enabled (reg 0x71 bit 6 toggled on) the PCM playback
73 * seems to be effected (speaker_test plays a lower frequency). Can't find
74 * anything in the datasheet to account for this, so a Video Playback Switch
75 * control has been included to allow ZV to be enabled only when necessary.
76 * Then again on at least one test system the 0x71 bit 6 enable bit is not
77 * needed for ZV, so maybe the datasheet is entirely wrong here.
78 */
79
67#include <sound/driver.h> 80#include <sound/driver.h>
68#include <linux/init.h> 81#include <linux/init.h>
69#include <linux/err.h> 82#include <linux/err.h>
@@ -1317,10 +1330,20 @@ static struct snd_kcontrol_new snd_es18xx_opt_speaker =
1317 1330
1318static struct snd_kcontrol_new snd_es18xx_opt_1869[] = { 1331static struct snd_kcontrol_new snd_es18xx_opt_1869[] = {
1319ES18XX_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1), 1332ES18XX_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1),
1333ES18XX_SINGLE("Video Playback Switch", 0, 0x7f, 0, 1, 0),
1320ES18XX_DOUBLE("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0), 1334ES18XX_DOUBLE("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0),
1321ES18XX_DOUBLE("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0) 1335ES18XX_DOUBLE("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0)
1322}; 1336};
1323 1337
1338static struct snd_kcontrol_new snd_es18xx_opt_1878 =
1339 ES18XX_DOUBLE("Video Playback Volume", 0, 0x68, 0x68, 4, 0, 15, 0);
1340
1341static struct snd_kcontrol_new snd_es18xx_opt_1879[] = {
1342ES18XX_SINGLE("Video Playback Switch", 0, 0x71, 6, 1, 0),
1343ES18XX_DOUBLE("Video Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0),
1344ES18XX_DOUBLE("Video Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0)
1345};
1346
1324static struct snd_kcontrol_new snd_es18xx_pcm1_controls[] = { 1347static struct snd_kcontrol_new snd_es18xx_pcm1_controls[] = {
1325ES18XX_DOUBLE("PCM Playback Volume", 0, 0x14, 0x14, 4, 0, 15, 0), 1348ES18XX_DOUBLE("PCM Playback Volume", 0, 0x14, 0x14, 4, 0, 15, 0),
1326}; 1349};
@@ -1365,7 +1388,6 @@ static struct snd_kcontrol_new snd_es18xx_hw_volume_controls[] = {
1365ES18XX_SINGLE("Hardware Master Volume Split", 0, 0x64, 7, 1, 0), 1388ES18XX_SINGLE("Hardware Master Volume Split", 0, 0x64, 7, 1, 0),
1366}; 1389};
1367 1390
1368#if 0
1369static int __devinit snd_es18xx_config_read(struct snd_es18xx *chip, unsigned char reg) 1391static int __devinit snd_es18xx_config_read(struct snd_es18xx *chip, unsigned char reg)
1370{ 1392{
1371 int data; 1393 int data;
@@ -1376,7 +1398,6 @@ static int __devinit snd_es18xx_config_read(struct snd_es18xx *chip, unsigned ch
1376 spin_unlock_irqrestore(&chip->ctrl_lock, flags); 1398 spin_unlock_irqrestore(&chip->ctrl_lock, flags);
1377 return data; 1399 return data;
1378} 1400}
1379#endif
1380 1401
1381static void __devinit snd_es18xx_config_write(struct snd_es18xx *chip, 1402static void __devinit snd_es18xx_config_write(struct snd_es18xx *chip,
1382 unsigned char reg, unsigned char data) 1403 unsigned char reg, unsigned char data)
@@ -1522,6 +1543,17 @@ static int __devinit snd_es18xx_initialize(struct snd_es18xx *chip)
1522 snd_es18xx_mixer_write(chip, 0x58, 0x94); 1543 snd_es18xx_mixer_write(chip, 0x58, 0x94);
1523 snd_es18xx_mixer_write(chip, 0x5a, 0x80); 1544 snd_es18xx_mixer_write(chip, 0x5a, 0x80);
1524 } 1545 }
1546 /* Flip the "enable I2S" bits for those chipsets that need it */
1547 switch (chip->version) {
1548 case 0x1879:
1549 //Leaving I2S enabled on the 1879 screws up the PCM playback (rate effected somehow)
1550 //so a Switch control has been added to toggle this 0x71 bit on/off:
1551 //snd_es18xx_mixer_bits(chip, 0x71, 0x40, 0x40);
1552 /* Note: we fall through on purpose here. */
1553 case 0x1878:
1554 snd_es18xx_config_write(chip, 0x29, snd_es18xx_config_read(chip, 0x29) | 0x40);
1555 break;
1556 }
1525 /* Mute input source */ 1557 /* Mute input source */
1526 if (chip->caps & ES18XX_MUTEREC) 1558 if (chip->caps & ES18XX_MUTEREC)
1527 mask = 0x10; 1559 mask = 0x10;
@@ -1929,6 +1961,19 @@ static int __devinit snd_es18xx_mixer(struct snd_es18xx *chip)
1929 if (err < 0) 1961 if (err < 0)
1930 return err; 1962 return err;
1931 } 1963 }
1964 } else if (chip->version == 0x1878) {
1965 err = snd_ctl_add(card, snd_ctl_new1(&snd_es18xx_opt_1878,
1966 chip));
1967 if (err < 0)
1968 return err;
1969 } else if (chip->version == 0x1879) {
1970 for (idx = 0; idx < ARRAY_SIZE(snd_es18xx_opt_1879); idx++) {
1971 err = snd_ctl_add(card,
1972 snd_ctl_new1(&snd_es18xx_opt_1879[idx],
1973 chip));
1974 if (err < 0)
1975 return err;
1976 }
1932 } 1977 }
1933 return 0; 1978 return 0;
1934} 1979}