summaryrefslogtreecommitdiff
path: root/sound/core/init.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-02-01 03:38:09 +0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-02-01 03:38:09 +0400
commit14864a52cd8189e8567df8351d9fc7e435133abd (patch)
tree2cc4548e503d36c56311ef9e1d1d644238e917ec /sound/core/init.c
parent4e13c5d0212f25d69a97606b9d5a85edb52a7737 (diff)
parent75fae117a5dbde5ab984fa5c60705758cfbc6433 (diff)
downloadlinux-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.c57
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) {