| /* | |
| * soc-devres.c -- ALSA SoC Audio Layer devres functions | |
| * | |
| * Copyright (C) 2013 Linaro Ltd | |
| * | |
| * This program is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License as published by the | |
| * Free Software Foundation; either version 2 of the License, or (at your | |
| * option) any later version. | |
| */ | |
| #include <linux/module.h> | |
| #include <linux/moduleparam.h> | |
| #include <sound/soc.h> | |
| static void devm_component_release(struct device *dev, void *res) | |
| { | |
| snd_soc_unregister_component(*(struct device **)res); | |
| } | |
| /** | |
| * devm_snd_soc_register_component - resource managed component registration | |
| * @dev: Device used to manage component | |
| * @cmpnt_drv: Component driver | |
| * @dai_drv: DAI driver | |
| * @num_dai: Number of DAIs to register | |
| * | |
| * Register a component with automatic unregistration when the device is | |
| * unregistered. | |
| */ | |
| int devm_snd_soc_register_component(struct device *dev, | |
| const struct snd_soc_component_driver *cmpnt_drv, | |
| struct snd_soc_dai_driver *dai_drv, int num_dai) | |
| { | |
| struct device **ptr; | |
| int ret; | |
| ptr = devres_alloc(devm_component_release, sizeof(*ptr), GFP_KERNEL); | |
| if (!ptr) | |
| return -ENOMEM; | |
| ret = snd_soc_register_component(dev, cmpnt_drv, dai_drv, num_dai); | |
| if (ret == 0) { | |
| *ptr = dev; | |
| devres_add(dev, ptr); | |
| } else { | |
| devres_free(ptr); | |
| } | |
| return ret; | |
| } | |
| EXPORT_SYMBOL_GPL(devm_snd_soc_register_component); | |
| static void devm_card_release(struct device *dev, void *res) | |
| { | |
| snd_soc_unregister_card(*(struct snd_soc_card **)res); | |
| } | |
| /** | |
| * devm_snd_soc_register_card - resource managed card registration | |
| * @dev: Device used to manage card | |
| * @card: Card to register | |
| * | |
| * Register a card with automatic unregistration when the device is | |
| * unregistered. | |
| */ | |
| int devm_snd_soc_register_card(struct device *dev, struct snd_soc_card *card) | |
| { | |
| struct snd_soc_card **ptr; | |
| int ret; | |
| ptr = devres_alloc(devm_card_release, sizeof(*ptr), GFP_KERNEL); | |
| if (!ptr) | |
| return -ENOMEM; | |
| ret = snd_soc_register_card(card); | |
| if (ret == 0) { | |
| *ptr = card; | |
| devres_add(dev, ptr); | |
| } else { | |
| devres_free(ptr); | |
| } | |
| return ret; | |
| } | |
| EXPORT_SYMBOL_GPL(devm_snd_soc_register_card); |