From: Clemens Ladisch Date: Mon, 22 Sep 2008 06:56:01 +0000 (+0200) Subject: ALSA: oxygen: add probe callback X-Git-Tag: v2.6.28-rc1~20^2~112 X-Git-Url: http://ftp.safe.ca/?a=commitdiff_plain;h=568c59e722da22c9b0a485c2f1aaf28cb1b36b79;hp=9bd6a73aef955216816fd6e28f371a868ed073d5;p=safe%2Fjmp%2Flinux-2.6 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 --- diff --git a/sound/pci/oxygen/hifier.c b/sound/pci/oxygen/hifier.c index dad393a..173d6dd 100644 --- a/sound/pci/oxygen/hifier.c +++ b/sound/pci/oxygen/hifier.c @@ -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; diff --git a/sound/pci/oxygen/oxygen.c b/sound/pci/oxygen/oxygen.c index c5829d3..4722fe0 100644 --- a/sound/pci/oxygen/oxygen.c +++ b/sound/pci/oxygen/oxygen.c @@ -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; diff --git a/sound/pci/oxygen/oxygen.h b/sound/pci/oxygen/oxygen.h index 5f3fbf8..914b8f4 100644 --- a/sound/pci/oxygen/oxygen.h +++ b/sound/pci/oxygen/oxygen.h @@ -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); diff --git a/sound/pci/oxygen/oxygen_lib.c b/sound/pci/oxygen/oxygen_lib.c index 07b0563..58bbc01 100644 --- a/sound/pci/oxygen/oxygen_lib.c +++ b/sound/pci/oxygen/oxygen_lib.c @@ -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); diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c index 01d7b75..4aa2857 100644 --- a/sound/pci/oxygen/virtuoso.c +++ b/sound/pci/oxygen/virtuoso.c @@ -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;