All of lore.kernel.org
 help / color / mirror / Atom feed
From: <Claudiu.Beznea@microchip.com>
To: <amadeuszx.slawinski@linux.intel.com>, <lgirdwood@gmail.com>,
	<broonie@kernel.org>, <robh+dt@kernel.org>,
	<krzysztof.kozlowski+dt@linaro.org>, <perex@perex.cz>,
	<tiwai@suse.com>, <Nicolas.Ferre@microchip.com>,
	<alexandre.belloni@bootlin.com>
Cc: alsa-devel@alsa-project.org, devicetree@vger.kernel.org,
	linux-kernel@vger.kernel.org,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v2 1/3] ASoC: soc-pcm: add option to start DMA after DAI
Date: Fri, 17 Feb 2023 13:14:13 +0000	[thread overview]
Message-ID: <f63059d3-0b92-2916-873c-e67b773cfd11@microchip.com> (raw)
In-Reply-To: <bd634d42-ebab-f713-365d-6936fdb5d77f@linux.intel.com>

On 17.02.2023 15:09, Amadeusz Sławiński wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the
> content is safe
> 
> On 2/17/2023 1:41 PM, Claudiu Beznea wrote:
>> Add option to start DMA component after DAI trigger. This is done
>> by filling the new struct snd_soc_component_driver::start_dma_last.
>>
>> Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
>> ---
>>   include/sound/soc-component.h |  2 ++
>>   sound/soc/soc-pcm.c           | 27 ++++++++++++++++++++++-----
>>   2 files changed, 24 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/sound/soc-component.h b/include/sound/soc-component.h
>> index 3203d35bc8c1..0814ed143864 100644
>> --- a/include/sound/soc-component.h
>> +++ b/include/sound/soc-component.h
>> @@ -190,6 +190,8 @@ struct snd_soc_component_driver {
>>       bool use_dai_pcm_id;    /* use DAI link PCM ID as PCM device number */
>>       int be_pcm_base;        /* base device ID for all BE PCMs */
>>
>> +     unsigned int start_dma_last;
>> +
>>   #ifdef CONFIG_DEBUG_FS
>>       const char *debugfs_prefix;
>>   #endif
>> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
>> index 005b179a770a..5eb056b942ce 100644
>> --- a/sound/soc/soc-pcm.c
>> +++ b/sound/soc/soc-pcm.c
>> @@ -1088,22 +1088,39 @@ static int soc_pcm_hw_params(struct
>> snd_pcm_substream *substream,
>>   static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
>>   {
>>       struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
>> -     int ret = -EINVAL, _ret = 0;
>> +     struct snd_soc_component *component;
>> +     int ret = -EINVAL, _ret = 0, start_dma_last = 0, i;
>>       int rollback = 0;
>>
>>       switch (cmd) {
>>       case SNDRV_PCM_TRIGGER_START:
>>       case SNDRV_PCM_TRIGGER_RESUME:
>>       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
>> +             /* Do we need to start dma last? */
>> +             for_each_rtd_components(rtd, i, component) {
>> +                     if (component->driver->start_dma_last) {
>> +                             start_dma_last = 1;
>> +                             break;
>> +                     }
>> +             }
>> +
>>               ret = snd_soc_link_trigger(substream, cmd, 0);
>>               if (ret < 0)
>>                       goto start_err;
>>
>> -             ret = snd_soc_pcm_component_trigger(substream, cmd, 0);
>> -             if (ret < 0)
>> -                     goto start_err;
>> +             if (start_dma_last) {
>> +                     ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +                     if (ret < 0)
>> +                             goto start_err;
>> +
>> +                     ret = snd_soc_pcm_component_trigger(substream, cmd,
>> 0);
>> +             } else {
>> +                     ret = snd_soc_pcm_component_trigger(substream, cmd,
>> 0);
>> +                     if (ret < 0)
>> +                             goto start_err;
>>
>> -             ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +                     ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +             }
>>   start_err:
>>               if (ret < 0)
>>                       rollback = 1;
> 
> Can all of the above be implemented similarly to already present
> stop_dma_first? It looks similar and I don't see reason to have one flag
> in snd_soc_component_driver and other in snd_soc_dai_link.

That was the other solution identified; I mentioned it in v1; from v1 cover
letter/discussions:

The other solution that was identified for this was to extend the already
existing mechanism around struct snd_soc_dai_link::stop_dma_first. The downside
of this was that a potential struct snd_soc_dai_link::start_dma_last
would have to be populated on sound card driver thus, had to be taken
into account in all sound card drivers. At the moment, the mchp-pdmc is
used only with simple-audio-card. In case of simple-audio-card a new DT
binding would had to be introduced to specify this action on dai-link
descriptions (as of my investigation).

> 
> 


WARNING: multiple messages have this Message-ID (diff)
From: <Claudiu.Beznea@microchip.com>
To: <amadeuszx.slawinski@linux.intel.com>, <lgirdwood@gmail.com>,
	<broonie@kernel.org>, <robh+dt@kernel.org>,
	<krzysztof.kozlowski+dt@linaro.org>, <perex@perex.cz>,
	<tiwai@suse.com>, <Nicolas.Ferre@microchip.com>,
	<alexandre.belloni@bootlin.com>
Cc: <alsa-devel@alsa-project.org>, <devicetree@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 1/3] ASoC: soc-pcm: add option to start DMA after DAI
Date: Fri, 17 Feb 2023 13:14:13 +0000	[thread overview]
Message-ID: <f63059d3-0b92-2916-873c-e67b773cfd11@microchip.com> (raw)
In-Reply-To: <bd634d42-ebab-f713-365d-6936fdb5d77f@linux.intel.com>

On 17.02.2023 15:09, Amadeusz Sławiński wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the
> content is safe
> 
> On 2/17/2023 1:41 PM, Claudiu Beznea wrote:
>> Add option to start DMA component after DAI trigger. This is done
>> by filling the new struct snd_soc_component_driver::start_dma_last.
>>
>> Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
>> ---
>>   include/sound/soc-component.h |  2 ++
>>   sound/soc/soc-pcm.c           | 27 ++++++++++++++++++++++-----
>>   2 files changed, 24 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/sound/soc-component.h b/include/sound/soc-component.h
>> index 3203d35bc8c1..0814ed143864 100644
>> --- a/include/sound/soc-component.h
>> +++ b/include/sound/soc-component.h
>> @@ -190,6 +190,8 @@ struct snd_soc_component_driver {
>>       bool use_dai_pcm_id;    /* use DAI link PCM ID as PCM device number */
>>       int be_pcm_base;        /* base device ID for all BE PCMs */
>>
>> +     unsigned int start_dma_last;
>> +
>>   #ifdef CONFIG_DEBUG_FS
>>       const char *debugfs_prefix;
>>   #endif
>> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
>> index 005b179a770a..5eb056b942ce 100644
>> --- a/sound/soc/soc-pcm.c
>> +++ b/sound/soc/soc-pcm.c
>> @@ -1088,22 +1088,39 @@ static int soc_pcm_hw_params(struct
>> snd_pcm_substream *substream,
>>   static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
>>   {
>>       struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
>> -     int ret = -EINVAL, _ret = 0;
>> +     struct snd_soc_component *component;
>> +     int ret = -EINVAL, _ret = 0, start_dma_last = 0, i;
>>       int rollback = 0;
>>
>>       switch (cmd) {
>>       case SNDRV_PCM_TRIGGER_START:
>>       case SNDRV_PCM_TRIGGER_RESUME:
>>       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
>> +             /* Do we need to start dma last? */
>> +             for_each_rtd_components(rtd, i, component) {
>> +                     if (component->driver->start_dma_last) {
>> +                             start_dma_last = 1;
>> +                             break;
>> +                     }
>> +             }
>> +
>>               ret = snd_soc_link_trigger(substream, cmd, 0);
>>               if (ret < 0)
>>                       goto start_err;
>>
>> -             ret = snd_soc_pcm_component_trigger(substream, cmd, 0);
>> -             if (ret < 0)
>> -                     goto start_err;
>> +             if (start_dma_last) {
>> +                     ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +                     if (ret < 0)
>> +                             goto start_err;
>> +
>> +                     ret = snd_soc_pcm_component_trigger(substream, cmd,
>> 0);
>> +             } else {
>> +                     ret = snd_soc_pcm_component_trigger(substream, cmd,
>> 0);
>> +                     if (ret < 0)
>> +                             goto start_err;
>>
>> -             ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +                     ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +             }
>>   start_err:
>>               if (ret < 0)
>>                       rollback = 1;
> 
> Can all of the above be implemented similarly to already present
> stop_dma_first? It looks similar and I don't see reason to have one flag
> in snd_soc_component_driver and other in snd_soc_dai_link.

That was the other solution identified; I mentioned it in v1; from v1 cover
letter/discussions:

The other solution that was identified for this was to extend the already
existing mechanism around struct snd_soc_dai_link::stop_dma_first. The downside
of this was that a potential struct snd_soc_dai_link::start_dma_last
would have to be populated on sound card driver thus, had to be taken
into account in all sound card drivers. At the moment, the mchp-pdmc is
used only with simple-audio-card. In case of simple-audio-card a new DT
binding would had to be introduced to specify this action on dai-link
descriptions (as of my investigation).

> 
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: <Claudiu.Beznea@microchip.com>
To: <amadeuszx.slawinski@linux.intel.com>, <lgirdwood@gmail.com>,
	<broonie@kernel.org>, <robh+dt@kernel.org>,
	<krzysztof.kozlowski+dt@linaro.org>, <perex@perex.cz>,
	<tiwai@suse.com>, <Nicolas.Ferre@microchip.com>,
	<alexandre.belloni@bootlin.com>
Cc: <alsa-devel@alsa-project.org>, <devicetree@vger.kernel.org>,
	<linux-kernel@vger.kernel.org>,
	<linux-arm-kernel@lists.infradead.org>
Subject: Re: [PATCH v2 1/3] ASoC: soc-pcm: add option to start DMA after DAI
Date: Fri, 17 Feb 2023 13:14:13 +0000	[thread overview]
Message-ID: <f63059d3-0b92-2916-873c-e67b773cfd11@microchip.com> (raw)
In-Reply-To: <bd634d42-ebab-f713-365d-6936fdb5d77f@linux.intel.com>

On 17.02.2023 15:09, Amadeusz Sławiński wrote:
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the
> content is safe
> 
> On 2/17/2023 1:41 PM, Claudiu Beznea wrote:
>> Add option to start DMA component after DAI trigger. This is done
>> by filling the new struct snd_soc_component_driver::start_dma_last.
>>
>> Signed-off-by: Claudiu Beznea <claudiu.beznea@microchip.com>
>> ---
>>   include/sound/soc-component.h |  2 ++
>>   sound/soc/soc-pcm.c           | 27 ++++++++++++++++++++++-----
>>   2 files changed, 24 insertions(+), 5 deletions(-)
>>
>> diff --git a/include/sound/soc-component.h b/include/sound/soc-component.h
>> index 3203d35bc8c1..0814ed143864 100644
>> --- a/include/sound/soc-component.h
>> +++ b/include/sound/soc-component.h
>> @@ -190,6 +190,8 @@ struct snd_soc_component_driver {
>>       bool use_dai_pcm_id;    /* use DAI link PCM ID as PCM device number */
>>       int be_pcm_base;        /* base device ID for all BE PCMs */
>>
>> +     unsigned int start_dma_last;
>> +
>>   #ifdef CONFIG_DEBUG_FS
>>       const char *debugfs_prefix;
>>   #endif
>> diff --git a/sound/soc/soc-pcm.c b/sound/soc/soc-pcm.c
>> index 005b179a770a..5eb056b942ce 100644
>> --- a/sound/soc/soc-pcm.c
>> +++ b/sound/soc/soc-pcm.c
>> @@ -1088,22 +1088,39 @@ static int soc_pcm_hw_params(struct
>> snd_pcm_substream *substream,
>>   static int soc_pcm_trigger(struct snd_pcm_substream *substream, int cmd)
>>   {
>>       struct snd_soc_pcm_runtime *rtd = asoc_substream_to_rtd(substream);
>> -     int ret = -EINVAL, _ret = 0;
>> +     struct snd_soc_component *component;
>> +     int ret = -EINVAL, _ret = 0, start_dma_last = 0, i;
>>       int rollback = 0;
>>
>>       switch (cmd) {
>>       case SNDRV_PCM_TRIGGER_START:
>>       case SNDRV_PCM_TRIGGER_RESUME:
>>       case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
>> +             /* Do we need to start dma last? */
>> +             for_each_rtd_components(rtd, i, component) {
>> +                     if (component->driver->start_dma_last) {
>> +                             start_dma_last = 1;
>> +                             break;
>> +                     }
>> +             }
>> +
>>               ret = snd_soc_link_trigger(substream, cmd, 0);
>>               if (ret < 0)
>>                       goto start_err;
>>
>> -             ret = snd_soc_pcm_component_trigger(substream, cmd, 0);
>> -             if (ret < 0)
>> -                     goto start_err;
>> +             if (start_dma_last) {
>> +                     ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +                     if (ret < 0)
>> +                             goto start_err;
>> +
>> +                     ret = snd_soc_pcm_component_trigger(substream, cmd,
>> 0);
>> +             } else {
>> +                     ret = snd_soc_pcm_component_trigger(substream, cmd,
>> 0);
>> +                     if (ret < 0)
>> +                             goto start_err;
>>
>> -             ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +                     ret = snd_soc_pcm_dai_trigger(substream, cmd, 0);
>> +             }
>>   start_err:
>>               if (ret < 0)
>>                       rollback = 1;
> 
> Can all of the above be implemented similarly to already present
> stop_dma_first? It looks similar and I don't see reason to have one flag
> in snd_soc_component_driver and other in snd_soc_dai_link.

That was the other solution identified; I mentioned it in v1; from v1 cover
letter/discussions:

The other solution that was identified for this was to extend the already
existing mechanism around struct snd_soc_dai_link::stop_dma_first. The downside
of this was that a potential struct snd_soc_dai_link::start_dma_last
would have to be populated on sound card driver thus, had to be taken
into account in all sound card drivers. At the moment, the mchp-pdmc is
used only with simple-audio-card. In case of simple-audio-card a new DT
binding would had to be introduced to specify this action on dai-link
descriptions (as of my investigation).

> 
> 


  reply	other threads:[~2023-02-17 13:15 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-02-17 12:41 [PATCH v2 0/3] ASoC: mchp-pdmc: fix poc noises when starting capture Claudiu Beznea
2023-02-17 12:41 ` Claudiu Beznea
2023-02-17 12:41 ` Claudiu Beznea
2023-02-17 12:41 ` [PATCH v2 1/3] ASoC: soc-pcm: add option to start DMA after DAI Claudiu Beznea
2023-02-17 12:41   ` Claudiu Beznea
2023-02-17 12:41   ` Claudiu Beznea
2023-02-17 13:09   ` Amadeusz Sławiński
2023-02-17 13:09     ` Amadeusz Sławiński
2023-02-17 13:14     ` Claudiu.Beznea [this message]
2023-02-17 13:14       ` Claudiu.Beznea
2023-02-17 13:14       ` Claudiu.Beznea
2023-02-17 12:41 ` [PATCH v2 2/3] ASoC: dt-bindings: sama7g5-pdmc: add microchip,startup-delay-us binding Claudiu Beznea
2023-02-17 12:41   ` Claudiu Beznea
2023-02-17 12:41   ` Claudiu Beznea
2023-02-20 22:56   ` Rob Herring
2023-02-20 22:56     ` Rob Herring
2023-02-20 22:56     ` Rob Herring
2023-02-21  8:10     ` Claudiu.Beznea
2023-02-21  8:10       ` Claudiu.Beznea
2023-02-21  8:10       ` Claudiu.Beznea
2023-02-21  9:23       ` Krzysztof Kozlowski
2023-02-21  9:23         ` Krzysztof Kozlowski
2023-02-21  9:23         ` Krzysztof Kozlowski
2023-02-21 10:52         ` Claudiu.Beznea
2023-02-21 10:52           ` Claudiu.Beznea
2023-02-21 10:52           ` Claudiu.Beznea
2023-02-21 14:50           ` Mark Brown
2023-02-21 14:50             ` Mark Brown
2023-02-21 14:50             ` Mark Brown
2023-02-17 12:41 ` [PATCH v2 3/3] ASoC: mchp-pdmc: fix poc noise at capture startup Claudiu Beznea
2023-02-17 12:41   ` Claudiu Beznea
2023-02-17 12:41   ` Claudiu Beznea

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f63059d3-0b92-2916-873c-e67b773cfd11@microchip.com \
    --to=claudiu.beznea@microchip.com \
    --cc=Nicolas.Ferre@microchip.com \
    --cc=alexandre.belloni@bootlin.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=amadeuszx.slawinski@linux.intel.com \
    --cc=broonie@kernel.org \
    --cc=devicetree@vger.kernel.org \
    --cc=krzysztof.kozlowski+dt@linaro.org \
    --cc=lgirdwood@gmail.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=perex@perex.cz \
    --cc=robh+dt@kernel.org \
    --cc=tiwai@suse.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.