ES1371 improvements, including codec select
This commit is contained in:
@@ -26,19 +26,12 @@
|
||||
#include <86box/snd_ac97.h>
|
||||
|
||||
|
||||
enum {
|
||||
AC97_CODEC_AD1881,
|
||||
AC97_CODEC_ALC100,
|
||||
AC97_CODEC_CS4297,
|
||||
AC97_CODEC_CS4297A,
|
||||
AC97_CODEC_WM9701A
|
||||
};
|
||||
|
||||
static const struct {
|
||||
const uint32_t vendor_id, max_rate, misc_flags; /* definitions for misc_flags in snd_ac97.h */
|
||||
const uint16_t reset_flags, extid_flags, /* definitions in snd_ac97.h */
|
||||
powerdown_mask; /* bits [7:0] => register 26 bits [15:8]; bits [11:8] => register 2A bits [14:11] */
|
||||
const ac97_vendor_reg_t *vendor_regs; /* bits [11:8] of index are the page number if applicable (registers [60:6F]) */
|
||||
const device_t *device;
|
||||
} ac97_codecs[] = {
|
||||
[AC97_CODEC_AD1881] = {
|
||||
.vendor_id = AC97_VENDOR_ID('A', 'D', 'S', 0x40),
|
||||
@@ -46,7 +39,8 @@ static const struct {
|
||||
.misc_flags = AC97_MASTER_6B | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_POP | AC97_MS | AC97_LPBK,
|
||||
.reset_flags = (1 << AC97_3D_SHIFT), /* datasheet contradicts itself on AC97_HPOUT */
|
||||
.extid_flags = AC97_VRA,
|
||||
.powerdown_mask = 0x0bf
|
||||
.powerdown_mask = 0x0bf,
|
||||
.device = &ad1881_device
|
||||
},
|
||||
[AC97_CODEC_ALC100] = {
|
||||
.vendor_id = AC97_VENDOR_ID('A', 'L', 'C', 0x20),
|
||||
@@ -54,7 +48,8 @@ static const struct {
|
||||
.misc_flags = AC97_AUXOUT | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_POP | AC97_MS | AC97_LPBK,
|
||||
.reset_flags = (22 << AC97_3D_SHIFT),
|
||||
.extid_flags = AC97_AMAP,
|
||||
.powerdown_mask = 0x0bf
|
||||
.powerdown_mask = 0x0bf,
|
||||
.device = &alc100_device
|
||||
},
|
||||
[AC97_CODEC_CS4297] = {
|
||||
.vendor_id = AC97_VENDOR_ID('C', 'R', 'Y', 0x03),
|
||||
@@ -63,7 +58,8 @@ static const struct {
|
||||
.reset_flags = AC97_HPOUT | AC97_DAC_18B | AC97_ADC_18B,
|
||||
.extid_flags = 0,
|
||||
.powerdown_mask = 0x07f,
|
||||
.vendor_regs = (const ac97_vendor_reg_t[]) {{0x05a, 0x0301, 0x0000}, {0}}
|
||||
.vendor_regs = (const ac97_vendor_reg_t[]) {{0x5a, 0x0301, 0x0000}, {0}},
|
||||
.device = &cs4297_device
|
||||
},
|
||||
[AC97_CODEC_CS4297A] = {
|
||||
.vendor_id = AC97_VENDOR_ID('C', 'R', 'Y', 0x11),
|
||||
@@ -72,7 +68,28 @@ static const struct {
|
||||
.reset_flags = AC97_HPOUT | AC97_DAC_20B | AC97_ADC_18B | (6 << AC97_3D_SHIFT),
|
||||
.extid_flags = AC97_AMAP,
|
||||
.powerdown_mask = 0x0ff,
|
||||
.vendor_regs = (const ac97_vendor_reg_t[]) {{0x05e, 0x0000, 0x01b0}, {0x060, 0x0023, 0x0001}, {0x068, 0x0000, 0xdfff}, {0}}
|
||||
.vendor_regs = (const ac97_vendor_reg_t[]) {{0x5e, 0x0000, 0x01b0}, {0x60, 0x0023, 0x0001}, {0x68, 0x0000, 0xdfff}, {0}},
|
||||
.device = &cs4297a_device
|
||||
},
|
||||
[AC97_CODEC_STAC9708] = {
|
||||
.vendor_id = AC97_VENDOR_ID(0x83, 0x84, 0x76, 0x08),
|
||||
.max_rate = 48000,
|
||||
.misc_flags = AC97_AUXOUT | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_MS | AC97_LPBK,
|
||||
.reset_flags = (26 << AC97_3D_SHIFT) | AC97_DAC_18B | AC97_ADC_18B,
|
||||
.extid_flags = AC97_SDAC,
|
||||
.powerdown_mask = 0x2ff,
|
||||
.vendor_regs = (const ac97_vendor_reg_t []) {{0x6c, 0x0000, 0x0003}, {0x74, 0x0000, 0x0003}, {0}},
|
||||
.device = &stac9708_device
|
||||
},
|
||||
[AC97_CODEC_STAC9721] = {
|
||||
.vendor_id = AC97_VENDOR_ID(0x83, 0x84, 0x76, 0x09),
|
||||
.max_rate = 48000,
|
||||
.misc_flags = AC97_AUXOUT | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_MS | AC97_LPBK,
|
||||
.reset_flags = (26 << AC97_3D_SHIFT) | AC97_DAC_18B | AC97_ADC_18B,
|
||||
.extid_flags = AC97_AMAP,
|
||||
.powerdown_mask = 0x0ff,
|
||||
.vendor_regs = (const ac97_vendor_reg_t []) {{0x6c, 0x0000, 0x0000}, {0x6e, 0x0000, 0x0003}, {0x70, 0x0000, 0xffff}, {0x72, 0x0000, 0x0006}, {0x74, 0x0000, 0x0003}, {0x76, 0x0000, 0xffff}, {0x78, 0x0000, 0x3802}, {0}},
|
||||
.device = &stac9721_device
|
||||
},
|
||||
[AC97_CODEC_WM9701A] = {
|
||||
.vendor_id = AC97_VENDOR_ID('W', 'M', 'L', 0x00),
|
||||
@@ -80,7 +97,8 @@ static const struct {
|
||||
.misc_flags = AC97_AUXOUT | AC97_MONOOUT | AC97_PCBEEP | AC97_PHONE | AC97_VIDEO | AC97_AUXIN | AC97_MS | AC97_LPBK,
|
||||
.reset_flags = AC97_DAC_18B | AC97_ADC_18B,
|
||||
.extid_flags = 0,
|
||||
.powerdown_mask = 0x03f
|
||||
.powerdown_mask = 0x03f,
|
||||
.device = &wm9701a_device
|
||||
}
|
||||
};
|
||||
|
||||
@@ -257,6 +275,13 @@ line_gain: val &= 0x9f1f;
|
||||
val &= 0x0003;
|
||||
break;
|
||||
|
||||
case 26: /* SigmaTel */
|
||||
i = 0x0003;
|
||||
if (dev->extid_flags & AC97_SDAC)
|
||||
i |= 0x000c;
|
||||
val &= i;
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
@@ -433,6 +458,9 @@ ac97_codec_reset(void *priv)
|
||||
dev->regs[0x14 >> 1] = AC97_MUTE | 0x0808;
|
||||
if (dev->misc_flags & AC97_AUXIN)
|
||||
dev->regs[0x14 >> 1] = AC97_MUTE | 0x0808;
|
||||
dev->regs[0x1c] = AC97_MUTE; /* record gain */
|
||||
if (dev->reset_flags & AC97_MICPCM)
|
||||
dev->regs[0x1e] = AC97_MUTE; /* mic record gain */
|
||||
if (dev->misc_flags & AC97_LDAC)
|
||||
dev->regs[0x36 >> 1] = AC97_MUTE_L;
|
||||
if (dev->misc_flags & AC97_CDAC)
|
||||
@@ -594,6 +622,16 @@ ac97_codec_close(void *priv)
|
||||
}
|
||||
|
||||
|
||||
const device_t *
|
||||
ac97_codec_get(int model)
|
||||
{
|
||||
if ((model >= 0) && (model < (sizeof(ac97_codecs) / sizeof(ac97_codecs[0]))))
|
||||
return ac97_codecs[model].device;
|
||||
else
|
||||
return &cs4297a_device; /* fallback */
|
||||
}
|
||||
|
||||
|
||||
const device_t ad1881_device =
|
||||
{
|
||||
"Analog Devices AD1881",
|
||||
@@ -642,6 +680,30 @@ const device_t cs4297a_device =
|
||||
NULL
|
||||
};
|
||||
|
||||
const device_t stac9708_device =
|
||||
{
|
||||
"SigmaTel STAC9708",
|
||||
DEVICE_AC97,
|
||||
AC97_CODEC_STAC9708,
|
||||
ac97_codec_init, ac97_codec_close, ac97_codec_reset,
|
||||
{ NULL },
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
const device_t stac9721_device =
|
||||
{
|
||||
"SigmaTel STAC9721",
|
||||
DEVICE_AC97,
|
||||
AC97_CODEC_STAC9721,
|
||||
ac97_codec_init, ac97_codec_close, ac97_codec_reset,
|
||||
{ NULL },
|
||||
NULL,
|
||||
NULL,
|
||||
NULL
|
||||
};
|
||||
|
||||
const device_t wm9701a_device =
|
||||
{
|
||||
"Wolfson WM9701A",
|
||||
|
||||
Reference in New Issue
Block a user