diff options
author | Rob Herring <rob.herring@calxeda.com> | 2012-11-07 17:59:14 -0600 |
---|---|---|
committer | Rob Herring <rob.herring@calxeda.com> | 2012-11-07 17:59:14 -0600 |
commit | d3ad4a60a1b1448e59914eebefe1ccc8e64f9e2f (patch) | |
tree | f0862d1905a599cdbad86fcc8816d86a6f33459f /sound/core/sound.c | |
parent | e095c0d122c09efabe7d4136ce77f72c636c4879 (diff) | |
parent | e5c5f2adeb370559f4b221d57214db85858b786a (diff) |
Merge remote-tracking branch 'arm-soc/devel/debug_ll_init' into debug_ll
Diffstat (limited to 'sound/core/sound.c')
-rw-r--r-- | sound/core/sound.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/sound/core/sound.c b/sound/core/sound.c index 643976000ce8..89780c323f19 100644 --- a/sound/core/sound.c +++ b/sound/core/sound.c @@ -98,6 +98,10 @@ static void snd_request_other(int minor) * * Checks that a minor device with the specified type is registered, and returns * its user data pointer. + * + * This function increments the reference counter of the card instance + * if an associated instance with the given minor number and type is found. + * The caller must call snd_card_unref() appropriately later. */ void *snd_lookup_minor_data(unsigned int minor, int type) { @@ -108,9 +112,11 @@ void *snd_lookup_minor_data(unsigned int minor, int type) return NULL; mutex_lock(&sound_mutex); mreg = snd_minors[minor]; - if (mreg && mreg->type == type) + if (mreg && mreg->type == type) { private_data = mreg->private_data; - else + if (mreg->card_ptr) + atomic_inc(&mreg->card_ptr->refcount); + } else private_data = NULL; mutex_unlock(&sound_mutex); return private_data; @@ -275,6 +281,7 @@ int snd_register_device_for_dev(int type, struct snd_card *card, int dev, preg->device = dev; preg->f_ops = f_ops; preg->private_data = private_data; + preg->card_ptr = card; mutex_lock(&sound_mutex); #ifdef CONFIG_SND_DYNAMIC_MINORS minor = snd_find_free_minor(type); |