forked from Minki/linux
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: Timo Wischer <twischer@de.adit-jv.com> Signed-off-by: Jiada Wang <jiada_wang@mentor.com> Link: https://lore.kernel.org/r/20190722072403.11008-2-jiada_wang@mentor.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
parent
a789adae59
commit
859fd6cbf1
@ -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,
|
||||
};
|
||||
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user