Commit 4ad193b4 authored by Linus Torvalds's avatar Linus Torvalds

Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6

* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound-2.6:
  ALSA: wm8990: Implement speaker volume PGA
  ALSA: wm8990: Fix routing of left DAC to speaker mixer
  ALSA: virtuoso: add Xonar D1 support
parents cebd7709 97bb8129
...@@ -1144,8 +1144,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -1144,8 +1144,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
This module supports autoprobe and multiple cards. This module supports autoprobe and multiple cards.
Power management is _not_ supported.
Module snd-ice1712 Module snd-ice1712
------------------ ------------------
...@@ -1628,8 +1626,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -1628,8 +1626,6 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
This module supports autoprobe and multiple cards. This module supports autoprobe and multiple cards.
Power management is _not_ supported.
Module snd-pcsp Module snd-pcsp
----------------- -----------------
...@@ -2081,13 +2077,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed. ...@@ -2081,13 +2077,11 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
Module snd-virtuoso Module snd-virtuoso
------------------- -------------------
Module for sound cards based on the Asus AV200 chip, i.e., Module for sound cards based on the Asus AV100/AV200 chips,
Xonar D2 and Xonar D2X. i.e., Xonar D1, DX, D2 and D2X.
This module supports autoprobe and multiple cards. This module supports autoprobe and multiple cards.
Power management is _not_ supported.
Module snd-vx222 Module snd-vx222
---------------- ----------------
......
...@@ -845,7 +845,7 @@ config SND_VIRTUOSO ...@@ -845,7 +845,7 @@ config SND_VIRTUOSO
select SND_OXYGEN_LIB select SND_OXYGEN_LIB
help help
Say Y here to include support for sound cards based on the Say Y here to include support for sound cards based on the
Asus AV100/AV200 chips, i.e., Xonar D2, DX and D2X. Asus AV100/AV200 chips, i.e., Xonar D1, DX, D2 and D2X.
To compile this driver as a module, choose M here: the module To compile this driver as a module, choose M here: the module
will be called snd-virtuoso. will be called snd-virtuoso.
......
...@@ -36,15 +36,15 @@ ...@@ -36,15 +36,15 @@
*/ */
/* /*
* Xonar DX * Xonar D1/DX
* -------- * -----------
* *
* CMI8788: * CMI8788:
* *
* I²C <-> CS4398 (front) * I²C <-> CS4398 (front)
* <-> CS4362A (surround, center/LFE, back) * <-> CS4362A (surround, center/LFE, back)
* *
* GPI 0 <- external power present * GPI 0 <- external power present (DX only)
* *
* GPIO 0 -> enable output to speakers * GPIO 0 -> enable output to speakers
* GPIO 1 -> enable front panel I/O * GPIO 1 -> enable front panel I/O
...@@ -96,6 +96,7 @@ MODULE_PARM_DESC(enable, "enable card"); ...@@ -96,6 +96,7 @@ MODULE_PARM_DESC(enable, "enable card");
enum { enum {
MODEL_D2, MODEL_D2,
MODEL_D2X, MODEL_D2X,
MODEL_D1,
MODEL_DX, MODEL_DX,
}; };
...@@ -103,6 +104,7 @@ static struct pci_device_id xonar_ids[] __devinitdata = { ...@@ -103,6 +104,7 @@ static struct pci_device_id xonar_ids[] __devinitdata = {
{ OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 }, { OXYGEN_PCI_SUBID(0x1043, 0x8269), .driver_data = MODEL_D2 },
{ OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX }, { OXYGEN_PCI_SUBID(0x1043, 0x8275), .driver_data = MODEL_DX },
{ OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X }, { OXYGEN_PCI_SUBID(0x1043, 0x82b7), .driver_data = MODEL_D2X },
{ OXYGEN_PCI_SUBID(0x1043, 0x834f), .driver_data = MODEL_D1 },
{ } { }
}; };
MODULE_DEVICE_TABLE(pci, xonar_ids); MODULE_DEVICE_TABLE(pci, xonar_ids);
...@@ -313,15 +315,12 @@ static void cs43xx_init(struct oxygen *chip) ...@@ -313,15 +315,12 @@ static void cs43xx_init(struct oxygen *chip)
cs4362a_write(chip, 0x01, CS4362A_CPEN); cs4362a_write(chip, 0x01, CS4362A_CPEN);
} }
static void xonar_dx_init(struct oxygen *chip) static void xonar_d1_init(struct oxygen *chip)
{ {
struct xonar_data *data = chip->model_data; struct xonar_data *data = chip->model_data;
data->anti_pop_delay = 800; data->anti_pop_delay = 800;
data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE; data->output_enable_bit = GPIO_DX_OUTPUT_ENABLE;
data->ext_power_reg = OXYGEN_GPI_DATA;
data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
data->ext_power_bit = GPI_DX_EXT_POWER;
data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST; data->cs4398_fm = CS4398_FM_SINGLE | CS4398_DEM_NONE | CS4398_DIF_LJUST;
data->cs4362a_fm = CS4362A_FM_SINGLE | data->cs4362a_fm = CS4362A_FM_SINGLE |
CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L; CS4362A_ATAPI_B_R | CS4362A_ATAPI_A_L;
...@@ -345,6 +344,16 @@ static void xonar_dx_init(struct oxygen *chip) ...@@ -345,6 +344,16 @@ static void xonar_dx_init(struct oxygen *chip)
snd_component_add(chip->card, "CS5361"); snd_component_add(chip->card, "CS5361");
} }
static void xonar_dx_init(struct oxygen *chip)
{
struct xonar_data *data = chip->model_data;
data->ext_power_reg = OXYGEN_GPI_DATA;
data->ext_power_int_reg = OXYGEN_GPI_INTERRUPT_MASK;
data->ext_power_bit = GPI_DX_EXT_POWER;
xonar_d1_init(chip);
}
static void xonar_cleanup(struct oxygen *chip) static void xonar_cleanup(struct oxygen *chip)
{ {
struct xonar_data *data = chip->model_data; struct xonar_data *data = chip->model_data;
...@@ -352,7 +361,7 @@ static void xonar_cleanup(struct oxygen *chip) ...@@ -352,7 +361,7 @@ static void xonar_cleanup(struct oxygen *chip)
oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit); oxygen_clear_bits16(chip, OXYGEN_GPIO_DATA, data->output_enable_bit);
} }
static void xonar_dx_cleanup(struct oxygen *chip) static void xonar_d1_cleanup(struct oxygen *chip)
{ {
xonar_cleanup(chip); xonar_cleanup(chip);
cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN); cs4362a_write(chip, 0x01, CS4362A_PDN | CS4362A_CPEN);
...@@ -365,7 +374,7 @@ static void xonar_d2_resume(struct oxygen *chip) ...@@ -365,7 +374,7 @@ static void xonar_d2_resume(struct oxygen *chip)
xonar_enable_output(chip); xonar_enable_output(chip);
} }
static void xonar_dx_resume(struct oxygen *chip) static void xonar_d1_resume(struct oxygen *chip)
{ {
cs43xx_init(chip); cs43xx_init(chip);
xonar_enable_output(chip); xonar_enable_output(chip);
...@@ -513,7 +522,7 @@ static const struct snd_kcontrol_new front_panel_switch = { ...@@ -513,7 +522,7 @@ static const struct snd_kcontrol_new front_panel_switch = {
.put = front_panel_put, .put = front_panel_put,
}; };
static void xonar_dx_ac97_switch(struct oxygen *chip, static void xonar_d1_ac97_switch(struct oxygen *chip,
unsigned int reg, unsigned int mute) unsigned int reg, unsigned int mute)
{ {
if (reg == AC97_LINE) { if (reg == AC97_LINE) {
...@@ -536,7 +545,7 @@ static int xonar_d2_control_filter(struct snd_kcontrol_new *template) ...@@ -536,7 +545,7 @@ static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
return 0; return 0;
} }
static int xonar_dx_control_filter(struct snd_kcontrol_new *template) static int xonar_d1_control_filter(struct snd_kcontrol_new *template)
{ {
if (!strncmp(template->name, "CD Capture ", 11)) if (!strncmp(template->name, "CD Capture ", 11))
return 1; /* no CD input */ return 1; /* no CD input */
...@@ -548,7 +557,7 @@ static int xonar_mixer_init(struct oxygen *chip) ...@@ -548,7 +557,7 @@ static int xonar_mixer_init(struct oxygen *chip)
return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip)); return snd_ctl_add(chip->card, snd_ctl_new1(&alt_switch, chip));
} }
static int xonar_dx_mixer_init(struct oxygen *chip) static int xonar_d1_mixer_init(struct oxygen *chip)
{ {
return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip)); return snd_ctl_add(chip->card, snd_ctl_new1(&front_panel_switch, chip));
} }
...@@ -615,23 +624,51 @@ static const struct oxygen_model xonar_models[] = { ...@@ -615,23 +624,51 @@ static const struct oxygen_model xonar_models[] = {
.dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST, .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
.adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST, .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
}, },
[MODEL_D1] = {
.shortname = "Xonar D1",
.longname = "Asus Virtuoso 100",
.chip = "AV200",
.owner = THIS_MODULE,
.init = xonar_d1_init,
.control_filter = xonar_d1_control_filter,
.mixer_init = xonar_d1_mixer_init,
.cleanup = xonar_d1_cleanup,
.suspend = xonar_d1_cleanup,
.resume = xonar_d1_resume,
.set_dac_params = set_cs43xx_params,
.set_adc_params = set_cs53x1_params,
.update_dac_volume = update_cs43xx_volume,
.update_dac_mute = update_cs43xx_mute,
.ac97_switch = xonar_d1_ac97_switch,
.dac_tlv = cs4362a_db_scale,
.model_data_size = sizeof(struct xonar_data),
.pcm_dev_cfg = PLAYBACK_0_TO_I2S |
PLAYBACK_1_TO_SPDIF |
CAPTURE_0_FROM_I2S_2,
.dac_channels = 8,
.dac_volume_min = 0,
.dac_volume_max = 127,
.function_flags = OXYGEN_FUNCTION_2WIRE,
.dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
.adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
},
[MODEL_DX] = { [MODEL_DX] = {
.shortname = "Xonar DX", .shortname = "Xonar DX",
.longname = "Asus Virtuoso 100", .longname = "Asus Virtuoso 100",
.chip = "AV200", .chip = "AV200",
.owner = THIS_MODULE, .owner = THIS_MODULE,
.init = xonar_dx_init, .init = xonar_dx_init,
.control_filter = xonar_dx_control_filter, .control_filter = xonar_d1_control_filter,
.mixer_init = xonar_dx_mixer_init, .mixer_init = xonar_d1_mixer_init,
.cleanup = xonar_dx_cleanup, .cleanup = xonar_d1_cleanup,
.suspend = xonar_dx_cleanup, .suspend = xonar_d1_cleanup,
.resume = xonar_dx_resume, .resume = xonar_d1_resume,
.set_dac_params = set_cs43xx_params, .set_dac_params = set_cs43xx_params,
.set_adc_params = set_cs53x1_params, .set_adc_params = set_cs53x1_params,
.update_dac_volume = update_cs43xx_volume, .update_dac_volume = update_cs43xx_volume,
.update_dac_mute = update_cs43xx_mute, .update_dac_mute = update_cs43xx_mute,
.gpio_changed = xonar_gpio_changed, .gpio_changed = xonar_gpio_changed,
.ac97_switch = xonar_dx_ac97_switch, .ac97_switch = xonar_d1_ac97_switch,
.dac_tlv = cs4362a_db_scale, .dac_tlv = cs4362a_db_scale,
.model_data_size = sizeof(struct xonar_data), .model_data_size = sizeof(struct xonar_data),
.pcm_dev_cfg = PLAYBACK_0_TO_I2S | .pcm_dev_cfg = PLAYBACK_0_TO_I2S |
......
...@@ -82,7 +82,7 @@ static const u16 wm8990_reg[] = { ...@@ -82,7 +82,7 @@ static const u16 wm8990_reg[] = {
0x0003, /* R35 - ClassD1 */ 0x0003, /* R35 - ClassD1 */
0x0000, /* R36 */ 0x0000, /* R36 */
0x0100, /* R37 - ClassD3 */ 0x0100, /* R37 - ClassD3 */
0x0000, /* R38 */ 0x0079, /* R38 - ClassD4 */
0x0000, /* R39 - Input Mixer1 */ 0x0000, /* R39 - Input Mixer1 */
0x0000, /* R40 - Input Mixer2 */ 0x0000, /* R40 - Input Mixer2 */
0x0000, /* R41 - Input Mixer3 */ 0x0000, /* R41 - Input Mixer3 */
...@@ -311,11 +311,15 @@ SOC_SINGLE("Speaker Mode Switch", WM8990_CLASSD1, ...@@ -311,11 +311,15 @@ SOC_SINGLE("Speaker Mode Switch", WM8990_CLASSD1,
WM8990_CDMODE_BIT, 1, 0), WM8990_CDMODE_BIT, 1, 0),
SOC_SINGLE("Speaker Output Attenuation Volume", WM8990_SPEAKER_VOLUME, SOC_SINGLE("Speaker Output Attenuation Volume", WM8990_SPEAKER_VOLUME,
WM8990_SPKVOL_SHIFT, WM8990_SPKVOL_MASK, 0), WM8990_SPKATTN_SHIFT, WM8990_SPKATTN_MASK, 0),
SOC_SINGLE("Speaker DC Boost Volume", WM8990_CLASSD3, SOC_SINGLE("Speaker DC Boost Volume", WM8990_CLASSD3,
WM8990_DCGAIN_SHIFT, WM8990_DCGAIN_MASK, 0), WM8990_DCGAIN_SHIFT, WM8990_DCGAIN_MASK, 0),
SOC_SINGLE("Speaker AC Boost Volume", WM8990_CLASSD3, SOC_SINGLE("Speaker AC Boost Volume", WM8990_CLASSD3,
WM8990_ACGAIN_SHIFT, WM8990_ACGAIN_MASK, 0), WM8990_ACGAIN_SHIFT, WM8990_ACGAIN_MASK, 0),
SOC_SINGLE_TLV("Speaker Volume", WM8990_CLASSD4,
WM8990_SPKVOL_SHIFT, WM8990_SPKVOL_MASK, 0, out_pga_tlv),
SOC_SINGLE("Speaker ZC Switch", WM8990_CLASSD4,
WM8990_SPKZC_SHIFT, WM8990_SPKZC_MASK, 0),
SOC_WM899X_OUTPGA_SINGLE_R_TLV("Left DAC Digital Volume", SOC_WM899X_OUTPGA_SINGLE_R_TLV("Left DAC Digital Volume",
WM8990_LEFT_DAC_DIGITAL_VOLUME, WM8990_LEFT_DAC_DIGITAL_VOLUME,
...@@ -920,7 +924,7 @@ static const struct snd_soc_dapm_route audio_map[] = { ...@@ -920,7 +924,7 @@ static const struct snd_soc_dapm_route audio_map[] = {
{"SPKMIX", "SPKMIX Left Mixer PGA Switch", "LOPGA"}, {"SPKMIX", "SPKMIX Left Mixer PGA Switch", "LOPGA"},
{"SPKMIX", "SPKMIX Right Mixer PGA Switch", "ROPGA"}, {"SPKMIX", "SPKMIX Right Mixer PGA Switch", "ROPGA"},
{"SPKMIX", "SPKMIX Right DAC Switch", "Right DAC"}, {"SPKMIX", "SPKMIX Right DAC Switch", "Right DAC"},
{"SPKMIX", "SPKMIX Left DAC Switch", "Right DAC"}, {"SPKMIX", "SPKMIX Left DAC Switch", "Left DAC"},
/* LONMIX */ /* LONMIX */
{"LONMIX", "LONMIX Left Mixer PGA Switch", "LOPGA"}, {"LONMIX", "LONMIX Left Mixer PGA Switch", "LOPGA"},
......
...@@ -54,6 +54,7 @@ ...@@ -54,6 +54,7 @@
#define WM8990_SPEAKER_VOLUME 0x22 #define WM8990_SPEAKER_VOLUME 0x22
#define WM8990_CLASSD1 0x23 #define WM8990_CLASSD1 0x23
#define WM8990_CLASSD3 0x25 #define WM8990_CLASSD3 0x25
#define WM8990_CLASSD4 0x26
#define WM8990_INPUT_MIXER1 0x27 #define WM8990_INPUT_MIXER1 0x27
#define WM8990_INPUT_MIXER2 0x28 #define WM8990_INPUT_MIXER2 0x28
#define WM8990_INPUT_MIXER3 0x29 #define WM8990_INPUT_MIXER3 0x29
...@@ -528,8 +529,8 @@ ...@@ -528,8 +529,8 @@
/* /*
* R34 (0x22) - Speaker Volume * R34 (0x22) - Speaker Volume
*/ */
#define WM8990_SPKVOL_MASK 0x0003 /* SPKVOL - [1:0] */ #define WM8990_SPKATTN_MASK 0x0003 /* SPKATTN - [1:0] */
#define WM8990_SPKVOL_SHIFT 0 #define WM8990_SPKATTN_SHIFT 0
/* /*
* R35 (0x23) - ClassD1 * R35 (0x23) - ClassD1
...@@ -544,6 +545,15 @@ ...@@ -544,6 +545,15 @@
#define WM8990_DCGAIN_SHIFT 3 #define WM8990_DCGAIN_SHIFT 3
#define WM8990_ACGAIN_MASK 0x0007 /* ACGAIN - [2:0] */ #define WM8990_ACGAIN_MASK 0x0007 /* ACGAIN - [2:0] */
#define WM8990_ACGAIN_SHIFT 0 #define WM8990_ACGAIN_SHIFT 0
/*
* R38 (0x26) - ClassD4
*/
#define WM8990_SPKZC_MASK 0x0001 /* SPKZC */
#define WM8990_SPKZC_SHIFT 7 /* SPKZC */
#define WM8990_SPKVOL_MASK 0x007F /* SPKVOL - [6:0] */
#define WM8990_SPKVOL_SHIFT 0 /* SPKVOL - [6:0] */
/* /*
* R39 (0x27) - Input Mixer1 * R39 (0x27) - Input Mixer1
*/ */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment