Alsa-devel
Threads by month
- ----- 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
- 244 discussions
[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
04 Feb '15
Disables GPIO support and LINE2 input and renames Mic3 input to Mic2,
if tlv320aic3104 mode is seleced. Devicetree binding document is
updated accordingly.
Signed-off-by: Jyri Sarha <jsarha(a)ti.com>
---
.../devicetree/bindings/sound/tlv320aic3x.txt | 10 +-
sound/soc/codecs/tlv320aic3x.c | 344 ++++++++++++++------
2 files changed, 252 insertions(+), 102 deletions(-)
diff --git a/Documentation/devicetree/bindings/sound/tlv320aic3x.txt b/Documentation/devicetree/bindings/sound/tlv320aic3x.txt
index 5e6040c..47a213c 100644
--- a/Documentation/devicetree/bindings/sound/tlv320aic3x.txt
+++ b/Documentation/devicetree/bindings/sound/tlv320aic3x.txt
@@ -9,6 +9,7 @@ Required properties:
"ti,tlv320aic33" - TLV320AIC33
"ti,tlv320aic3007" - TLV320AIC3007
"ti,tlv320aic3106" - TLV320AIC3106
+ "ti,tlv320aic3104" - TLV320AIC3104
- reg - <int> - I2C slave address
@@ -18,6 +19,7 @@ Optional properties:
- gpio-reset - gpio pin number used for codec reset
- ai3x-gpio-func - <array of 2 int> - AIC3X_GPIO1 & AIC3X_GPIO2 Functionality
+ - Not supported on tlv320aic3104
- ai3x-micbias-vg - MicBias Voltage required.
1 - MICBIAS output is powered to 2.0V,
2 - MICBIAS output is powered to 2.5V,
@@ -36,7 +38,13 @@ CODEC output pins:
* HPLCOM
* HPRCOM
-CODEC input pins:
+CODEC input pins for TLV320AIC3104:
+ * MIC2L
+ * MIC2R
+ * LINE1L
+ * LINE1R
+
+CODEC input pins for other compatible codecs:
* MIC3L
* MIC3R
* LINE1L
diff --git a/sound/soc/codecs/tlv320aic3x.c b/sound/soc/codecs/tlv320aic3x.c
index b7ebce0..49ba3c7 100644
--- a/sound/soc/codecs/tlv320aic3x.c
+++ b/sound/soc/codecs/tlv320aic3x.c
@@ -87,6 +87,7 @@ struct aic3x_priv {
#define AIC3X_MODEL_3X 0
#define AIC3X_MODEL_33 1
#define AIC3X_MODEL_3007 2
+#define AIC3X_MODEL_3104 3
u16 model;
/* Selects the micbias voltage */
@@ -316,52 +317,37 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
* only for swapped L-to-R and R-to-L routes. See below stereo controls
* for direct L-to-L and R-to-R routes.
*/
- SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume",
- LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Left Line Mixer PGAR Bypass Volume",
PGAR_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Left Line Mixer DACR1 Playback Volume",
DACR1_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
- SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume",
- LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Right Line Mixer PGAL Bypass Volume",
PGAL_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Right Line Mixer DACL1 Playback Volume",
DACL1_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
- SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume",
- LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Left HP Mixer PGAR Bypass Volume",
PGAR_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Left HP Mixer DACR1 Playback Volume",
DACR1_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
- SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume",
- LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Right HP Mixer PGAL Bypass Volume",
PGAL_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Right HP Mixer DACL1 Playback Volume",
DACL1_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
- SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume",
- LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Left HPCOM Mixer PGAR Bypass Volume",
PGAR_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Left HPCOM Mixer DACR1 Playback Volume",
DACR1_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
- SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume",
- LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Right HPCOM Mixer PGAL Bypass Volume",
PGAL_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
SOC_SINGLE_TLV("Right HPCOM Mixer DACL1 Playback Volume",
DACL1_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
/* Stereo output controls for direct L-to-L and R-to-R routes */
- SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume",
- LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL,
- 0, 118, 1, output_stage_tlv),
SOC_DOUBLE_R_TLV("Line PGA Bypass Volume",
PGAL_2_LLOPM_VOL, PGAR_2_RLOPM_VOL,
0, 118, 1, output_stage_tlv),
@@ -369,9 +355,6 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
DACL1_2_LLOPM_VOL, DACR1_2_RLOPM_VOL,
0, 118, 1, output_stage_tlv),
- SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume",
- LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL,
- 0, 118, 1, output_stage_tlv),
SOC_DOUBLE_R_TLV("HP PGA Bypass Volume",
PGAL_2_HPLOUT_VOL, PGAR_2_HPROUT_VOL,
0, 118, 1, output_stage_tlv),
@@ -379,9 +362,6 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
DACL1_2_HPLOUT_VOL, DACR1_2_HPROUT_VOL,
0, 118, 1, output_stage_tlv),
- SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume",
- LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL,
- 0, 118, 1, output_stage_tlv),
SOC_DOUBLE_R_TLV("HPCOM PGA Bypass Volume",
PGAL_2_HPLCOM_VOL, PGAR_2_HPRCOM_VOL,
0, 118, 1, output_stage_tlv),
@@ -424,6 +404,45 @@ static const struct snd_kcontrol_new aic3x_snd_controls[] = {
SOC_ENUM("Output Driver Ramp-up step", aic3x_rampup_step_enum),
};
+/* For other than tlv320aic3104 */
+static const struct snd_kcontrol_new aic3x_extra_snd_controls[] = {
+ /*
+ * Output controls that map to output mixer switches. Note these are
+ * only for swapped L-to-R and R-to-L routes. See below stereo controls
+ * for direct L-to-L and R-to-R routes.
+ */
+ SOC_SINGLE_TLV("Left Line Mixer Line2R Bypass Volume",
+ LINE2R_2_LLOPM_VOL, 0, 118, 1, output_stage_tlv),
+
+ SOC_SINGLE_TLV("Right Line Mixer Line2L Bypass Volume",
+ LINE2L_2_RLOPM_VOL, 0, 118, 1, output_stage_tlv),
+
+ SOC_SINGLE_TLV("Left HP Mixer Line2R Bypass Volume",
+ LINE2R_2_HPLOUT_VOL, 0, 118, 1, output_stage_tlv),
+
+ SOC_SINGLE_TLV("Right HP Mixer Line2L Bypass Volume",
+ LINE2L_2_HPROUT_VOL, 0, 118, 1, output_stage_tlv),
+
+ SOC_SINGLE_TLV("Left HPCOM Mixer Line2R Bypass Volume",
+ LINE2R_2_HPLCOM_VOL, 0, 118, 1, output_stage_tlv),
+
+ SOC_SINGLE_TLV("Right HPCOM Mixer Line2L Bypass Volume",
+ LINE2L_2_HPRCOM_VOL, 0, 118, 1, output_stage_tlv),
+
+ /* Stereo output controls for direct L-to-L and R-to-R routes */
+ SOC_DOUBLE_R_TLV("Line Line2 Bypass Volume",
+ LINE2L_2_LLOPM_VOL, LINE2R_2_RLOPM_VOL,
+ 0, 118, 1, output_stage_tlv),
+
+ SOC_DOUBLE_R_TLV("HP Line2 Bypass Volume",
+ LINE2L_2_HPLOUT_VOL, LINE2R_2_HPROUT_VOL,
+ 0, 118, 1, output_stage_tlv),
+
+ SOC_DOUBLE_R_TLV("HPCOM Line2 Bypass Volume",
+ LINE2L_2_HPLCOM_VOL, LINE2R_2_HPRCOM_VOL,
+ 0, 118, 1, output_stage_tlv),
+};
+
static const struct snd_kcontrol_new aic3x_mono_controls[] = {
SOC_DOUBLE_R_TLV("Mono Line2 Bypass Volume",
LINE2L_2_MONOLOPM_VOL, LINE2R_2_MONOLOPM_VOL,
@@ -464,22 +483,24 @@ SOC_DAPM_ENUM("Route", aic3x_right_hpcom_enum);
/* Left Line Mixer */
static const struct snd_kcontrol_new aic3x_left_line_mixer_controls[] = {
- SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_LLOPM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_LLOPM_VOL, 7, 1, 0),
- SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_LLOPM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_LLOPM_VOL, 7, 1, 0),
+ /* Not on tlv320aic3104 */
+ SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_LLOPM_VOL, 7, 1, 0),
+ SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_LLOPM_VOL, 7, 1, 0),
};
/* Right Line Mixer */
static const struct snd_kcontrol_new aic3x_right_line_mixer_controls[] = {
- SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_RLOPM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_RLOPM_VOL, 7, 1, 0),
- SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_RLOPM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_RLOPM_VOL, 7, 1, 0),
+ /* Not on tlv320aic3104 */
+ SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_RLOPM_VOL, 7, 1, 0),
+ SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_RLOPM_VOL, 7, 1, 0),
};
/* Mono Mixer */
@@ -494,42 +515,46 @@ static const struct snd_kcontrol_new aic3x_mono_mixer_controls[] = {
/* Left HP Mixer */
static const struct snd_kcontrol_new aic3x_left_hp_mixer_controls[] = {
- SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLOUT_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLOUT_VOL, 7, 1, 0),
- SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLOUT_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLOUT_VOL, 7, 1, 0),
+ /* Not on tlv320aic3104 */
+ SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLOUT_VOL, 7, 1, 0),
+ SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLOUT_VOL, 7, 1, 0),
};
/* Right HP Mixer */
static const struct snd_kcontrol_new aic3x_right_hp_mixer_controls[] = {
- SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPROUT_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPROUT_VOL, 7, 1, 0),
- SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPROUT_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPROUT_VOL, 7, 1, 0),
+ /* Not on tlv320aic3104 */
+ SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPROUT_VOL, 7, 1, 0),
+ SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPROUT_VOL, 7, 1, 0),
};
/* Left HPCOM Mixer */
static const struct snd_kcontrol_new aic3x_left_hpcom_mixer_controls[] = {
- SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPLCOM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPLCOM_VOL, 7, 1, 0),
- SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPLCOM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPLCOM_VOL, 7, 1, 0),
+ /* Not on tlv320aic3104 */
+ SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPLCOM_VOL, 7, 1, 0),
+ SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPLCOM_VOL, 7, 1, 0),
};
/* Right HPCOM Mixer */
static const struct snd_kcontrol_new aic3x_right_hpcom_mixer_controls[] = {
- SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAL Bypass Switch", PGAL_2_HPRCOM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACL1 Switch", DACL1_2_HPRCOM_VOL, 7, 1, 0),
- SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("PGAR Bypass Switch", PGAR_2_HPRCOM_VOL, 7, 1, 0),
SOC_DAPM_SINGLE("DACR1 Switch", DACR1_2_HPRCOM_VOL, 7, 1, 0),
+ /* Not on tlv320aic3104 */
+ SOC_DAPM_SINGLE("Line2L Bypass Switch", LINE2L_2_HPRCOM_VOL, 7, 1, 0),
+ SOC_DAPM_SINGLE("Line2R Bypass Switch", LINE2R_2_HPRCOM_VOL, 7, 1, 0),
};
/* Left PGA Mixer */
@@ -550,6 +575,22 @@ static const struct snd_kcontrol_new aic3x_right_pga_mixer_controls[] = {
SOC_DAPM_SINGLE_AIC3X("Mic3R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1),
};
+/* Left PGA Mixer for tlv320aic3104 */
+static const struct snd_kcontrol_new aic3104_left_pga_mixer_controls[] = {
+ SOC_DAPM_SINGLE_AIC3X("Line1L Switch", LINE1L_2_LADC_CTRL, 3, 1, 1),
+ SOC_DAPM_SINGLE_AIC3X("Line1R Switch", LINE1R_2_LADC_CTRL, 3, 1, 1),
+ SOC_DAPM_SINGLE_AIC3X("Mic2L Switch", MIC3LR_2_LADC_CTRL, 4, 1, 1),
+ SOC_DAPM_SINGLE_AIC3X("Mic2R Switch", MIC3LR_2_LADC_CTRL, 0, 1, 1),
+};
+
+/* Right PGA Mixer for tlv320aic3104 */
+static const struct snd_kcontrol_new aic3104_right_pga_mixer_controls[] = {
+ SOC_DAPM_SINGLE_AIC3X("Line1R Switch", LINE1R_2_RADC_CTRL, 3, 1, 1),
+ SOC_DAPM_SINGLE_AIC3X("Line1L Switch", LINE1L_2_RADC_CTRL, 3, 1, 1),
+ SOC_DAPM_SINGLE_AIC3X("Mic2L Switch", MIC3LR_2_RADC_CTRL, 4, 1, 1),
+ SOC_DAPM_SINGLE_AIC3X("Mic2R Switch", MIC3LR_2_RADC_CTRL, 0, 1, 1),
+};
+
/* Left Line1 Mux */
static const struct snd_kcontrol_new aic3x_left_line1l_mux_controls =
SOC_DAPM_ENUM("Route", aic3x_line1l_2_l_enum);
@@ -593,26 +634,56 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
/* Inputs to Left ADC */
SND_SOC_DAPM_ADC("Left ADC", "Left Capture", LINE1L_2_LADC_CTRL, 2, 0),
- SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
- &aic3x_left_pga_mixer_controls[0],
- ARRAY_SIZE(aic3x_left_pga_mixer_controls)),
SND_SOC_DAPM_MUX("Left Line1L Mux", SND_SOC_NOPM, 0, 0,
&aic3x_left_line1l_mux_controls),
SND_SOC_DAPM_MUX("Left Line1R Mux", SND_SOC_NOPM, 0, 0,
&aic3x_left_line1r_mux_controls),
- SND_SOC_DAPM_MUX("Left Line2L Mux", SND_SOC_NOPM, 0, 0,
- &aic3x_left_line2_mux_controls),
/* Inputs to Right ADC */
SND_SOC_DAPM_ADC("Right ADC", "Right Capture",
LINE1R_2_RADC_CTRL, 2, 0),
- SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
- &aic3x_right_pga_mixer_controls[0],
- ARRAY_SIZE(aic3x_right_pga_mixer_controls)),
SND_SOC_DAPM_MUX("Right Line1L Mux", SND_SOC_NOPM, 0, 0,
&aic3x_right_line1l_mux_controls),
SND_SOC_DAPM_MUX("Right Line1R Mux", SND_SOC_NOPM, 0, 0,
&aic3x_right_line1r_mux_controls),
+
+ /* Mic Bias */
+ SND_SOC_DAPM_SUPPLY("Mic Bias", MICBIAS_CTRL, 6, 0,
+ mic_bias_event,
+ SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
+
+ SND_SOC_DAPM_OUTPUT("LLOUT"),
+ SND_SOC_DAPM_OUTPUT("RLOUT"),
+ SND_SOC_DAPM_OUTPUT("HPLOUT"),
+ SND_SOC_DAPM_OUTPUT("HPROUT"),
+ SND_SOC_DAPM_OUTPUT("HPLCOM"),
+ SND_SOC_DAPM_OUTPUT("HPRCOM"),
+
+ SND_SOC_DAPM_INPUT("LINE1L"),
+ SND_SOC_DAPM_INPUT("LINE1R"),
+
+ /*
+ * Virtual output pin to detection block inside codec. This can be
+ * used to keep codec bias on if gpio or detection features are needed.
+ * Force pin on or construct a path with an input jack and mic bias
+ * widgets.
+ */
+ SND_SOC_DAPM_OUTPUT("Detection"),
+};
+
+/* For other than tlv320aic3104 */
+static const struct snd_soc_dapm_widget aic3x_extra_dapm_widgets[] = {
+ /* Inputs to Left ADC */
+ SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3x_left_pga_mixer_controls[0],
+ ARRAY_SIZE(aic3x_left_pga_mixer_controls)),
+ SND_SOC_DAPM_MUX("Left Line2L Mux", SND_SOC_NOPM, 0, 0,
+ &aic3x_left_line2_mux_controls),
+
+ /* Inputs to Right ADC */
+ SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3x_right_pga_mixer_controls[0],
+ ARRAY_SIZE(aic3x_right_pga_mixer_controls)),
SND_SOC_DAPM_MUX("Right Line2R Mux", SND_SOC_NOPM, 0, 0,
&aic3x_right_line2_mux_controls),
@@ -637,11 +708,6 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
SND_SOC_DAPM_REG(snd_soc_dapm_micbias, "DMic Rate 32",
AIC3X_ASD_INTF_CTRLA, 0, 3, 3, 0),
- /* Mic Bias */
- SND_SOC_DAPM_SUPPLY("Mic Bias", MICBIAS_CTRL, 6, 0,
- mic_bias_event,
- SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
-
/* Output mixers */
SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0,
&aic3x_left_line_mixer_controls[0],
@@ -662,27 +728,46 @@ static const struct snd_soc_dapm_widget aic3x_dapm_widgets[] = {
&aic3x_right_hpcom_mixer_controls[0],
ARRAY_SIZE(aic3x_right_hpcom_mixer_controls)),
- SND_SOC_DAPM_OUTPUT("LLOUT"),
- SND_SOC_DAPM_OUTPUT("RLOUT"),
- SND_SOC_DAPM_OUTPUT("HPLOUT"),
- SND_SOC_DAPM_OUTPUT("HPROUT"),
- SND_SOC_DAPM_OUTPUT("HPLCOM"),
- SND_SOC_DAPM_OUTPUT("HPRCOM"),
-
SND_SOC_DAPM_INPUT("MIC3L"),
SND_SOC_DAPM_INPUT("MIC3R"),
- SND_SOC_DAPM_INPUT("LINE1L"),
- SND_SOC_DAPM_INPUT("LINE1R"),
SND_SOC_DAPM_INPUT("LINE2L"),
SND_SOC_DAPM_INPUT("LINE2R"),
+};
- /*
- * Virtual output pin to detection block inside codec. This can be
- * used to keep codec bias on if gpio or detection features are needed.
- * Force pin on or construct a path with an input jack and mic bias
- * widgets.
- */
- SND_SOC_DAPM_OUTPUT("Detection"),
+/* For tlv320aic3104 */
+static const struct snd_soc_dapm_widget aic3104_extra_dapm_widgets[] = {
+ /* Inputs to Left ADC */
+ SND_SOC_DAPM_MIXER("Left PGA Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3104_left_pga_mixer_controls[0],
+ ARRAY_SIZE(aic3104_left_pga_mixer_controls)),
+
+ /* Inputs to Right ADC */
+ SND_SOC_DAPM_MIXER("Right PGA Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3104_right_pga_mixer_controls[0],
+ ARRAY_SIZE(aic3104_right_pga_mixer_controls)),
+
+ /* Output mixers */
+ SND_SOC_DAPM_MIXER("Left Line Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3x_left_line_mixer_controls[0],
+ ARRAY_SIZE(aic3x_left_line_mixer_controls) - 2),
+ SND_SOC_DAPM_MIXER("Right Line Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3x_right_line_mixer_controls[0],
+ ARRAY_SIZE(aic3x_right_line_mixer_controls) - 2),
+ SND_SOC_DAPM_MIXER("Left HP Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3x_left_hp_mixer_controls[0],
+ ARRAY_SIZE(aic3x_left_hp_mixer_controls) - 2),
+ SND_SOC_DAPM_MIXER("Right HP Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3x_right_hp_mixer_controls[0],
+ ARRAY_SIZE(aic3x_right_hp_mixer_controls) - 2),
+ SND_SOC_DAPM_MIXER("Left HPCOM Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3x_left_hpcom_mixer_controls[0],
+ ARRAY_SIZE(aic3x_left_hpcom_mixer_controls) - 2),
+ SND_SOC_DAPM_MIXER("Right HPCOM Mixer", SND_SOC_NOPM, 0, 0,
+ &aic3x_right_hpcom_mixer_controls[0],
+ ARRAY_SIZE(aic3x_right_hpcom_mixer_controls) - 2),
+
+ SND_SOC_DAPM_INPUT("MIC2L"),
+ SND_SOC_DAPM_INPUT("MIC2R"),
};
static const struct snd_soc_dapm_widget aic3x_dapm_mono_widgets[] = {
@@ -712,17 +797,10 @@ static const struct snd_soc_dapm_route intercon[] = {
{"Left Line1R Mux", "single-ended", "LINE1R"},
{"Left Line1R Mux", "differential", "LINE1R"},
- {"Left Line2L Mux", "single-ended", "LINE2L"},
- {"Left Line2L Mux", "differential", "LINE2L"},
-
{"Left PGA Mixer", "Line1L Switch", "Left Line1L Mux"},
{"Left PGA Mixer", "Line1R Switch", "Left Line1R Mux"},
- {"Left PGA Mixer", "Line2L Switch", "Left Line2L Mux"},
- {"Left PGA Mixer", "Mic3L Switch", "MIC3L"},
- {"Left PGA Mixer", "Mic3R Switch", "MIC3R"},
{"Left ADC", NULL, "Left PGA Mixer"},
- {"Left ADC", NULL, "GPIO1 dmic modclk"},
/* Right Input */
{"Right Line1R Mux", "single-ended", "LINE1R"},
@@ -730,25 +808,10 @@ static const struct snd_soc_dapm_route intercon[] = {
{"Right Line1L Mux", "single-ended", "LINE1L"},
{"Right Line1L Mux", "differential", "LINE1L"},
- {"Right Line2R Mux", "single-ended", "LINE2R"},
- {"Right Line2R Mux", "differential", "LINE2R"},
-
{"Right PGA Mixer", "Line1L Switch", "Right Line1L Mux"},
{"Right PGA Mixer", "Line1R Switch", "Right Line1R Mux"},
- {"Right PGA Mixer", "Line2R Switch", "Right Line2R Mux"},
- {"Right PGA Mixer", "Mic3L Switch", "MIC3L"},
- {"Right PGA Mixer", "Mic3R Switch", "MIC3R"},
{"Right ADC", NULL, "Right PGA Mixer"},
- {"Right ADC", NULL, "GPIO1 dmic modclk"},
-
- /*
- * Logical path between digital mic enable and GPIO1 modulator clock
- * output function
- */
- {"GPIO1 dmic modclk", NULL, "DMic Rate 128"},
- {"GPIO1 dmic modclk", NULL, "DMic Rate 64"},
- {"GPIO1 dmic modclk", NULL, "DMic Rate 32"},
/* Left DAC Output */
{"Left DAC Mux", "DAC_L1", "Left DAC"},
@@ -761,10 +824,8 @@ static const struct snd_soc_dapm_route intercon[] = {
{"Right DAC Mux", "DAC_R3", "Right DAC"},
/* Left Line Output */
- {"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
{"Left Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
{"Left Line Mixer", "DACL1 Switch", "Left DAC Mux"},
- {"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
{"Left Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
{"Left Line Mixer", "DACR1 Switch", "Right DAC Mux"},
@@ -773,10 +834,8 @@ static const struct snd_soc_dapm_route intercon[] = {
{"LLOUT", NULL, "Left Line Out"},
/* Right Line Output */
- {"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
{"Right Line Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
{"Right Line Mixer", "DACL1 Switch", "Left DAC Mux"},
- {"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
{"Right Line Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
{"Right Line Mixer", "DACR1 Switch", "Right DAC Mux"},
@@ -785,10 +844,8 @@ static const struct snd_soc_dapm_route intercon[] = {
{"RLOUT", NULL, "Right Line Out"},
/* Left HP Output */
- {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
{"Left HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
{"Left HP Mixer", "DACL1 Switch", "Left DAC Mux"},
- {"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
{"Left HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
{"Left HP Mixer", "DACR1 Switch", "Right DAC Mux"},
@@ -797,10 +854,8 @@ static const struct snd_soc_dapm_route intercon[] = {
{"HPLOUT", NULL, "Left HP Out"},
/* Right HP Output */
- {"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
{"Right HP Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
{"Right HP Mixer", "DACL1 Switch", "Left DAC Mux"},
- {"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
{"Right HP Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
{"Right HP Mixer", "DACR1 Switch", "Right DAC Mux"},
@@ -809,10 +864,8 @@ static const struct snd_soc_dapm_route intercon[] = {
{"HPROUT", NULL, "Right HP Out"},
/* Left HPCOM Output */
- {"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
{"Left HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
{"Left HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"},
- {"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
{"Left HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
{"Left HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"},
@@ -823,10 +876,8 @@ static const struct snd_soc_dapm_route intercon[] = {
{"HPLCOM", NULL, "Left HP Com"},
/* Right HPCOM Output */
- {"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
{"Right HPCOM Mixer", "PGAL Bypass Switch", "Left PGA Mixer"},
{"Right HPCOM Mixer", "DACL1 Switch", "Left DAC Mux"},
- {"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
{"Right HPCOM Mixer", "PGAR Bypass Switch", "Right PGA Mixer"},
{"Right HPCOM Mixer", "DACR1 Switch", "Right DAC Mux"},
@@ -839,6 +890,72 @@ static const struct snd_soc_dapm_route intercon[] = {
{"HPRCOM", NULL, "Right HP Com"},
};
+/* For other than tlv320aic3104 */
+static const struct snd_soc_dapm_route intercon_extra[] = {
+ /* Left Input */
+ {"Left Line2L Mux", "single-ended", "LINE2L"},
+ {"Left Line2L Mux", "differential", "LINE2L"},
+
+ {"Left PGA Mixer", "Line2L Switch", "Left Line2L Mux"},
+ {"Left PGA Mixer", "Mic3L Switch", "MIC3L"},
+ {"Left PGA Mixer", "Mic3R Switch", "MIC3R"},
+
+ {"Left ADC", NULL, "GPIO1 dmic modclk"},
+
+ /* Right Input */
+ {"Right Line2R Mux", "single-ended", "LINE2R"},
+ {"Right Line2R Mux", "differential", "LINE2R"},
+
+ {"Right PGA Mixer", "Line2R Switch", "Right Line2R Mux"},
+ {"Right PGA Mixer", "Mic3L Switch", "MIC3L"},
+ {"Right PGA Mixer", "Mic3R Switch", "MIC3R"},
+
+ {"Right ADC", NULL, "GPIO1 dmic modclk"},
+
+ /*
+ * Logical path between digital mic enable and GPIO1 modulator clock
+ * output function
+ */
+ {"GPIO1 dmic modclk", NULL, "DMic Rate 128"},
+ {"GPIO1 dmic modclk", NULL, "DMic Rate 64"},
+ {"GPIO1 dmic modclk", NULL, "DMic Rate 32"},
+
+ /* Left Line Output */
+ {"Left Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
+ {"Left Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
+
+ /* Right Line Output */
+ {"Right Line Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
+ {"Right Line Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
+
+ /* Left HP Output */
+ {"Left HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
+ {"Left HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
+
+ /* Right HP Output */
+ {"Right HP Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
+ {"Right HP Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
+
+ /* Left HPCOM Output */
+ {"Left HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
+ {"Left HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
+
+ /* Right HPCOM Output */
+ {"Right HPCOM Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
+ {"Right HPCOM Mixer", "Line2R Bypass Switch", "Right Line2R Mux"},
+};
+
+/* For other than tlv320aic3104 */
+static const struct snd_soc_dapm_route intercon_extra_3104[] = {
+ /* Left Input */
+ {"Left PGA Mixer", "Mic2L Switch", "MIC2L"},
+ {"Left PGA Mixer", "Mic2R Switch", "MIC2R"},
+
+ /* Right Input */
+ {"Right PGA Mixer", "Mic2L Switch", "MIC2L"},
+ {"Right PGA Mixer", "Mic2R Switch", "MIC2R"},
+};
+
static const struct snd_soc_dapm_route intercon_mono[] = {
/* Mono Output */
{"Mono Mixer", "Line2L Bypass Switch", "Left Line2L Mux"},
@@ -867,17 +984,31 @@ static int aic3x_add_widgets(struct snd_soc_codec *codec)
switch (aic3x->model) {
case AIC3X_MODEL_3X:
case AIC3X_MODEL_33:
+ snd_soc_dapm_new_controls(dapm, aic3x_extra_dapm_widgets,
+ ARRAY_SIZE(aic3x_extra_dapm_widgets));
+ snd_soc_dapm_add_routes(dapm, intercon_extra,
+ ARRAY_SIZE(intercon_extra));
snd_soc_dapm_new_controls(dapm, aic3x_dapm_mono_widgets,
ARRAY_SIZE(aic3x_dapm_mono_widgets));
snd_soc_dapm_add_routes(dapm, intercon_mono,
ARRAY_SIZE(intercon_mono));
break;
case AIC3X_MODEL_3007:
+ snd_soc_dapm_new_controls(dapm, aic3x_extra_dapm_widgets,
+ ARRAY_SIZE(aic3x_extra_dapm_widgets));
+ snd_soc_dapm_add_routes(dapm, intercon_extra,
+ ARRAY_SIZE(intercon_extra));
snd_soc_dapm_new_controls(dapm, aic3007_dapm_widgets,
ARRAY_SIZE(aic3007_dapm_widgets));
snd_soc_dapm_add_routes(dapm, intercon_3007,
ARRAY_SIZE(intercon_3007));
break;
+ case AIC3X_MODEL_3104:
+ snd_soc_dapm_new_controls(dapm, aic3104_extra_dapm_widgets,
+ ARRAY_SIZE(aic3104_extra_dapm_widgets));
+ snd_soc_dapm_add_routes(dapm, intercon_extra_3104,
+ ARRAY_SIZE(intercon_extra_3104));
+ break;
}
return 0;
@@ -1438,23 +1569,33 @@ static int aic3x_probe(struct snd_soc_codec *codec)
aic3x_init(codec);
if (aic3x->setup) {
- /* setup GPIO functions */
- snd_soc_write(codec, AIC3X_GPIO1_REG,
- (aic3x->setup->gpio_func[0] & 0xf) << 4);
- snd_soc_write(codec, AIC3X_GPIO2_REG,
- (aic3x->setup->gpio_func[1] & 0xf) << 4);
+ if (aic3x->model != AIC3X_MODEL_3104) {
+ /* setup GPIO functions */
+ snd_soc_write(codec, AIC3X_GPIO1_REG,
+ (aic3x->setup->gpio_func[0] & 0xf) << 4);
+ snd_soc_write(codec, AIC3X_GPIO2_REG,
+ (aic3x->setup->gpio_func[1] & 0xf) << 4);
+ } else {
+ dev_warn(codec->dev, "GPIO functionality is not supported on tlv320aic3104\n");
+ }
}
switch (aic3x->model) {
case AIC3X_MODEL_3X:
case AIC3X_MODEL_33:
+ snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls,
+ ARRAY_SIZE(aic3x_extra_snd_controls));
snd_soc_add_codec_controls(codec, aic3x_mono_controls,
ARRAY_SIZE(aic3x_mono_controls));
break;
case AIC3X_MODEL_3007:
+ snd_soc_add_codec_controls(codec, aic3x_extra_snd_controls,
+ ARRAY_SIZE(aic3x_extra_snd_controls));
snd_soc_add_codec_controls(codec,
&aic3x_classd_amp_gain_ctrl, 1);
break;
+ case AIC3X_MODEL_3104:
+ break;
}
/* set mic bias voltage */
@@ -1522,6 +1663,7 @@ static const struct i2c_device_id aic3x_i2c_id[] = {
{ "tlv320aic33", AIC3X_MODEL_33 },
{ "tlv320aic3007", AIC3X_MODEL_3007 },
{ "tlv320aic3106", AIC3X_MODEL_3X },
+ { "tlv320aic3104", AIC3X_MODEL_3104 },
{ }
};
MODULE_DEVICE_TABLE(i2c, aic3x_i2c_id);
--
1.7.9.5
4
10