[alsa-devel] [PATCH 1/2] ASoC: dmic: introduce mode switch delay

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Fri Nov 16 15:20:04 CET 2018


On 11/16/18 7:29 AM, Jaroslav Kysela wrote:
> Dne 16.11.2018 v 12:10 Jenny TC napsal(a):
>> On startup, applications such as PulseAudio or CRAS enable playback or
>> capture on all PCM devices to verify that configurations are correct,
>> and close them immediately. For DMICs, this can result in the clock
>> being turned off very quickly, which may not compatible with internal
>> state machine transition requirements.
>>
>> This patch add a mode-switch delay which will prevent the clock from
>> being turned off without complying with manufacturer timing
>> specifications. While the DMIC clock may be controlled at a lower level,
>> be it with hardware or firmware, applying the delay during the
>> STOP_TRIGGER phase ensures that there is no race condition, e.g. with
>> the hardware/firmware turning off the clock earlier
>>
>> Signed-off-by: Sathyanarayana Nujella <sathyanarayana.nujella at intel.com>
>> Signed-off-by: Jairaj Arava <jairaj.arava at intel.com>
>> Signed-off-by: Harsha Priya <harshapriya.n at intel.com>
>> ---
>>   sound/soc/codecs/dmic.c | 31 +++++++++++++++++++++++++++++++
>>   1 file changed, 31 insertions(+)
>>
>> diff --git a/sound/soc/codecs/dmic.c b/sound/soc/codecs/dmic.c
>> index 8c4926d..0527bc2 100644
>> --- a/sound/soc/codecs/dmic.c
>> +++ b/sound/soc/codecs/dmic.c
>> @@ -30,9 +30,35 @@
>>   #include <sound/soc.h>
>>   #include <sound/soc-dapm.h>
>>   
>> +static int modeswitch_delay_ms;
>> +module_param(modeswitch_delay_ms, uint, 0644);
>> +
>>   struct dmic {
>>   	struct gpio_desc *gpio_en;
>>   	int wakeup_delay;
>> +	/* Delay after DMIC mode switch */
>> +	int modeswitch_delay_ms;
>> +};
>> +
>> +int dmic_daiops_trigger(struct snd_pcm_substream *substream,
>> +		int cmd, struct snd_soc_dai *dai)
>> +{
>> +	struct snd_soc_component *component = dai->component;
>> +	struct dmic *dmic = snd_soc_component_get_drvdata(component);
>> +
>> +	switch (cmd) {
>> +	case SNDRV_PCM_TRIGGER_STOP:
>> +		if (dmic->modeswitch_delay_ms)
>> +			mdelay(dmic->modeswitch_delay_ms);
>> +
>> +		break;
>> +	}
>> +
>> +	return 0;
>> +}
>> +
>> +static const struct snd_soc_dai_ops dmic_dai_ops = {
>> +	.trigger	= dmic_daiops_trigger,
>>   };
>>   
>>   static int dmic_aif_event(struct snd_soc_dapm_widget *w,
>> @@ -68,6 +94,7 @@ static int dmic_aif_event(struct snd_soc_dapm_widget *w,
>>   			| SNDRV_PCM_FMTBIT_S24_LE
>>   			| SNDRV_PCM_FMTBIT_S16_LE,
>>   	},
>> +	.ops    = &dmic_dai_ops,
>>   };
>>   
>>   static int dmic_component_probe(struct snd_soc_component *component)
>> @@ -85,6 +112,10 @@ static int dmic_component_probe(struct snd_soc_component *component)
>>   
>>   	device_property_read_u32(component->dev, "wakeup-delay-ms",
>>   				 &dmic->wakeup_delay);
>> +	device_property_read_u32(component->dev, "modeswitch_delay_ms",
>> +				 &dmic->modeswitch_delay_ms);
> This should be probably consistent with the previous property name. Use
> "modeswitch-delay-ms".

Indeed. I'd go even further in the nitpicks department and only use the 
the -ms suffix in the property and use a modeswitch_delay field and 
parameter for naming consistency with the existing wake_delay.

The patches look good otherwise, it's a useful patch to add. Jenny, can 
you do this cosmetic fix and resubmit?

>
>> +	if (modeswitch_delay_ms)
>> +		dmic->modeswitch_delay_ms  = modeswitch_delay_ms;
>>   
>>   	snd_soc_component_set_drvdata(component, dmic);
>>   
>>
> 					Jaroslav
>


More information about the Alsa-devel mailing list