All of lore.kernel.org
 help / color / mirror / Atom feed
From: Takashi Iwai <tiwai@suse.de>
To: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Cc: alsa-devel@alsa-project.org, andriy.shevchenko@intel.com,
	Daniel Baluta <daniel.baluta@gmail.com>,
	liam.r.girdwood@linux.intel.com, vkoul@kernel.org,
	broonie@kernel.org, Alan Cox <alan@linux.intel.com>,
	sound-open-firmware@alsa-project.org
Subject: Re: [PATCH v4 05/14] ASoC: SOF: Add PCM operations support
Date: Thu, 14 Feb 2019 12:20:26 +0100	[thread overview]
Message-ID: <s5hftsqzked.wl-tiwai@suse.de> (raw)
In-Reply-To: <20190213220734.10471-6-pierre-louis.bossart@linux.intel.com>

On Wed, 13 Feb 2019 23:07:25 +0100,
Pierre-Louis Bossart wrote:
> +static int sof_pcm_open(struct snd_pcm_substream *substream)
> +{
....
> +	snd_sof_pcm_platform_open(sdev, substream);

No error check?


> +
> +	mutex_unlock(&spcm->mutex);
> +	return 0;
> +}
> +
> +static int sof_pcm_close(struct snd_pcm_substream *substream)
> +{
> +	struct snd_soc_pcm_runtime *rtd = substream->private_data;
> +	struct snd_soc_component *component =
> +		snd_soc_rtdcom_lookup(rtd, DRV_NAME);
> +	struct snd_sof_dev *sdev =
> +		snd_soc_component_get_drvdata(component);
> +	struct snd_sof_pcm *spcm = rtd->private;
> +	int err;
> +
> +	/* nothing todo for BE */
> +	if (rtd->dai_link->no_pcm)
> +		return 0;
> +
> +	dev_dbg(sdev->dev, "pcm: close stream %d dir %d\n", spcm->pcm.pcm_id,
> +		substream->stream);
> +
> +	snd_sof_pcm_platform_close(sdev, substream);

Doesn't it need spcm->mutex lock while open is called inside mutex?
Or, better to reconsider: what does spcm->mutex protect?

> +
> +	mutex_lock(&spcm->mutex);
> +	pm_runtime_mark_last_busy(sdev->dev);
> +
> +	err = pm_runtime_put_autosuspend(sdev->dev);
> +	if (err < 0)
> +		dev_err(sdev->dev, "error: pcm close failed to idle %d\n",
> +			err);
> +
> +	mutex_unlock(&spcm->mutex);
> +	return 0;
> +}
> +
> +static struct snd_pcm_ops sof_pcm_ops = {
> +	.open		= sof_pcm_open,
> +	.close		= sof_pcm_close,
> +	.ioctl		= snd_pcm_lib_ioctl,
> +	.hw_params	= sof_pcm_hw_params,
> +	.hw_free	= sof_pcm_hw_free,
> +	.trigger	= sof_pcm_trigger,
> +	.pointer	= sof_pcm_pointer,
> +	.page		= snd_pcm_sgbuf_ops_page,
> +};
> +
> +/*
> + * Pre-allocate playback/capture audio buffer pages.
> + * no need to explicitly release memory preallocated by sof_pcm_new in pcm_free
> + * snd_pcm_lib_preallocate_free_for_all() is called by the core.
> + */
> +static int sof_pcm_new(struct snd_soc_pcm_runtime *rtd)
> +{
> +	struct snd_soc_component *component =
> +		snd_soc_rtdcom_lookup(rtd, DRV_NAME);
> +	struct snd_sof_dev *sdev =
> +		snd_soc_component_get_drvdata(component);
> +	struct snd_sof_pcm *spcm;
> +	struct snd_pcm *pcm = rtd->pcm;
> +	struct snd_soc_tplg_stream_caps *caps;
> +	int ret = 0, stream = SNDRV_PCM_STREAM_PLAYBACK;
> +
> +	/* find SOF PCM for this RTD */
> +	spcm = snd_sof_find_spcm_dai(sdev, rtd);
> +	if (!spcm) {
> +		dev_warn(sdev->dev, "warn: can't find PCM with DAI ID %d\n",
> +			 rtd->dai_link->id);
> +		return 0;
> +	}
> +	rtd->private = spcm;
> +
> +	dev_dbg(sdev->dev, "creating new PCM %s\n", spcm->pcm.pcm_name);
> +
> +	/* do we need to pre-allocate playback audio buffer pages */
> +	if (!spcm->pcm.playback)
> +		goto capture;
> +
> +	caps = &spcm->pcm.caps[stream];
> +
> +	/* pre-allocate playback audio buffer pages */
> +	dev_dbg(sdev->dev, "spcm: allocate %s playback DMA buffer size 0x%x max 0x%x\n",
> +		caps->name, caps->buffer_size_min, caps->buffer_size_max);
> +
> +	ret = snd_pcm_lib_preallocate_pages(pcm->streams[stream].substream,
> +					    SNDRV_DMA_TYPE_DEV_SG, sdev->dev,
> +					    le32_to_cpu(caps->buffer_size_min),
> +					    le32_to_cpu(caps->buffer_size_max));
> +	if (ret) {
> +		dev_err(sdev->dev, "error: can't alloc DMA buffer size 0x%x/0x%x for %s %d\n",
> +			caps->buffer_size_min, caps->buffer_size_max,
> +			caps->name, ret);
> +		return ret;
> +	}

The error check here is redundant, please drop.
snd_pcm_lib_preallocate_pages() was changed to be void function
recently, so it'll be a build error.


> +
> +capture:
> +	stream = SNDRV_PCM_STREAM_CAPTURE;
> +
> +	/* do we need to pre-allocate capture audio buffer pages */
> +	if (!spcm->pcm.capture)
> +		return ret;
> +
> +	caps = &spcm->pcm.caps[stream];
> +
> +	/* pre-allocate capture audio buffer pages */
> +	dev_dbg(sdev->dev, "spcm: allocate %s capture DMA buffer size 0x%x max 0x%x\n",
> +		caps->name, caps->buffer_size_min, caps->buffer_size_max);
> +
> +	ret = snd_pcm_lib_preallocate_pages(pcm->streams[stream].substream,
> +					    SNDRV_DMA_TYPE_DEV_SG, sdev->dev,
> +					    le32_to_cpu(caps->buffer_size_min),
> +					    le32_to_cpu(caps->buffer_size_max));
> +	if (ret)
> +		dev_err(sdev->dev, "error: can't alloc DMA buffer size 0x%x/0x%x for %s %d\n",
> +			caps->buffer_size_min, caps->buffer_size_max,
> +			caps->name, ret);

Ditto.


> +
> +	return ret;
> +}
> +
> +/* fixup the BE DAI link to match any values from topology */
> +static int sof_pcm_dai_link_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);
> +	struct snd_soc_component *component =
> +		snd_soc_rtdcom_lookup(rtd, DRV_NAME);
> +	struct snd_sof_dev *sdev =
> +		snd_soc_component_get_drvdata(component);
> +	struct snd_sof_dai *dai =
> +		snd_sof_find_dai(sdev, (char *)rtd->dai_link->name);
> +
> +	/* no topology exists for this BE, try a common configuration */
> +	if (!dai) {
> +		dev_warn(sdev->dev, "warning: no topology found for BE DAI %s config\n",
> +			 rtd->dai_link->name);
> +
> +		/*  set 48k, stereo, 16bits by default */
> +		rate->min = 48000;
> +		rate->max = 48000;
> +
> +		channels->min = 2;
> +		channels->max = 2;
> +
> +		snd_mask_none(fmt);
> +		snd_mask_set(fmt, (__force int)SNDRV_PCM_FORMAT_S16_LE);

Use snd_mask_set_format() macro.  That avoids the ugly cast.


> +
> +		return 0;
> +	}
> +
> +	/* read format from topology */
> +	snd_mask_none(fmt);
> +
> +	switch (dai->comp_dai.config.frame_fmt) {
> +	case SOF_IPC_FRAME_S16_LE:
> +		snd_mask_set(fmt, (__force int)SNDRV_PCM_FORMAT_S16_LE);
> +		break;
> +	case SOF_IPC_FRAME_S24_4LE:
> +		snd_mask_set(fmt, (__force int)SNDRV_PCM_FORMAT_S24_LE);
> +		break;
> +	case SOF_IPC_FRAME_S32_LE:
> +		snd_mask_set(fmt, (__force int)SNDRV_PCM_FORMAT_S32_LE);
> +		break;

Ditto for these three, too.


thanks,

Takashi

  reply	other threads:[~2019-02-14 11:20 UTC|newest]

Thread overview: 81+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-02-13 22:07 [PATCH v4 00/14] ASoC: Sound Open Firmware (SOF) core Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 01/14] ASoC: SOF: Add Sound Open Firmware driver core Pierre-Louis Bossart
2019-02-14  9:25   ` Takashi Iwai
2019-02-14 14:53     ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-02-19 15:38       ` Mark Brown
2019-02-20 14:35         ` Pierre-Louis Bossart
2019-02-20 16:26           ` Mark Brown
2019-02-20 21:32             ` Pierre-Louis Bossart
2019-02-21 18:47               ` Mark Brown
2019-02-22  0:08                 ` Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 02/14] ASoC: SOF: Add Sound Open Firmware KControl support Pierre-Louis Bossart
2019-02-14  9:30   ` Takashi Iwai
2019-02-14 14:35     ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-02-14 15:21       ` Takashi Iwai
2019-02-13 22:07 ` [PATCH v4 03/14] ASoC: SOF: Add driver debug support Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 04/14] ASoC: SOF: Add support for IPC IO between DSP and Host Pierre-Louis Bossart
2019-02-14 11:52   ` Takashi Iwai
2019-02-14 14:56     ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-02-20 17:31       ` Mark Brown
2019-02-13 22:07 ` [PATCH v4 05/14] ASoC: SOF: Add PCM operations support Pierre-Louis Bossart
2019-02-14 11:20   ` Takashi Iwai [this message]
2019-02-14 15:07     ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-02-14 20:42       ` Pierre-Louis Bossart
2019-02-18 15:51   ` Daniel Baluta
2019-02-13 22:07 ` [PATCH v4 06/14] ASoC: SOF: Add support for loading topologies Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 07/14] ASoC: SOF: Add DSP firmware logger support Pierre-Louis Bossart
2019-02-14 13:19   ` Takashi Iwai
2019-02-14 15:13     ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-02-20 17:44   ` Mark Brown
2019-02-20 20:18     ` Pierre-Louis Bossart
2019-02-21 12:29       ` Andy Shevchenko
2019-02-21 14:57         ` Pierre-Louis Bossart
2019-02-21 15:04         ` Mark Brown
2019-02-13 22:07 ` [PATCH v4 08/14] ASoC: SOF: Add DSP HW abstraction operations Pierre-Louis Bossart
2019-02-14 13:21   ` Takashi Iwai
2019-02-14 15:22     ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-02-14 13:45   ` Andy Shevchenko
2019-02-14 15:21     ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 09/14] ASoC: SOF: Add firmware loader support Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 10/14] ASoC: SOF: Add userspace ABI support Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 11/14] ASoC: SOF: Add PM support Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 12/14] ASoC: SOF: Add Nocodec machine driver support Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 13/14] ASoC: SOF: Add xtensa support Pierre-Louis Bossart
2019-02-13 22:07 ` [PATCH v4 14/14] ASoC: SOF: Add utils Pierre-Louis Bossart
2019-02-14 13:33   ` Takashi Iwai
2019-02-14 13:37     ` Takashi Iwai
2019-02-18 20:03 ` [v4,00/14] ASoC: Sound Open Firmware (SOF) core Xiang Xiao
2019-02-19  9:49   ` [alsa-devel] " Srinivas Kandagatla
2019-02-19  9:49     ` Srinivas Kandagatla
2019-02-19 15:09     ` [alsa-devel] " xiang xiao
2019-02-19 15:09       ` xiang xiao
2019-02-19 15:55       ` [alsa-devel] " Pierre-Louis Bossart
2019-02-19 15:55         ` Pierre-Louis Bossart
2019-02-21  4:39         ` [alsa-devel] " Vinod Koul
2019-02-21  4:39           ` Vinod Koul
2019-02-21 10:42           ` [alsa-devel] " Arnaud Pouliquen
2019-02-21 10:42             ` Arnaud Pouliquen
2019-02-21 11:28             ` [alsa-devel] " Mark Brown
2019-02-21 11:28               ` Mark Brown
2019-02-21 23:49               ` [alsa-devel] " Pierre-Louis Bossart
2019-02-21 23:49                 ` Pierre-Louis Bossart
2019-02-21 15:27           ` [alsa-devel] " Pierre-Louis Bossart
2019-02-21 15:27             ` Pierre-Louis Bossart
2019-02-22  8:32             ` [alsa-devel] " xiang xiao
2019-02-22  8:32               ` xiang xiao
2019-02-22 11:15               ` [alsa-devel] " Keyon Jie
2019-02-22 11:15                 ` Keyon Jie
2019-02-22 18:21                 ` [alsa-devel] " xiang xiao
2019-02-22 18:21                   ` xiang xiao
2019-02-25  3:05                   ` [Sound-open-firmware] [alsa-devel] [v4, 00/14] " Keyon Jie
2019-02-25  3:05                     ` [Sound-open-firmware] " Keyon Jie
2019-02-22 14:48               ` [Sound-open-firmware] [alsa-devel] " Pierre-Louis Bossart
2019-02-22 14:48                 ` [Sound-open-firmware] " Pierre-Louis Bossart
2019-02-22 18:41                 ` [Sound-open-firmware] [alsa-devel] " xiang xiao
2019-02-22 18:41                   ` [Sound-open-firmware] " xiang xiao
2019-02-22 21:52                   ` [alsa-devel] " Pierre-Louis Bossart
2019-02-22 21:52                     ` Pierre-Louis Bossart
2019-02-23 16:42                     ` [alsa-devel] " xiang xiao
2019-02-23 16:42                       ` xiang xiao
2019-02-25 10:16                 ` [Sound-open-firmware] [alsa-devel] " Srinivas Kandagatla
2019-02-25 10:16                   ` [Sound-open-firmware] " Srinivas Kandagatla

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=s5hftsqzked.wl-tiwai@suse.de \
    --to=tiwai@suse.de \
    --cc=alan@linux.intel.com \
    --cc=alsa-devel@alsa-project.org \
    --cc=andriy.shevchenko@intel.com \
    --cc=broonie@kernel.org \
    --cc=daniel.baluta@gmail.com \
    --cc=liam.r.girdwood@linux.intel.com \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=sound-open-firmware@alsa-project.org \
    --cc=vkoul@kernel.org \
    /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.