diff options
-rw-r--r-- | sound/isa/es18xx.c | 51 |
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 | ||
1318 | static struct snd_kcontrol_new snd_es18xx_opt_1869[] = { | 1331 | static struct snd_kcontrol_new snd_es18xx_opt_1869[] = { |
1319 | ES18XX_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1), | 1332 | ES18XX_SINGLE("Capture Switch", 0, 0x1c, 4, 1, 1), |
1333 | ES18XX_SINGLE("Video Playback Switch", 0, 0x7f, 0, 1, 0), | ||
1320 | ES18XX_DOUBLE("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0), | 1334 | ES18XX_DOUBLE("Mono Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0), |
1321 | ES18XX_DOUBLE("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0) | 1335 | ES18XX_DOUBLE("Mono Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0) |
1322 | }; | 1336 | }; |
1323 | 1337 | ||
1338 | static struct snd_kcontrol_new snd_es18xx_opt_1878 = | ||
1339 | ES18XX_DOUBLE("Video Playback Volume", 0, 0x68, 0x68, 4, 0, 15, 0); | ||
1340 | |||
1341 | static struct snd_kcontrol_new snd_es18xx_opt_1879[] = { | ||
1342 | ES18XX_SINGLE("Video Playback Switch", 0, 0x71, 6, 1, 0), | ||
1343 | ES18XX_DOUBLE("Video Playback Volume", 0, 0x6d, 0x6d, 4, 0, 15, 0), | ||
1344 | ES18XX_DOUBLE("Video Capture Volume", 0, 0x6f, 0x6f, 4, 0, 15, 0) | ||
1345 | }; | ||
1346 | |||
1324 | static struct snd_kcontrol_new snd_es18xx_pcm1_controls[] = { | 1347 | static struct snd_kcontrol_new snd_es18xx_pcm1_controls[] = { |
1325 | ES18XX_DOUBLE("PCM Playback Volume", 0, 0x14, 0x14, 4, 0, 15, 0), | 1348 | ES18XX_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[] = { | |||
1365 | ES18XX_SINGLE("Hardware Master Volume Split", 0, 0x64, 7, 1, 0), | 1388 | ES18XX_SINGLE("Hardware Master Volume Split", 0, 0x64, 7, 1, 0), |
1366 | }; | 1389 | }; |
1367 | 1390 | ||
1368 | #if 0 | ||
1369 | static int __devinit snd_es18xx_config_read(struct snd_es18xx *chip, unsigned char reg) | 1391 | static 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 | ||
1381 | static void __devinit snd_es18xx_config_write(struct snd_es18xx *chip, | 1402 | static 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 | } |