diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-02-01 03:38:09 +0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-02-01 03:38:09 +0400 |
commit | 14864a52cd8189e8567df8351d9fc7e435133abd (patch) | |
tree | 2cc4548e503d36c56311ef9e1d1d644238e917ec /sound/core/init.c | |
parent | 4e13c5d0212f25d69a97606b9d5a85edb52a7737 (diff) | |
parent | 75fae117a5dbde5ab984fa5c60705758cfbc6433 (diff) | |
download | linux-14864a52cd8189e8567df8351d9fc7e435133abd.tar.xz |
Merge tag 'sound-fix-3.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound
Pull sound fixes from Takashi Iwai:
"The big chunks here are the updates for oxygen driver for Xonar DG
devices, which were slipped from the previous pull request. They are
device-specific and thus not too dangerous.
Other than that, all patches are small bug fixes, mainly for Samsung
build fixes, a few HD-audio enhancements, and other misc ASoC fixes.
(And this time ASoC merge is less than Octopus, lucky seven :)"
* tag 'sound-fix-3.14-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound: (42 commits)
ALSA: hda/hdmi - allow PIN_OUT to be dynamically enabled
ALSA: hda - add headset mic detect quirks for another Dell laptop
ALSA: oxygen: Xonar DG(X): cleanup and minor changes
ALSA: oxygen: Xonar DG(X): modify high-pass filter control
ALSA: oxygen: Xonar DG(X): modify input select functions
ALSA: oxygen: Xonar DG(X): modify capture volume functions
ALSA: oxygen: Xonar DG(X): use headphone volume control
ALSA: oxygen: Xonar DG(X): modify playback output select
ALSA: oxygen: Xonar DG(X): capture from I2S channel 1, not 2
ALSA: oxygen: Xonar DG(X): move the mixer code into another file
ALSA: oxygen: modify CS4245 register dumping function
ALSA: oxygen: modify adjust_dg_dac_routing function
ALSA: oxygen: Xonar DG(X): modify DAC/ADC parameters function
ALSA: oxygen: Xonar DG(X): modify initialization functions
ALSA: oxygen: Xonar DG(X): add new CS4245 SPI functions
ALSA: oxygen: additional definitions for the Xonar DG/DGX card
ALSA: oxygen: change description of the xonar_dg.c file
ALSA: oxygen: export oxygen_update_dac_routing symbol
ALSA: oxygen: add mute mask for the OXYGEN_PLAY_ROUTING register
ALSA: oxygen: modify the SPI writing function
...
Diffstat (limited to 'sound/core/init.c')
-rw-r--r-- | sound/core/init.c | 57 |
1 files changed, 30 insertions, 27 deletions
diff --git a/sound/core/init.c b/sound/core/init.c index 1351f22f651c..0d42fcda0de2 100644 --- a/sound/core/init.c +++ b/sound/core/init.c @@ -131,6 +131,31 @@ static inline int init_info_for_card(struct snd_card *card) #define init_info_for_card(card) #endif +static int check_empty_slot(struct module *module, int slot) +{ + return !slots[slot] || !*slots[slot]; +} + +/* return an empty slot number (>= 0) found in the given bitmask @mask. + * @mask == -1 == 0xffffffff means: take any free slot up to 32 + * when no slot is available, return the original @mask as is. + */ +static int get_slot_from_bitmask(int mask, int (*check)(struct module *, int), + struct module *module) +{ + int slot; + + for (slot = 0; slot < SNDRV_CARDS; slot++) { + if (slot < 32 && !(mask & (1U << slot))) + continue; + if (!test_bit(slot, snd_cards_lock)) { + if (check(module, slot)) + return slot; /* found */ + } + } + return mask; /* unchanged */ +} + /** * snd_card_create - create and initialize a soundcard structure * @idx: card index (address) [0 ... (SNDRV_CARDS-1)] @@ -152,7 +177,7 @@ int snd_card_create(int idx, const char *xid, struct snd_card **card_ret) { struct snd_card *card; - int err, idx2; + int err; if (snd_BUG_ON(!card_ret)) return -EINVAL; @@ -167,32 +192,10 @@ int snd_card_create(int idx, const char *xid, strlcpy(card->id, xid, sizeof(card->id)); err = 0; mutex_lock(&snd_card_mutex); - if (idx < 0) { - for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) { - /* idx == -1 == 0xffff means: take any free slot */ - if (idx2 < sizeof(int) && !(idx & (1U << idx2))) - continue; - if (!test_bit(idx2, snd_cards_lock)) { - if (module_slot_match(module, idx2)) { - idx = idx2; - break; - } - } - } - } - if (idx < 0) { - for (idx2 = 0; idx2 < SNDRV_CARDS; idx2++) { - /* idx == -1 == 0xffff means: take any free slot */ - if (idx2 < sizeof(int) && !(idx & (1U << idx2))) - continue; - if (!test_bit(idx2, snd_cards_lock)) { - if (!slots[idx2] || !*slots[idx2]) { - idx = idx2; - break; - } - } - } - } + if (idx < 0) /* first check the matching module-name slot */ + idx = get_slot_from_bitmask(idx, module_slot_match, module); + if (idx < 0) /* if not matched, assign an empty slot */ + idx = get_slot_from_bitmask(idx, check_empty_slot, module); if (idx < 0) err = -ENODEV; else if (idx < snd_ecards_limit) { |