Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Unverified Commit 859fd6cb authored by Timo Wischer's avatar Timo Wischer Committed by Mark Brown
Browse files

ASoC: rsnd: Support hw_free() callback at DAI level



This patch provides the needed infrastructure to support calling hw_free()
at the DAI level. This is for example required to free resources allocated
in hw_params() callback.

The modification of __rsnd_mod_add_hw_params does not have any side
effects because rsnd_mod_ops::hw_params callback is not used by anyone
until now.

Signed-off-by: default avatarTimo Wischer <twischer@de.adit-jv.com>
Signed-off-by: default avatarJiada Wang <jiada_wang@mentor.com>
Link: https://lore.kernel.org/r/20190722072403.11008-2-jiada_wang@mentor.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent a789adae
Loading
Loading
Loading
Loading
+15 −1
Original line number Diff line number Diff line
@@ -1421,6 +1421,20 @@ static int rsnd_hw_params(struct snd_pcm_substream *substream,
					params_buffer_bytes(hw_params));
}

static int rsnd_hw_free(struct snd_pcm_substream *substream)
{
	struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
	struct rsnd_dai *rdai = rsnd_dai_to_rdai(dai);
	struct rsnd_dai_stream *io = rsnd_rdai_to_io(rdai, substream);
	int ret;

	ret = rsnd_dai_call(hw_free, io, substream);
	if (ret)
		return ret;

	return snd_pcm_lib_free_pages(substream);
}

static snd_pcm_uframes_t rsnd_pointer(struct snd_pcm_substream *substream)
{
	struct snd_soc_dai *dai = rsnd_substream_to_dai(substream);
@@ -1436,7 +1450,7 @@ static snd_pcm_uframes_t rsnd_pointer(struct snd_pcm_substream *substream)
static const struct snd_pcm_ops rsnd_pcm_ops = {
	.ioctl		= snd_pcm_lib_ioctl,
	.hw_params	= rsnd_hw_params,
	.hw_free	= snd_pcm_lib_free_pages,
	.hw_free	= rsnd_hw_free,
	.pointer	= rsnd_pointer,
};

+9 −3
Original line number Diff line number Diff line
@@ -327,6 +327,9 @@ struct rsnd_mod_ops {
	int (*cleanup)(struct rsnd_mod *mod,
		       struct rsnd_dai_stream *io,
		       struct rsnd_priv *priv);
	int (*hw_free)(struct rsnd_mod *mod,
		       struct rsnd_dai_stream *io,
		       struct snd_pcm_substream *substream);
	u32 *(*get_status)(struct rsnd_mod *mod,
			   struct rsnd_dai_stream *io,
			   enum rsnd_mod_type type);
@@ -351,12 +354,12 @@ struct rsnd_mod {
 *
 * B	0: init		1: quit
 * C	0: start	1: stop
 * D	0: hw_params	1: hw_free
 *
 * H is always called (see __rsnd_mod_call)
 * H	0: probe	1: remove
 * H	0: pcm_new
 * H	0: fallback
 * H	0: hw_params
 * H	0: pointer
 * H	0: prepare
 * H	0: cleanup
@@ -365,12 +368,13 @@ struct rsnd_mod {
#define __rsnd_mod_shift_quit		4
#define __rsnd_mod_shift_start		8
#define __rsnd_mod_shift_stop		8
#define __rsnd_mod_shift_hw_params	12
#define __rsnd_mod_shift_hw_free	12
#define __rsnd_mod_shift_probe		28 /* always called */
#define __rsnd_mod_shift_remove		28 /* always called */
#define __rsnd_mod_shift_irq		28 /* always called */
#define __rsnd_mod_shift_pcm_new	28 /* always called */
#define __rsnd_mod_shift_fallback	28 /* always called */
#define __rsnd_mod_shift_hw_params	28 /* always called */
#define __rsnd_mod_shift_pointer	28 /* always called */
#define __rsnd_mod_shift_prepare	28 /* always called */
#define __rsnd_mod_shift_cleanup	28 /* always called */
@@ -383,10 +387,11 @@ struct rsnd_mod {
#define __rsnd_mod_add_quit		-1
#define __rsnd_mod_add_start		 1
#define __rsnd_mod_add_stop		-1
#define __rsnd_mod_add_hw_params	1
#define __rsnd_mod_add_hw_free		-1
#define __rsnd_mod_add_irq		0
#define __rsnd_mod_add_pcm_new		0
#define __rsnd_mod_add_fallback		0
#define __rsnd_mod_add_hw_params	0
#define __rsnd_mod_add_pointer		0

#define __rsnd_mod_call_probe		0
@@ -402,6 +407,7 @@ struct rsnd_mod {
#define __rsnd_mod_call_fallback	0
#define __rsnd_mod_call_hw_params	0
#define __rsnd_mod_call_pointer		0
#define __rsnd_mod_call_hw_free		1

#define rsnd_mod_to_priv(mod)	((mod)->priv)
#define rsnd_mod_power_on(mod)	clk_enable((mod)->clk)