Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * ff.c - a part of driver for RME Fireface series
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Copyright (c) 2015-2017 Takashi Sakamoto
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) #include "ff.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) #define OUI_RME	0x000a35
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) MODULE_DESCRIPTION("RME Fireface series Driver");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) MODULE_AUTHOR("Takashi Sakamoto <o-takashi@sakamocchi.jp>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) MODULE_LICENSE("GPL v2");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) static void name_card(struct snd_ff *ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 	struct fw_device *fw_dev = fw_parent_device(ff->unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) 	const char *const names[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) 		[SND_FF_UNIT_VERSION_FF800]	= "Fireface800",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) 		[SND_FF_UNIT_VERSION_FF400]	= "Fireface400",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) 		[SND_FF_UNIT_VERSION_UFX]	= "FirefaceUFX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) 		[SND_FF_UNIT_VERSION_UCX]	= "FirefaceUCX",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) 		[SND_FF_UNIT_VERSION_802]	= "Fireface802",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 	};
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) 	const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) 	name = names[ff->unit_version];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) 	strcpy(ff->card->driver, "Fireface");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) 	strcpy(ff->card->shortname, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 	strcpy(ff->card->mixername, name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 	snprintf(ff->card->longname, sizeof(ff->card->longname),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 		 "RME %s, GUID %08x%08x at %s, S%d", name,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) 		 fw_dev->config_rom[3], fw_dev->config_rom[4],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) 		 dev_name(&ff->unit->device), 100 << fw_dev->max_speed);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) static void ff_card_free(struct snd_card *card)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) 	struct snd_ff *ff = card->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) 	snd_ff_stream_destroy_duplex(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) 	snd_ff_transaction_unregister(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) static void do_registration(struct work_struct *work)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 	struct snd_ff *ff = container_of(work, struct snd_ff, dwork.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) 	int err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	if (ff->registered)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	err = snd_card_new(&ff->unit->device, -1, NULL, THIS_MODULE, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 			   &ff->card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	ff->card->private_free = ff_card_free;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	ff->card->private_data = ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 	err = snd_ff_transaction_register(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	name_card(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	err = snd_ff_stream_init_duplex(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	snd_ff_proc_init(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	err = snd_ff_create_midi_devices(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	err = snd_ff_create_pcm_devices(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 	err = snd_ff_create_hwdep_devices(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 	err = snd_card_register(ff->card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 	if (err < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 		goto error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 	ff->registered = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 	return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 	snd_card_free(ff->card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 	dev_info(&ff->unit->device,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 		 "Sound card registration failed: %d\n", err);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) static int snd_ff_probe(struct fw_unit *unit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 			   const struct ieee1394_device_id *entry)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 	struct snd_ff *ff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 	ff = devm_kzalloc(&unit->device, sizeof(struct snd_ff), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 	if (!ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	ff->unit = fw_unit_get(unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 	dev_set_drvdata(&unit->device, ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	mutex_init(&ff->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 	spin_lock_init(&ff->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 	init_waitqueue_head(&ff->hwdep_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	ff->unit_version = entry->version;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	ff->spec = (const struct snd_ff_spec *)entry->driver_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	/* Register this sound card later. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	INIT_DEFERRABLE_WORK(&ff->dwork, do_registration);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	snd_fw_schedule_registration(unit, &ff->dwork);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) static void snd_ff_update(struct fw_unit *unit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 	struct snd_ff *ff = dev_get_drvdata(&unit->device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	/* Postpone a workqueue for deferred registration. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	if (!ff->registered)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 		snd_fw_schedule_registration(unit, &ff->dwork);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 	snd_ff_transaction_reregister(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	if (ff->registered)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		snd_ff_stream_update_duplex(ff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) static void snd_ff_remove(struct fw_unit *unit)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 	struct snd_ff *ff = dev_get_drvdata(&unit->device);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 	 * Confirm to stop the work for registration before the sound card is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	 * going to be released. The work is not scheduled again because bus
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 	 * reset handler is not called anymore.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 	cancel_work_sync(&ff->dwork.work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	if (ff->registered) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 		// Block till all of ALSA character devices are released.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 		snd_card_free(ff->card);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	mutex_destroy(&ff->mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	fw_unit_put(ff->unit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) static const struct snd_ff_spec spec_ff800 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 	.pcm_capture_channels = {28, 20, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 	.pcm_playback_channels = {28, 20, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 	.midi_in_ports = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 	.midi_out_ports = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	.protocol = &snd_ff_protocol_ff800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	.midi_high_addr = 0x000200000320ull,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 	.midi_addr_range = 12,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	.midi_rx_addrs = {0x000080180000ull, 0},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static const struct snd_ff_spec spec_ff400 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	.pcm_capture_channels = {18, 14, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	.pcm_playback_channels = {18, 14, 10},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 	.midi_in_ports = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 	.midi_out_ports = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	.protocol = &snd_ff_protocol_ff400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 	.midi_high_addr = 0x0000801003f4ull,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	.midi_addr_range = SND_FF_MAXIMIM_MIDI_QUADS * 4,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 	.midi_rx_addrs = {0x000080180000ull, 0x000080190000ull},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) static const struct snd_ff_spec spec_ucx = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	.pcm_capture_channels = {18, 14, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	.pcm_playback_channels = {18, 14, 12},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	.midi_in_ports = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	.midi_out_ports = 2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 	.protocol = &snd_ff_protocol_latter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	.midi_high_addr = 0xffff00000034ull,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 	.midi_addr_range = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 	.midi_rx_addrs = {0xffff00000030ull, 0xffff00000030ull},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) static const struct snd_ff_spec spec_ufx_802 = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	.pcm_capture_channels = {30, 22, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	.pcm_playback_channels = {30, 22, 14},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 	.midi_in_ports = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	.midi_out_ports = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 	.protocol = &snd_ff_protocol_latter,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 	.midi_high_addr = 0xffff00000034ull,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	.midi_addr_range = 0x80,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	.midi_rx_addrs = {0xffff00000030ull, 0xffff00000030ull},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) static const struct ieee1394_device_id snd_ff_id_table[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	/* Fireface 800 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 		.match_flags	= IEEE1394_MATCH_VENDOR_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 				  IEEE1394_MATCH_SPECIFIER_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 				  IEEE1394_MATCH_VERSION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 				  IEEE1394_MATCH_MODEL_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 		.vendor_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		.specifier_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 		.version	= SND_FF_UNIT_VERSION_FF800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 		.model_id	= 0x101800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		.driver_data	= (kernel_ulong_t)&spec_ff800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 	/* Fireface 400 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 		.match_flags	= IEEE1394_MATCH_VENDOR_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 				  IEEE1394_MATCH_SPECIFIER_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 				  IEEE1394_MATCH_VERSION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 				  IEEE1394_MATCH_MODEL_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 		.vendor_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		.specifier_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		.version	= SND_FF_UNIT_VERSION_FF400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		.model_id	= 0x101800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 		.driver_data	= (kernel_ulong_t)&spec_ff400,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 	// Fireface UFX.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		.match_flags	= IEEE1394_MATCH_VENDOR_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 				  IEEE1394_MATCH_SPECIFIER_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 				  IEEE1394_MATCH_VERSION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 				  IEEE1394_MATCH_MODEL_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 		.vendor_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 		.specifier_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 		.version	= SND_FF_UNIT_VERSION_UFX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 		.model_id	= 0x101800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 		.driver_data	= (kernel_ulong_t)&spec_ufx_802,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 	// Fireface UCX.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		.match_flags	= IEEE1394_MATCH_VENDOR_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 				  IEEE1394_MATCH_SPECIFIER_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 				  IEEE1394_MATCH_VERSION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 				  IEEE1394_MATCH_MODEL_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 		.vendor_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 		.specifier_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 		.version	= SND_FF_UNIT_VERSION_UCX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 		.model_id	= 0x101800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 		.driver_data	= (kernel_ulong_t)&spec_ucx,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	// Fireface 802.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 	{
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		.match_flags	= IEEE1394_MATCH_VENDOR_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 				  IEEE1394_MATCH_SPECIFIER_ID |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 				  IEEE1394_MATCH_VERSION |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 				  IEEE1394_MATCH_MODEL_ID,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 		.vendor_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 		.specifier_id	= OUI_RME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		.version	= SND_FF_UNIT_VERSION_802,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 		.model_id	= 0x101800,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 		.driver_data	= (kernel_ulong_t)&spec_ufx_802,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 	{}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) MODULE_DEVICE_TABLE(ieee1394, snd_ff_id_table);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) static struct fw_driver ff_driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 	.driver = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 		.owner	= THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 		.name	= KBUILD_MODNAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 		.bus	= &fw_bus_type,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	},
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	.probe    = snd_ff_probe,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	.update   = snd_ff_update,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 	.remove   = snd_ff_remove,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	.id_table = snd_ff_id_table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) static int __init snd_ff_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 	return driver_register(&ff_driver.driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) static void __exit snd_ff_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 	driver_unregister(&ff_driver.driver);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) module_init(snd_ff_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) module_exit(snd_ff_exit);