Alsa-devel
Threads by month
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
February 2015
- 124 participants
- 245 discussions
[alsa-devel] [PATCH v2] ASoC: rt286: add jack detection enable/disable APIs and export
by Jie Yang 05 Feb '15
by Jie Yang 05 Feb '15
05 Feb '15
Some platforms, e.g. WSB, don't need jack detection when
system is in Suspend, for power save reason.
Here add jack detection enable/disable APIs and export them, when
disabled, it will ignore interrupt, and disable LDO1, which is
used for jack detection when headphone is plugged in.
Signed-off-by: Jie Yang <yang.jie(a)intel.com>
Reviewed-by: Bard Liao <bardliao(a)realtek.com>
---
sound/soc/codecs/rt286.c | 24 ++++++++++++++++++++++++
sound/soc/codecs/rt286.h | 2 ++
2 files changed, 26 insertions(+)
diff --git a/sound/soc/codecs/rt286.c b/sound/soc/codecs/rt286.c
index 8104d22..9ea01d0 100644
--- a/sound/soc/codecs/rt286.c
+++ b/sound/soc/codecs/rt286.c
@@ -400,6 +400,30 @@ int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack)
}
EXPORT_SYMBOL_GPL(rt286_mic_detect);
+int rt286_enable_jack_detection(struct snd_soc_codec *codec)
+{
+ struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
+
+ if (rt286->jack->status | SND_JACK_HEADPHONE)
+ snd_soc_dapm_force_enable_pin(&rt286->codec->dapm, "LDO1");
+ snd_soc_dapm_sync(&rt286->codec->dapm);
+ enable_irq(rt286->i2c->irq);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(rt286_enable_jack_detection);
+
+int rt286_disable_jack_detection(struct snd_soc_codec *codec)
+{
+ struct rt286_priv *rt286 = snd_soc_codec_get_drvdata(codec);
+
+ disable_irq(rt286->i2c->irq);
+
+ snd_soc_dapm_disable_pin(&rt286->codec->dapm, "LDO1");
+ snd_soc_dapm_sync(&rt286->codec->dapm);
+ return 0;
+}
+EXPORT_SYMBOL_GPL(rt286_disable_jack_detection);
+
static int is_mclk_mode(struct snd_soc_dapm_widget *source,
struct snd_soc_dapm_widget *sink)
{
diff --git a/sound/soc/codecs/rt286.h b/sound/soc/codecs/rt286.h
index b539b73..c958182 100644
--- a/sound/soc/codecs/rt286.h
+++ b/sound/soc/codecs/rt286.h
@@ -193,6 +193,8 @@ enum {
};
int rt286_mic_detect(struct snd_soc_codec *codec, struct snd_soc_jack *jack);
+int rt286_enable_jack_detection(struct snd_soc_codec *codec);
+int rt286_disable_jack_detection(struct snd_soc_codec *codec);
#endif /* __RT286_H__ */
--
1.9.1
3
3
[alsa-devel] [PATCH 1/2] ASoC: Intel:Add Cherrytrail & Braswell machine driver cht_bsw_rt5645
by yang.a.fang@intel.com 05 Feb '15
by yang.a.fang@intel.com 05 Feb '15
05 Feb '15
From: "Fang, Yang A" <yang.a.fang(a)intel.com>
Add machine driver for two Intel Cherryview-based platforms, Cherrytrail
and Braswell, with RT5645 codec
Signed-off-by: Fang, Yang A <yang.a.fang(a)intel.com>
---
sound/soc/intel/Kconfig | 11 ++
sound/soc/intel/Makefile | 2 +
sound/soc/intel/cht_bsw_rt5645.c | 317 ++++++++++++++++++++++++++++++++++++++
3 files changed, 330 insertions(+)
create mode 100644 sound/soc/intel/cht_bsw_rt5645.c
diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig
index f06fcf1..12093fd 100644
--- a/sound/soc/intel/Kconfig
+++ b/sound/soc/intel/Kconfig
@@ -110,3 +110,14 @@ config SND_SOC_INTEL_CHT_BSW_RT5672_MACH
platforms with RT5672 audio codec.
Say Y if you have such a device
If unsure select "N".
+
+config SND_SOC_INTEL_CHT_BSW_RT5645_MACH
+ tristate "ASoC Audio driver for Intel Cherrytrail & Braswell with RT5645 codec"
+ depends on X86_INTEL_LPSS
+ select SND_SOC_RT5645
+ select SND_SST_MFLD_PLATFORM
+ select SND_SST_IPC_ACPI
+ help
+ This adds support for ASoC machine driver for Intel(R) Cherrytrail & Braswell
+ platforms with RT5645 audio codec.
+ If unsure select "N".
diff --git a/sound/soc/intel/Makefile b/sound/soc/intel/Makefile
index e928ec3..a8e53c4 100644
--- a/sound/soc/intel/Makefile
+++ b/sound/soc/intel/Makefile
@@ -28,6 +28,7 @@ snd-soc-sst-byt-max98090-mach-objs := byt-max98090.o
snd-soc-sst-broadwell-objs := broadwell.o
snd-soc-sst-bytcr-dpcm-rt5640-objs := bytcr_dpcm_rt5640.o
snd-soc-sst-cht-bsw-rt5672-objs := cht_bsw_rt5672.o
+snd-soc-sst-cht-bsw-rt5645-objs := cht_bsw_rt5645.o
obj-$(CONFIG_SND_SOC_INTEL_HASWELL_MACH) += snd-soc-sst-haswell.o
obj-$(CONFIG_SND_SOC_INTEL_BYT_RT5640_MACH) += snd-soc-sst-byt-rt5640-mach.o
@@ -35,6 +36,7 @@ obj-$(CONFIG_SND_SOC_INTEL_BYT_MAX98090_MACH) += snd-soc-sst-byt-max98090-mach.o
obj-$(CONFIG_SND_SOC_INTEL_BROADWELL_MACH) += snd-soc-sst-broadwell.o
obj-$(CONFIG_SND_SOC_INTEL_BYTCR_RT5640_MACH) += snd-soc-sst-bytcr-dpcm-rt5640.o
obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_RT5672_MACH) += snd-soc-sst-cht-bsw-rt5672.o
+obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_RT5645_MACH) += snd-soc-sst-cht-bsw-rt5645.o
# DSP driver
obj-$(CONFIG_SND_SST_IPC) += sst/
diff --git a/sound/soc/intel/cht_bsw_rt5645.c b/sound/soc/intel/cht_bsw_rt5645.c
new file mode 100644
index 0000000..7a6f1e5
--- /dev/null
+++ b/sound/soc/intel/cht_bsw_rt5645.c
@@ -0,0 +1,317 @@
+/*
+ * cht-bsw-rt5645.c - ASoc Machine driver for Intel Cherryview-based platforms
+ * Cherrytrail and Braswell, with RT5645 codec.
+ *
+ * Copyright (C) 2014 Intel Corp
+ * Author: Fang, Yang A <yang.a.fang(a)intel.com>
+ * N,Harshapriya <harshapriya.n(a)intel.com>
+ * This file is modified from cht_bsw_rt5672.c
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ */
+
+#include <linux/module.h>
+#include <linux/platform_device.h>
+#include <linux/slab.h>
+#include <sound/pcm.h>
+#include <sound/pcm_params.h>
+#include <sound/soc.h>
+#include <sound/jack.h>
+#include "../codecs/rt5645.h"
+#include "sst-atom-controls.h"
+
+#define CHT_PLAT_CLK_3_HZ 19200000
+#define CHT_CODEC_DAI "rt5645-aif1"
+
+struct cht_mc_private {
+ struct snd_soc_jack hp_jack;
+ struct snd_soc_jack mic_jack;
+};
+
+static inline struct snd_soc_dai *cht_get_codec_dai(struct snd_soc_card *card)
+{
+ int i;
+
+ for (i = 0; i < card->num_rtd; i++) {
+ struct snd_soc_pcm_runtime *rtd;
+
+ rtd = card->rtd + i;
+ if (!strncmp(rtd->codec_dai->name, CHT_CODEC_DAI,
+ strlen(CHT_CODEC_DAI)))
+ return rtd->codec_dai;
+ }
+ return NULL;
+}
+
+static int platform_clock_control(struct snd_soc_dapm_widget *w,
+ struct snd_kcontrol *k, int event)
+{
+ struct snd_soc_dapm_context *dapm = w->dapm;
+ struct snd_soc_card *card = dapm->card;
+ struct snd_soc_dai *codec_dai;
+
+ codec_dai = cht_get_codec_dai(card);
+ if (!codec_dai) {
+ dev_err(card->dev, "Codec dai not found; Unable to set platform clock\n");
+ return -EIO;
+ }
+ if (!SND_SOC_DAPM_EVENT_OFF(event))
+ return 0;
+
+ /* Set codec sysclk source to its internal clock because codec PLL will
+ * be off when idle and MCLK will also be off by ACPI when codec is
+ * runtime suspended. Codec needs clock for jack detection and button
+ * press.
+ */
+ snd_soc_dai_set_sysclk(codec_dai, RT5645_SCLK_S_RCCLK,
+ 0, SND_SOC_CLOCK_IN);
+
+ return 0;
+}
+
+static const struct snd_soc_dapm_widget cht_dapm_widgets[] = {
+ SND_SOC_DAPM_HP("Headphone", NULL),
+ SND_SOC_DAPM_MIC("Headset Mic", NULL),
+ SND_SOC_DAPM_MIC("Int Mic", NULL),
+ SND_SOC_DAPM_SPK("Ext Spk", NULL),
+ SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0,
+ platform_clock_control, SND_SOC_DAPM_POST_PMD),
+};
+
+static const struct snd_soc_dapm_route cht_audio_map[] = {
+ {"IN1P", NULL, "Headset Mic"},
+ {"IN1N", NULL, "Headset Mic"},
+ {"DMIC L1", NULL, "Int Mic"},
+ {"DMIC R1", NULL, "Int Mic"},
+ {"Headphone", NULL, "HPOL"},
+ {"Headphone", NULL, "HPOR"},
+ {"Ext Spk", NULL, "SPOL"},
+ {"Ext Spk", NULL, "SPOR"},
+ {"AIF1 Playback", NULL, "ssp2 Tx"},
+ {"ssp2 Tx", NULL, "codec_out0"},
+ {"ssp2 Tx", NULL, "codec_out1"},
+ {"codec_in0", NULL, "ssp2 Rx" },
+ {"codec_in1", NULL, "ssp2 Rx" },
+ {"ssp2 Rx", NULL, "AIF1 Capture"},
+ {"Headphone", NULL, "Platform Clock"},
+ {"Headset Mic", NULL, "Platform Clock"},
+ {"Int Mic", NULL, "Platform Clock"},
+ {"Ext Spk", NULL, "Platform Clock"},
+};
+
+static const struct snd_kcontrol_new cht_mc_controls[] = {
+ SOC_DAPM_PIN_SWITCH("Headphone"),
+ SOC_DAPM_PIN_SWITCH("Headset Mic"),
+ SOC_DAPM_PIN_SWITCH("Int Mic"),
+ SOC_DAPM_PIN_SWITCH("Ext Spk"),
+};
+
+static int cht_aif1_hw_params(struct snd_pcm_substream *substream,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_soc_pcm_runtime *rtd = substream->private_data;
+ struct snd_soc_dai *codec_dai = rtd->codec_dai;
+ int ret;
+
+ /* set codec PLL source to the 19.2MHz platform clock (MCLK) */
+ ret = snd_soc_dai_set_pll(codec_dai, 0, RT5645_PLL1_S_MCLK,
+ CHT_PLAT_CLK_3_HZ, params_rate(params) * 512);
+ if (ret < 0) {
+ dev_err(rtd->dev, "can't set codec pll: %d\n", ret);
+ return ret;
+ }
+
+ ret = snd_soc_dai_set_sysclk(codec_dai, RT5645_SCLK_S_PLL1,
+ params_rate(params) * 512, SND_SOC_CLOCK_IN);
+ if (ret < 0) {
+ dev_err(rtd->dev, "can't set codec sysclk: %d\n", ret);
+ return ret;
+ }
+
+ return 0;
+}
+
+static int cht_codec_init(struct snd_soc_pcm_runtime *runtime)
+{
+ int ret;
+ struct snd_soc_codec *codec = runtime->codec;
+ struct snd_soc_dai *codec_dai = runtime->codec_dai;
+ struct cht_mc_private *ctx = snd_soc_card_get_drvdata(runtime->card);
+
+ /* Select clk_i2s1_asrc as ASRC clock source */
+ snd_soc_write(codec, RT5645_ASRC_2, 0x1111);
+
+ /* TDM 4 slots 24 bit, set Rx & Tx bitmask to 4 active slots */
+ ret = snd_soc_dai_set_tdm_slot(codec_dai, 0xF, 0xF, 4, 24);
+ if (ret < 0) {
+ dev_err(runtime->dev, "can't set codec TDM slot %d\n", ret);
+ return ret;
+ }
+
+ ret = snd_soc_jack_new(codec, "Headphone Jack",
+ SND_JACK_HEADPHONE,
+ &ctx->hp_jack);
+ if (ret) {
+ dev_err(runtime->dev, "Headphone jack creation failed\n");
+ return ret;
+ }
+
+ ret = snd_soc_jack_new(codec, "Mic Jack",
+ SND_JACK_MICROPHONE,
+ &ctx->mic_jack);
+ if (ret) {
+ dev_err(runtime->dev, "Mic jack creation failed\n");
+ return ret;
+ }
+
+ rt5645_set_jack_detect(codec, &ctx->hp_jack, &ctx->mic_jack);
+
+ return ret;
+}
+
+static int cht_codec_fixup(struct snd_soc_pcm_runtime *rtd,
+ struct snd_pcm_hw_params *params)
+{
+ struct snd_interval *rate = hw_param_interval(params,
+ SNDRV_PCM_HW_PARAM_RATE);
+ struct snd_interval *channels = hw_param_interval(params,
+ SNDRV_PCM_HW_PARAM_CHANNELS);
+
+ /* The DSP will covert the FE rate to 48k, stereo, 24bits */
+ rate->min = rate->max = 48000;
+ channels->min = channels->max = 2;
+
+ /* set SSP2 to 24-bit */
+ snd_mask_set(¶ms->masks[SNDRV_PCM_HW_PARAM_FORMAT -
+ SNDRV_PCM_HW_PARAM_FIRST_MASK],
+ SNDRV_PCM_FORMAT_S24_LE);
+ return 0;
+}
+
+static unsigned int rates_48000[] = {
+ 48000,
+};
+
+static struct snd_pcm_hw_constraint_list constraints_48000 = {
+ .count = ARRAY_SIZE(rates_48000),
+ .list = rates_48000,
+};
+
+static int cht_aif1_startup(struct snd_pcm_substream *substream)
+{
+ return snd_pcm_hw_constraint_list(substream->runtime, 0,
+ SNDRV_PCM_HW_PARAM_RATE,
+ &constraints_48000);
+}
+
+static struct snd_soc_ops cht_aif1_ops = {
+ .startup = cht_aif1_startup,
+};
+
+static struct snd_soc_ops cht_be_ssp2_ops = {
+ .hw_params = cht_aif1_hw_params,
+};
+
+static struct snd_soc_dai_link cht_dailink[] = {
+ [MERR_DPCM_AUDIO] = {
+ .name = "Audio Port",
+ .stream_name = "Audio",
+ .cpu_dai_name = "media-cpu-dai",
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .platform_name = "sst-mfld-platform",
+ .ignore_suspend = 1,
+ .dynamic = 1,
+ .dpcm_playback = 1,
+ .dpcm_capture = 1,
+ .ops = &cht_aif1_ops,
+ },
+ [MERR_DPCM_COMPR] = {
+ .name = "Compressed Port",
+ .stream_name = "Compress",
+ .cpu_dai_name = "compress-cpu-dai",
+ .codec_dai_name = "snd-soc-dummy-dai",
+ .codec_name = "snd-soc-dummy",
+ .platform_name = "sst-mfld-platform",
+ },
+ /* CODEC<->CODEC link */
+ /* back ends */
+ {
+ .name = "SSP2-Codec",
+ .be_id = 1,
+ .cpu_dai_name = "ssp2-port",
+ .platform_name = "sst-mfld-platform",
+ .no_pcm = 1,
+ .codec_dai_name = "rt5645-aif1",
+ .codec_name = "i2c-10EC5645:00",
+ .dai_fmt = SND_SOC_DAIFMT_DSP_B | SND_SOC_DAIFMT_IB_NF
+ | SND_SOC_DAIFMT_CBS_CFS,
+ .init = cht_codec_init,
+ .be_hw_params_fixup = cht_codec_fixup,
+ .ignore_suspend = 1,
+ .dpcm_playback = 1,
+ .dpcm_capture = 1,
+ .ops = &cht_be_ssp2_ops,
+ },
+};
+
+/* SoC card */
+static struct snd_soc_card snd_soc_card_cht = {
+ .name = "chtrt5645",
+ .dai_link = cht_dailink,
+ .num_links = ARRAY_SIZE(cht_dailink),
+ .dapm_widgets = cht_dapm_widgets,
+ .num_dapm_widgets = ARRAY_SIZE(cht_dapm_widgets),
+ .dapm_routes = cht_audio_map,
+ .num_dapm_routes = ARRAY_SIZE(cht_audio_map),
+ .controls = cht_mc_controls,
+ .num_controls = ARRAY_SIZE(cht_mc_controls),
+};
+
+static int snd_cht_mc_probe(struct platform_device *pdev)
+{
+ int ret_val = 0;
+ struct cht_mc_private *drv;
+
+ drv = devm_kzalloc(&pdev->dev, sizeof(*drv), GFP_ATOMIC);
+ if (!drv)
+ return -ENOMEM;
+
+ /* register the soc card */
+ snd_soc_card_cht.dev = &pdev->dev;
+ snd_soc_card_set_drvdata(&snd_soc_card_cht, drv);
+ ret_val = devm_snd_soc_register_card(&pdev->dev, &snd_soc_card_cht);
+ if (ret_val) {
+ dev_err(&pdev->dev,
+ "snd_soc_register_card failed %d\n", ret_val);
+ return ret_val;
+ }
+ platform_set_drvdata(pdev, &snd_soc_card_cht);
+ return ret_val;
+}
+
+static struct platform_driver snd_cht_mc_driver = {
+ .driver = {
+ .owner = THIS_MODULE,
+ .name = "cht-bsw-rt5645",
+ .pm = &snd_soc_pm_ops,
+ },
+ .probe = snd_cht_mc_probe,
+};
+
+module_platform_driver(snd_cht_mc_driver)
+
+MODULE_DESCRIPTION("ASoC Intel(R) Braswell Machine driver");
+MODULE_AUTHOR("Fang, Yang A,N,Harshapriya");
+MODULE_LICENSE("GPL v2");
+MODULE_ALIAS("platform:cht-bsw-rt5645");
--
1.7.9.5
3
13
05 Feb '15
For runtime suspend/resume, it is some different with suspend/resume,
e.g. codec power supply won't be switch off, codec jack detection
still working(to wake up system from Jack event), won't call call
snd_soc_suspend/resume, etc.
So here, we add a platform PM status, HSW_PM_STATE_RTD3, to make
the status more clear, when in idle, it will enter this status, to
transfer from HSW_PM_STATE_RTD3 to HSW_PM_STATE_D3, we will do those
extra jobs, and vice versa for resuming.
Signed-off-by: Jie Yang <yang.jie(a)intel.com>
---
sound/soc/intel/sst-haswell-pcm.c | 70 ++++++++++++++++++++-------------------
1 file changed, 36 insertions(+), 34 deletions(-)
diff --git a/sound/soc/intel/sst-haswell-pcm.c b/sound/soc/intel/sst-haswell-pcm.c
index ad7f4a5..78fa01b 100644
--- a/sound/soc/intel/sst-haswell-pcm.c
+++ b/sound/soc/intel/sst-haswell-pcm.c
@@ -119,8 +119,9 @@ struct hsw_pcm_data {
};
enum hsw_pm_state {
- HSW_PM_STATE_D3 = 0,
- HSW_PM_STATE_D0 = 1,
+ HSW_PM_STATE_D0 = 0,
+ HSW_PM_STATE_RTD3 = 1,
+ HSW_PM_STATE_D3 = 2,
};
/* private data for the driver */
@@ -1035,12 +1036,12 @@ static int hsw_pcm_runtime_suspend(struct device *dev)
struct hsw_priv_data *pdata = dev_get_drvdata(dev);
struct sst_hsw *hsw = pdata->hsw;
- if (pdata->pm_state == HSW_PM_STATE_D3)
+ if (pdata->pm_state >= HSW_PM_STATE_RTD3)
return 0;
sst_hsw_dsp_runtime_suspend(hsw);
sst_hsw_dsp_runtime_sleep(hsw);
- pdata->pm_state = HSW_PM_STATE_D3;
+ pdata->pm_state = HSW_PM_STATE_RTD3;
return 0;
}
@@ -1051,7 +1052,7 @@ static int hsw_pcm_runtime_resume(struct device *dev)
struct sst_hsw *hsw = pdata->hsw;
int ret;
- if (pdata->pm_state == HSW_PM_STATE_D0)
+ if (pdata->pm_state != HSW_PM_STATE_RTD3)
return 0;
ret = sst_hsw_dsp_load(hsw);
@@ -1091,7 +1092,7 @@ static void hsw_pcm_complete(struct device *dev)
struct hsw_pcm_data *pcm_data;
int i, err;
- if (pdata->pm_state == HSW_PM_STATE_D0)
+ if (pdata->pm_state != HSW_PM_STATE_D3)
return;
err = sst_hsw_dsp_load(hsw);
@@ -1139,41 +1140,42 @@ static int hsw_pcm_prepare(struct device *dev)
if (pdata->pm_state == HSW_PM_STATE_D3)
return 0;
- /* suspend all active streams */
- for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
- pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
+ else if (pdata->pm_state == HSW_PM_STATE_D0) {
+ /* suspend all active streams */
+ for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
+ pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
+
+ if (!pcm_data->substream)
+ continue;
+ dev_dbg(dev, "suspending pcm %d\n", i);
+ snd_pcm_suspend_all(pcm_data->hsw_pcm);
+
+ /* We need to wait until the DSP FW stops the streams */
+ msleep(2);
+ }
- if (!pcm_data->substream)
- continue;
- dev_dbg(dev, "suspending pcm %d\n", i);
- snd_pcm_suspend_all(pcm_data->hsw_pcm);
+ /* preserve persistent memory */
+ for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
+ pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
+
+ if (!pcm_data->substream)
+ continue;
- /* We need to wait until the DSP FW stops the streams */
- msleep(2);
+ dev_dbg(dev, "saving context pcm %d\n", i);
+ err = sst_module_runtime_save(pcm_data->runtime,
+ &pcm_data->context);
+ if (err < 0)
+ dev_err(dev, "failed to save context for PCM %d\n", i);
+ }
+ /* enter D3 state and stall */
+ sst_hsw_dsp_runtime_suspend(hsw);
+ /* put the DSP to sleep */
+ sst_hsw_dsp_runtime_sleep(hsw);
}
snd_soc_suspend(pdata->soc_card->dev);
snd_soc_poweroff(pdata->soc_card->dev);
- /* enter D3 state and stall */
- sst_hsw_dsp_runtime_suspend(hsw);
-
- /* preserve persistent memory */
- for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
- pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
-
- if (!pcm_data->substream)
- continue;
-
- dev_dbg(dev, "saving context pcm %d\n", i);
- err = sst_module_runtime_save(pcm_data->runtime,
- &pcm_data->context);
- if (err < 0)
- dev_err(dev, "failed to save context for PCM %d\n", i);
- }
-
- /* put the DSP to sleep */
- sst_hsw_dsp_runtime_sleep(hsw);
pdata->pm_state = HSW_PM_STATE_D3;
return 0;
--
1.9.1
2
1
[alsa-devel] [PATCH] linux-firmware: update firmware for Intel Broadwell SST DSP
by Jie Yang 05 Feb '15
by Jie Yang 05 Feb '15
05 Feb '15
Update firmware intel/IntcSST2.bin from Version 8.4.1.68 to 8.4.1.77
Fix for freeing capture stream just after resetting it.
Signed-off-by: Jie Yang <yang.jie(a)intel.com>
---
WHENCE | 1 +
intel/IntcSST2.bin | Bin 260256 -> 260320 bytes
2 files changed, 1 insertion(+)
diff --git a/WHENCE b/WHENCE
index 7f2d6bf..6cb0778 100644
--- a/WHENCE
+++ b/WHENCE
@@ -2646,6 +2646,7 @@ Licence: Redistributable. See LICENCE.it913x for details
Driver: snd_soc_sst_acpi
File: intel/IntcSST2.bin
+Version: 8.4.1.77
License: Redistributable. See LICENCE.IntcSST2 for details
diff --git a/intel/IntcSST2.bin b/intel/IntcSST2.bin
index 69ac37e78582dc5971b56eb598f43821958a9a59..e11cb61f4a00bf32a304781e3e9b1f32775285e1 100644
GIT binary patch
delta 35726
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
H$jAK;0ejN$
delta 35651
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
QY}2_zyzbl~8@I{-2ZzDF#sB~S
--
1.9.1
1
0
05 Feb '15
For runtime suspend/resume, it is some different with suspend/resume,
e.g. codec power supply won't be switch off, codec jack detection
still working(to wake up system from Jack event), won't call call
snd_soc_suspend/resume, etc.
So here, we add a platform PM status, HSW_PM_STATE_RTD3, to make
the status more clear, when in idle, it will enter this status, to
transfer from HSW_PM_STATE_RTD3 to HSW_PM_STATE_D3, we will do those
extra jobs, and vice versa for resuming.
Signed-off-by: Jie Yang <yang.jie(a)intel.com>
---
sound/soc/intel/sst-haswell-pcm.c | 70 ++++++++++++++++++++-------------------
1 file changed, 36 insertions(+), 34 deletions(-)
diff --git a/sound/soc/intel/sst-haswell-pcm.c b/sound/soc/intel/sst-haswell-pcm.c
index ad7f4a5..edf8eaf 100644
--- a/sound/soc/intel/sst-haswell-pcm.c
+++ b/sound/soc/intel/sst-haswell-pcm.c
@@ -119,8 +119,9 @@ struct hsw_pcm_data {
};
enum hsw_pm_state {
- HSW_PM_STATE_D3 = 0,
- HSW_PM_STATE_D0 = 1,
+ HSW_PM_STATE_D0 = 0,
+ HSW_PM_STATE_RTD3 = 1,
+ HSW_PM_STATE_D3 = 2,
};
/* private data for the driver */
@@ -1035,12 +1036,12 @@ static int hsw_pcm_runtime_suspend(struct device *dev)
struct hsw_priv_data *pdata = dev_get_drvdata(dev);
struct sst_hsw *hsw = pdata->hsw;
- if (pdata->pm_state == HSW_PM_STATE_D3)
+ if (pdata->pm_state >= HSW_PM_STATE_RTD3)
return 0;
sst_hsw_dsp_runtime_suspend(hsw);
sst_hsw_dsp_runtime_sleep(hsw);
- pdata->pm_state = HSW_PM_STATE_D3;
+ pdata->pm_state = HSW_PM_STATE_RTD3;
return 0;
}
@@ -1051,7 +1052,7 @@ static int hsw_pcm_runtime_resume(struct device *dev)
struct sst_hsw *hsw = pdata->hsw;
int ret;
- if (pdata->pm_state == HSW_PM_STATE_D0)
+ if (pdata->pm_state != HSW_PM_STATE_RTD3)
return 0;
ret = sst_hsw_dsp_load(hsw);
@@ -1091,7 +1092,7 @@ static void hsw_pcm_complete(struct device *dev)
struct hsw_pcm_data *pcm_data;
int i, err;
- if (pdata->pm_state == HSW_PM_STATE_D0)
+ if (pdata->pm_state != HSW_PM_STATE_D3)
return;
err = sst_hsw_dsp_load(hsw);
@@ -1139,41 +1140,42 @@ static int hsw_pcm_prepare(struct device *dev)
if (pdata->pm_state == HSW_PM_STATE_D3)
return 0;
- /* suspend all active streams */
- for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
- pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
+ else if (pdata->pm_state == HSW_PM_STATE_D0){
+ /* suspend all active streams */
+ for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
+ pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
+
+ if (!pcm_data->substream)
+ continue;
+ dev_dbg(dev, "suspending pcm %d\n", i);
+ snd_pcm_suspend_all(pcm_data->hsw_pcm);
+
+ /* We need to wait until the DSP FW stops the streams */
+ msleep(2);
+ }
- if (!pcm_data->substream)
- continue;
- dev_dbg(dev, "suspending pcm %d\n", i);
- snd_pcm_suspend_all(pcm_data->hsw_pcm);
+ /* preserve persistent memory */
+ for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
+ pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
+
+ if (!pcm_data->substream)
+ continue;
- /* We need to wait until the DSP FW stops the streams */
- msleep(2);
+ dev_dbg(dev, "saving context pcm %d\n", i);
+ err = sst_module_runtime_save(pcm_data->runtime,
+ &pcm_data->context);
+ if (err < 0)
+ dev_err(dev, "failed to save context for PCM %d\n", i);
+ }
+ /* enter D3 state and stall */
+ sst_hsw_dsp_runtime_suspend(hsw);
+ /* put the DSP to sleep */
+ sst_hsw_dsp_runtime_sleep(hsw);
}
snd_soc_suspend(pdata->soc_card->dev);
snd_soc_poweroff(pdata->soc_card->dev);
- /* enter D3 state and stall */
- sst_hsw_dsp_runtime_suspend(hsw);
-
- /* preserve persistent memory */
- for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
- pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
-
- if (!pcm_data->substream)
- continue;
-
- dev_dbg(dev, "saving context pcm %d\n", i);
- err = sst_module_runtime_save(pcm_data->runtime,
- &pcm_data->context);
- if (err < 0)
- dev_err(dev, "failed to save context for PCM %d\n", i);
- }
-
- /* put the DSP to sleep */
- sst_hsw_dsp_runtime_sleep(hsw);
pdata->pm_state = HSW_PM_STATE_D3;
return 0;
--
1.9.1
2
1
[alsa-devel] [PATCH 1/2] ALSA: Add a helper to add a new attribute group to card
by Takashi Iwai 05 Feb '15
by Takashi Iwai 05 Feb '15
05 Feb '15
For assigning sysfs entries for a card device from the driver,
introduce a new helper function, snd_card_add_dev_attr(). In this
way, we can avoid the possible race between the device registration
and the sysfs addition / removal.
The driver can pass a new attribute group to add freely. This has to
be called before snd_card_register().
Currently, up to two extra groups can be added. More than that, it'll
return an error.
Signed-off-by: Takashi Iwai <tiwai(a)suse.de>
---
include/sound/core.h | 3 +++
sound/core/init.c | 31 +++++++++++++++++++++++++------
2 files changed, 28 insertions(+), 6 deletions(-)
diff --git a/include/sound/core.h b/include/sound/core.h
index 58882bfacdd7..da5748289968 100644
--- a/include/sound/core.h
+++ b/include/sound/core.h
@@ -132,6 +132,7 @@ struct snd_card {
struct completion *release_completion;
struct device *dev; /* device assigned to this card */
struct device card_dev; /* cardX object for sysfs */
+ const struct attribute_group *dev_groups[4]; /* assigned sysfs attr */
bool registered; /* card_dev is registered? */
#ifdef CONFIG_PM
@@ -262,6 +263,8 @@ void snd_card_set_id(struct snd_card *card, const char *id);
int snd_card_register(struct snd_card *card);
int snd_card_info_init(void);
int snd_card_info_done(void);
+int snd_card_add_dev_attr(struct snd_card *card,
+ const struct attribute_group *group);
int snd_component_add(struct snd_card *card, const char *component);
int snd_card_file_add(struct snd_card *card, struct file *file);
int snd_card_file_remove(struct snd_card *card, struct file *file);
diff --git a/sound/core/init.c b/sound/core/init.c
index 96194599e82e..35419054821c 100644
--- a/sound/core/init.c
+++ b/sound/core/init.c
@@ -181,7 +181,7 @@ void snd_device_initialize(struct device *dev, struct snd_card *card)
EXPORT_SYMBOL_GPL(snd_device_initialize);
static int snd_card_do_free(struct snd_card *card);
-static const struct attribute_group *card_dev_attr_groups[];
+static const struct attribute_group card_dev_attr_group;
static void release_card_device(struct device *dev)
{
@@ -269,7 +269,8 @@ int snd_card_new(struct device *parent, int idx, const char *xid,
card->card_dev.parent = parent;
card->card_dev.class = sound_class;
card->card_dev.release = release_card_device;
- card->card_dev.groups = card_dev_attr_groups;
+ card->card_dev.groups = card->dev_groups;
+ card->dev_groups[0] = &card_dev_attr_group;
err = kobject_set_name(&card->card_dev.kobj, "card%d", idx);
if (err < 0)
goto __error;
@@ -700,14 +701,32 @@ static struct attribute *card_dev_attrs[] = {
NULL
};
-static struct attribute_group card_dev_attr_group = {
+static const struct attribute_group card_dev_attr_group = {
.attrs = card_dev_attrs,
};
-static const struct attribute_group *card_dev_attr_groups[] = {
- &card_dev_attr_group,
- NULL
+/**
+ * snd_card_add_dev_attr - Append a new sysfs attribute group to card
+ * @card: card instance
+ * @group: attribute group to append
+ */
+int snd_card_add_dev_attr(struct snd_card *card,
+ const struct attribute_group *group)
+{
+ int i;
+
+ /* loop for (arraysize-1) here to keep NULL at the last entry */
+ for (i = 0; i < ARRAY_SIZE(card->dev_groups) - 1; i++) {
+ if (!card->dev_groups[i]) {
+ card->dev_groups[i] = group;
+ return 0;
+ }
+ }
+
+ dev_err(card->dev, "Too many groups assigned\n");
+ return -ENOSPC;
};
+EXPORT_SYMBOL_GPL(snd_card_add_dev_attr);
/**
* snd_card_register - register the soundcard
--
2.2.2
1
1
The following changes since commit e36f014edff70fc02b3d3d79cead1d58f289332e:
Linux 3.19-rc7 (2015-02-01 20:07:21 -0800)
are available in the git repository at:
git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git tags/asoc-v3.20-2
for you to fetch changes up to 16ca41c6cc904d7eb9e92afc5f576e375c314f90:
Merge remote-tracking branches 'asoc/topic/wm8960', 'asoc/topic/wm8988' and 'asoc/topic/xtfpga' into asoc-next (2015-02-04 20:57:26 +0000)
----------------------------------------------------------------
ASoC: Updates for v3.20
More updates for v3.20:
- Lots of refactoring from Lars-Peter Clausen, moving drivers to more
data driven initialization and rationalizing a lot of DAPM usage.
- Much improved handling of CDCLK clocks on Samsung I2S controllers.
- Lots of driver specific cleanups and feature improvements.
- CODEC support for TI PCM514x and TLV320AIC3104 devices.
- Board support for Tegra systems with Realtek RT5677.
----------------------------------------------------------------
Alexander Morozov (1):
ASoC: wm8904: add dt ids table
Alexandre Belloni (2):
ASoC: atmel: sam9g20_wm8731: remove useless include
Asoc: sam9x5_wm8731: depend on ARCH_AT91 instead of SOC_AT91SAM9X5
Anatol Pomozov (3):
ASoC: tegra: Add platform driver for rt5677 audio codec
ASoC: ts3a227e: Remap keys to match Android headset specification
ASoC: ts3a227e: Add dts property that allows to specify micbias voltage
Andrew Jackson (9):
ASoC: dwc: Remove unnecessary debug messages and tests
ASoC: dwc: Reorder code in preparation for DT support
ASoC: dwc: Switch to managed clock resource
ASoC: dwc: Read I2S block configuration from registers
ASoC: dwc: Prepare clock before use
ASoC: dwc: Register components with managed interface
ASoC: dwc: Add documentation for I2S DT
ASoC: dwc: Add devicetree support for Designware I2S
ASoC: dwc: Remove unnecessary conditional compilation
Arnd Bergmann (3):
ASoC: davinci: fix DM365_EVM codec selection
ASoC: rt5677: fix SPI dependency
ASoC: pxa: make TTC DKB tristate
Bard Liao (6):
ASoC: rt5670: set platform data by dmi
ASoC: rt5670: Add runtime PM support
ASoC: rt5670: Keep sysclk on if JD func is used
ASoC: rt5670: redefine ASRC control registers 0x84 and 0x85
ASoC: rt286: Fix capture volume setting issue
ASoC: rt5645: Add rt5650 codec support
Bo Shen (7):
ASoC: atmel_ssc_dai: fix start event for I2S mode
ASoC: atmel_ssc_dai: remove clock pin comments
ASoC: wm8904: add new compatible string
ASoC: atmel_ssc_dai: fix the setting for DSP mode
ASoC: atmel_ssc_dai: refactor the startup and shutdown
ASoC: atmel_ssc_dai: only clean PDC when using PDC
ASoC: atmel-pcm-dma: won't check direction when configure dma
Charles Keepax (2):
ASoC: arizona: Add delay for output disable
ASoC: arizona: Coalesce output power up delays
Dan Carpenter (1):
ASoC: Intel: remove an unused struct member
Eric Nelson (1):
ASoC: sgtl5000: add delay before first I2C access
Fabio Estevam (10):
ASoC: fsl_spdif: Use dev_name() for registering the irq
ASoC: fsl_asrc: Use dev_name() for registering the irq
ASoC: mxs-saif: Do not store the irq number in the private structure
ASoC: fsl_ssi: Make error message concise
ASoC: fsl_asrc: Make error message concise
ASoC: fsl_sai: Make error message concise
ASoC: fsl_esai: Make error message concise
ASoC: fsl_spdif: Make error message concise
ASoC: fsl_ssi: Change irq type to 'int'
ASoC: fsl: imx-spdif: Set the card owner field
Fang, Yang A (1):
ASoC: Intel: Add support rt5645 in sst driver
Filip Brozovic (1):
ASoC: sgtl5000: Use shift mask when setting codec mode
Jarkko Nikula (2):
ASoC: pcm: Fix vague codec and cpu DAI prepare error messages
ASoC: rt5640: Add RT5642 ACPI ID for Intel Baytrail
Jianqun Xu (1):
ASoC: rockchip: i2s: set TDL and RDL to 16 samples
Jie Yang (8):
ASoC: Intel: Store the entry_point read from FW file
ASoC: Intel: Always enable DRAM block for FW dump
ASoC: Intel: Add stream direction for pcm-module map
ASoC: Intel: Split hsw_pcm_data for playback and capture
ASoC: Intel: initial stream_hw_id to invalid value
ASoC: Intel: Used lock version to update shim registers
MAINTAINERS: ASoC: add maintainer for Intel BDW/HSW ASoC driver
ASoC: Intel: initial scalar variable ba
Jyri Sarha (3):
ASoC: simple-card: Enable and disable DAI clocks as needed
ASoC: tlv320aic3x: Add support for tlv320aic3104
ASoC: tlv320aic3x: Fix bad comment before intercon_extra_3104 definition
Krzysztof Kozlowski (8):
ASoC: alc5632: Constify struct regmap_config and snd_soc_codec_driver
ASoC: cs35l32: Constify struct regmap_config and snd_soc_codec_driver
ASoC: cs42l52: Constify struct regmap_config and snd_soc_codec_driver
ASoC: cs42l56: Constify struct regmap_config and snd_soc_codec_driver
ASoC: cs42l73: Constify struct regmap_config and snd_soc_codec_driver
ASoC: wm8804: Constify struct regmap_config and snd_soc_codec_driver
ASoC: wm8988: Constify struct regmap_config and snd_soc_codec_driver
ASoC: wm8804: Constify struct regmap_config and snd_soc_codec_driver
Kuninori Morimoto (19):
ASoC: rsnd: add recovery support for under/over flow error on SRC
ASoC: rsnd: remove unsed .rate
ASoC: rsnd: tidyup rsnd_io_to_xxx() macro declaration position
ASoC: rsnd: rsnd_mod controls clock
ASoC: rsnd: rename rsnd_dai_get() to rsnd_rdai_get()
ASoC: rsnd: rename rsnd_dai_is_clk_master() to rsnd_rdai_is_clk_master()
ASoC: rsnd: remove unused rsnd_dai_id()
ASoC: rsnd: remove rsnd_dai_get_platform_info() macro
ASoC: rsnd: add rsnd_io_to_rdai()
ASoC: rsnd: replace rsnd_dai_is_play() to rsnd_io_is_play()
ASoC: rsnd: remove unsed rdai parameter from each function
ASoC: rsnd: replace rdai to priv in each function
ASoC: rsnd: save priv in struct rsnd_dai
ASoC: rsnd: error meesage indicates its port
ASoC: rsnd: ignore DIRQ when DMA transfer
ASoC: rsnd: tidyup DMA start/stop timing on SSI
ASoC: rsnd: tidyup DVC/SRC/SSI order
ASoC: rsnd: call missing snd_ctl_remove()
ASoC: rsnd: call missing snd_soc_unregiter_component/platform()
Lad, Prabhakar (1):
ASoC: ts3a227e: fix sparse warning
Lars-Peter Clausen (109):
ASoC: wm8750: Make VREF a VMID instead of OUTPUT widget
ASoC: wm8750: Cleanup manual bias level transitions
ASoC: dapm: Don't mark MICBIAS widgets as auto non-connected
ASoC: dapm: Simplify fully route card handling
ASoC: dmaengine: Remove unnecessary snd_pcm_lib_preallocate_free_for_all()
ASoC: au1x: Remove unnecessary snd_pcm_lib_preallocate_free_for_all()
ASoC: nuc900: Remove unnecessary snd_pcm_lib_preallocate_free_for_all()
ASoC: rcar: Remove unnecessary snd_pcm_lib_preallocate_free_for_all()
ASoC: sh: Remove unnecessary snd_pcm_lib_preallocate_free_for_all()
ASoC: txx9: Remove unnecessary snd_pcm_lib_preallocate_free_for_all()
ASoC: broadwell: Drop unnecessary snd_soc_dapm_enable() calls
ASoC: byt-rt5640: Fix snd_soc_dapm_ignore_suspend() calls
ASoC: byt-rt5640: Register microphone routes with the card DAPM context
ASoC: intel: Remove unnecessary snd_pcm_lib_preallocate_free_for_all()
ASoC: sam9g20_wm8731: Use static DAI format setup
ASoC: db1200: Use static DAI format setup
ASoC: eureka-tlv320: Use static DAI format setup
ASoC: mx27vis-aci32x4: Use static DAI format setup
ASoC: wm1133-ev1: Use static DAI format setup
ASoC: mxs-sgtl5000: Use static DAI format setup
ASoC: ams-delta: Use static DAI format setup
ASoC: raumfeld: Use static DAI format setup
ASoC: zylonite: Use static DAI format setup
ASoC: goni_wm8994: Use static DAI format setup
ASoC: h1940_uda1380: Use static DAI format setup
ASoC: jive_wm8750: Use static DAI format setup
ASoC: neo1973_wm8753: Use static DAI format setup
ASoC: rx1950_uda1380: Use static DAI format setup
ASoC: s3c24xx_simtec: Use static DAI format setup
ASoC: s3c24xx_uda134x: Use static DAI format setup
ASoC: smartq_wm8987: Use static DAI format setup
ASoC: smdk_wm8580: Use static DAI format setup
ASoC: smdk_wm8570pcm: Use static DAI format setup
ASoC: smdk_wm8994pcm: Use static DAI format setup
ASoC: migor: Use static DAI format setup
ASoC: Add helper function for changing the DAI link format
ASoC: omap-twl4030: Use snd_soc_runtime_set_dai_fmt()
ASoC: mop500_ab8500: Use snd_soc_runtime_set_dai_fmt()
ASoC: Export snd_soc_runtime_set_dai_fmt()
ASoC: ttc-dkb: Remove unnecessary snd_soc_dapm_disable_pin() calls
ASoC: corgi: Automatically disconnect non-connected pins
ASoC: e740: Automatically disconnect non-connected pins
ASoC: e750: Automatically disconnect non-connected pins
ASoC: hx4700: Automatically disconnect non-connected pins
ASoC: magician: Automatically disconnect non-connected pins
ASoC: palm27x: Fix microphone route
ASoC: palm27x: Automatically disconnect non-connected pins
ASoC: spitz: Automatically disconnect non-connected pins
ASoC: ad193x: Don't power down DAC in CODEC probe
ASoC: mc13783: Update set_tdm_slot() semantics
ASoC: fsl: Update set_tdm_slot() semantics
ASoC: fsl: Remove fsl_asoc_xlate_tdm_slot_mask()
ASoC: Update snd_soc_dai_set_tdm_slot() documentation
ASoC: 88pm860x: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: ak4671: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: da732x: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: sgtl5000: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: sn95031: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: arizona: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm2000: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm5102: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm5102: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm5110: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8350: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8400: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8731: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8770: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8900: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8903: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8904: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8955: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8961: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8961: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8962: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8988: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8990: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8991: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8993: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8995: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8995: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8996: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm8997: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm9081: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm9090: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm9713: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm_adsp: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: wm_hubs: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: mioa701_wm9713: Fix speaker event
ASoC: pcm3008: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: tlv320aic31xx: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: tlv320aic3x: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: tlv320dac33: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: twl4030: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: twl6040: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: alc5623: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: alc5632: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: rt286: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: rt5631: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: rt5640: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: rt5645: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: rt5651: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: rt5670: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: rt5677: Replace w->codec snd_soc_dapm_to_codec(w->dapm)
ASoC: Remove codec field from snd_soc_dapm_widget
ASoC: jive: Automatically disconnect non-connected pins
ASoC: smdk_wm8580: Pass card DAPM context to snd_soc_dapm_disable_pin()
ASoC: samsung: Replace depends on REGMAP_I2C with depends on I2C
ASoC: Add support for allocating AC'97 device before registering it
ASoC: wm97xx: Reset AC'97 device before registering it
Manuel Lauss (1):
ASoC: wm8731: init mutex in i2c init path
Mark Brown (27):
ASoC: dapm: Don't use async I/O
Merge branch 'topic/rt5670' of git://git.kernel.org/.../broonie/sound into asoc-intel
Merge remote-tracking branch 'asoc/fix/fsl-ssi' into asoc-fsl
Merge branch 'topic/rt5677' of git://git.kernel.org/.../broonie/sound into asoc-w-codec
Merge branch 'topic/dai' of git://git.kernel.org/.../broonie/sound into asoc-samsung
Merge branch 'fix/atmel' of git://git.kernel.org/.../broonie/sound into asoc-atmel
Merge branch 'topic/rt286' of git://git.kernel.org/.../broonie/sound into asoc-w-codec
Merge branch 'fix/rt5677' of git://git.kernel.org/.../broonie/sound into asoc-w-codec
Merge branch 'topic/arizona' of git://git.kernel.org/.../broonie/sound into asoc-w-codec
Merge remote-tracking branches 'asoc/fix/ac97', 'asoc/fix/atmel', 'asoc/fix/intel', 'asoc/fix/rt286', 'asoc/fix/rt5640', 'asoc/fix/sgtl5000', 'asoc/fix/sta32x', 'asoc/fix/tlv320aic3x' and 'asoc/fix/wm8731' into asoc-linus
Merge remote-tracking branch 'asoc/topic/core' into asoc-next
Merge remote-tracking branch 'asoc/topic/dapm' into asoc-next
Merge remote-tracking branch 'asoc/topic/dmaengine' into asoc-next
Merge remote-tracking branch 'asoc/topic/pcm' into asoc-next
Merge remote-tracking branch 'asoc/topic/pcm512x' into asoc-next
Merge remote-tracking branch 'asoc/topic/w-codec' into asoc-next
Merge remote-tracking branches 'asoc/topic/ad193x', 'asoc/topic/alc5632', 'asoc/topic/atmel' and 'asoc/topic/au1x' into asoc-next
Merge remote-tracking branches 'asoc/topic/bt-sco', 'asoc/topic/cs35l32', 'asoc/topic/cs42l52' and 'asoc/topic/cs42l56' into asoc-next
Merge remote-tracking branches 'asoc/topic/cs42l73', 'asoc/topic/dai' and 'asoc/topic/davinci' into asoc-next
Merge remote-tracking branches 'asoc/topic/doc', 'asoc/topic/dwc', 'asoc/topic/fsi', 'asoc/topic/fsl' and 'asoc/topic/fsl-asrc' into asoc-next
Merge remote-tracking branches 'asoc/topic/fsl-spdif', 'asoc/topic/imx', 'asoc/topic/intel', 'asoc/topic/mxs-saif' and 'asoc/topic/nuc900' into asoc-next
Merge remote-tracking branches 'asoc/topic/omap', 'asoc/topic/pxa' and 'asoc/topic/rcar' into asoc-next
Merge remote-tracking branches 'asoc/topic/rockchip', 'asoc/topic/rt5645' and 'asoc/topic/rt5677' into asoc-next
Merge remote-tracking branches 'asoc/topic/rx51', 'asoc/topic/samsung', 'asoc/topic/sh', 'asoc/topic/simple' and 'asoc/topic/sta32x' into asoc-next
Merge remote-tracking branches 'asoc/topic/tdm-slot', 'asoc/topic/tegra', 'asoc/topic/tlv320aic3x', 'asoc/topic/ts3a227e' and 'asoc/topic/ts3a277e' into asoc-next
Merge remote-tracking branches 'asoc/topic/txx9', 'asoc/topic/wm8750', 'asoc/topic/wm8804' and 'asoc/topic/wm8904' into asoc-next
Merge remote-tracking branches 'asoc/topic/wm8960', 'asoc/topic/wm8988' and 'asoc/topic/xtfpga' into asoc-next
Markus Elfring (3):
ASoC: Intel: Delete an unnecessary check before the function call "sst_dma_free"
ASoC: fsi: Deletion of unnecessary checks before the function call "clk_enable"
ASoC: Intel: Delete an unnecessary check before the function call "release_firmware"
Masanari Iida (2):
ASoC: Fix typo in bt-sco.c
ASoC: Fix warning with make xmldocs caused by soc-devres.c
Max Filippov (1):
ASoC: add xtensa xtfpga I2S interface and platform
Mengdong Lin (2):
ASoC: rt5670: add API to select ASRC clock source
ASoC: Intel: Select RT5672 ASRC clock source on Cherrytrail and Braswell
Oder Chiou (6):
ASoC: rt5677: Revise the filter powers
ASoC: rt5677: Add the ASRC support
ASoC: rt5677: Adjust the routing of "PLL1"
ASoC: rt5677: Add the MICBIAS VDD setting in the platform data
ASoC: rt5677: Use the regmap functions instead of the snd_soc functions
ASoC: rt5677: Add the slot_width "25" support in the TDM mode
Peter Rosin (10):
ASoC: pcm512x: Also support PCM514x devices
ALSA: pcm: Add snd_interval_ranges() and snd_pcm_hw_constraint_ranges()
ASoC: pcm512x: Fix spelling of register field names.
ASoC: pcm512x: Support mastering BCLK/LRCLK without using the PLL
ASoC: pcm512x: Support mastering BCLK/LRCLK using the PLL
ASoC: pcm512x: Avoid the PLL for the DAC clock, if possible
ASoC: pcm512x: Support SND_SOC_DAIFMT_CBM_CFS
ASoC: pcm512x: Fixup warning splat
ASoC: pcm512x: Use the correct range constraints for S24_LE
ASoC: atmel_ssc_dai: Support SND_SOC_DAIFMT_CBM_CFS on I2S
Peter Ujfalusi (7):
ASoC: davinci-mcasp: Support for combined tx/rx interrupt line
ASoC: rx51: Correct DAPM route for capture
ASoC: tlv320aic3x: Fix data delay configuration
ASoC: davinci-evm: Do not include edma headers
ASoC: davinci-evm: Do not include davinci-pcm.h and davinci-i2s.h
ASoC: davicni-mcasp: Mark the common irq line as shared
ASoC: davinci-mcasp: Fix DIT only McASP instance support
Sylwester Nawrocki (13):
ASoC: samsung: i2s: Remove unused gpios field from struct i2s
ASoC: samsung: i2s: samsung_i2s_get_driver_data() cleanup
ASoC: samsung: i2s: Add return value checks in probe()
ASoC: samsung: i2s: Request memory region in driver probe()
ASoC: samsung: i2s: Move clk_get() to platform driver probe()
ASoC: samsung: i2s: Move clk enable to the platform driver probe()
ASoC: samsung: i2s: Add get_other_dai helper function
ASoC: samsung: i2s: Remove an unneeded goto usage
ASoC: samsung: i2s: Add spinlock in place of local_irq_* calls
ASoC: samsung: i2s: Protect more registers with a spinlock
ASoC: samsung: odroidx2: Handle I2S CDCLK clock conditionally
ASoC: samsung: i2s: Add clk provider DT binding documentation
ASoC: samsung: i2s: Add clock provider for the I2S internal clocks
Takashi Iwai (2):
ASoC: intel: Remove superfluous backslash in Kconfig
ASoC: Add sysfs entries via static attribute groups
Thomas Niederprüm (9):
ASoC: sta32x: correct bit shift value for IDE register
ASoC: sta32x: Convert to direct regmap API usage.
ASoC: sta32x: make sta32x a gpio consumer for the reset GPIO
ASoC: sta32x: use DECLARE_TLV_DB_RANGE macro.
ASoC: sta32x: move code to calculate mclk divider and extrapolation ratio to sta32x_hw_params()
ASoC: sta32x: add device tree binding.
ASoC: sta32x: use dev_dbg() for debug output.
ASoC: sta32x: minor Kconfig update.
ASoC: sta32x: change dai name to be in line with the sta350 driver.
Vaishali Thakkar (1):
ASoC: wm5102: Use put_unaligned_be16
Wei Yongjun (1):
ASoC: Intel: fix sparse non static symbol warnings
Wolfram Sang (4):
ASoC: intel: sst: drop owner assignment from platform_drivers
ASoC: omap: drop owner assignment from platform_drivers
ASoC: pxa: drop owner assignment from platform_drivers
ASoC: samsung: drop owner assignment from platform_drivers
Zidan Wang (1):
ASoC: wm8960: Let wm8960 codec driver manage its own MCLK
kbuild test robot (2):
ASoC: Intel: fix platform_no_drv_owner.cocci warnings
ASoC: Intel: fix platform_no_drv_owner.cocci warnings
.../devicetree/bindings/sound/cdns,xtfpga-i2s.txt | 18 +
.../devicetree/bindings/sound/designware-i2s.txt | 31 +
.../bindings/sound/nvidia,tegra-audio-rt5677.txt | 67 ++
.../devicetree/bindings/sound/pcm512x.txt | 28 +-
.../devicetree/bindings/sound/samsung-i2s.txt | 22 +
.../devicetree/bindings/sound/simple-card.txt | 5 +
.../devicetree/bindings/sound/st,sta32x.txt | 92 ++
.../devicetree/bindings/sound/tlv320aic3x.txt | 10 +-
.../devicetree/bindings/sound/ts3a227e.txt | 5 +
Documentation/devicetree/bindings/sound/wm8904.txt | 2 +-
MAINTAINERS | 11 +
include/dt-bindings/sound/samsung-i2s.h | 8 +
include/sound/pcm.h | 12 +
include/sound/rcar_snd.h | 1 +
include/sound/rt5677.h | 3 +
include/sound/simple_card.h | 1 +
include/sound/soc-dapm.h | 4 +-
include/sound/soc.h | 4 +
include/sound/sta32x.h | 18 +-
sound/core/pcm_lib.c | 85 ++
sound/soc/Kconfig | 1 +
sound/soc/Makefile | 1 +
sound/soc/atmel/Kconfig | 2 +-
sound/soc/atmel/atmel-pcm-dma.c | 12 +-
sound/soc/atmel/atmel_ssc_dai.c | 132 +--
sound/soc/atmel/sam9g20_wm8731.c | 31 +-
sound/soc/au1x/db1200.c | 19 +-
sound/soc/au1x/dbdma2.c | 6 -
sound/soc/au1x/dma.c | 6 -
sound/soc/codecs/88pm860x-codec.c | 4 +-
sound/soc/codecs/Kconfig | 6 +-
sound/soc/codecs/ad193x.c | 4 +-
sound/soc/codecs/ak4671.c | 2 +-
sound/soc/codecs/alc5623.c | 8 +-
sound/soc/codecs/alc5632.c | 12 +-
sound/soc/codecs/arizona.c | 78 +-
sound/soc/codecs/arizona.h | 5 +
sound/soc/codecs/bt-sco.c | 2 +-
sound/soc/codecs/cs35l32.c | 4 +-
sound/soc/codecs/cs42l52.c | 4 +-
sound/soc/codecs/cs42l56.c | 4 +-
sound/soc/codecs/cs42l73.c | 4 +-
sound/soc/codecs/da732x.c | 4 +-
sound/soc/codecs/mc13783.c | 10 +-
sound/soc/codecs/pcm3008.c | 4 +-
sound/soc/codecs/pcm512x-i2c.c | 4 +
sound/soc/codecs/pcm512x-spi.c | 4 +
sound/soc/codecs/pcm512x.c | 932 ++++++++++++++++++++-
sound/soc/codecs/pcm512x.h | 109 ++-
sound/soc/codecs/rt286.c | 51 +-
sound/soc/codecs/rt5631.c | 28 +-
sound/soc/codecs/rt5640.c | 12 +-
sound/soc/codecs/rt5645.c | 174 +++-
sound/soc/codecs/rt5645.h | 15 +
sound/soc/codecs/rt5651.c | 18 +-
sound/soc/codecs/rt5670.c | 137 ++-
sound/soc/codecs/rt5670.h | 80 +-
sound/soc/codecs/rt5677.c | 243 +++++-
sound/soc/codecs/sgtl5000.c | 27 +-
sound/soc/codecs/sn95031.c | 33 +-
sound/soc/codecs/sta32x.c | 534 +++++++-----
sound/soc/codecs/sta32x.h | 2 +-
sound/soc/codecs/tlv320aic31xx.c | 9 +-
sound/soc/codecs/tlv320aic3x.c | 349 +++++---
sound/soc/codecs/tlv320dac33.c | 9 +-
sound/soc/codecs/ts3a227e.c | 35 +-
sound/soc/codecs/twl4030.c | 55 +-
sound/soc/codecs/twl6040.c | 4 +-
sound/soc/codecs/wm2000.c | 2 +-
sound/soc/codecs/wm5100.c | 5 +-
sound/soc/codecs/wm5102.c | 23 +-
sound/soc/codecs/wm5110.c | 20 +-
sound/soc/codecs/wm8350.c | 2 +-
sound/soc/codecs/wm8400.c | 9 +-
sound/soc/codecs/wm8731.c | 5 +-
sound/soc/codecs/wm8750.c | 2 +-
sound/soc/codecs/wm8770.c | 8 +-
sound/soc/codecs/wm8804.c | 4 +-
sound/soc/codecs/wm8900.c | 2 +-
sound/soc/codecs/wm8903.c | 2 +-
sound/soc/codecs/wm8904.c | 35 +-
sound/soc/codecs/wm8955.c | 2 +-
sound/soc/codecs/wm8958-dsp2.c | 2 +-
sound/soc/codecs/wm8960.c | 51 +-
sound/soc/codecs/wm8961.c | 4 +-
sound/soc/codecs/wm8962.c | 6 +-
sound/soc/codecs/wm8988.c | 6 +-
sound/soc/codecs/wm8990.c | 9 +-
sound/soc/codecs/wm8991.c | 9 +-
sound/soc/codecs/wm8993.c | 2 +-
sound/soc/codecs/wm8994.c | 23 +-
sound/soc/codecs/wm8995.c | 20 +-
sound/soc/codecs/wm8996.c | 8 +-
sound/soc/codecs/wm8997.c | 11 +-
sound/soc/codecs/wm9081.c | 2 +-
sound/soc/codecs/wm9090.c | 2 +-
sound/soc/codecs/wm9705.c | 16 +-
sound/soc/codecs/wm9712.c | 12 +-
sound/soc/codecs/wm9713.c | 14 +-
sound/soc/codecs/wm_adsp.c | 6 +-
sound/soc/codecs/wm_hubs.c | 10 +-
sound/soc/davinci/Kconfig | 3 +-
sound/soc/davinci/davinci-evm.c | 6 -
sound/soc/davinci/davinci-mcasp.c | 103 ++-
sound/soc/dwc/Kconfig | 1 +
sound/soc/dwc/designware_i2s.c | 311 +++++--
sound/soc/fsl/eukrea-tlv320.c | 23 +-
sound/soc/fsl/fsl_asrc.c | 5 +-
sound/soc/fsl/fsl_asrc.h | 3 -
sound/soc/fsl/fsl_esai.c | 2 +-
sound/soc/fsl/fsl_sai.c | 2 +-
sound/soc/fsl/fsl_spdif.c | 17 +-
sound/soc/fsl/fsl_ssi.c | 10 +-
sound/soc/fsl/fsl_utils.c | 27 -
sound/soc/fsl/fsl_utils.h | 3 -
sound/soc/fsl/imx-mc13783.c | 5 +-
sound/soc/fsl/imx-spdif.c | 1 +
sound/soc/fsl/imx-ssi.c | 5 +-
sound/soc/fsl/mx27vis-aic32x4.c | 12 +-
sound/soc/fsl/wm1133-ev1.c | 16 +-
sound/soc/generic/simple-card.c | 34 +
sound/soc/intel/Kconfig | 4 +-
sound/soc/intel/broadwell.c | 10 -
sound/soc/intel/byt-rt5640.c | 12 +-
sound/soc/intel/bytcr_dpcm_rt5640.c | 1 -
sound/soc/intel/cht_bsw_rt5672.c | 15 +-
sound/soc/intel/sst-baytrail-pcm.c | 6 -
sound/soc/intel/sst-dsp.c | 3 +-
sound/soc/intel/sst-firmware.c | 3 +
sound/soc/intel/sst-haswell-dsp.c | 17 +-
sound/soc/intel/sst-haswell-ipc.c | 9 +-
sound/soc/intel/sst-haswell-pcm.c | 105 ++-
sound/soc/intel/sst-mfld-platform-pcm.c | 7 -
sound/soc/intel/sst/sst_acpi.c | 7 +-
sound/soc/intel/sst/sst_loader.c | 3 +-
sound/soc/mxs/mxs-saif.c | 10 +-
sound/soc/mxs/mxs-saif.h | 1 -
sound/soc/mxs/mxs-sgtl5000.c | 27 +-
sound/soc/nuc900/nuc900-pcm.c | 6 -
sound/soc/omap/ams-delta.c | 18 +-
sound/soc/omap/omap-hdmi-audio.c | 1 -
sound/soc/omap/omap-twl4030.c | 20 +-
sound/soc/omap/rx51.c | 8 +-
sound/soc/pxa/Kconfig | 2 +-
sound/soc/pxa/corgi.c | 16 +-
sound/soc/pxa/e740_wm9705.c | 20 +-
sound/soc/pxa/e750_wm9705.c | 20 +-
sound/soc/pxa/hx4700.c | 8 +-
sound/soc/pxa/magician.c | 21 +-
sound/soc/pxa/mioa701_wm9713.c | 2 +-
sound/soc/pxa/palm27x.c | 15 +-
sound/soc/pxa/raumfeld.c | 35 +-
sound/soc/pxa/spitz.c | 23 +-
sound/soc/pxa/ttc-dkb.c | 4 -
sound/soc/pxa/zylonite.c | 12 +-
sound/soc/rockchip/rockchip_i2s.c | 4 +
sound/soc/samsung/Kconfig | 4 +-
sound/soc/samsung/arndale_rt5631.c | 1 -
sound/soc/samsung/goni_wm8994.c | 23 +-
sound/soc/samsung/h1940_uda1380.c | 15 +-
sound/soc/samsung/i2s.c | 362 ++++----
sound/soc/samsung/jive_wm8750.c | 34 +-
sound/soc/samsung/neo1973_wm8753.c | 25 +-
sound/soc/samsung/odroidx2_max98090.c | 6 +-
sound/soc/samsung/rx1950_uda1380.c | 15 +-
sound/soc/samsung/s3c24xx_simtec.c | 20 +-
sound/soc/samsung/s3c24xx_uda134x.c | 12 +-
sound/soc/samsung/smartq_wm8987.c | 16 +-
sound/soc/samsung/smdk_wm8580.c | 26 +-
sound/soc/samsung/smdk_wm8580pcm.c | 19 +-
sound/soc/samsung/smdk_wm8994pcm.c | 16 +-
sound/soc/sh/dma-sh7760.c | 6 -
sound/soc/sh/fsi.c | 15 +-
sound/soc/sh/migor.c | 12 +-
sound/soc/sh/rcar/adg.c | 14 +-
sound/soc/sh/rcar/core.c | 111 ++-
sound/soc/sh/rcar/dvc.c | 63 +-
sound/soc/sh/rcar/gen.c | 15 +
sound/soc/sh/rcar/rsnd.h | 81 +-
sound/soc/sh/rcar/src.c | 269 ++++--
sound/soc/sh/rcar/ssi.c | 100 +--
sound/soc/sh/siu_pcm.c | 1 -
sound/soc/soc-ac97.c | 36 +-
sound/soc/soc-core.c | 207 +++--
sound/soc/soc-dapm.c | 125 +--
sound/soc/soc-devres.c | 2 +-
sound/soc/soc-generic-dmaengine-pcm.c | 15 +-
sound/soc/soc-pcm.c | 7 +-
sound/soc/tegra/Kconfig | 10 +
sound/soc/tegra/Makefile | 2 +
sound/soc/tegra/tegra_rt5677.c | 347 ++++++++
sound/soc/txx9/txx9aclc.c | 6 -
sound/soc/ux500/mop500_ab8500.c | 16 +-
sound/soc/xtensa/Kconfig | 7 +
sound/soc/xtensa/Makefile | 3 +
sound/soc/xtensa/xtfpga-i2s.c | 675 +++++++++++++++
196 files changed, 5566 insertions(+), 2227 deletions(-)
create mode 100644 Documentation/devicetree/bindings/sound/cdns,xtfpga-i2s.txt
create mode 100644 Documentation/devicetree/bindings/sound/designware-i2s.txt
create mode 100644 Documentation/devicetree/bindings/sound/nvidia,tegra-audio-rt5677.txt
create mode 100644 Documentation/devicetree/bindings/sound/st,sta32x.txt
create mode 100644 include/dt-bindings/sound/samsung-i2s.h
create mode 100644 sound/soc/tegra/tegra_rt5677.c
create mode 100644 sound/soc/xtensa/Kconfig
create mode 100644 sound/soc/xtensa/Makefile
create mode 100644 sound/soc/xtensa/xtfpga-i2s.c
2
4
[alsa-devel] [PATCH_V4 0/3] sound:soc: jz4740: Add DT, dynamic sampling
by Zubair Lutfullah Kakakhel 05 Feb '15
by Zubair Lutfullah Kakakhel 05 Feb '15
05 Feb '15
Hi,
Here are a few simple patches for the jz4740.
First adds dynamic sampling support to jz4740-i2s.
Then two to add a simple binding and DT support.
Then a patch to set the clock rate for i2s.
These are in preparation for jz4780 and ci20 later on.
Patches are based on 3.19-rc7. Quite disjoint and stay within jz4740
so should apply easily on other trees.
If you would like to have them rebased to a different tree, please tell.
Thank-you
V4 changes:
Added Acked-by: Lars-Peter Clausen <lars(a)metafoo.de>
Rebased on 3.19-rc7
Removed patch 4 which was redundant
V3 changes:
Added dma binding to example but forgot to put it in required properties.
V2 changes:
Removed a redundant #define
Added #ifdef CONFIG_OF
Added dma in binding document
Removed a redundant call to clk_prepare_enable
Zubair Lutfullah Kakakhel (3):
sound: soc: jz4740: Add dynamic sampling rate support to jz4740-i2s
dt: sound: jz4740: Add binding documentation for jz4740-i2s
sound: soc: jz4740: Add DT support to jz4740-i2s driver
.../bindings/sound/ingenic,jz4740-i2s.txt | 23 ++++++++++++++++++++++
sound/soc/jz4740/jz4740-i2s.c | 21 +++++++++++++++++++-
2 files changed, 43 insertions(+), 1 deletion(-)
create mode 100644 Documentation/devicetree/bindings/sound/ingenic,jz4740-i2s.txt
--
1.9.1
2
5
05 Feb '15
For runtime suspend/resume, it is some different with suspend/resume,
e.g. codec power supply won't be switch off, codec jack detection
still working(to wake up system from Jack event), won't call call
snd_soc_suspend/resume, etc.
So here, we add a platform PM status, HSW_PM_STATE_RTD3, to make
the status clearer, when in idle, it will enter this status, to
transfer from HSW_PM_STATE_RTD3 to HSW_PM_STATE_D3, we will do those
extra jobs, and vice versa for resuming.
Signed-off-by: Jie Yang <yang.jie(a)intel.com>
---
sound/soc/intel/sst-haswell-pcm.c | 24 +++++++++++++++---------
1 file changed, 15 insertions(+), 9 deletions(-)
diff --git a/sound/soc/intel/sst-haswell-pcm.c b/sound/soc/intel/sst-haswell-pcm.c
index ad7f4a5..06b149e 100644
--- a/sound/soc/intel/sst-haswell-pcm.c
+++ b/sound/soc/intel/sst-haswell-pcm.c
@@ -119,8 +119,9 @@ struct hsw_pcm_data {
};
enum hsw_pm_state {
- HSW_PM_STATE_D3 = 0,
- HSW_PM_STATE_D0 = 1,
+ HSW_PM_STATE_D0 = 0,
+ HSW_PM_STATE_RTD3 = 1,
+ HSW_PM_STATE_D3 = 2,
};
/* private data for the driver */
@@ -1035,12 +1036,12 @@ static int hsw_pcm_runtime_suspend(struct device *dev)
struct hsw_priv_data *pdata = dev_get_drvdata(dev);
struct sst_hsw *hsw = pdata->hsw;
- if (pdata->pm_state == HSW_PM_STATE_D3)
+ if (pdata->pm_state >= HSW_PM_STATE_RTD3)
return 0;
sst_hsw_dsp_runtime_suspend(hsw);
sst_hsw_dsp_runtime_sleep(hsw);
- pdata->pm_state = HSW_PM_STATE_D3;
+ pdata->pm_state = HSW_PM_STATE_RTD3;
return 0;
}
@@ -1051,7 +1052,7 @@ static int hsw_pcm_runtime_resume(struct device *dev)
struct sst_hsw *hsw = pdata->hsw;
int ret;
- if (pdata->pm_state == HSW_PM_STATE_D0)
+ if (pdata->pm_state != HSW_PM_STATE_RTD3)
return 0;
ret = sst_hsw_dsp_load(hsw);
@@ -1091,7 +1092,7 @@ static void hsw_pcm_complete(struct device *dev)
struct hsw_pcm_data *pcm_data;
int i, err;
- if (pdata->pm_state == HSW_PM_STATE_D0)
+ if (pdata->pm_state != HSW_PM_STATE_D3)
return;
err = sst_hsw_dsp_load(hsw);
@@ -1139,6 +1140,9 @@ static int hsw_pcm_prepare(struct device *dev)
if (pdata->pm_state == HSW_PM_STATE_D3)
return 0;
+ else if (pdata->pm_state == HSW_PM_STATE_RTD3)
+ goto suspend;
+
/* suspend all active streams */
for (i = 0; i < ARRAY_SIZE(mod_map); i++) {
pcm_data = &pdata->pcm[mod_map[i].dai_id][mod_map[i].stream];
@@ -1152,9 +1156,6 @@ static int hsw_pcm_prepare(struct device *dev)
msleep(2);
}
- snd_soc_suspend(pdata->soc_card->dev);
- snd_soc_poweroff(pdata->soc_card->dev);
-
/* enter D3 state and stall */
sst_hsw_dsp_runtime_suspend(hsw);
@@ -1174,6 +1175,11 @@ static int hsw_pcm_prepare(struct device *dev)
/* put the DSP to sleep */
sst_hsw_dsp_runtime_sleep(hsw);
+
+suspend:
+ snd_soc_suspend(pdata->soc_card->dev);
+ snd_soc_poweroff(pdata->soc_card->dev);
+
pdata->pm_state = HSW_PM_STATE_D3;
return 0;
--
1.9.1
3
2
04 Feb '15
From: "Lad, Prabhakar" <prabhakar.csengg(a)gmail.com>
this patch fixes following sparse warning:
ts3a227e.c:222:5: warning: symbol 'ts3a227e_enable_jack_detect' was not declared. Should it be static?
Signed-off-by: Lad, Prabhakar <prabhakar.csengg(a)gmail.com>
---
Found this issue on linux-next (gcc version 4.8.2,
sparse version 0.4.5-rc1)and applies on top linux-next.
sound/soc/codecs/ts3a227e.c | 2 ++
1 file changed, 2 insertions(+)
diff --git a/sound/soc/codecs/ts3a227e.c b/sound/soc/codecs/ts3a227e.c
index 5ecfa31..9fd80ac 100644
--- a/sound/soc/codecs/ts3a227e.c
+++ b/sound/soc/codecs/ts3a227e.c
@@ -20,6 +20,8 @@
#include <sound/jack.h>
#include <sound/soc.h>
+#include "ts3a227e.h"
+
struct ts3a227e {
struct regmap *regmap;
struct snd_soc_jack *jack;
--
1.9.1
2
1