forked from Minki/linux
Merge branch 'fix/hda' into topic/hda
This commit is contained in:
commit
1aa924e21e
@ -141,6 +141,7 @@ int snd_jack_new(struct snd_card *card, const char *id, int type,
|
||||
|
||||
fail_input:
|
||||
input_free_device(jack->input_dev);
|
||||
kfree(jack->id);
|
||||
kfree(jack);
|
||||
return err;
|
||||
}
|
||||
|
@ -1252,11 +1252,19 @@ static void vortex_adbdma_resetup(vortex_t *vortex, int adbdma) {
|
||||
static int inline vortex_adbdma_getlinearpos(vortex_t * vortex, int adbdma)
|
||||
{
|
||||
stream_t *dma = &vortex->dma_adb[adbdma];
|
||||
int temp;
|
||||
int temp, page, delta;
|
||||
|
||||
temp = hwread(vortex->mmio, VORTEX_ADBDMA_STAT + (adbdma << 2));
|
||||
temp = (dma->period_virt * dma->period_bytes) + (temp & (dma->period_bytes - 1));
|
||||
return temp;
|
||||
page = (temp & ADB_SUBBUF_MASK) >> ADB_SUBBUF_SHIFT;
|
||||
if (dma->nr_periods >= 4)
|
||||
delta = (page - dma->period_real) & 3;
|
||||
else {
|
||||
delta = (page - dma->period_real);
|
||||
if (delta < 0)
|
||||
delta += dma->nr_periods;
|
||||
}
|
||||
return (dma->period_virt + delta) * dma->period_bytes
|
||||
+ (temp & (dma->period_bytes - 1));
|
||||
}
|
||||
|
||||
static void vortex_adbdma_startfifo(vortex_t * vortex, int adbdma)
|
||||
|
@ -2308,6 +2308,7 @@ static struct snd_pci_quirk position_fix_list[] __devinitdata = {
|
||||
SND_PCI_QUIRK(0x1043, 0x813d, "ASUS P5AD2", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1043, 0x81b3, "ASUS", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1043, 0x81e7, "ASUS M2V", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1043, 0x8410, "ASUS", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x104d, 0x9069, "Sony VPCS11V9E", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1106, 0x3288, "ASUS M2V-MX SE", POS_FIX_LPIB),
|
||||
SND_PCI_QUIRK(0x1179, 0xff10, "Toshiba A100-259", POS_FIX_LPIB),
|
||||
|
@ -3114,6 +3114,8 @@ static struct snd_pci_quirk cxt5066_cfg_tbl[] = {
|
||||
SND_PCI_QUIRK(0x1028, 0x0401, "Dell Vostro 1014", CXT5066_DELL_VOSTRO),
|
||||
SND_PCI_QUIRK(0x1028, 0x0402, "Dell Vostro", CXT5066_DELL_VOSTRO),
|
||||
SND_PCI_QUIRK(0x1028, 0x0408, "Dell Inspiron One 19T", CXT5066_IDEAPAD),
|
||||
SND_PCI_QUIRK(0x1028, 0x050f, "Dell Inspiron", CXT5066_IDEAPAD),
|
||||
SND_PCI_QUIRK(0x1028, 0x0510, "Dell Vostro", CXT5066_IDEAPAD),
|
||||
SND_PCI_QUIRK(0x103c, 0x360b, "HP G60", CXT5066_HP_LAPTOP),
|
||||
SND_PCI_QUIRK(0x1043, 0x13f3, "Asus A52J", CXT5066_ASUS),
|
||||
SND_PCI_QUIRK(0x1043, 0x1643, "Asus K52JU", CXT5066_ASUS),
|
||||
@ -3410,7 +3412,7 @@ static void cx_auto_parse_output(struct hda_codec *codec)
|
||||
}
|
||||
}
|
||||
spec->multiout.dac_nids = spec->private_dac_nids;
|
||||
spec->multiout.max_channels = nums * 2;
|
||||
spec->multiout.max_channels = spec->multiout.num_dacs * 2;
|
||||
|
||||
if (cfg->hp_outs > 0)
|
||||
spec->auto_mute = 1;
|
||||
@ -3729,9 +3731,9 @@ static int cx_auto_init(struct hda_codec *codec)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
|
||||
static int cx_auto_add_volume_idx(struct hda_codec *codec, const char *basename,
|
||||
const char *dir, int cidx,
|
||||
hda_nid_t nid, int hda_dir)
|
||||
hda_nid_t nid, int hda_dir, int amp_idx)
|
||||
{
|
||||
static char name[32];
|
||||
static struct snd_kcontrol_new knew[] = {
|
||||
@ -3743,7 +3745,8 @@ static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
struct snd_kcontrol *kctl;
|
||||
knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, 0, hda_dir);
|
||||
knew[i].private_value = HDA_COMPOSE_AMP_VAL(nid, 3, amp_idx,
|
||||
hda_dir);
|
||||
knew[i].subdevice = HDA_SUBDEV_AMP_FLAG;
|
||||
knew[i].index = cidx;
|
||||
snprintf(name, sizeof(name), "%s%s %s", basename, dir, sfx[i]);
|
||||
@ -3759,6 +3762,9 @@ static int cx_auto_add_volume(struct hda_codec *codec, const char *basename,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#define cx_auto_add_volume(codec, str, dir, cidx, nid, hda_dir) \
|
||||
cx_auto_add_volume_idx(codec, str, dir, cidx, nid, hda_dir, 0)
|
||||
|
||||
#define cx_auto_add_pb_volume(codec, nid, str, idx) \
|
||||
cx_auto_add_volume(codec, str, " Playback", idx, nid, HDA_OUTPUT)
|
||||
|
||||
@ -3808,29 +3814,60 @@ static int cx_auto_build_input_controls(struct hda_codec *codec)
|
||||
struct conexant_spec *spec = codec->spec;
|
||||
struct auto_pin_cfg *cfg = &spec->autocfg;
|
||||
static const char *prev_label;
|
||||
int i, err, cidx;
|
||||
int i, err, cidx, conn_len;
|
||||
hda_nid_t conn[HDA_MAX_CONNECTIONS];
|
||||
|
||||
int multi_adc_volume = 0; /* If the ADC nid has several input volumes */
|
||||
int adc_nid = spec->adc_nids[0];
|
||||
|
||||
conn_len = snd_hda_get_connections(codec, adc_nid, conn,
|
||||
HDA_MAX_CONNECTIONS);
|
||||
if (conn_len < 0)
|
||||
return conn_len;
|
||||
|
||||
multi_adc_volume = cfg->num_inputs > 1 && conn_len > 1;
|
||||
if (!multi_adc_volume) {
|
||||
err = cx_auto_add_volume(codec, "Capture", "", 0, adc_nid,
|
||||
HDA_INPUT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
err = cx_auto_add_volume(codec, "Capture", "", 0, spec->adc_nids[0],
|
||||
HDA_INPUT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
prev_label = NULL;
|
||||
cidx = 0;
|
||||
for (i = 0; i < cfg->num_inputs; i++) {
|
||||
hda_nid_t nid = cfg->inputs[i].pin;
|
||||
const char *label;
|
||||
if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP))
|
||||
int j;
|
||||
int pin_amp = get_wcaps(codec, nid) & AC_WCAP_IN_AMP;
|
||||
if (!pin_amp && !multi_adc_volume)
|
||||
continue;
|
||||
|
||||
label = hda_get_autocfg_input_label(codec, cfg, i);
|
||||
if (label == prev_label)
|
||||
cidx++;
|
||||
else
|
||||
cidx = 0;
|
||||
prev_label = label;
|
||||
err = cx_auto_add_volume(codec, label, " Capture", cidx,
|
||||
nid, HDA_INPUT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
if (pin_amp) {
|
||||
err = cx_auto_add_volume(codec, label, " Boost", cidx,
|
||||
nid, HDA_INPUT);
|
||||
if (err < 0)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (!multi_adc_volume)
|
||||
continue;
|
||||
for (j = 0; j < conn_len; j++) {
|
||||
if (conn[j] == nid) {
|
||||
err = cx_auto_add_volume_idx(codec, label,
|
||||
" Capture", cidx, adc_nid, HDA_INPUT, j);
|
||||
if (err < 0)
|
||||
return err;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -3902,6 +3939,8 @@ static struct hda_codec_preset snd_hda_preset_conexant[] = {
|
||||
.patch = patch_cxt5066 },
|
||||
{ .id = 0x14f15069, .name = "CX20585",
|
||||
.patch = patch_cxt5066 },
|
||||
{ .id = 0x14f1506e, .name = "CX20590",
|
||||
.patch = patch_cxt5066 },
|
||||
{ .id = 0x14f15097, .name = "CX20631",
|
||||
.patch = patch_conexant_auto },
|
||||
{ .id = 0x14f15098, .name = "CX20632",
|
||||
@ -3928,6 +3967,7 @@ MODULE_ALIAS("snd-hda-codec-id:14f15066");
|
||||
MODULE_ALIAS("snd-hda-codec-id:14f15067");
|
||||
MODULE_ALIAS("snd-hda-codec-id:14f15068");
|
||||
MODULE_ALIAS("snd-hda-codec-id:14f15069");
|
||||
MODULE_ALIAS("snd-hda-codec-id:14f1506e");
|
||||
MODULE_ALIAS("snd-hda-codec-id:14f15097");
|
||||
MODULE_ALIAS("snd-hda-codec-id:14f15098");
|
||||
MODULE_ALIAS("snd-hda-codec-id:14f150a1");
|
||||
|
@ -567,7 +567,7 @@ static void via_auto_init_analog_input(struct hda_codec *codec)
|
||||
hda_nid_t nid = cfg->inputs[i].pin;
|
||||
if (spec->smart51_enabled && is_smart51_pins(spec, nid))
|
||||
ctl = PIN_OUT;
|
||||
else if (i == AUTO_PIN_MIC)
|
||||
else if (cfg->inputs[i].type == AUTO_PIN_MIC)
|
||||
ctl = PIN_VREF50;
|
||||
else
|
||||
ctl = PIN_IN;
|
||||
|
@ -1287,9 +1287,9 @@ SND_SOC_DAPM_SUPPLY("DSPINTCLK", WM8994_CLOCKING_1, 1, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("AIF1CLK", WM8994_AIF1_CLOCKING_1, 0, 0, NULL, 0),
|
||||
SND_SOC_DAPM_SUPPLY("AIF2CLK", WM8994_AIF2_CLOCKING_1, 0, 0, NULL, 0),
|
||||
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", "AIF1 Capture",
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC1L", NULL,
|
||||
0, WM8994_POWER_MANAGEMENT_4, 9, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", "AIF1 Capture",
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC1R", NULL,
|
||||
0, WM8994_POWER_MANAGEMENT_4, 8, 0),
|
||||
SND_SOC_DAPM_AIF_IN_E("AIF1DAC1L", NULL, 0,
|
||||
WM8994_POWER_MANAGEMENT_5, 9, 0, wm8958_aif_ev,
|
||||
@ -1298,9 +1298,9 @@ SND_SOC_DAPM_AIF_IN_E("AIF1DAC1R", NULL, 0,
|
||||
WM8994_POWER_MANAGEMENT_5, 8, 0, wm8958_aif_ev,
|
||||
SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
|
||||
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", "AIF1 Capture",
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC2L", NULL,
|
||||
0, WM8994_POWER_MANAGEMENT_4, 11, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", "AIF1 Capture",
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADC2R", NULL,
|
||||
0, WM8994_POWER_MANAGEMENT_4, 10, 0),
|
||||
SND_SOC_DAPM_AIF_IN_E("AIF1DAC2L", NULL, 0,
|
||||
WM8994_POWER_MANAGEMENT_5, 11, 0, wm8958_aif_ev,
|
||||
@ -1345,6 +1345,7 @@ SND_SOC_DAPM_AIF_IN_E("AIF2DACR", NULL, 0,
|
||||
|
||||
SND_SOC_DAPM_AIF_IN("AIF1DACDAT", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_IN("AIF2DACDAT", "AIF2 Playback", 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1ADCDAT", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF2ADCDAT", "AIF2 Capture", 0, SND_SOC_NOPM, 0, 0),
|
||||
|
||||
SND_SOC_DAPM_MUX("AIF1DAC Mux", SND_SOC_NOPM, 0, 0, &aif1dac_mux),
|
||||
@ -1546,6 +1547,11 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{ "AIF2DAC2R Mixer", "Left Sidetone Switch", "Left Sidetone" },
|
||||
{ "AIF2DAC2R Mixer", "Right Sidetone Switch", "Right Sidetone" },
|
||||
|
||||
{ "AIF1ADCDAT", NULL, "AIF1ADC1L" },
|
||||
{ "AIF1ADCDAT", NULL, "AIF1ADC1R" },
|
||||
{ "AIF1ADCDAT", NULL, "AIF1ADC2L" },
|
||||
{ "AIF1ADCDAT", NULL, "AIF1ADC2R" },
|
||||
|
||||
{ "AIF2ADCDAT", NULL, "AIF2ADC Mux" },
|
||||
|
||||
/* AIF3 output */
|
||||
@ -1578,6 +1584,13 @@ static const struct snd_soc_dapm_route intercon[] = {
|
||||
{ "Right Headphone Mux", "DAC", "DAC1R" },
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route wm8994_revd_intercon[] = {
|
||||
{ "AIF1DACDAT", NULL, "AIF2DACDAT" },
|
||||
{ "AIF2DACDAT", NULL, "AIF1DACDAT" },
|
||||
{ "AIF1ADCDAT", NULL, "AIF2ADCDAT" },
|
||||
{ "AIF2ADCDAT", NULL, "AIF1ADCDAT" },
|
||||
};
|
||||
|
||||
static const struct snd_soc_dapm_route wm8994_intercon[] = {
|
||||
{ "AIF2DACL", NULL, "AIF2DAC Mux" },
|
||||
{ "AIF2DACR", NULL, "AIF2DAC Mux" },
|
||||
@ -3129,6 +3142,11 @@ static int wm8994_codec_probe(struct snd_soc_codec *codec)
|
||||
case WM8994:
|
||||
snd_soc_dapm_add_routes(dapm, wm8994_intercon,
|
||||
ARRAY_SIZE(wm8994_intercon));
|
||||
|
||||
if (wm8994->revision < 4)
|
||||
snd_soc_dapm_add_routes(dapm, wm8994_revd_intercon,
|
||||
ARRAY_SIZE(wm8994_revd_intercon));
|
||||
|
||||
break;
|
||||
case WM8958:
|
||||
snd_soc_dapm_add_routes(dapm, wm8958_intercon,
|
||||
|
@ -218,7 +218,19 @@ static struct snd_soc_dai_link dm6467_evm_dai[] = {
|
||||
.ops = &evm_spdif_ops,
|
||||
},
|
||||
};
|
||||
static struct snd_soc_dai_link da8xx_evm_dai = {
|
||||
|
||||
static struct snd_soc_dai_link da830_evm_dai = {
|
||||
.name = "TLV320AIC3X",
|
||||
.stream_name = "AIC3X",
|
||||
.cpu_dai_name = "davinci-mcasp.1",
|
||||
.codec_dai_name = "tlv320aic3x-hifi",
|
||||
.codec_name = "tlv320aic3x-codec.1-0018",
|
||||
.platform_name = "davinci-pcm-audio",
|
||||
.init = evm_aic3x_init,
|
||||
.ops = &evm_ops,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_link da850_evm_dai = {
|
||||
.name = "TLV320AIC3X",
|
||||
.stream_name = "AIC3X",
|
||||
.cpu_dai_name= "davinci-mcasp.0",
|
||||
@ -259,13 +271,13 @@ static struct snd_soc_card dm6467_snd_soc_card_evm = {
|
||||
|
||||
static struct snd_soc_card da830_snd_soc_card = {
|
||||
.name = "DA830/OMAP-L137 EVM",
|
||||
.dai_link = &da8xx_evm_dai,
|
||||
.dai_link = &da830_evm_dai,
|
||||
.num_links = 1,
|
||||
};
|
||||
|
||||
static struct snd_soc_card da850_snd_soc_card = {
|
||||
.name = "DA850/OMAP-L138 EVM",
|
||||
.dai_link = &da8xx_evm_dai,
|
||||
.dai_link = &da850_evm_dai,
|
||||
.num_links = 1,
|
||||
};
|
||||
|
||||
|
@ -1449,6 +1449,7 @@ static int soc_post_component_init(struct snd_soc_card *card,
|
||||
rtd = &card->rtd_aux[num];
|
||||
name = aux_dev->name;
|
||||
}
|
||||
rtd->card = card;
|
||||
|
||||
/* machine controls, routes and widgets are not prefixed */
|
||||
temp = codec->name_prefix;
|
||||
@ -1471,7 +1472,6 @@ static int soc_post_component_init(struct snd_soc_card *card,
|
||||
|
||||
/* register the rtd device */
|
||||
rtd->codec = codec;
|
||||
rtd->card = card;
|
||||
rtd->dev.parent = card->dev;
|
||||
rtd->dev.release = rtd_release;
|
||||
rtd->dev.init_name = name;
|
||||
|
@ -785,7 +785,7 @@ int snd_usb_caiaq_audio_init(struct snd_usb_caiaqdev *dev)
|
||||
}
|
||||
|
||||
dev->pcm->private_data = dev;
|
||||
strcpy(dev->pcm->name, dev->product_name);
|
||||
strlcpy(dev->pcm->name, dev->product_name, sizeof(dev->pcm->name));
|
||||
|
||||
memset(dev->sub_playback, 0, sizeof(dev->sub_playback));
|
||||
memset(dev->sub_capture, 0, sizeof(dev->sub_capture));
|
||||
|
@ -136,7 +136,7 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
strcpy(rmidi->name, device->product_name);
|
||||
strlcpy(rmidi->name, device->product_name, sizeof(rmidi->name));
|
||||
|
||||
rmidi->info_flags = SNDRV_RAWMIDI_INFO_DUPLEX;
|
||||
rmidi->private_data = device;
|
||||
|
@ -323,6 +323,7 @@ static int snd_usb_audio_create(struct usb_device *dev, int idx,
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
mutex_init(&chip->shutdown_mutex);
|
||||
chip->index = idx;
|
||||
chip->dev = dev;
|
||||
chip->card = card;
|
||||
@ -531,6 +532,7 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
|
||||
chip = ptr;
|
||||
card = chip->card;
|
||||
mutex_lock(®ister_mutex);
|
||||
mutex_lock(&chip->shutdown_mutex);
|
||||
chip->shutdown = 1;
|
||||
chip->num_interfaces--;
|
||||
if (chip->num_interfaces <= 0) {
|
||||
@ -548,9 +550,11 @@ static void snd_usb_audio_disconnect(struct usb_device *dev, void *ptr)
|
||||
snd_usb_mixer_disconnect(p);
|
||||
}
|
||||
usb_chip[chip->index] = NULL;
|
||||
mutex_unlock(&chip->shutdown_mutex);
|
||||
mutex_unlock(®ister_mutex);
|
||||
snd_card_free_when_closed(card);
|
||||
} else {
|
||||
mutex_unlock(&chip->shutdown_mutex);
|
||||
mutex_unlock(®ister_mutex);
|
||||
}
|
||||
}
|
||||
|
@ -361,6 +361,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
mutex_lock(&subs->stream->chip->shutdown_mutex);
|
||||
/* format changed */
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
/* influenced: period_bytes, channels, rate, format, */
|
||||
@ -368,6 +369,7 @@ static int snd_usb_hw_params(struct snd_pcm_substream *substream,
|
||||
params_rate(hw_params),
|
||||
snd_pcm_format_physical_width(params_format(hw_params)) *
|
||||
params_channels(hw_params));
|
||||
mutex_unlock(&subs->stream->chip->shutdown_mutex);
|
||||
}
|
||||
|
||||
return ret;
|
||||
@ -385,8 +387,9 @@ static int snd_usb_hw_free(struct snd_pcm_substream *substream)
|
||||
subs->cur_audiofmt = NULL;
|
||||
subs->cur_rate = 0;
|
||||
subs->period_bytes = 0;
|
||||
if (!subs->stream->chip->shutdown)
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
mutex_lock(&subs->stream->chip->shutdown_mutex);
|
||||
snd_usb_release_substream_urbs(subs, 0);
|
||||
mutex_unlock(&subs->stream->chip->shutdown_mutex);
|
||||
return snd_pcm_lib_free_vmalloc_buffer(substream);
|
||||
}
|
||||
|
||||
|
@ -36,6 +36,7 @@ struct snd_usb_audio {
|
||||
struct snd_card *card;
|
||||
u32 usb_id;
|
||||
int shutdown;
|
||||
struct mutex shutdown_mutex;
|
||||
unsigned int txfr_quirk:1; /* Subframe boundaries on transfers */
|
||||
int num_interfaces;
|
||||
int num_suspended_intf;
|
||||
|
Loading…
Reference in New Issue
Block a user