[alsa-devel] [PATCH] ASoC: Dynamically allocate the rtd device for a non-empty release

Takashi Iwai tiwai at suse.de
Mon Jan 9 11:14:56 CET 2012


At Sun,  8 Jan 2012 23:02:30 -0800,
Mark Brown wrote:
> 
> Signed-off-by: Mark Brown <broonie at opensource.wolfsonmicro.com>
> ---
> 
> Greg, you asked for this to be included in 3.3 but I really don't see
> any reason for doing so - this isn't exactly new code and there aren't
> any practical issues being reported.  Is there any actual rush?

Since it's no urgent fix, rc1 is the best merge point.  Of course, I
know it's a bit too late for merge, but the code doesn't look so
awfully intrusive.  So, I find it's OK.


thanks,

Takashi

> 
>  include/sound/soc.h  |    6 +++---
>  sound/soc/soc-core.c |   34 +++++++++++++++++++++-------------
>  2 files changed, 24 insertions(+), 16 deletions(-)
> 
> diff --git a/include/sound/soc.h b/include/sound/soc.h
> index a7425e9..0a56767 100644
> --- a/include/sound/soc.h
> +++ b/include/sound/soc.h
> @@ -862,7 +862,7 @@ struct snd_soc_card {
>  
>  /* SoC machine DAI configuration, glues a codec and cpu DAI together */
>  struct snd_soc_pcm_runtime {
> -	struct device dev;
> +	struct device *dev;
>  	struct snd_soc_card *card;
>  	struct snd_soc_dai_link *dai_link;
>  	struct mutex pcm_mutex;
> @@ -954,12 +954,12 @@ static inline void *snd_soc_platform_get_drvdata(struct snd_soc_platform *platfo
>  static inline void snd_soc_pcm_set_drvdata(struct snd_soc_pcm_runtime *rtd,
>  		void *data)
>  {
> -	dev_set_drvdata(&rtd->dev, data);
> +	dev_set_drvdata(rtd->dev, data);
>  }
>  
>  static inline void *snd_soc_pcm_get_drvdata(struct snd_soc_pcm_runtime *rtd)
>  {
> -	return dev_get_drvdata(&rtd->dev);
> +	return dev_get_drvdata(rtd->dev);
>  }
>  
>  static inline void snd_soc_initialize_card_lists(struct snd_soc_card *card)
> diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c
> index dcc4b62..9d8a631 100644
> --- a/sound/soc/soc-core.c
> +++ b/sound/soc/soc-core.c
> @@ -884,9 +884,9 @@ static void soc_remove_dai_link(struct snd_soc_card *card, int num, int order)
>  
>  	/* unregister the rtd device */
>  	if (rtd->dev_registered) {
> -		device_remove_file(&rtd->dev, &dev_attr_pmdown_time);
> -		device_remove_file(&rtd->dev, &dev_attr_codec_reg);
> -		device_unregister(&rtd->dev);
> +		device_remove_file(rtd->dev, &dev_attr_pmdown_time);
> +		device_remove_file(rtd->dev, &dev_attr_codec_reg);
> +		device_unregister(rtd->dev);
>  		rtd->dev_registered = 0;
>  	}
>  
> @@ -1061,7 +1061,10 @@ err_probe:
>  	return ret;
>  }
>  
> -static void rtd_release(struct device *dev) {}
> +static void rtd_release(struct device *dev)
> +{
> +	kfree(dev);
> +}
>  
>  static int soc_post_component_init(struct snd_soc_card *card,
>  				   struct snd_soc_codec *codec,
> @@ -1104,11 +1107,16 @@ static int soc_post_component_init(struct snd_soc_card *card,
>  
>  	/* register the rtd device */
>  	rtd->codec = codec;
> -	rtd->dev.parent = card->dev;
> -	rtd->dev.release = rtd_release;
> -	rtd->dev.init_name = name;
> +
> +	rtd->dev = kzalloc(sizeof(struct device), GFP_KERNEL);
> +	if (!rtd->dev)
> +		return -ENOMEM;
> +	device_initialize(rtd->dev);
> +	rtd->dev->parent = card->dev;
> +	rtd->dev->release = rtd_release;
> +	rtd->dev->init_name = name;
>  	mutex_init(&rtd->pcm_mutex);
> -	ret = device_register(&rtd->dev);
> +	ret = device_add(rtd->dev);
>  	if (ret < 0) {
>  		dev_err(card->dev,
>  			"asoc: failed to register runtime device: %d\n", ret);
> @@ -1117,14 +1125,14 @@ static int soc_post_component_init(struct snd_soc_card *card,
>  	rtd->dev_registered = 1;
>  
>  	/* add DAPM sysfs entries for this codec */
> -	ret = snd_soc_dapm_sys_add(&rtd->dev);
> +	ret = snd_soc_dapm_sys_add(rtd->dev);
>  	if (ret < 0)
>  		dev_err(codec->dev,
>  			"asoc: failed to add codec dapm sysfs entries: %d\n",
>  			ret);
>  
>  	/* add codec sysfs entries */
> -	ret = device_create_file(&rtd->dev, &dev_attr_codec_reg);
> +	ret = device_create_file(rtd->dev, &dev_attr_codec_reg);
>  	if (ret < 0)
>  		dev_err(codec->dev,
>  			"asoc: failed to add codec sysfs files: %d\n", ret);
> @@ -1213,7 +1221,7 @@ static int soc_probe_dai_link(struct snd_soc_card *card, int num, int order)
>  	if (ret)
>  		return ret;
>  
> -	ret = device_create_file(&rtd->dev, &dev_attr_pmdown_time);
> +	ret = device_create_file(rtd->dev, &dev_attr_pmdown_time);
>  	if (ret < 0)
>  		printk(KERN_WARNING "asoc: failed to add pmdown_time sysfs\n");
>  
> @@ -1311,8 +1319,8 @@ static void soc_remove_aux_dev(struct snd_soc_card *card, int num)
>  
>  	/* unregister the rtd device */
>  	if (rtd->dev_registered) {
> -		device_remove_file(&rtd->dev, &dev_attr_codec_reg);
> -		device_unregister(&rtd->dev);
> +		device_remove_file(rtd->dev, &dev_attr_codec_reg);
> +		device_del(rtd->dev);
>  		rtd->dev_registered = 0;
>  	}
>  
> -- 
> 1.7.7.3
> 
> _______________________________________________
> Alsa-devel mailing list
> Alsa-devel at alsa-project.org
> http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
> 


More information about the Alsa-devel mailing list