Commit aa708c61 authored by Takashi Iwai's avatar Takashi Iwai
Browse files

ASoC: blackfin: Convert to the new PCM ops



Replace the copy and the silence ops with the new PCM ops.
In AC97 and I2S-TDM mode, we need to convert back to frames, but
otherwise the conversion is pretty straightforward.

Reviewed-by: default avatarTakashi Sakamoto <o-takashi@sakamocchi.jp>
Acked-by: default avatarMark Brown <broonie@kernel.org>
Signed-off-by: default avatarTakashi Iwai <tiwai@suse.de>
parent 1cc2f8ba
Loading
Loading
Loading
Loading
+19 −8
Original line number Diff line number Diff line
@@ -279,23 +279,33 @@ static int bf5xx_pcm_mmap(struct snd_pcm_substream *substream,
	return 0 ;
}
#else
static	int bf5xx_pcm_copy(struct snd_pcm_substream *substream, int channel,
		    snd_pcm_uframes_t pos,
		    void __user *buf, snd_pcm_uframes_t count)
static	int bf5xx_pcm_copy(struct snd_pcm_substream *substream,
			   int channel, unsigned long pos,
			   void *buf, unsigned long count)
{
	struct snd_pcm_runtime *runtime = substream->runtime;
	unsigned int chan_mask = ac97_chan_mask[runtime->channels - 1];
	struct ac97_frame *dst;

	pr_debug("%s copy pos:0x%lx count:0x%lx\n",
			substream->stream ? "Capture" : "Playback", pos, count);
	dst = (struct ac97_frame *)runtime->dma_area +
		bytes_to_frames(runtime, pos);
	count = bytes_to_frames(runtime, count);

	if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK)
		bf5xx_pcm_to_ac97((struct ac97_frame *)runtime->dma_area + pos,
			(__u16 *)buf, count, chan_mask);
		bf5xx_pcm_to_ac97(dst, buf, count, chan_mask);
	else
		bf5xx_ac97_to_pcm((struct ac97_frame *)runtime->dma_area + pos,
			(__u16 *)buf, count);
		bf5xx_ac97_to_pcm(dst, buf, count);
	return 0;
}

static	int bf5xx_pcm_copy_user(struct snd_pcm_substream *substream,
				int channel, unsigned long pos,
				void __user *buf, unsigned long count)
{
	return bf5xx_pcm_copy(substream, channel, pos, (void *)buf, count);
}
#endif

static struct snd_pcm_ops bf5xx_pcm_ac97_ops = {
@@ -309,7 +319,8 @@ static struct snd_pcm_ops bf5xx_pcm_ac97_ops = {
#if defined(CONFIG_SND_BF5XX_MMAP_SUPPORT)
	.mmap		= bf5xx_pcm_mmap,
#else
	.copy		= bf5xx_pcm_copy,
	.copy_user	= bf5xx_pcm_copy_user,
	.copy_kernel	= bf5xx_pcm_copy,
#endif
};

+24 −12
Original line number Diff line number Diff line
@@ -225,8 +225,9 @@ static int bf5xx_pcm_mmap(struct snd_pcm_substream *substream,
	return 0 ;
}

static int bf5xx_pcm_copy(struct snd_pcm_substream *substream, int channel,
	snd_pcm_uframes_t pos, void *buf, snd_pcm_uframes_t count)
static int bf5xx_pcm_copy(struct snd_pcm_substream *substream,
			  int channel, unsigned long pos,
			  void *buf, unsigned long count)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_pcm_runtime *runtime = substream->runtime;
@@ -238,6 +239,8 @@ static int bf5xx_pcm_copy(struct snd_pcm_substream *substream, int channel,
	dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);

	if (dma_data->tdm_mode) {
		pos = bytes_to_frames(runtime, pos);
		count = bytes_to_frames(runtime, count);
		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
			src = buf;
			dst = runtime->dma_area;
@@ -269,21 +272,29 @@ static int bf5xx_pcm_copy(struct snd_pcm_substream *substream, int channel,
		if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
			src = buf;
			dst = runtime->dma_area;
			dst += frames_to_bytes(runtime, pos);
			dst += pos;
		} else {
			src = runtime->dma_area;
			src += frames_to_bytes(runtime, pos);
			src += pos;
			dst = buf;
		}

		memcpy(dst, src, frames_to_bytes(runtime, count));
		memcpy(dst, src, count);
	}

	return 0;
}

static int bf5xx_pcm_copy_user(struct snd_pcm_substream *substream,
			       int channel, unsigned long pos,
			       void __user *buf, unsigned long count)
{
	return bf5xx_pcm_copy(substream, channel, pos, (void *)buf, count);
}

static int bf5xx_pcm_silence(struct snd_pcm_substream *substream,
	int channel, snd_pcm_uframes_t pos, snd_pcm_uframes_t count)
			     int channel, unsigned long pos,
			     unsigned long count)
{
	struct snd_soc_pcm_runtime *rtd = substream->private_data;
	struct snd_pcm_runtime *runtime = substream->runtime;
@@ -295,11 +306,11 @@ static int bf5xx_pcm_silence(struct snd_pcm_substream *substream,
	dma_data = snd_soc_dai_get_dma_data(rtd->cpu_dai, substream);

	if (dma_data->tdm_mode) {
		offset = pos * 8 * sample_size;
		samples = count * 8;
		offset = bytes_to_frames(runtime, pos) * 8 * sample_size;
		samples = bytes_to_frames(runtime, count) * 8;
	} else {
		offset = frames_to_bytes(runtime, pos);
		samples = count * runtime->channels;
		offset = pos;
		samples = bytes_to_samples(runtime, count);
	}

	snd_pcm_format_set_silence(runtime->format, buf + offset, samples);
@@ -316,8 +327,9 @@ static struct snd_pcm_ops bf5xx_pcm_i2s_ops = {
	.trigger	= bf5xx_pcm_trigger,
	.pointer	= bf5xx_pcm_pointer,
	.mmap		= bf5xx_pcm_mmap,
	.copy		= bf5xx_pcm_copy,
	.silence	= bf5xx_pcm_silence,
	.copy_user	= bf5xx_pcm_copy_user,
	.copy_kernel	= bf5xx_pcm_copy,
	.fill_silence	= bf5xx_pcm_silence,
};

static int bf5xx_pcm_i2s_new(struct snd_soc_pcm_runtime *rtd)