ALSA: oxygen: add probe callback
Add a probe callback to the model structure so that model-specific drivers can refine their model detection before the card is initialized. Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
This commit is contained in:
parent
9bd6a73aef
commit
568c59e722
5 changed files with 14 additions and 5 deletions
|
@ -180,7 +180,7 @@ static int __devinit hifier_probe(struct pci_dev *pci,
|
|||
++dev;
|
||||
return -ENOENT;
|
||||
}
|
||||
err = oxygen_pci_probe(pci, index[dev], id[dev], &model_hifier);
|
||||
err = oxygen_pci_probe(pci, index[dev], id[dev], &model_hifier, 0);
|
||||
if (err >= 0)
|
||||
++dev;
|
||||
return err;
|
||||
|
|
|
@ -354,7 +354,8 @@ static int __devinit generic_oxygen_probe(struct pci_dev *pci,
|
|||
}
|
||||
is_meridian = pci_id->driver_data;
|
||||
err = oxygen_pci_probe(pci, index[dev], id[dev],
|
||||
is_meridian ? &model_meridian : &model_generic);
|
||||
is_meridian ? &model_meridian : &model_generic,
|
||||
0);
|
||||
if (err >= 0)
|
||||
++dev;
|
||||
return err;
|
||||
|
|
|
@ -58,6 +58,7 @@ struct oxygen_model {
|
|||
const char *longname;
|
||||
const char *chip;
|
||||
struct module *owner;
|
||||
int (*probe)(struct oxygen *chip, unsigned long driver_data);
|
||||
void (*init)(struct oxygen *chip);
|
||||
int (*control_filter)(struct snd_kcontrol_new *template);
|
||||
int (*mixer_init)(struct oxygen *chip);
|
||||
|
@ -125,7 +126,8 @@ struct oxygen {
|
|||
/* oxygen_lib.c */
|
||||
|
||||
int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
const struct oxygen_model *model);
|
||||
const struct oxygen_model *model,
|
||||
unsigned long driver_data);
|
||||
void oxygen_pci_remove(struct pci_dev *pci);
|
||||
#ifdef CONFIG_PM
|
||||
int oxygen_pci_suspend(struct pci_dev *pci, pm_message_t state);
|
||||
|
|
|
@ -424,7 +424,8 @@ static void oxygen_card_free(struct snd_card *card)
|
|||
}
|
||||
|
||||
int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
||||
const struct oxygen_model *model)
|
||||
const struct oxygen_model *model,
|
||||
unsigned long driver_data)
|
||||
{
|
||||
struct snd_card *card;
|
||||
struct oxygen *chip;
|
||||
|
@ -470,6 +471,11 @@ int oxygen_pci_probe(struct pci_dev *pci, int index, char *id,
|
|||
snd_card_set_dev(card, &pci->dev);
|
||||
card->private_free = oxygen_card_free;
|
||||
|
||||
if (chip->model.probe) {
|
||||
err = chip->model.probe(chip, driver_data);
|
||||
if (err < 0)
|
||||
goto err_card;
|
||||
}
|
||||
oxygen_init(chip);
|
||||
chip->model.init(chip);
|
||||
|
||||
|
|
|
@ -696,7 +696,7 @@ static int __devinit xonar_probe(struct pci_dev *pci,
|
|||
return -ENOENT;
|
||||
}
|
||||
err = oxygen_pci_probe(pci, index[dev], id[dev],
|
||||
&xonar_models[pci_id->driver_data]);
|
||||
&xonar_models[pci_id->driver_data], 0);
|
||||
if (err >= 0)
|
||||
++dev;
|
||||
return err;
|
||||
|
|
Loading…
Reference in a new issue