static void name_card(struct snd_ff *ff)
 {
        struct fw_device *fw_dev = fw_parent_device(ff->unit);
-       const char *const model = "Fireface Skeleton";
 
        strcpy(ff->card->driver, "Fireface");
-       strcpy(ff->card->shortname, model);
-       strcpy(ff->card->mixername, model);
+       strcpy(ff->card->shortname, ff->spec->name);
+       strcpy(ff->card->mixername, ff->spec->name);
        snprintf(ff->card->longname, sizeof(ff->card->longname),
-                "RME %s, GUID %08x%08x at %s, S%d", model,
+                "RME %s, GUID %08x%08x at %s, S%d", ff->spec->name,
                 fw_dev->config_rom[3], fw_dev->config_rom[4],
                 dev_name(&ff->unit->device), 100 << fw_dev->max_speed);
 }
 
        mutex_init(&ff->mutex);
 
+       ff->spec = (const struct snd_ff_spec *)entry->driver_data;
+
        /* Register this sound card later. */
        INIT_DEFERRABLE_WORK(&ff->dwork, do_registration);
        snd_fw_schedule_registration(unit, &ff->dwork);
 
 
 #include "../lib.h"
 
+#define SND_FF_STREAM_MODES            3
+
+struct snd_ff_spec {
+       const char *const name;
+
+       const unsigned int pcm_capture_channels[SND_FF_STREAM_MODES];
+       const unsigned int pcm_playback_channels[SND_FF_STREAM_MODES];
+
+       unsigned int midi_in_ports;
+       unsigned int midi_out_ports;
+};
+
 struct snd_ff {
        struct snd_card *card;
        struct fw_unit *unit;
 
        bool registered;
        struct delayed_work dwork;
+
+       const struct snd_ff_spec *spec;
 };
 #endif