Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751563AbeAIJGa (ORCPT + 1 other); Tue, 9 Jan 2018 04:06:30 -0500 Received: from mx08-00178001.pphosted.com ([91.207.212.93]:34329 "EHLO mx07-00178001.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750915AbeAIJGU (ORCPT ); Tue, 9 Jan 2018 04:06:20 -0500 Subject: Re: [PATCH] ASoC: codecs: dmic: Make number of channels configurable To: Matthias Kaehlcke , Liam Girdwood , Mark Brown , Jaroslav Kysela , Takashi Iwai , Rob Herring , Mark Rutland CC: "alsa-devel@alsa-project.org" , "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , Bhumika Goyal , huang lin , Brian Norris , Dylan Reid References: <20180105203957.184883-1-mka@chromium.org> From: Arnaud Pouliquen Message-ID: Date: Tue, 9 Jan 2018 10:04:17 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.5.0 MIME-Version: 1.0 In-Reply-To: <20180105203957.184883-1-mka@chromium.org> Content-Type: text/plain; charset="utf-8" Content-Language: en-US Content-Transfer-Encoding: 8bit X-Originating-IP: [10.75.127.44] X-ClientProxiedBy: SFHDAG5NODE1.st.com (10.75.127.13) To SFHDAG3NODE1.st.com (10.75.127.7) X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2018-01-09_05:,, signatures=0 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Return-Path: Hello Mathias, Next time could you add patch version in your mail subject ( [PATCH vX]) easier to follow versions :-). otherwise, Acked-by: Arnaud Pouliquen Regards, Arnaud On 01/05/2018 09:39 PM, Matthias Kaehlcke wrote: > The DMIC DAI driver specifies a number of 1 to 8 channels for each DAI. > The actual number of mics can currently not be configured in the device > tree or audio glue, but is derived from the min/max channels of the CPU > and codec DAI. A typical CPU DAI has two or more channels, in consequence > a single mic is treated as a stereo/multi channel device, even though > only one channel carries audio data. > > This change adds the option to specify the number of used DMIC channels > in the device tree. When specified this value overwrites the default > channels_max value of 8 in the snd_soc_dai_driver struct of the codec. > > Signed-off-by: Matthias Kaehlcke > --- >  Documentation/devicetree/bindings/sound/dmic.txt |  2 ++ >  sound/soc/codecs/dmic.c                          | 24 > +++++++++++++++++++++++- >  2 files changed, 25 insertions(+), 1 deletion(-) > > diff --git a/Documentation/devicetree/bindings/sound/dmic.txt > b/Documentation/devicetree/bindings/sound/dmic.txt > index 54c8ef6498a8..f7bf65611453 100644 > --- a/Documentation/devicetree/bindings/sound/dmic.txt > +++ b/Documentation/devicetree/bindings/sound/dmic.txt > @@ -7,10 +7,12 @@ Required properties: >   >  Optional properties: >          - dmicen-gpios: GPIO specifier for dmic to control start and stop > +       - num-channels: Number of microphones on this DAI >   >  Example node: >   >          dmic_codec: dmic@0 { >                  compatible = "dmic-codec"; >                  dmicen-gpios = <&gpio4 3 GPIO_ACTIVE_HIGH>; > +               num-channels = <1>; >          }; > diff --git a/sound/soc/codecs/dmic.c b/sound/soc/codecs/dmic.c > index b88a1ee66f80..c88f974ebe3e 100644 > --- a/sound/soc/codecs/dmic.c > +++ b/sound/soc/codecs/dmic.c > @@ -107,8 +107,30 @@ static const struct snd_soc_codec_driver soc_dmic = { >   >  static int dmic_dev_probe(struct platform_device *pdev) >  { > +       int err; > +       u32 chans; > +       struct snd_soc_dai_driver *dai_drv = &dmic_dai; > + > +       if (pdev->dev.of_node) { > +               err = of_property_read_u32(pdev->dev.of_node, > "num-channels", &chans); > +               if (err && (err != -ENOENT)) > +                       return err; > + > +               if (!err) { > +                       if (chans < 1 || chans > 8) > +                               return -EINVAL; > + > +                       dai_drv = devm_kzalloc(&pdev->dev, > sizeof(*dai_drv), GFP_KERNEL); > +                       if (!dai_drv) > +                               return -ENOMEM; > + > +                       memcpy(dai_drv, &dmic_dai, sizeof(*dai_drv)); > +                       dai_drv->capture.channels_max = chans; > +               } > +       } > + >          return snd_soc_register_codec(&pdev->dev, > -                       &soc_dmic, &dmic_dai, 1); > +                       &soc_dmic, dai_drv, 1); >  } >   >  static int dmic_dev_remove(struct platform_device *pdev) > -- > 2.16.0.rc0.223.g4a4ac83678-goog >