> -----Original Message----- > From: Anatol Pomozov [mailto:anatol.pomozov@xxxxxxxxx] > Sent: Sunday, December 20, 2015 5:37 PM > To: Fang, Yang A > Cc: Mark Brown; Liam Girdwood; alsa-devel@xxxxxxxxxxxxxxxx; Ainapure, > Rohit M; Ausmus, James; Koul, Vinod; Konno, Joe; Nujella, Sathyanarayana; > Kp, Jeeja; Patel, Vedang; Zhi, Yong > Subject: Re: [PATCH 3/8] ASoC: Intel: Skylake: Add Nuvoton > Maxim machine driver > > Hi Yang > > On Fri, Dec 11, 2015 at 11:29 AM, <yang.a.fang@xxxxxxxxx> wrote: > > From: Rohit Ainapure <rohit.m.ainapure@xxxxxxxxx> > > > > This adds Skylake I2S machine driver which uses NAU88L25 as anlog > > codec and MAX98357A as speakers > > > > Signed-off-by: Rohit Ainapure <rohit.m.ainapure@xxxxxxxxx> > > Signed-off-by: Fang, Yang A <yang.a.fang@xxxxxxxxx> > > Signed-off-by: Vinod Koul <vinod.koul@xxxxxxxxx> > > --- > > sound/soc/intel/Kconfig | 14 + > > sound/soc/intel/boards/Makefile | 2 + > > sound/soc/intel/boards/skl_nau88l25_max98357a.c | 485 > > +++++++++++++++++++++++ > > 3 files changed, 501 insertions(+) > > create mode 100644 sound/soc/intel/boards/skl_nau88l25_max98357a.c > > > > diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig index > > 2d3b124..9b1c0aa 100644 > > --- a/sound/soc/intel/Kconfig > > +++ b/sound/soc/intel/Kconfig > > @@ -169,3 +169,17 @@ config > SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH > > create an alsa sound card for NAU88L25 + SSM4567. > > Say Y if you have such a device > > If unsure select "N". > > + > > +config SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH > > + tristate "ASoC Audio driver for SKL with NAU88L25 and MAX98357A in > I2S Mode" > > I there any reason you keep using inconsistent name for this IC. The original > driver uses "NAU8825" name and the one above is "NAU88L25". > > Please keep naming consistent. The driver chip should be names either > NAU8825 or NAU88L25 but it has to be done everywhere. > Hi Anatol Thanks for the suggestion. I will rename them to reflect correctly Thanks, Yang > I had this question to Vinod earlier as well sent NAU88L25 -> NAU8825 > rename patch but got no reply. > > > + depends on X86_INTEL_LPSS && I2C > > + select SND_SOC_INTEL_SST > > + select SND_SOC_INTEL_SKYLAKE > > + select SND_SOC_NAU8825 > > + select SND_SOC_MAX98357A > > + select SND_SOC_DMIC > > + help > > + This adds support for ASoC Onboard Codec I2S machine driver. This > will > > + create an alsa sound card for NAU88L25 + MAX98357A. > > + Say Y if you have such a device > > + If unsure select "N". > > diff --git a/sound/soc/intel/boards/Makefile > > b/sound/soc/intel/boards/Makefile index a59f762..2485ea9 100644 > > --- a/sound/soc/intel/boards/Makefile > > +++ b/sound/soc/intel/boards/Makefile > > @@ -7,6 +7,7 @@ snd-soc-sst-cht-bsw-rt5672-objs := cht_bsw_rt5672.o > > snd-soc-sst-cht-bsw-rt5645-objs := cht_bsw_rt5645.o > > snd-soc-sst-cht-bsw-max98090_ti-objs := cht_bsw_max98090_ti.o > > snd-soc-skl_rt286-objs := skl_rt286.o > > +snd-skl_nau88l25_max98357a-objs := skl_nau88l25_max98357a.o > > snd-soc-skl_nau88l25_ssm4567-objs := skl_nau88l25_ssm4567.o > > > > obj-$(CONFIG_SND_SOC_INTEL_HASWELL_MACH) += snd-soc-sst- > haswell.o @@ > > -18,4 +19,5 @@ 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 > > obj-$(CONFIG_SND_SOC_INTEL_CHT_BSW_MAX98090_TI_MACH) += > > snd-soc-sst-cht-bsw-max98090_ti.o > > obj-$(CONFIG_SND_SOC_INTEL_SKL_RT286_MACH) += snd-soc- > skl_rt286.o > > +obj-$(CONFIG_SND_SOC_INTEL_SKL_NAU88L25_MAX98357A_MACH) += > > +snd-skl_nau88l25_max98357a.o > > obj-$(CONFIG_SND_SOC_INTEL_SKL_NAU88L25_SSM4567_MACH) += > > snd-soc-skl_nau88l25_ssm4567.o diff --git > > a/sound/soc/intel/boards/skl_nau88l25_max98357a.c > > b/sound/soc/intel/boards/skl_nau88l25_max98357a.c > > new file mode 100644 > > index 0000000..ab7da9c > > --- /dev/null > > +++ b/sound/soc/intel/boards/skl_nau88l25_max98357a.c > > @@ -0,0 +1,485 @@ > > +/* > > + * Intel Skylake I2S Machine Driver with MAXIM98357A > > + * and NAU88L25 > > + * > > + * Copyright (C) 2015, Intel Corporation. All rights reserved. > > + * > > + * This program is free software; you can redistribute it and/or > > + * modify it under the terms of the GNU General Public License > > +version > > + * 2 as published by the Free Software Foundation. > > + * > > + * 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 <sound/core.h> > > +#include <sound/jack.h> > > +#include <sound/pcm.h> > > +#include <sound/pcm_params.h> > > +#include <sound/soc.h> > > +#include "../../codecs/nau8825.h" > > + > > +#define SKL_NUVOTON_CODEC_DAI "nau8825-hifi" > > +#define SKL_MAXIM_CODEC_DAI "HiFi" > > + > > +static struct snd_soc_jack skylake_headset; static struct > > +snd_soc_card skylake_audio_card; > > + > > +static inline struct snd_soc_dai *skl_get_codec_dai(struct > > +snd_soc_card *card) { > > + struct snd_soc_pcm_runtime *rtd; > > + > > + list_for_each_entry(rtd, &card->rtd_list, list) { > > + > > + if (!strncmp(rtd->codec_dai->name, SKL_NUVOTON_CODEC_DAI, > > + strlen(SKL_NUVOTON_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; > > + int ret; > > + > > + codec_dai = skl_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_ON(event)) { > > + ret = snd_soc_dai_set_sysclk(codec_dai, > > + NAU8825_CLK_MCLK, 24000000, SND_SOC_CLOCK_IN); > > + if (ret < 0) { > > + dev_err(card->dev, "set sysclk err = %d\n", ret); > > + return -EIO; > > + } > > + } else { > > + ret = snd_soc_dai_set_sysclk(codec_dai, > > + NAU8825_CLK_INTERNAL, 0, SND_SOC_CLOCK_IN); > > + if (ret < 0) { > > + dev_err(card->dev, "set sysclk err = %d\n", ret); > > + return -EIO; > > + } > > + } > > + > > + return ret; > > +} > > + > > +static const struct snd_kcontrol_new skylake_controls[] = { > > + SOC_DAPM_PIN_SWITCH("Headphone Jack"), > > + SOC_DAPM_PIN_SWITCH("Headset Mic"), > > + SOC_DAPM_PIN_SWITCH("Spk"), > > +}; > > + > > +static const struct snd_soc_dapm_widget skylake_widgets[] = { > > + SND_SOC_DAPM_HP("Headphone Jack", NULL), > > + SND_SOC_DAPM_MIC("Headset Mic", NULL), > > + SND_SOC_DAPM_SPK("Spk", NULL), > > + SND_SOC_DAPM_MIC("SoC DMIC", NULL), > > + SND_SOC_DAPM_SINK("WoV Sink"), > > + SND_SOC_DAPM_SPK("DP", NULL), > > + SND_SOC_DAPM_SPK("HDMI", NULL), > > + SND_SOC_DAPM_SUPPLY("Platform Clock", SND_SOC_NOPM, 0, 0, > > + platform_clock_control, SND_SOC_DAPM_PRE_PMU | > > + SND_SOC_DAPM_POST_PMD), }; > > + > > +static const struct snd_soc_dapm_route skylake_map[] = { > > + /* HP jack connectors - unknown if we have jack detection */ > > + { "Headphone Jack", NULL, "HPOL" }, > > + { "Headphone Jack", NULL, "HPOR" }, > > + > > + /* speaker */ > > + { "Spk", NULL, "Speaker" }, > > + > > + /* other jacks */ > > + { "MIC", NULL, "Headset Mic" }, > > + { "DMic", NULL, "SoC DMIC" }, > > + > > + {"WoV Sink", NULL, "hwd_in sink"}, > > + {"HDMI", NULL, "hif5 Output"}, > > + {"DP", NULL, "hif6 Output"}, > > + > > + /* CODEC BE connections */ > > + { "HiFi Playback", NULL, "ssp0 Tx" }, > > + { "ssp0 Tx", NULL, "codec0_out" }, > > + > > + { "Playback", NULL, "ssp1 Tx" }, > > + { "ssp1 Tx", NULL, "codec1_out" }, > > + > > + { "codec0_in", NULL, "ssp1 Rx" }, > > + { "ssp1 Rx", NULL, "Capture" }, > > + > > + /* DMIC */ > > + { "dmic01_hifi", NULL, "DMIC01 Rx" }, > > + { "DMIC01 Rx", NULL, "DMIC AIF" }, > > + { "hifi1", NULL, "iDisp Tx"}, > > + { "iDisp Tx", NULL, "iDisp_out"}, > > + { "Headphone Jack", NULL, "Platform Clock" }, > > + { "Headset Mic", NULL, "Platform Clock" }, }; > > + > > +static int skylake_ssp_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); > > + struct snd_mask *fmt = hw_param_mask(params, > > +SNDRV_PCM_HW_PARAM_FORMAT); > > + > > + /* The ADSP will covert the FE rate to 48k, stereo */ > > + rate->min = rate->max = 48000; > > + channels->min = channels->max = 2; > > + > > + /* set SSP0 to 24 bit */ > > + snd_mask_none(fmt); > > + snd_mask_set(fmt, SNDRV_PCM_FORMAT_S24_LE); > > + > > + return 0; > > +} > > + > > +static int skylake_nau8825_codec_init(struct snd_soc_pcm_runtime > > +*rtd) { > > + int ret; > > + struct snd_soc_codec *codec = rtd->codec; > > + > > + /* > > + * Headset buttons map to the google Reference headset. > > + * These can be configured by userspace. > > + */ > > + ret = snd_soc_card_jack_new(&skylake_audio_card, "Headset Jack", > > + SND_JACK_HEADSET | SND_JACK_BTN_0 | SND_JACK_BTN_1 > | > > + SND_JACK_BTN_2 | SND_JACK_BTN_3, &skylake_headset, > > + NULL, 0); > > + if (ret) { > > + dev_err(rtd->dev, "Headset Jack creation failed %d\n", ret); > > + return ret; > > + } > > + > > + nau8825_enable_jack_detect(codec, &skylake_headset); > > + > > + snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "SoC DMIC"); > > + snd_soc_dapm_ignore_suspend(&rtd->card->dapm, "WoV Sink"); > > + > > + return ret; > > +} > > + > > +static int skylake_nau8825_fe_init(struct snd_soc_pcm_runtime *rtd) { > > + struct snd_soc_dapm_context *dapm; > > + struct snd_soc_component *component = rtd->cpu_dai->component; > > + > > + dapm = snd_soc_component_get_dapm(component); > > + snd_soc_dapm_ignore_suspend(dapm, "Reference Capture"); > > + > > + return 0; > > +} > > + > > +static unsigned int rates[] = { > > + 48000, > > +}; > > + > > +static struct snd_pcm_hw_constraint_list constraints_rates = { > > + .count = ARRAY_SIZE(rates), > > + .list = rates, > > + .mask = 0, > > +}; > > + > > +static unsigned int channels[] = { > > + 2, > > +}; > > + > > +static struct snd_pcm_hw_constraint_list constraints_channels = { > > + .count = ARRAY_SIZE(channels), > > + .list = channels, > > + .mask = 0, > > +}; > > + > > +static int skl_fe_startup(struct snd_pcm_substream *substream) { > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + > > + /* > > + * On this platform for PCM device we support, > > + * 48Khz > > + * stereo > > + * 16 bit audio > > + */ > > + > > + runtime->hw.channels_max = 2; > > + snd_pcm_hw_constraint_list(runtime, 0, > SNDRV_PCM_HW_PARAM_CHANNELS, > > + &constraints_channels); > > + > > + runtime->hw.formats = SNDRV_PCM_FMTBIT_S16_LE; > > + snd_pcm_hw_constraint_msbits(runtime, 0, 16, 16); > > + > > + snd_pcm_hw_constraint_list(runtime, 0, > > + SNDRV_PCM_HW_PARAM_RATE, > > + &constraints_rates); > > + > > + return 0; > > +} > > + > > +static const struct snd_soc_ops skylake_nau8825_fe_ops = { > > + .startup = skl_fe_startup, > > +}; > > + > > +static int skylake_nau8825_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; > > + > > + ret = snd_soc_dai_set_sysclk(codec_dai, > > + NAU8825_CLK_MCLK, 24000000, SND_SOC_CLOCK_IN); > > + > > + if (ret < 0) > > + dev_err(rtd->dev, "snd_soc_dai_set_sysclk err = %d\n", > > + ret); > > + > > + return ret; > > +} > > + > > +static struct snd_soc_ops skylake_nau8825_ops = { > > + .hw_params = skylake_nau8825_hw_params, }; > > + > > +static int skylake_dmic_fixup(struct snd_soc_pcm_runtime *rtd, > > + struct snd_pcm_hw_params *params) { > > + struct snd_interval *channels = hw_param_interval(params, > > + SNDRV_PCM_HW_PARAM_CHANNELS); > > + > > + if (params_channels(params) == 2) > > + channels->min = channels->max = 2; > > + else > > + channels->min = channels->max = 4; > > + > > + return 0; > > +} > > + > > +static unsigned int channels_dmic[] = { > > + 2, 4, > > +}; > > + > > +static struct snd_pcm_hw_constraint_list constraints_dmic_channels = { > > + .count = ARRAY_SIZE(channels_dmic), > > + .list = channels_dmic, > > + .mask = 0, > > +}; > > + > > +static int skylake_dmic_startup(struct snd_pcm_substream *substream) > > +{ > > + struct snd_pcm_runtime *runtime = substream->runtime; > > + > > + runtime->hw.channels_max = 4; > > + snd_pcm_hw_constraint_list(runtime, 0, > SNDRV_PCM_HW_PARAM_CHANNELS, > > + &constraints_dmic_channels); > > + > > + return snd_pcm_hw_constraint_list(substream->runtime, 0, > > + SNDRV_PCM_HW_PARAM_RATE, &constraints_rates); > > +} > > + > > +static struct snd_soc_ops skylake_dmic_ops = { > > + .startup = skylake_dmic_startup, }; > > + > > +static unsigned int rates_16000[] = { > > + 16000, > > +}; > > + > > +static struct snd_pcm_hw_constraint_list constraints_16000 = { > > + .count = ARRAY_SIZE(rates_16000), > > + .list = rates_16000, > > +}; > > + > > +static int skylake_refcap_startup(struct snd_pcm_substream > > +*substream) { > > + return snd_pcm_hw_constraint_list(substream->runtime, 0, > > + SNDRV_PCM_HW_PARAM_RATE, > > + &constraints_16000); } > > + > > +static struct snd_soc_ops skylaye_refcap_ops = { > > + .startup = skylake_refcap_startup, }; > > + > > +/* skylake digital audio interface glue - connects codec <--> CPU */ > > +static struct snd_soc_dai_link skylake_dais[] = { > > + /* Front End DAI links */ > > + { > > + .name = "Skl Audio Port", > > + .stream_name = "Audio", > > + .cpu_dai_name = "System Pin", > > + .platform_name = "0000:00:1f.3", > > + .dynamic = 1, > > + .codec_name = "snd-soc-dummy", > > + .codec_dai_name = "snd-soc-dummy-dai", > > + .nonatomic = 1, > > + .init = skylake_nau8825_fe_init, > > + .trigger = { > > + SND_SOC_DPCM_TRIGGER_POST, > SND_SOC_DPCM_TRIGGER_POST}, > > + .dpcm_playback = 1, > > + .ops = &skylake_nau8825_fe_ops, > > + }, > > + { > > + .name = "Skl Audio Capture Port", > > + .stream_name = "Audio Record", > > + .cpu_dai_name = "System Pin", > > + .platform_name = "0000:00:1f.3", > > + .dynamic = 1, > > + .codec_name = "snd-soc-dummy", > > + .codec_dai_name = "snd-soc-dummy-dai", > > + .nonatomic = 1, > > + .trigger = { > > + SND_SOC_DPCM_TRIGGER_POST, > SND_SOC_DPCM_TRIGGER_POST}, > > + .dpcm_capture = 1, > > + .ops = &skylake_nau8825_fe_ops, > > + }, > > + { > > + .name = "Skl Audio Reference cap", > > + .stream_name = "Wake on Voice", > > + .cpu_dai_name = "Reference Pin", > > + .codec_name = "snd-soc-dummy", > > + .codec_dai_name = "snd-soc-dummy-dai", > > + .platform_name = "0000:00:1f.3", > > + .init = NULL, > > + .dpcm_capture = 1, > > + .ignore_suspend = 1, > > + .nonatomic = 1, > > + .dynamic = 1, > > + .ops = &skylaye_refcap_ops, > > + }, > > + { > > + .name = "Skl Audio DMIC cap", > > + .stream_name = "dmiccap", > > + .cpu_dai_name = "DMIC Pin", > > + .codec_name = "snd-soc-dummy", > > + .codec_dai_name = "snd-soc-dummy-dai", > > + .platform_name = "0000:00:1f.3", > > + .init = NULL, > > + .dpcm_capture = 1, > > + .nonatomic = 1, > > + .dynamic = 1, > > + .ops = &skylake_dmic_ops, > > + }, > > + { > > + .name = "Skl HDMI Port", > > + .stream_name = "Hdmi", > > + .cpu_dai_name = "HDMI Pin", > > + .codec_name = "snd-soc-dummy", > > + .codec_dai_name = "snd-soc-dummy-dai", > > + .platform_name = "0000:00:1f.3", > > + .dpcm_playback = 1, > > + .init = NULL, > > + .nonatomic = 1, > > + .dynamic = 1, > > + }, > > + > > + /* Back End DAI links */ > > + { > > + /* SSP0 - Codec */ > > + .name = "SSP0-Codec", > > + .be_id = 0, > > + .cpu_dai_name = "SSP0 Pin", > > + .platform_name = "0000:00:1f.3", > > + .no_pcm = 1, > > + .codec_name = "MX98357A:00", > > + .codec_dai_name = SKL_MAXIM_CODEC_DAI, > > + .dai_fmt = SND_SOC_DAIFMT_I2S | > > + SND_SOC_DAIFMT_NB_NF | > > + SND_SOC_DAIFMT_CBS_CFS, > > + .ignore_pmdown_time = 1, > > + .be_hw_params_fixup = skylake_ssp_fixup, > > + .dpcm_playback = 1, > > + }, > > + { > > + /* SSP1 - Codec */ > > + .name = "SSP1-Codec", > > + .be_id = 0, > > + .cpu_dai_name = "SSP1 Pin", > > + .platform_name = "0000:00:1f.3", > > + .no_pcm = 1, > > + .codec_name = "i2c-10508825:00", > > + .codec_dai_name = SKL_NUVOTON_CODEC_DAI, > > + .init = skylake_nau8825_codec_init, > > + .dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF | > > + SND_SOC_DAIFMT_CBS_CFS, > > + .ignore_pmdown_time = 1, > > + .be_hw_params_fixup = skylake_ssp_fixup, > > + .ops = &skylake_nau8825_ops, > > + .dpcm_playback = 1, > > + .dpcm_capture = 1, > > + }, > > + { > > + .name = "dmic01", > > + .be_id = 1, > > + .cpu_dai_name = "DMIC01 Pin", > > + .codec_name = "dmic-codec", > > + .codec_dai_name = "dmic-hifi", > > + .platform_name = "0000:00:1f.3", > > + .be_hw_params_fixup = skylake_dmic_fixup, > > + .ignore_suspend = 1, > > + .dpcm_capture = 1, > > + .no_pcm = 1, > > + }, > > + { > > + .name = "iDisp", > > + .be_id = 3, > > + .cpu_dai_name = "iDisp Pin", > > + .codec_name = "ehdaudio0D2", > > + .codec_dai_name = "intel-hdmi-hifi1", > > + .platform_name = "0000:00:1f.3", > > + .dpcm_playback = 1, > > + .no_pcm = 1, > > + }, > > +}; > > + > > +/* skylake audio machine driver for SPT + NAU88L25 */ static struct > > +snd_soc_card skylake_audio_card = { > > + .name = "sklnau8825max", > > + .owner = THIS_MODULE, > > + .dai_link = skylake_dais, > > + .num_links = ARRAY_SIZE(skylake_dais), > > + .controls = skylake_controls, > > + .num_controls = ARRAY_SIZE(skylake_controls), > > + .dapm_widgets = skylake_widgets, > > + .num_dapm_widgets = ARRAY_SIZE(skylake_widgets), > > + .dapm_routes = skylake_map, > > + .num_dapm_routes = ARRAY_SIZE(skylake_map), > > + .fully_routed = true, > > +}; > > + > > +static int skylake_audio_probe(struct platform_device *pdev) { > > + skylake_audio_card.dev = &pdev->dev; > > + > > + return devm_snd_soc_register_card(&pdev->dev, > > +&skylake_audio_card); } > > + > > +static struct platform_driver skylake_audio = { > > + .probe = skylake_audio_probe, > > + .driver = { > > + .name = "skl_nau88l25_max98357a_i2s", > > + .pm = &snd_soc_pm_ops, > > + }, > > +}; > > + > > +module_platform_driver(skylake_audio) > > + > > +/* Module information */ > > +MODULE_DESCRIPTION("Audio Machine driver-NAU88L25 & MAX98357A > in I2S > > +mode"); MODULE_AUTHOR("Rohit Ainapure > <rohit.m.ainapure@xxxxxxxxx"); > > +MODULE_LICENSE("GPL v2"); > > +MODULE_ALIAS("platform:skl_nau88l25_max98357a_i2s"); > > -- > > 1.7.9.5 > > > > _______________________________________________ > > Alsa-devel mailing list > > Alsa-devel@xxxxxxxxxxxxxxxx > > http://mailman.alsa-project.org/mailman/listinfo/alsa-devel _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel