ac97: added support for missing realtek codecs.
* based on ALSA. * code cleanup
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
* AC97 interface
|
* AC97 interface
|
||||||
*
|
*
|
||||||
* Copyright (c) 2002, Marcus Overhagen <[email protected]>
|
* Copyright (c) 2002, Marcus Overhagen <[email protected]>
|
||||||
* Copyright (c) 2008, Jérôme Duval
|
* Copyright (c) 2008-2013, Jérôme Duval
|
||||||
*
|
*
|
||||||
* All rights reserved.
|
* All rights reserved.
|
||||||
* Redistribution and use in source and binary forms, with or without modification,
|
* Redistribution and use in source and binary forms, with or without modification,
|
||||||
@@ -26,6 +26,8 @@
|
|||||||
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <OS.h>
|
#include <OS.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
@@ -44,6 +46,7 @@ void ac97_detect_capabilities(ac97_dev *dev);
|
|||||||
void ac97_detect_rates(ac97_dev *dev);
|
void ac97_detect_rates(ac97_dev *dev);
|
||||||
void ac97_update_register_cache(ac97_dev *dev);
|
void ac97_update_register_cache(ac97_dev *dev);
|
||||||
|
|
||||||
|
|
||||||
const char * stereo_enhancement_technique[] =
|
const char * stereo_enhancement_technique[] =
|
||||||
{
|
{
|
||||||
"No 3D Stereo Enhancement",
|
"No 3D Stereo Enhancement",
|
||||||
@@ -80,26 +83,31 @@ const char * stereo_enhancement_technique[] =
|
|||||||
"Unknown (31)"
|
"Unknown (31)"
|
||||||
};
|
};
|
||||||
|
|
||||||
void default_init(ac97_dev *dev);
|
|
||||||
void ad1819_init(ac97_dev *dev);
|
static void default_init(ac97_dev *dev);
|
||||||
void ad1881_init(ac97_dev *dev);
|
static void ad1819_init(ac97_dev *dev);
|
||||||
void ad1885_init(ac97_dev *dev);
|
static void ad1881_init(ac97_dev *dev);
|
||||||
void ad1886_init(ac97_dev *dev);
|
static void ad1885_init(ac97_dev *dev);
|
||||||
void ad1980_init(ac97_dev *dev);
|
static void ad1886_init(ac97_dev *dev);
|
||||||
void ad1981b_init(ac97_dev *dev);
|
static void ad1980_init(ac97_dev *dev);
|
||||||
void alc650_init(ac97_dev *dev);
|
static void ad1981b_init(ac97_dev *dev);
|
||||||
void stac9708_init(ac97_dev *dev);
|
static void alc203_init(ac97_dev *dev);
|
||||||
void stac9721_init(ac97_dev *dev);
|
static void alc650_init(ac97_dev *dev);
|
||||||
void stac9744_init(ac97_dev *dev);
|
static void alc655_init(ac97_dev *dev);
|
||||||
void stac9756_init(ac97_dev *dev);
|
static void alc850_init(ac97_dev *dev);
|
||||||
void tr28028_init(ac97_dev *dev);
|
static void stac9708_init(ac97_dev *dev);
|
||||||
void wm9701_init(ac97_dev *dev);
|
static void stac9721_init(ac97_dev *dev);
|
||||||
void wm9703_init(ac97_dev *dev);
|
static void stac9744_init(ac97_dev *dev);
|
||||||
void wm9704_init(ac97_dev *dev);
|
static void stac9756_init(ac97_dev *dev);
|
||||||
|
static void tr28028_init(ac97_dev *dev);
|
||||||
|
static void wm9701_init(ac97_dev *dev);
|
||||||
|
static void wm9703_init(ac97_dev *dev);
|
||||||
|
static void wm9704_init(ac97_dev *dev);
|
||||||
|
|
||||||
bool ad1819_set_rate(ac97_dev *dev, uint8 reg, uint32 rate);
|
bool ad1819_set_rate(ac97_dev *dev, uint8 reg, uint32 rate);
|
||||||
bool ad1819_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate);
|
bool ad1819_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate);
|
||||||
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
uint32 id;
|
uint32 id;
|
||||||
@@ -108,6 +116,7 @@ typedef struct
|
|||||||
const char *info;
|
const char *info;
|
||||||
} codec_table;
|
} codec_table;
|
||||||
|
|
||||||
|
|
||||||
codec_table codecs[] =
|
codec_table codecs[] =
|
||||||
{
|
{
|
||||||
{ CODEC_ID_AD1819, 0xffffffff, ad1819_init, "Analog Devices AD1819A, AD1819B SoundPort"B_UTF8_REGISTERED },
|
{ CODEC_ID_AD1819, 0xffffffff, ad1819_init, "Analog Devices AD1819A, AD1819B SoundPort"B_UTF8_REGISTERED },
|
||||||
@@ -127,11 +136,17 @@ codec_table codecs[] =
|
|||||||
{ CODEC_ID_AK4540, 0xffffffff, default_init, "Asahi Kasei AK4540" },
|
{ CODEC_ID_AK4540, 0xffffffff, default_init, "Asahi Kasei AK4540" },
|
||||||
{ CODEC_ID_AK4542, 0xffffffff, default_init, "Asahi Kasei AK4542" },
|
{ CODEC_ID_AK4542, 0xffffffff, default_init, "Asahi Kasei AK4542" },
|
||||||
{ CODEC_ID_AK4543, 0xffffffff, default_init, "Asahi Kasei AK4543" },
|
{ CODEC_ID_AK4543, 0xffffffff, default_init, "Asahi Kasei AK4543" },
|
||||||
|
{ 0x414c4300, 0xffffff00, default_init, "Avance Logic (Realtek) ALC100" }, /* 0x4300 = ALC100 */
|
||||||
{ 0x414c4320, 0xfffffff0, default_init, "Avance Logic (Realtek) ALC100/ALC100P, RL5383/RL5522" },
|
{ 0x414c4320, 0xfffffff0, default_init, "Avance Logic (Realtek) ALC100/ALC100P, RL5383/RL5522" },
|
||||||
{ 0x414c4730, 0xffffffff, default_init, "Avance Logic (Realtek) ALC101" },
|
{ CODEC_ID_ALC201A, 0xfffffff0, default_init, "Avance Logic (Realtek) ALC200/ALC200A, ALC201/ALC201A" }, /* 0x4710 = ALC201A */
|
||||||
{ CODEC_ID_ALC201A, 0xffffffff, default_init, "Avance Logic (Realtek) ALC200/ALC200A, ALC201/ALC201A" }, /* 0x4710 = ALC201A */
|
|
||||||
{ 0x414c4720, 0xffffffff, alc650_init, "Avance Logic (Realtek) ALC650" }, /* 0x4720 = ALC650 */
|
{ 0x414c4720, 0xffffffff, alc650_init, "Avance Logic (Realtek) ALC650" }, /* 0x4720 = ALC650 */
|
||||||
{ 0x414c4740, 0xffffffff, default_init, "Avance Logic (Realtek) ALC202/ALC202A" },
|
{ 0x414c4730, 0xffffffff, default_init, "Avance Logic (Realtek) ALC101" },
|
||||||
|
{ 0x414c4740, 0xfffffff0, default_init, "Avance Logic (Realtek) ALC202/ALC202A" },
|
||||||
|
{ 0x414c4750, 0xfffffff0, default_init, "Avance Logic (Realtek) ALC250" },
|
||||||
|
{ 0x414c4760, 0xfffffff0, alc655_init, "Avance Logic (Realtek) ALC655" }, /* 0x4760 = ALC655 */
|
||||||
|
{ 0x414c4770, 0xfffffff0, alc203_init, "Avance Logic (Realtek) ALC203" },
|
||||||
|
{ 0x414c4780, 0xffffffff, alc655_init, "Avance Logic (Realtek) ALC658" },
|
||||||
|
{ 0x414c4790, 0xfffffff0, alc850_init, "Avance Logic (Realtek) ALC850" },
|
||||||
{ 0x434d4941, 0xffffffff, default_init, "C-Media CMI9738" },
|
{ 0x434d4941, 0xffffffff, default_init, "C-Media CMI9738" },
|
||||||
{ 0x434d4961, 0xffffffff, default_init, "C-Media CMI9739" },
|
{ 0x434d4961, 0xffffffff, default_init, "C-Media CMI9739" },
|
||||||
{ 0x43525900, 0xffffffff, default_init, "Cirrus Logic CS4297" },
|
{ 0x43525900, 0xffffffff, default_init, "Cirrus Logic CS4297" },
|
||||||
@@ -198,9 +213,8 @@ codec_table codecs[] =
|
|||||||
{ 0x00000000, 0x00000000, default_init, "Unknown" } /* must be last one, matches every codec */
|
{ 0x00000000, 0x00000000, default_init, "Unknown" } /* must be last one, matches every codec */
|
||||||
};
|
};
|
||||||
|
|
||||||
codec_table *find_codec_table(uint32 codecid);
|
|
||||||
|
|
||||||
codec_table *
|
static codec_table *
|
||||||
find_codec_table(uint32 codecid)
|
find_codec_table(uint32 codecid)
|
||||||
{
|
{
|
||||||
codec_table *codec;
|
codec_table *codec;
|
||||||
@@ -210,6 +224,7 @@ find_codec_table(uint32 codecid)
|
|||||||
return codec;
|
return codec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_attach(ac97_dev **_dev, codec_reg_read reg_read, codec_reg_write reg_write, void *cookie,
|
ac97_attach(ac97_dev **_dev, codec_reg_read reg_read, codec_reg_write reg_write, void *cookie,
|
||||||
ushort subvendor_id, ushort subsystem_id)
|
ushort subvendor_id, ushort subsystem_id)
|
||||||
@@ -293,6 +308,7 @@ ac97_attach(ac97_dev **_dev, codec_reg_read reg_read, codec_reg_write reg_write,
|
|||||||
ac97_dump_capabilities(dev);
|
ac97_dump_capabilities(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_detach(ac97_dev *dev)
|
ac97_detach(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
@@ -311,18 +327,21 @@ ac97_detach(ac97_dev *dev)
|
|||||||
free(dev);
|
free(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_suspend(ac97_dev *dev)
|
ac97_suspend(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
ac97_amp_enable(dev, false);
|
ac97_amp_enable(dev, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_resume(ac97_dev *dev)
|
ac97_resume(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
ac97_amp_enable(dev, true);
|
ac97_amp_enable(dev, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_reg_cached_write(ac97_dev *dev, uint8 reg, uint16 value)
|
ac97_reg_cached_write(ac97_dev *dev, uint8 reg, uint16 value)
|
||||||
{
|
{
|
||||||
@@ -332,6 +351,7 @@ ac97_reg_cached_write(ac97_dev *dev, uint8 reg, uint16 value)
|
|||||||
dev->reg_cache[reg] = value;
|
dev->reg_cache[reg] = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16
|
uint16
|
||||||
ac97_reg_cached_read(ac97_dev *dev, uint8 reg)
|
ac97_reg_cached_read(ac97_dev *dev, uint8 reg)
|
||||||
{
|
{
|
||||||
@@ -348,6 +368,7 @@ ac97_reg_uncached_write(ac97_dev *dev, uint8 reg, uint16 value)
|
|||||||
dev->reg_write(dev->cookie, reg, value);
|
dev->reg_write(dev->cookie, reg, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint16
|
uint16
|
||||||
ac97_reg_uncached_read(ac97_dev *dev, uint8 reg)
|
ac97_reg_uncached_read(ac97_dev *dev, uint8 reg)
|
||||||
{
|
{
|
||||||
@@ -356,6 +377,7 @@ ac97_reg_uncached_read(ac97_dev *dev, uint8 reg)
|
|||||||
return dev->reg_read(dev->cookie, reg);
|
return dev->reg_read(dev->cookie, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ac97_reg_update(ac97_dev *dev, uint8 reg, uint16 value)
|
ac97_reg_update(ac97_dev *dev, uint8 reg, uint16 value)
|
||||||
{
|
{
|
||||||
@@ -367,6 +389,7 @@ ac97_reg_update(ac97_dev *dev, uint8 reg, uint16 value)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ac97_reg_update_bits(ac97_dev *dev, uint8 reg, uint16 mask, uint16 value)
|
ac97_reg_update_bits(ac97_dev *dev, uint8 reg, uint16 mask, uint16 value)
|
||||||
{
|
{
|
||||||
@@ -382,6 +405,7 @@ ac97_reg_update_bits(ac97_dev *dev, uint8 reg, uint16 mask, uint16 value)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_update_register_cache(ac97_dev *dev)
|
ac97_update_register_cache(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
@@ -390,6 +414,7 @@ ac97_update_register_cache(ac97_dev *dev)
|
|||||||
dev->reg_cache[reg] = ac97_reg_uncached_read(dev, reg);
|
dev->reg_cache[reg] = ac97_reg_uncached_read(dev, reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ac97_set_rate(ac97_dev *dev, uint8 reg, uint32 rate)
|
ac97_set_rate(ac97_dev *dev, uint8 reg, uint32 rate)
|
||||||
{
|
{
|
||||||
@@ -421,6 +446,7 @@ ac97_set_rate(ac97_dev *dev, uint8 reg, uint32 rate)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ac97_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate)
|
ac97_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate)
|
||||||
{
|
{
|
||||||
@@ -441,6 +467,7 @@ ac97_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_set_clock(ac97_dev *dev, uint32 clock)
|
ac97_set_clock(ac97_dev *dev, uint32 clock)
|
||||||
{
|
{
|
||||||
@@ -450,6 +477,7 @@ ac97_set_clock(ac97_dev *dev, uint32 clock)
|
|||||||
ac97_dump_capabilities(dev);
|
ac97_dump_capabilities(dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_detect_capabilities(ac97_dev *dev)
|
ac97_detect_capabilities(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
@@ -550,6 +578,7 @@ ac97_detect_rates(ac97_dev *dev)
|
|||||||
ac97_set_rate(dev, AC97_PCM_FRONT_DAC_RATE, oldrate);
|
ac97_set_rate(dev, AC97_PCM_FRONT_DAC_RATE, oldrate);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ac97_dump_capabilities(ac97_dev *dev)
|
ac97_dump_capabilities(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
@@ -620,6 +649,7 @@ ac97_dump_capabilities(ac97_dev *dev)
|
|||||||
LOG(("CAP_PCM_RATE_96000\n"));
|
LOG(("CAP_PCM_RATE_96000\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ac97_has_capability(ac97_dev *dev, uint64 cap)
|
ac97_has_capability(ac97_dev *dev, uint64 cap)
|
||||||
{
|
{
|
||||||
@@ -677,7 +707,9 @@ ac97_reg_is_valid(ac97_dev *dev, uint8 reg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ac97_amp_enable(ac97_dev *dev, bool yesno)
|
|
||||||
|
void
|
||||||
|
ac97_amp_enable(ac97_dev *dev, bool yesno)
|
||||||
{
|
{
|
||||||
switch (dev->codec_id) {
|
switch (dev->codec_id) {
|
||||||
case CODEC_ID_CS4299A:
|
case CODEC_ID_CS4299A:
|
||||||
@@ -704,6 +736,7 @@ void ac97_amp_enable(ac97_dev *dev, bool yesno)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ad1819_set_rate(ac97_dev *dev, uint8 reg, uint32 rate)
|
ad1819_set_rate(ac97_dev *dev, uint8 reg, uint32 rate)
|
||||||
{
|
{
|
||||||
@@ -730,6 +763,7 @@ ad1819_set_rate(ac97_dev *dev, uint8 reg, uint32 rate)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
ad1819_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate)
|
ad1819_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate)
|
||||||
{
|
{
|
||||||
@@ -753,12 +787,15 @@ ad1819_get_rate(ac97_dev *dev, uint8 reg, uint32 *rate)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void default_init(ac97_dev *dev)
|
void
|
||||||
|
default_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("default_init\n"));
|
LOG(("default_init\n"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void ad1819_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
ad1819_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("ad1819_init\n"));
|
LOG(("ad1819_init\n"));
|
||||||
|
|
||||||
@@ -780,7 +817,9 @@ void ad1819_init(ac97_dev *dev)
|
|||||||
ac97_set_rate(dev, AC97_PCM_L_R_ADC_RATE, 48000);
|
ac97_set_rate(dev, AC97_PCM_L_R_ADC_RATE, 48000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ad1881_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
ad1881_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("ad1881_init\n"));
|
LOG(("ad1881_init\n"));
|
||||||
|
|
||||||
@@ -797,7 +836,9 @@ void ad1881_init(ac97_dev *dev)
|
|||||||
dev->max_vsr = 0xBB80; /* 48kHz */
|
dev->max_vsr = 0xBB80; /* 48kHz */
|
||||||
}
|
}
|
||||||
|
|
||||||
void ad1885_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
ad1885_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("ad1885_init\n"));
|
LOG(("ad1885_init\n"));
|
||||||
ad1881_init(dev);
|
ad1881_init(dev);
|
||||||
@@ -806,7 +847,9 @@ void ad1885_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, AC97_AD_JACK_SENSE, ac97_reg_cached_read(dev, AC97_AD_JACK_SENSE) | 0x0300);
|
ac97_reg_cached_write(dev, AC97_AD_JACK_SENSE, ac97_reg_cached_read(dev, AC97_AD_JACK_SENSE) | 0x0300);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ad1886_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
ad1886_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("ad1886_init\n"));
|
LOG(("ad1886_init\n"));
|
||||||
ad1881_init(dev);
|
ad1881_init(dev);
|
||||||
@@ -817,7 +860,9 @@ void ad1886_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, AC97_SPDIF_CONTROL, 0x2a20);
|
ac97_reg_cached_write(dev, AC97_SPDIF_CONTROL, 0x2a20);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ad1980_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
ad1980_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("ad1980_init\n"));
|
LOG(("ad1980_init\n"));
|
||||||
|
|
||||||
@@ -835,7 +880,9 @@ void ad1980_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, AC97_AD_MISC_CONTROL, 0x0400);
|
ac97_reg_cached_write(dev, AC97_AD_MISC_CONTROL, 0x0400);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ad1981b_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
ad1981b_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("ad1981b_init\n"));
|
LOG(("ad1981b_init\n"));
|
||||||
if (dev->subsystem == 0x0e11005a
|
if (dev->subsystem == 0x0e11005a
|
||||||
@@ -853,7 +900,18 @@ void ad1981b_init(ac97_dev *dev)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void alc650_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
alc203_init(ac97_dev *dev)
|
||||||
|
{
|
||||||
|
LOG(("alc203_init\n"));
|
||||||
|
|
||||||
|
ac97_reg_update_bits(dev, AC97_ALC650_CLOCK_SOURCE, 0x400, 0x400);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
alc650_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("alc650_init\n"));
|
LOG(("alc650_init\n"));
|
||||||
|
|
||||||
@@ -870,7 +928,46 @@ void alc650_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, AC97_ALC650_CEN_LFE_VOLUME, 0x0808);
|
ac97_reg_cached_write(dev, AC97_ALC650_CEN_LFE_VOLUME, 0x0808);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stac9708_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
alc655_init(ac97_dev *dev)
|
||||||
|
{
|
||||||
|
uint16 val;
|
||||||
|
LOG(("alc655_init\n"));
|
||||||
|
|
||||||
|
ac97_reg_update_bits(dev, AC97_PAGING, 0xf, 0);
|
||||||
|
|
||||||
|
val = ac97_reg_cached_read(dev, AC97_ALC650_CLOCK_SOURCE);
|
||||||
|
// TODO update bits for specific devices
|
||||||
|
val &= ~0x1000;
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_CLOCK_SOURCE, val);
|
||||||
|
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_MULTI_CHAN_CTRL, 0x8000);
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_SURR_VOLUME, 0x808);
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_CEN_LFE_VOLUME, 0x808);
|
||||||
|
|
||||||
|
if (dev->codec_id == 0x414c4781)
|
||||||
|
ac97_reg_update_bits(dev, AC97_ALC650_MISC_CONTROL, 0x800, 0x800);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
alc850_init(ac97_dev *dev)
|
||||||
|
{
|
||||||
|
LOG(("alc850_init\n"));
|
||||||
|
|
||||||
|
ac97_reg_update_bits(dev, AC97_PAGING, 0xf, 0);
|
||||||
|
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_MULTI_CHAN_CTRL, 0x8000);
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_CLOCK_SOURCE, 0x20d2);
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_GPIO_SETUP, 0x8a90);
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_SURR_VOLUME, 0x808);
|
||||||
|
ac97_reg_cached_write(dev, AC97_ALC650_CEN_LFE_VOLUME, 0x808);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
stac9708_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("stac9708_init\n"));
|
LOG(("stac9708_init\n"));
|
||||||
/* ALSA initializes some registers that according to the
|
/* ALSA initializes some registers that according to the
|
||||||
@@ -884,7 +981,9 @@ void stac9708_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, 0x74, 0x0000);
|
ac97_reg_cached_write(dev, 0x74, 0x0000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stac9721_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
stac9721_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("stac9721_init\n"));
|
LOG(("stac9721_init\n"));
|
||||||
/* Set Analog Special to default (DAC/ADC -6dB disabled) */
|
/* Set Analog Special to default (DAC/ADC -6dB disabled) */
|
||||||
@@ -901,7 +1000,9 @@ void stac9721_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, 0x78, 0x0000);
|
ac97_reg_cached_write(dev, 0x78, 0x0000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stac9744_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
stac9744_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("stac9744_init\n"));
|
LOG(("stac9744_init\n"));
|
||||||
/* Set Analog Special to default (DAC/ADC -6dB disabled) */
|
/* Set Analog Special to default (DAC/ADC -6dB disabled) */
|
||||||
@@ -918,7 +1019,9 @@ void stac9744_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, 0x78, 0x0000);
|
ac97_reg_cached_write(dev, 0x78, 0x0000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void stac9756_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
stac9756_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("stac9756_init\n"));
|
LOG(("stac9756_init\n"));
|
||||||
/* Set Analog Special to default (AC97 all-mix, DAC/ADC -6dB disabled) */
|
/* Set Analog Special to default (AC97 all-mix, DAC/ADC -6dB disabled) */
|
||||||
@@ -935,7 +1038,9 @@ void stac9756_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, 0x78, 0x0000);
|
ac97_reg_cached_write(dev, 0x78, 0x0000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void tr28028_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
tr28028_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("tr28028_init\n"));
|
LOG(("tr28028_init\n"));
|
||||||
ac97_reg_cached_write(dev, AC97_POWERDOWN, 0x0300);
|
ac97_reg_cached_write(dev, AC97_POWERDOWN, 0x0300);
|
||||||
@@ -944,7 +1049,9 @@ void tr28028_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, AC97_SPDIF_CONTROL, 0x0000);
|
ac97_reg_cached_write(dev, AC97_SPDIF_CONTROL, 0x0000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wm9701_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
wm9701_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("wm9701_init\n"));
|
LOG(("wm9701_init\n"));
|
||||||
/* ALSA writes some of these registers, but the codec
|
/* ALSA writes some of these registers, but the codec
|
||||||
@@ -956,7 +1063,9 @@ void wm9701_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, 0x5a, 0x0200);
|
ac97_reg_cached_write(dev, 0x5a, 0x0200);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wm9703_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
wm9703_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("wm9703_init\n"));
|
LOG(("wm9703_init\n"));
|
||||||
/* Set front mixer value to unmuted */
|
/* Set front mixer value to unmuted */
|
||||||
@@ -965,7 +1074,9 @@ void wm9703_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, AC97_GENERAL_PURPOSE, 0x8000);
|
ac97_reg_cached_write(dev, AC97_GENERAL_PURPOSE, 0x8000);
|
||||||
}
|
}
|
||||||
|
|
||||||
void wm9704_init(ac97_dev *dev)
|
|
||||||
|
void
|
||||||
|
wm9704_init(ac97_dev *dev)
|
||||||
{
|
{
|
||||||
LOG(("wm9704_init\n"));
|
LOG(("wm9704_init\n"));
|
||||||
/* Set read DAC value to unmuted */
|
/* Set read DAC value to unmuted */
|
||||||
@@ -978,6 +1089,7 @@ void wm9704_init(ac97_dev *dev)
|
|||||||
ac97_reg_cached_write(dev, 0x5a, 0x0200);
|
ac97_reg_cached_write(dev, 0x5a, 0x0200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const ac97_source_info source_info[] = {
|
const ac97_source_info source_info[] = {
|
||||||
{ "Recording", B_MIX_GAIN|B_MIX_MUTE|B_MIX_STEREO|B_MIX_RECORDMUX, 100, AC97_RECORD_GAIN, 0x8000, 4, 0, 1, 0, 0.0, 22.5, 1.5 },
|
{ "Recording", B_MIX_GAIN|B_MIX_MUTE|B_MIX_STEREO|B_MIX_RECORDMUX, 100, AC97_RECORD_GAIN, 0x8000, 4, 0, 1, 0, 0.0, 22.5, 1.5 },
|
||||||
{ "Master", B_MIX_GAIN|B_MIX_MUTE|B_MIX_STEREO, 101, AC97_MASTER_VOLUME, 0x8000, 5, 0, 1, 1,-46.5, 0.0, 1.5 },
|
{ "Master", B_MIX_GAIN|B_MIX_MUTE|B_MIX_STEREO, 101, AC97_MASTER_VOLUME, 0x8000, 5, 0, 1, 1,-46.5, 0.0, 1.5 },
|
||||||
|
|||||||
Reference in New Issue
Block a user