提交 bfd4e66b 编写于 作者: T Takashi Iwai

Merge branches 'topic/asoc', 'topic/misc-fixes' and 'topic/hda' into for-linus

...@@ -159,7 +159,7 @@ static int i2sbus_add_dev(struct macio_dev *macio, ...@@ -159,7 +159,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
struct i2sbus_dev *dev; struct i2sbus_dev *dev;
struct device_node *child = NULL, *sound = NULL; struct device_node *child = NULL, *sound = NULL;
struct resource *r; struct resource *r;
int i, layout = 0, rlen; int i, layout = 0, rlen, ok = force;
static const char *rnames[] = { "i2sbus: %s (control)", static const char *rnames[] = { "i2sbus: %s (control)",
"i2sbus: %s (tx)", "i2sbus: %s (tx)",
"i2sbus: %s (rx)" }; "i2sbus: %s (rx)" };
...@@ -192,7 +192,7 @@ static int i2sbus_add_dev(struct macio_dev *macio, ...@@ -192,7 +192,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
layout = *layout_id; layout = *layout_id;
snprintf(dev->sound.modalias, 32, snprintf(dev->sound.modalias, 32,
"sound-layout-%d", layout); "sound-layout-%d", layout);
force = 1; ok = 1;
} }
} }
/* for the time being, until we can handle non-layout-id /* for the time being, until we can handle non-layout-id
...@@ -201,7 +201,7 @@ static int i2sbus_add_dev(struct macio_dev *macio, ...@@ -201,7 +201,7 @@ static int i2sbus_add_dev(struct macio_dev *macio,
* When there are two i2s busses and only one has a layout-id, * When there are two i2s busses and only one has a layout-id,
* then this depends on the order, but that isn't important * then this depends on the order, but that isn't important
* either as the second one in that case is just a modem. */ * either as the second one in that case is just a modem. */
if (!force) { if (!ok) {
kfree(dev); kfree(dev);
return -ENODEV; return -ENODEV;
} }
......
...@@ -194,7 +194,7 @@ int __pxa2xx_pcm_open(struct snd_pcm_substream *substream) ...@@ -194,7 +194,7 @@ int __pxa2xx_pcm_open(struct snd_pcm_substream *substream)
goto out; goto out;
ret = -ENOMEM; ret = -ENOMEM;
rtd = kmalloc(sizeof(*rtd), GFP_KERNEL); rtd = kzalloc(sizeof(*rtd), GFP_KERNEL);
if (!rtd) if (!rtd)
goto out; goto out;
rtd->dma_desc_array = rtd->dma_desc_array =
......
...@@ -4996,7 +4996,7 @@ static struct hda_verb alc260_test_init_verbs[] = { ...@@ -4996,7 +4996,7 @@ static struct hda_verb alc260_test_init_verbs[] = {
*/ */
static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid, static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
const char *pfx) const char *pfx, int *vol_bits)
{ {
hda_nid_t nid_vol; hda_nid_t nid_vol;
unsigned long vol_val, sw_val; unsigned long vol_val, sw_val;
...@@ -5018,10 +5018,14 @@ static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid, ...@@ -5018,10 +5018,14 @@ static int alc260_add_playback_controls(struct alc_spec *spec, hda_nid_t nid,
} else } else
return 0; /* N/A */ return 0; /* N/A */
snprintf(name, sizeof(name), "%s Playback Volume", pfx); if (!(*vol_bits & (1 << nid_vol))) {
err = add_control(spec, ALC_CTL_WIDGET_VOL, name, vol_val); /* first control for the volume widget */
if (err < 0) snprintf(name, sizeof(name), "%s Playback Volume", pfx);
return err; err = add_control(spec, ALC_CTL_WIDGET_VOL, name, vol_val);
if (err < 0)
return err;
*vol_bits |= (1 << nid_vol);
}
snprintf(name, sizeof(name), "%s Playback Switch", pfx); snprintf(name, sizeof(name), "%s Playback Switch", pfx);
err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, sw_val); err = add_control(spec, ALC_CTL_WIDGET_MUTE, name, sw_val);
if (err < 0) if (err < 0)
...@@ -5035,6 +5039,7 @@ static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec, ...@@ -5035,6 +5039,7 @@ static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
{ {
hda_nid_t nid; hda_nid_t nid;
int err; int err;
int vols = 0;
spec->multiout.num_dacs = 1; spec->multiout.num_dacs = 1;
spec->multiout.dac_nids = spec->private_dac_nids; spec->multiout.dac_nids = spec->private_dac_nids;
...@@ -5042,21 +5047,22 @@ static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec, ...@@ -5042,21 +5047,22 @@ static int alc260_auto_create_multi_out_ctls(struct alc_spec *spec,
nid = cfg->line_out_pins[0]; nid = cfg->line_out_pins[0];
if (nid) { if (nid) {
err = alc260_add_playback_controls(spec, nid, "Front"); err = alc260_add_playback_controls(spec, nid, "Front", &vols);
if (err < 0) if (err < 0)
return err; return err;
} }
nid = cfg->speaker_pins[0]; nid = cfg->speaker_pins[0];
if (nid) { if (nid) {
err = alc260_add_playback_controls(spec, nid, "Speaker"); err = alc260_add_playback_controls(spec, nid, "Speaker", &vols);
if (err < 0) if (err < 0)
return err; return err;
} }
nid = cfg->hp_pins[0]; nid = cfg->hp_pins[0];
if (nid) { if (nid) {
err = alc260_add_playback_controls(spec, nid, "Headphone"); err = alc260_add_playback_controls(spec, nid, "Headphone",
&vols);
if (err < 0) if (err < 0)
return err; return err;
} }
......
...@@ -1282,7 +1282,7 @@ static int stac92xx_build_controls(struct hda_codec *codec) ...@@ -1282,7 +1282,7 @@ static int stac92xx_build_controls(struct hda_codec *codec)
return err; return err;
spec->multiout.share_spdif = 1; spec->multiout.share_spdif = 1;
} }
if (spec->dig_in_nid && (!spec->gpio_dir & 0x01)) { if (spec->dig_in_nid && !(spec->gpio_dir & 0x01)) {
err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid); err = snd_hda_create_spdif_in_ctls(codec, spec->dig_in_nid);
if (err < 0) if (err < 0)
return err; return err;
......
...@@ -863,17 +863,21 @@ static int aic3x_set_dai_fmt(struct snd_soc_dai *codec_dai, ...@@ -863,17 +863,21 @@ static int aic3x_set_dai_fmt(struct snd_soc_dai *codec_dai,
return -EINVAL; return -EINVAL;
} }
/* interface format */ /*
switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) { * match both interface format and signal polarities since they
case SND_SOC_DAIFMT_I2S: * are fixed
*/
switch (fmt & (SND_SOC_DAIFMT_FORMAT_MASK |
SND_SOC_DAIFMT_INV_MASK)) {
case (SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF):
break; break;
case SND_SOC_DAIFMT_DSP_A: case (SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF):
iface_breg |= (0x01 << 6); iface_breg |= (0x01 << 6);
break; break;
case SND_SOC_DAIFMT_RIGHT_J: case (SND_SOC_DAIFMT_RIGHT_J | SND_SOC_DAIFMT_NB_NF):
iface_breg |= (0x02 << 6); iface_breg |= (0x02 << 6);
break; break;
case SND_SOC_DAIFMT_LEFT_J: case (SND_SOC_DAIFMT_LEFT_J | SND_SOC_DAIFMT_NB_NF):
iface_breg |= (0x03 << 6); iface_breg |= (0x03 << 6);
break; break;
default: default:
......
...@@ -265,7 +265,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream, ...@@ -265,7 +265,7 @@ static int omap_mcbsp_dai_hw_params(struct snd_pcm_substream *substream,
break; break;
case SND_SOC_DAIFMT_DSP_A: case SND_SOC_DAIFMT_DSP_A:
regs->srgr2 |= FPER(wlen * 2 - 1); regs->srgr2 |= FPER(wlen * 2 - 1);
regs->srgr1 |= FWID(0); regs->srgr1 |= FWID(wlen * 2 - 2);
break; break;
} }
...@@ -284,7 +284,6 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, ...@@ -284,7 +284,6 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai,
{ {
struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data); struct omap_mcbsp_data *mcbsp_data = to_mcbsp(cpu_dai->private_data);
struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs; struct omap_mcbsp_reg_cfg *regs = &mcbsp_data->regs;
unsigned int temp_fmt = fmt;
if (mcbsp_data->configured) if (mcbsp_data->configured)
return 0; return 0;
...@@ -307,8 +306,6 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, ...@@ -307,8 +306,6 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai,
/* 0-bit data delay */ /* 0-bit data delay */
regs->rcr2 |= RDATDLY(0); regs->rcr2 |= RDATDLY(0);
regs->xcr2 |= XDATDLY(0); regs->xcr2 |= XDATDLY(0);
/* Invert bit clock and FS polarity configuration for DSP_A */
temp_fmt ^= SND_SOC_DAIFMT_IB_IF;
break; break;
default: default:
/* Unsupported data format */ /* Unsupported data format */
...@@ -332,7 +329,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai, ...@@ -332,7 +329,7 @@ static int omap_mcbsp_dai_set_dai_fmt(struct snd_soc_dai *cpu_dai,
} }
/* Set bit clock (CLKX/CLKR) and FS polarities */ /* Set bit clock (CLKX/CLKR) and FS polarities */
switch (temp_fmt & SND_SOC_DAIFMT_INV_MASK) { switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
case SND_SOC_DAIFMT_NB_NF: case SND_SOC_DAIFMT_NB_NF:
/* /*
* Normal BCLK + FS. * Normal BCLK + FS.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册