mirror of
https://github.com/torvalds/linux.git
synced 2024-11-08 13:11:45 +00:00
Merge branch 'for-linus' into topic/hda-cleanup
Syncing the HD-audio updates for further cleanup works.
This commit is contained in:
commit
1aaff09695
@ -3843,10 +3843,13 @@ F: drivers/tty/serial/ucc_uart.c
|
||||
|
||||
FREESCALE SOC SOUND DRIVERS
|
||||
M: Timur Tabi <timur@tabi.org>
|
||||
M: Nicolin Chen <nicoleotsuka@gmail.com>
|
||||
M: Xiubo Li <Li.Xiubo@freescale.com>
|
||||
L: alsa-devel@alsa-project.org (moderated for non-subscribers)
|
||||
L: linuxppc-dev@lists.ozlabs.org
|
||||
S: Maintained
|
||||
F: sound/soc/fsl/fsl*
|
||||
F: sound/soc/fsl/imx*
|
||||
F: sound/soc/fsl/mpc8610_hpcd.c
|
||||
|
||||
FREEVXFS FILESYSTEM
|
||||
|
@ -181,6 +181,8 @@ static void alc_fix_pll(struct hda_codec *codec)
|
||||
spec->pll_coef_idx);
|
||||
val = snd_hda_codec_read(codec, spec->pll_nid, 0,
|
||||
AC_VERB_GET_PROC_COEF, 0);
|
||||
if (val == -1)
|
||||
return;
|
||||
snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_COEF_INDEX,
|
||||
spec->pll_coef_idx);
|
||||
snd_hda_codec_write(codec, spec->pll_nid, 0, AC_VERB_SET_PROC_COEF,
|
||||
@ -2806,6 +2808,8 @@ static void alc286_shutup(struct hda_codec *codec)
|
||||
static void alc269vb_toggle_power_output(struct hda_codec *codec, int power_up)
|
||||
{
|
||||
int val = alc_read_coef_idx(codec, 0x04);
|
||||
if (val == -1)
|
||||
return;
|
||||
if (power_up)
|
||||
val |= 1 << 11;
|
||||
else
|
||||
@ -3264,6 +3268,15 @@ static int alc269_resume(struct hda_codec *codec)
|
||||
snd_hda_codec_resume_cache(codec);
|
||||
alc_inv_dmic_sync(codec, true);
|
||||
hda_call_check_power_status(codec, 0x01);
|
||||
|
||||
/* on some machine, the BIOS will clear the codec gpio data when enter
|
||||
* suspend, and won't restore the data after resume, so we restore it
|
||||
* in the driver.
|
||||
*/
|
||||
if (spec->gpio_led)
|
||||
snd_hda_codec_write(codec, codec->afg, 0, AC_VERB_SET_GPIO_DATA,
|
||||
spec->gpio_led);
|
||||
|
||||
if (spec->has_alc5505_dsp)
|
||||
alc5505_dsp_resume(codec);
|
||||
|
||||
@ -5311,26 +5324,29 @@ static void alc269_fill_coef(struct hda_codec *codec)
|
||||
if ((alc_get_coef0(codec) & 0x00ff) == 0x017) {
|
||||
val = alc_read_coef_idx(codec, 0x04);
|
||||
/* Power up output pin */
|
||||
if (val != -1)
|
||||
alc_write_coef_idx(codec, 0x04, val | (1<<11));
|
||||
}
|
||||
|
||||
if ((alc_get_coef0(codec) & 0x00ff) == 0x018) {
|
||||
val = alc_read_coef_idx(codec, 0xd);
|
||||
if ((val & 0x0c00) >> 10 != 0x1) {
|
||||
if (val != -1 && (val & 0x0c00) >> 10 != 0x1) {
|
||||
/* Capless ramp up clock control */
|
||||
alc_write_coef_idx(codec, 0xd, val | (1<<10));
|
||||
}
|
||||
val = alc_read_coef_idx(codec, 0x17);
|
||||
if ((val & 0x01c0) >> 6 != 0x4) {
|
||||
if (val != -1 && (val & 0x01c0) >> 6 != 0x4) {
|
||||
/* Class D power on reset */
|
||||
alc_write_coef_idx(codec, 0x17, val | (1<<7));
|
||||
}
|
||||
}
|
||||
|
||||
val = alc_read_coef_idx(codec, 0xd); /* Class D */
|
||||
if (val != -1)
|
||||
alc_write_coef_idx(codec, 0xd, val | (1<<14));
|
||||
|
||||
val = alc_read_coef_idx(codec, 0x4); /* HP */
|
||||
if (val != -1)
|
||||
alc_write_coef_idx(codec, 0x4, val | (1<<11));
|
||||
}
|
||||
|
||||
|
@ -1278,6 +1278,8 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
|
||||
else
|
||||
rates = &arizona_48k_bclk_rates[0];
|
||||
|
||||
wl = snd_pcm_format_width(params_format(params));
|
||||
|
||||
if (tdm_slots) {
|
||||
arizona_aif_dbg(dai, "Configuring for %d %d bit TDM slots\n",
|
||||
tdm_slots, tdm_width);
|
||||
@ -1285,6 +1287,7 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
|
||||
channels = tdm_slots;
|
||||
} else {
|
||||
bclk_target = snd_soc_params_to_bclk(params);
|
||||
tdm_width = wl;
|
||||
}
|
||||
|
||||
if (chan_limit && chan_limit < channels) {
|
||||
@ -1319,8 +1322,7 @@ static int arizona_hw_params(struct snd_pcm_substream *substream,
|
||||
arizona_aif_dbg(dai, "BCLK %dHz LRCLK %dHz\n",
|
||||
rates[bclk], rates[bclk] / lrclk);
|
||||
|
||||
wl = snd_pcm_format_width(params_format(params));
|
||||
frame = wl << ARIZONA_AIF1TX_WL_SHIFT | wl;
|
||||
frame = wl << ARIZONA_AIF1TX_WL_SHIFT | tdm_width;
|
||||
|
||||
reconfig = arizona_aif_cfg_changed(codec, base, bclk, lrclk, frame);
|
||||
|
||||
|
@ -259,13 +259,13 @@ static const struct soc_enum pcm512x_veds =
|
||||
pcm512x_ramp_step_text);
|
||||
|
||||
static const struct snd_kcontrol_new pcm512x_controls[] = {
|
||||
SOC_DOUBLE_R_TLV("Playback Digital Volume", PCM512x_DIGITAL_VOLUME_2,
|
||||
SOC_DOUBLE_R_TLV("Digital Playback Volume", PCM512x_DIGITAL_VOLUME_2,
|
||||
PCM512x_DIGITAL_VOLUME_3, 0, 255, 1, digital_tlv),
|
||||
SOC_DOUBLE_TLV("Playback Volume", PCM512x_ANALOG_GAIN_CTRL,
|
||||
PCM512x_LAGN_SHIFT, PCM512x_RAGN_SHIFT, 1, 1, analog_tlv),
|
||||
SOC_DOUBLE_TLV("Playback Boost Volume", PCM512x_ANALOG_GAIN_BOOST,
|
||||
PCM512x_AGBL_SHIFT, PCM512x_AGBR_SHIFT, 1, 0, boost_tlv),
|
||||
SOC_DOUBLE("Playback Digital Switch", PCM512x_MUTE, PCM512x_RQML_SHIFT,
|
||||
SOC_DOUBLE("Digital Playback Switch", PCM512x_MUTE, PCM512x_RQML_SHIFT,
|
||||
PCM512x_RQMR_SHIFT, 1, 1),
|
||||
|
||||
SOC_SINGLE("Deemphasis Switch", PCM512x_DSP, PCM512x_DEMP_SHIFT, 1, 1),
|
||||
|
@ -403,7 +403,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div)
|
||||
static int __davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
|
||||
int div, bool explicit)
|
||||
{
|
||||
struct davinci_mcasp *mcasp = snd_soc_dai_get_drvdata(dai);
|
||||
|
||||
@ -420,6 +421,7 @@ static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div
|
||||
ACLKXDIV(div - 1), ACLKXDIV_MASK);
|
||||
mcasp_mod_bits(mcasp, DAVINCI_MCASP_ACLKRCTL_REG,
|
||||
ACLKRDIV(div - 1), ACLKRDIV_MASK);
|
||||
if (explicit)
|
||||
mcasp->bclk_div = div;
|
||||
break;
|
||||
|
||||
@ -434,6 +436,12 @@ static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id, int div
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int davinci_mcasp_set_clkdiv(struct snd_soc_dai *dai, int div_id,
|
||||
int div)
|
||||
{
|
||||
return __davinci_mcasp_set_clkdiv(dai, div_id, div, 1);
|
||||
}
|
||||
|
||||
static int davinci_mcasp_set_sysclk(struct snd_soc_dai *dai, int clk_id,
|
||||
unsigned int freq, int dir)
|
||||
{
|
||||
@ -738,7 +746,7 @@ static int davinci_mcasp_hw_params(struct snd_pcm_substream *substream,
|
||||
"Inaccurate BCLK: %u Hz / %u != %u Hz\n",
|
||||
mcasp->sysclk_freq, div, bclk_freq);
|
||||
}
|
||||
davinci_mcasp_set_clkdiv(cpu_dai, 1, div);
|
||||
__davinci_mcasp_set_clkdiv(cpu_dai, 1, div, 0);
|
||||
}
|
||||
|
||||
ret = mcasp_common_hw_param(mcasp, substream->stream,
|
||||
|
@ -49,7 +49,6 @@ config SND_SOC_FSL_ESAI
|
||||
tristate "Enhanced Serial Audio Interface (ESAI) module support"
|
||||
select REGMAP_MMIO
|
||||
select SND_SOC_IMX_PCM_DMA if SND_IMX_SOC != n
|
||||
select SND_SOC_FSL_UTILS
|
||||
help
|
||||
Say Y if you want to add Enhanced Synchronous Audio Interface
|
||||
(ESAI) support for the Freescale CPUs.
|
||||
|
@ -18,7 +18,6 @@
|
||||
|
||||
#include "fsl_esai.h"
|
||||
#include "imx-pcm.h"
|
||||
#include "fsl_utils.h"
|
||||
|
||||
#define FSL_ESAI_RATES SNDRV_PCM_RATE_8000_192000
|
||||
#define FSL_ESAI_FORMATS (SNDRV_PCM_FMTBIT_S8 | \
|
||||
@ -607,7 +606,6 @@ static struct snd_soc_dai_ops fsl_esai_dai_ops = {
|
||||
.hw_params = fsl_esai_hw_params,
|
||||
.set_sysclk = fsl_esai_set_dai_sysclk,
|
||||
.set_fmt = fsl_esai_set_dai_fmt,
|
||||
.xlate_tdm_slot_mask = fsl_asoc_xlate_tdm_slot_mask,
|
||||
.set_tdm_slot = fsl_esai_set_dai_tdm_slot,
|
||||
};
|
||||
|
||||
|
@ -246,8 +246,8 @@ static struct sst_acpi_desc sst_acpi_broadwell_desc = {
|
||||
};
|
||||
|
||||
static struct sst_acpi_mach baytrail_machines[] = {
|
||||
{ "10EC5640", "byt-rt5640", "intel/fw_sst_0f28.bin-i2s_master" },
|
||||
{ "193C9890", "byt-max98090", "intel/fw_sst_0f28.bin-i2s_master" },
|
||||
{ "10EC5640", "byt-rt5640", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
|
||||
{ "193C9890", "byt-max98090", "intel/fw_sst_0f28.bin-48kHz_i2s_master" },
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -817,7 +817,7 @@ static struct sst_dsp_device byt_dev = {
|
||||
.ops = &sst_byt_ops,
|
||||
};
|
||||
|
||||
int sst_byt_dsp_suspend_noirq(struct device *dev, struct sst_pdata *pdata)
|
||||
int sst_byt_dsp_suspend_late(struct device *dev, struct sst_pdata *pdata)
|
||||
{
|
||||
struct sst_byt *byt = pdata->dsp;
|
||||
|
||||
@ -826,14 +826,6 @@ int sst_byt_dsp_suspend_noirq(struct device *dev, struct sst_pdata *pdata)
|
||||
sst_byt_drop_all(byt);
|
||||
dev_dbg(byt->dev, "dsp in reset\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(sst_byt_dsp_suspend_noirq);
|
||||
|
||||
int sst_byt_dsp_suspend_late(struct device *dev, struct sst_pdata *pdata)
|
||||
{
|
||||
struct sst_byt *byt = pdata->dsp;
|
||||
|
||||
dev_dbg(byt->dev, "free all blocks and unload fw\n");
|
||||
sst_fw_unload(byt->fw);
|
||||
|
||||
|
@ -66,7 +66,6 @@ int sst_byt_get_dsp_position(struct sst_byt *byt,
|
||||
int sst_byt_dsp_init(struct device *dev, struct sst_pdata *pdata);
|
||||
void sst_byt_dsp_free(struct device *dev, struct sst_pdata *pdata);
|
||||
struct sst_dsp *sst_byt_get_dsp(struct sst_byt *byt);
|
||||
int sst_byt_dsp_suspend_noirq(struct device *dev, struct sst_pdata *pdata);
|
||||
int sst_byt_dsp_suspend_late(struct device *dev, struct sst_pdata *pdata);
|
||||
int sst_byt_dsp_boot(struct device *dev, struct sst_pdata *pdata);
|
||||
int sst_byt_dsp_wait_for_ready(struct device *dev, struct sst_pdata *pdata);
|
||||
|
@ -59,6 +59,9 @@ struct sst_byt_priv_data {
|
||||
|
||||
/* DAI data */
|
||||
struct sst_byt_pcm_data pcm[BYT_PCM_COUNT];
|
||||
|
||||
/* flag indicating is stream context restore needed after suspend */
|
||||
bool restore_stream;
|
||||
};
|
||||
|
||||
/* this may get called several times by oss emulation */
|
||||
@ -184,7 +187,10 @@ static int sst_byt_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
sst_byt_stream_start(byt, pcm_data->stream, 0);
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
if (pdata->restore_stream == true)
|
||||
schedule_work(&pcm_data->work);
|
||||
else
|
||||
sst_byt_stream_resume(byt, pcm_data->stream);
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
sst_byt_stream_resume(byt, pcm_data->stream);
|
||||
@ -193,6 +199,7 @@ static int sst_byt_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
|
||||
sst_byt_stream_stop(byt, pcm_data->stream);
|
||||
break;
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
pdata->restore_stream = false;
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
sst_byt_stream_pause(byt, pcm_data->stream);
|
||||
break;
|
||||
@ -404,26 +411,10 @@ static const struct snd_soc_component_driver byt_dai_component = {
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int sst_byt_pcm_dev_suspend_noirq(struct device *dev)
|
||||
{
|
||||
struct sst_pdata *sst_pdata = dev_get_platdata(dev);
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "suspending noirq\n");
|
||||
|
||||
/* at this point all streams will be stopped and context saved */
|
||||
ret = sst_byt_dsp_suspend_noirq(dev, sst_pdata);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to suspend %d\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sst_byt_pcm_dev_suspend_late(struct device *dev)
|
||||
{
|
||||
struct sst_pdata *sst_pdata = dev_get_platdata(dev);
|
||||
struct sst_byt_priv_data *priv_data = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "suspending late\n");
|
||||
@ -434,34 +425,30 @@ static int sst_byt_pcm_dev_suspend_late(struct device *dev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
priv_data->restore_stream = true;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int sst_byt_pcm_dev_resume_early(struct device *dev)
|
||||
{
|
||||
struct sst_pdata *sst_pdata = dev_get_platdata(dev);
|
||||
int ret;
|
||||
|
||||
dev_dbg(dev, "resume early\n");
|
||||
|
||||
/* load fw and boot DSP */
|
||||
return sst_byt_dsp_boot(dev, sst_pdata);
|
||||
}
|
||||
|
||||
static int sst_byt_pcm_dev_resume(struct device *dev)
|
||||
{
|
||||
struct sst_pdata *sst_pdata = dev_get_platdata(dev);
|
||||
|
||||
dev_dbg(dev, "resume\n");
|
||||
ret = sst_byt_dsp_boot(dev, sst_pdata);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* wait for FW to finish booting */
|
||||
return sst_byt_dsp_wait_for_ready(dev, sst_pdata);
|
||||
}
|
||||
|
||||
static const struct dev_pm_ops sst_byt_pm_ops = {
|
||||
.suspend_noirq = sst_byt_pcm_dev_suspend_noirq,
|
||||
.suspend_late = sst_byt_pcm_dev_suspend_late,
|
||||
.resume_early = sst_byt_pcm_dev_resume_early,
|
||||
.resume = sst_byt_pcm_dev_resume,
|
||||
};
|
||||
|
||||
#define SST_BYT_PM_OPS (&sst_byt_pm_ops)
|
||||
|
@ -765,9 +765,7 @@ static int pxa_ssp_remove(struct snd_soc_dai *dai)
|
||||
SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_64000 | \
|
||||
SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000)
|
||||
|
||||
#define PXA_SSP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
|
||||
SNDRV_PCM_FMTBIT_S24_LE | \
|
||||
SNDRV_PCM_FMTBIT_S32_LE)
|
||||
#define PXA_SSP_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S32_LE)
|
||||
|
||||
static const struct snd_soc_dai_ops pxa_ssp_dai_ops = {
|
||||
.startup = pxa_ssp_startup,
|
||||
|
@ -2860,12 +2860,14 @@ int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
|
||||
struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_dapm(kcontrol);
|
||||
struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
|
||||
unsigned int reg_val, val;
|
||||
int ret = 0;
|
||||
|
||||
if (e->reg != SND_SOC_NOPM)
|
||||
ret = soc_dapm_read(dapm, e->reg, ®_val);
|
||||
else
|
||||
if (e->reg != SND_SOC_NOPM) {
|
||||
int ret = soc_dapm_read(dapm, e->reg, ®_val);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else {
|
||||
reg_val = dapm_kcontrol_get_value(kcontrol);
|
||||
}
|
||||
|
||||
val = (reg_val >> e->shift_l) & e->mask;
|
||||
ucontrol->value.enumerated.item[0] = snd_soc_enum_val_to_item(e, val);
|
||||
@ -2875,7 +2877,7 @@ int snd_soc_dapm_get_enum_double(struct snd_kcontrol *kcontrol,
|
||||
ucontrol->value.enumerated.item[1] = val;
|
||||
}
|
||||
|
||||
return ret;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(snd_soc_dapm_get_enum_double);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user