Merge branch 'for-3.12' into for-next
[cascardo/linux.git] / sound / firewire / speakers.c
index 0f1e5d8..fe9e6e2 100644 (file)
@@ -661,45 +661,9 @@ static void fwspk_card_free(struct snd_card *card)
        mutex_destroy(&fwspk->mutex);
 }
 
-static const struct device_info *fwspk_detect(struct fw_device *dev)
+static int fwspk_probe(struct fw_unit *unit,
+                      const struct ieee1394_device_id *id)
 {
-       static const struct device_info griffin_firewave = {
-               .driver_name = "FireWave",
-               .short_name  = "FireWave",
-               .long_name   = "Griffin FireWave Surround",
-               .pcm_constraints = firewave_constraints,
-               .mixer_channels = 6,
-               .mute_fb_id   = 0x01,
-               .volume_fb_id = 0x02,
-       };
-       static const struct device_info lacie_speakers = {
-               .driver_name = "FWSpeakers",
-               .short_name  = "FireWire Speakers",
-               .long_name   = "LaCie FireWire Speakers",
-               .pcm_constraints = lacie_speakers_constraints,
-               .mixer_channels = 1,
-               .mute_fb_id   = 0x01,
-               .volume_fb_id = 0x01,
-       };
-       struct fw_csr_iterator i;
-       int key, value;
-
-       fw_csr_iterator_init(&i, dev->config_rom);
-       while (fw_csr_iterator_next(&i, &key, &value))
-               if (key == CSR_VENDOR)
-                       switch (value) {
-                       case VENDOR_GRIFFIN:
-                               return &griffin_firewave;
-                       case VENDOR_LACIE:
-                               return &lacie_speakers;
-                       }
-
-       return NULL;
-}
-
-static int fwspk_probe(struct device *unit_dev)
-{
-       struct fw_unit *unit = fw_unit(unit_dev);
        struct fw_device *fw_dev = fw_parent_device(unit);
        struct snd_card *card;
        struct fwspk *fwspk;
@@ -709,17 +673,13 @@ static int fwspk_probe(struct device *unit_dev)
        err = snd_card_create(-1, NULL, THIS_MODULE, sizeof(*fwspk), &card);
        if (err < 0)
                return err;
-       snd_card_set_dev(card, unit_dev);
+       snd_card_set_dev(card, &unit->device);
 
        fwspk = card->private_data;
        fwspk->card = card;
        mutex_init(&fwspk->mutex);
        fwspk->unit = fw_unit_get(unit);
-       fwspk->device_info = fwspk_detect(fw_dev);
-       if (!fwspk->device_info) {
-               err = -ENODEV;
-               goto err_unit;
-       }
+       fwspk->device_info = (const struct device_info *)id->driver_data;
 
        err = cmp_connection_init(&fwspk->connection, unit, 0);
        if (err < 0)
@@ -754,7 +714,7 @@ static int fwspk_probe(struct device *unit_dev)
        if (err < 0)
                goto error;
 
-       dev_set_drvdata(unit_dev, fwspk);
+       dev_set_drvdata(&unit->device, fwspk);
 
        return 0;
 
@@ -768,22 +728,6 @@ error:
        return err;
 }
 
-static int fwspk_remove(struct device *dev)
-{
-       struct fwspk *fwspk = dev_get_drvdata(dev);
-
-       amdtp_out_stream_pcm_abort(&fwspk->stream);
-       snd_card_disconnect(fwspk->card);
-
-       mutex_lock(&fwspk->mutex);
-       fwspk_stop_stream(fwspk);
-       mutex_unlock(&fwspk->mutex);
-
-       snd_card_free_when_closed(fwspk->card);
-
-       return 0;
-}
-
 static void fwspk_bus_reset(struct fw_unit *unit)
 {
        struct fwspk *fwspk = dev_get_drvdata(&unit->device);
@@ -801,6 +745,40 @@ static void fwspk_bus_reset(struct fw_unit *unit)
        amdtp_out_stream_update(&fwspk->stream);
 }
 
+static void fwspk_remove(struct fw_unit *unit)
+{
+       struct fwspk *fwspk = dev_get_drvdata(&unit->device);
+
+       amdtp_out_stream_pcm_abort(&fwspk->stream);
+       snd_card_disconnect(fwspk->card);
+
+       mutex_lock(&fwspk->mutex);
+       fwspk_stop_stream(fwspk);
+       mutex_unlock(&fwspk->mutex);
+
+       snd_card_free_when_closed(fwspk->card);
+}
+
+static const struct device_info griffin_firewave = {
+       .driver_name = "FireWave",
+       .short_name  = "FireWave",
+       .long_name   = "Griffin FireWave Surround",
+       .pcm_constraints = firewave_constraints,
+       .mixer_channels = 6,
+       .mute_fb_id   = 0x01,
+       .volume_fb_id = 0x02,
+};
+
+static const struct device_info lacie_speakers = {
+       .driver_name = "FWSpeakers",
+       .short_name  = "FireWire Speakers",
+       .long_name   = "LaCie FireWire Speakers",
+       .pcm_constraints = lacie_speakers_constraints,
+       .mixer_channels = 1,
+       .mute_fb_id   = 0x01,
+       .volume_fb_id = 0x01,
+};
+
 static const struct ieee1394_device_id fwspk_id_table[] = {
        {
                .match_flags  = IEEE1394_MATCH_VENDOR_ID |
@@ -811,6 +789,7 @@ static const struct ieee1394_device_id fwspk_id_table[] = {
                .model_id     = 0x00f970,
                .specifier_id = SPECIFIER_1394TA,
                .version      = VERSION_AVC,
+               .driver_data  = (kernel_ulong_t)&griffin_firewave,
        },
        {
                .match_flags  = IEEE1394_MATCH_VENDOR_ID |
@@ -821,6 +800,7 @@ static const struct ieee1394_device_id fwspk_id_table[] = {
                .model_id     = 0x00f970,
                .specifier_id = SPECIFIER_1394TA,
                .version      = VERSION_AVC,
+               .driver_data  = (kernel_ulong_t)&lacie_speakers,
        },
        { }
 };
@@ -831,10 +811,10 @@ static struct fw_driver fwspk_driver = {
                .owner  = THIS_MODULE,
                .name   = KBUILD_MODNAME,
                .bus    = &fw_bus_type,
-               .probe  = fwspk_probe,
-               .remove = fwspk_remove,
        },
+       .probe    = fwspk_probe,
        .update   = fwspk_bus_reset,
+       .remove   = fwspk_remove,
        .id_table = fwspk_id_table,
 };