Loading include/sound/soc.h +6 −12 Original line number Original line Diff line number Diff line Loading @@ -507,9 +507,6 @@ int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms); int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream, int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream, const struct snd_pcm_hardware *hw); const struct snd_pcm_hardware *hw); int snd_soc_platform_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_platform *platform); int soc_dai_hw_params(struct snd_pcm_substream *substream, int soc_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai); struct snd_soc_dai *dai); Loading Loading @@ -785,6 +782,10 @@ struct snd_soc_component_driver { int (*suspend)(struct snd_soc_component *); int (*suspend)(struct snd_soc_component *); int (*resume)(struct snd_soc_component *); int (*resume)(struct snd_soc_component *); /* pcm creation and destruction */ int (*pcm_new)(struct snd_soc_pcm_runtime *); void (*pcm_free)(struct snd_pcm *); /* DT */ /* DT */ int (*of_xlate_dai_name)(struct snd_soc_component *component, int (*of_xlate_dai_name)(struct snd_soc_component *component, struct of_phandle_args *args, struct of_phandle_args *args, Loading Loading @@ -859,6 +860,8 @@ struct snd_soc_component { void (*remove)(struct snd_soc_component *); void (*remove)(struct snd_soc_component *); int (*suspend)(struct snd_soc_component *); int (*suspend)(struct snd_soc_component *); int (*resume)(struct snd_soc_component *); int (*resume)(struct snd_soc_component *); int (*pcm_new)(struct snd_soc_pcm_runtime *); void (*pcm_free)(struct snd_pcm *); /* machine specific init */ /* machine specific init */ int (*init)(struct snd_soc_component *component); int (*init)(struct snd_soc_component *component); Loading Loading @@ -941,20 +944,11 @@ struct snd_soc_platform_driver { int (*pcm_new)(struct snd_soc_pcm_runtime *); int (*pcm_new)(struct snd_soc_pcm_runtime *); void (*pcm_free)(struct snd_pcm *); void (*pcm_free)(struct snd_pcm *); /* * For platform caused delay reporting. * Optional. */ snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *, struct snd_soc_dai *); /* platform stream pcm ops */ /* platform stream pcm ops */ const struct snd_pcm_ops *ops; const struct snd_pcm_ops *ops; /* platform stream compress ops */ /* platform stream compress ops */ const struct snd_compr_ops *compr_ops; const struct snd_compr_ops *compr_ops; int (*bespoke_trigger)(struct snd_pcm_substream *, int); }; }; struct snd_soc_dai_link_component { struct snd_soc_dai_link_component { Loading sound/soc/soc-core.c +21 −0 Original line number Original line Diff line number Diff line Loading @@ -2976,6 +2976,8 @@ static int snd_soc_component_initialize(struct snd_soc_component *component, component->remove = component->driver->remove; component->remove = component->driver->remove; component->suspend = component->driver->suspend; component->suspend = component->driver->suspend; component->resume = component->driver->resume; component->resume = component->driver->resume; component->pcm_new = component->driver->pcm_new; component->pcm_free= component->driver->pcm_free; dapm = &component->dapm; dapm = &component->dapm; dapm->dev = dev; dapm->dev = dev; Loading Loading @@ -3158,6 +3160,21 @@ static void snd_soc_platform_drv_remove(struct snd_soc_component *component) platform->driver->remove(platform); platform->driver->remove(platform); } } static int snd_soc_platform_drv_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_platform *platform = rtd->platform; return platform->driver->pcm_new(rtd); } static void snd_soc_platform_drv_pcm_free(struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *rtd = pcm->private_data; struct snd_soc_platform *platform = rtd->platform; platform->driver->pcm_free(pcm); } /** /** * snd_soc_add_platform - Add a platform to the ASoC core * snd_soc_add_platform - Add a platform to the ASoC core * @dev: The parent device for the platform * @dev: The parent device for the platform Loading @@ -3181,6 +3198,10 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform, platform->component.probe = snd_soc_platform_drv_probe; platform->component.probe = snd_soc_platform_drv_probe; if (platform_drv->remove) if (platform_drv->remove) platform->component.remove = snd_soc_platform_drv_remove; platform->component.remove = snd_soc_platform_drv_remove; if (platform_drv->pcm_new) platform->component.pcm_new = snd_soc_platform_drv_pcm_new; if (platform_drv->pcm_free) platform->component.pcm_free = snd_soc_platform_drv_pcm_free; #ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS platform->component.debugfs_prefix = "platform"; platform->component.debugfs_prefix = "platform"; Loading sound/soc/soc-pcm.c +23 −32 Original line number Original line Diff line number Diff line Loading @@ -1055,7 +1055,6 @@ static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream, int cmd) int cmd) { { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_platform *platform = rtd->platform; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai *codec_dai; struct snd_soc_dai *codec_dai; int i, ret; int i, ret; Loading @@ -1071,12 +1070,6 @@ static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream, } } } } if (platform->driver->bespoke_trigger) { ret = platform->driver->bespoke_trigger(substream, cmd); if (ret < 0) return ret; } if (cpu_dai->driver->ops && cpu_dai->driver->ops->bespoke_trigger) { if (cpu_dai->driver->ops && cpu_dai->driver->ops->bespoke_trigger) { ret = cpu_dai->driver->ops->bespoke_trigger(substream, cmd, cpu_dai); ret = cpu_dai->driver->ops->bespoke_trigger(substream, cmd, cpu_dai); if (ret < 0) if (ret < 0) Loading Loading @@ -1116,13 +1109,6 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream) } } delay += codec_delay; delay += codec_delay; /* * None of the existing platform drivers implement delay(), so * for now the codec_dai of first multicodec entry is used */ if (platform->driver->delay) delay += platform->driver->delay(substream, rtd->codec_dais[0]); runtime->delay = delay; runtime->delay = delay; return offset; return offset; Loading Loading @@ -2642,12 +2628,25 @@ static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream) return ret; return ret; } } static void soc_pcm_free(struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *rtd = pcm->private_data; struct snd_soc_component *component; list_for_each_entry(component, &rtd->card->component_dev_list, card_list) { if (component->pcm_free) component->pcm_free(pcm); } } /* create a new pcm */ /* create a new pcm */ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) { { struct snd_soc_platform *platform = rtd->platform; struct snd_soc_platform *platform = rtd->platform; struct snd_soc_dai *codec_dai; struct snd_soc_dai *codec_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_component *component; struct snd_pcm *pcm; struct snd_pcm *pcm; char new_name[64]; char new_name[64]; int ret = 0, playback = 0, capture = 0; int ret = 0, playback = 0, capture = 0; Loading Loading @@ -2756,17 +2755,18 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) if (capture) if (capture) snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); if (platform->driver->pcm_new) { list_for_each_entry(component, &rtd->card->component_dev_list, card_list) { ret = platform->driver->pcm_new(rtd); if (component->pcm_new) { ret = component->pcm_new(rtd); if (ret < 0) { if (ret < 0) { dev_err(platform->dev, dev_err(component->dev, "ASoC: pcm constructor failed: %d\n", "ASoC: pcm constructor failed: %d\n", ret); ret); return ret; return ret; } } } } } pcm->private_free = platform->driver->pcm_free; pcm->private_free = soc_pcm_free; out: out: dev_info(rtd->card->dev, "%s <-> %s mapping ok\n", dev_info(rtd->card->dev, "%s <-> %s mapping ok\n", (rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name, (rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name, Loading Loading @@ -2874,15 +2874,6 @@ int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe, } } EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params); EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params); int snd_soc_platform_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_platform *platform) { if (platform->driver->ops && platform->driver->ops->trigger) return platform->driver->ops->trigger(substream, cmd); return 0; } EXPORT_SYMBOL_GPL(snd_soc_platform_trigger); #ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS static const char *dpcm_state_string(enum snd_soc_dpcm_state state) static const char *dpcm_state_string(enum snd_soc_dpcm_state state) { { Loading Loading
include/sound/soc.h +6 −12 Original line number Original line Diff line number Diff line Loading @@ -507,9 +507,6 @@ int snd_soc_params_to_bclk(struct snd_pcm_hw_params *parms); int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream, int snd_soc_set_runtime_hwparams(struct snd_pcm_substream *substream, const struct snd_pcm_hardware *hw); const struct snd_pcm_hardware *hw); int snd_soc_platform_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_platform *platform); int soc_dai_hw_params(struct snd_pcm_substream *substream, int soc_dai_hw_params(struct snd_pcm_substream *substream, struct snd_pcm_hw_params *params, struct snd_pcm_hw_params *params, struct snd_soc_dai *dai); struct snd_soc_dai *dai); Loading Loading @@ -785,6 +782,10 @@ struct snd_soc_component_driver { int (*suspend)(struct snd_soc_component *); int (*suspend)(struct snd_soc_component *); int (*resume)(struct snd_soc_component *); int (*resume)(struct snd_soc_component *); /* pcm creation and destruction */ int (*pcm_new)(struct snd_soc_pcm_runtime *); void (*pcm_free)(struct snd_pcm *); /* DT */ /* DT */ int (*of_xlate_dai_name)(struct snd_soc_component *component, int (*of_xlate_dai_name)(struct snd_soc_component *component, struct of_phandle_args *args, struct of_phandle_args *args, Loading Loading @@ -859,6 +860,8 @@ struct snd_soc_component { void (*remove)(struct snd_soc_component *); void (*remove)(struct snd_soc_component *); int (*suspend)(struct snd_soc_component *); int (*suspend)(struct snd_soc_component *); int (*resume)(struct snd_soc_component *); int (*resume)(struct snd_soc_component *); int (*pcm_new)(struct snd_soc_pcm_runtime *); void (*pcm_free)(struct snd_pcm *); /* machine specific init */ /* machine specific init */ int (*init)(struct snd_soc_component *component); int (*init)(struct snd_soc_component *component); Loading Loading @@ -941,20 +944,11 @@ struct snd_soc_platform_driver { int (*pcm_new)(struct snd_soc_pcm_runtime *); int (*pcm_new)(struct snd_soc_pcm_runtime *); void (*pcm_free)(struct snd_pcm *); void (*pcm_free)(struct snd_pcm *); /* * For platform caused delay reporting. * Optional. */ snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *, struct snd_soc_dai *); /* platform stream pcm ops */ /* platform stream pcm ops */ const struct snd_pcm_ops *ops; const struct snd_pcm_ops *ops; /* platform stream compress ops */ /* platform stream compress ops */ const struct snd_compr_ops *compr_ops; const struct snd_compr_ops *compr_ops; int (*bespoke_trigger)(struct snd_pcm_substream *, int); }; }; struct snd_soc_dai_link_component { struct snd_soc_dai_link_component { Loading
sound/soc/soc-core.c +21 −0 Original line number Original line Diff line number Diff line Loading @@ -2976,6 +2976,8 @@ static int snd_soc_component_initialize(struct snd_soc_component *component, component->remove = component->driver->remove; component->remove = component->driver->remove; component->suspend = component->driver->suspend; component->suspend = component->driver->suspend; component->resume = component->driver->resume; component->resume = component->driver->resume; component->pcm_new = component->driver->pcm_new; component->pcm_free= component->driver->pcm_free; dapm = &component->dapm; dapm = &component->dapm; dapm->dev = dev; dapm->dev = dev; Loading Loading @@ -3158,6 +3160,21 @@ static void snd_soc_platform_drv_remove(struct snd_soc_component *component) platform->driver->remove(platform); platform->driver->remove(platform); } } static int snd_soc_platform_drv_pcm_new(struct snd_soc_pcm_runtime *rtd) { struct snd_soc_platform *platform = rtd->platform; return platform->driver->pcm_new(rtd); } static void snd_soc_platform_drv_pcm_free(struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *rtd = pcm->private_data; struct snd_soc_platform *platform = rtd->platform; platform->driver->pcm_free(pcm); } /** /** * snd_soc_add_platform - Add a platform to the ASoC core * snd_soc_add_platform - Add a platform to the ASoC core * @dev: The parent device for the platform * @dev: The parent device for the platform Loading @@ -3181,6 +3198,10 @@ int snd_soc_add_platform(struct device *dev, struct snd_soc_platform *platform, platform->component.probe = snd_soc_platform_drv_probe; platform->component.probe = snd_soc_platform_drv_probe; if (platform_drv->remove) if (platform_drv->remove) platform->component.remove = snd_soc_platform_drv_remove; platform->component.remove = snd_soc_platform_drv_remove; if (platform_drv->pcm_new) platform->component.pcm_new = snd_soc_platform_drv_pcm_new; if (platform_drv->pcm_free) platform->component.pcm_free = snd_soc_platform_drv_pcm_free; #ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS platform->component.debugfs_prefix = "platform"; platform->component.debugfs_prefix = "platform"; Loading
sound/soc/soc-pcm.c +23 −32 Original line number Original line Diff line number Diff line Loading @@ -1055,7 +1055,6 @@ static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream, int cmd) int cmd) { { struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_pcm_runtime *rtd = substream->private_data; struct snd_soc_platform *platform = rtd->platform; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai *codec_dai; struct snd_soc_dai *codec_dai; int i, ret; int i, ret; Loading @@ -1071,12 +1070,6 @@ static int soc_pcm_bespoke_trigger(struct snd_pcm_substream *substream, } } } } if (platform->driver->bespoke_trigger) { ret = platform->driver->bespoke_trigger(substream, cmd); if (ret < 0) return ret; } if (cpu_dai->driver->ops && cpu_dai->driver->ops->bespoke_trigger) { if (cpu_dai->driver->ops && cpu_dai->driver->ops->bespoke_trigger) { ret = cpu_dai->driver->ops->bespoke_trigger(substream, cmd, cpu_dai); ret = cpu_dai->driver->ops->bespoke_trigger(substream, cmd, cpu_dai); if (ret < 0) if (ret < 0) Loading Loading @@ -1116,13 +1109,6 @@ static snd_pcm_uframes_t soc_pcm_pointer(struct snd_pcm_substream *substream) } } delay += codec_delay; delay += codec_delay; /* * None of the existing platform drivers implement delay(), so * for now the codec_dai of first multicodec entry is used */ if (platform->driver->delay) delay += platform->driver->delay(substream, rtd->codec_dais[0]); runtime->delay = delay; runtime->delay = delay; return offset; return offset; Loading Loading @@ -2642,12 +2628,25 @@ static int dpcm_fe_dai_close(struct snd_pcm_substream *fe_substream) return ret; return ret; } } static void soc_pcm_free(struct snd_pcm *pcm) { struct snd_soc_pcm_runtime *rtd = pcm->private_data; struct snd_soc_component *component; list_for_each_entry(component, &rtd->card->component_dev_list, card_list) { if (component->pcm_free) component->pcm_free(pcm); } } /* create a new pcm */ /* create a new pcm */ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) { { struct snd_soc_platform *platform = rtd->platform; struct snd_soc_platform *platform = rtd->platform; struct snd_soc_dai *codec_dai; struct snd_soc_dai *codec_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_dai *cpu_dai = rtd->cpu_dai; struct snd_soc_component *component; struct snd_pcm *pcm; struct snd_pcm *pcm; char new_name[64]; char new_name[64]; int ret = 0, playback = 0, capture = 0; int ret = 0, playback = 0, capture = 0; Loading Loading @@ -2756,17 +2755,18 @@ int soc_new_pcm(struct snd_soc_pcm_runtime *rtd, int num) if (capture) if (capture) snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); snd_pcm_set_ops(pcm, SNDRV_PCM_STREAM_CAPTURE, &rtd->ops); if (platform->driver->pcm_new) { list_for_each_entry(component, &rtd->card->component_dev_list, card_list) { ret = platform->driver->pcm_new(rtd); if (component->pcm_new) { ret = component->pcm_new(rtd); if (ret < 0) { if (ret < 0) { dev_err(platform->dev, dev_err(component->dev, "ASoC: pcm constructor failed: %d\n", "ASoC: pcm constructor failed: %d\n", ret); ret); return ret; return ret; } } } } } pcm->private_free = platform->driver->pcm_free; pcm->private_free = soc_pcm_free; out: out: dev_info(rtd->card->dev, "%s <-> %s mapping ok\n", dev_info(rtd->card->dev, "%s <-> %s mapping ok\n", (rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name, (rtd->num_codecs > 1) ? "multicodec" : rtd->codec_dai->name, Loading Loading @@ -2874,15 +2874,6 @@ int snd_soc_dpcm_can_be_params(struct snd_soc_pcm_runtime *fe, } } EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params); EXPORT_SYMBOL_GPL(snd_soc_dpcm_can_be_params); int snd_soc_platform_trigger(struct snd_pcm_substream *substream, int cmd, struct snd_soc_platform *platform) { if (platform->driver->ops && platform->driver->ops->trigger) return platform->driver->ops->trigger(substream, cmd); return 0; } EXPORT_SYMBOL_GPL(snd_soc_platform_trigger); #ifdef CONFIG_DEBUG_FS #ifdef CONFIG_DEBUG_FS static const char *dpcm_state_string(enum snd_soc_dpcm_state state) static const char *dpcm_state_string(enum snd_soc_dpcm_state state) { { Loading