Linux Audio

Check our new training course

Loading...
Note: File does not exist in v6.13.7.
   1/*
   2 * TC Applied Technologies Digital Interface Communications Engine driver
   3 *
   4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
   5 * Licensed under the terms of the GNU General Public License, version 2.
   6 */
   7
   8#include <linux/compat.h>
   9#include <linux/completion.h>
  10#include <linux/delay.h>
  11#include <linux/device.h>
  12#include <linux/firewire.h>
  13#include <linux/firewire-constants.h>
  14#include <linux/jiffies.h>
  15#include <linux/module.h>
  16#include <linux/mod_devicetable.h>
  17#include <linux/mutex.h>
  18#include <linux/slab.h>
  19#include <linux/spinlock.h>
  20#include <linux/wait.h>
  21#include <sound/control.h>
  22#include <sound/core.h>
  23#include <sound/firewire.h>
  24#include <sound/hwdep.h>
  25#include <sound/info.h>
  26#include <sound/initval.h>
  27#include <sound/pcm.h>
  28#include <sound/pcm_params.h>
  29#include "amdtp.h"
  30#include "iso-resources.h"
  31#include "lib.h"
  32#include "dice-interface.h"
  33
  34
  35struct dice {
  36	struct snd_card *card;
  37	struct fw_unit *unit;
  38	spinlock_t lock;
  39	struct mutex mutex;
  40	unsigned int global_offset;
  41	unsigned int rx_offset;
  42	unsigned int clock_caps;
  43	unsigned int rx_channels[3];
  44	unsigned int rx_midi_ports[3];
  45	struct fw_address_handler notification_handler;
  46	int owner_generation;
  47	int dev_lock_count; /* > 0 driver, < 0 userspace */
  48	bool dev_lock_changed;
  49	bool global_enabled;
  50	struct completion clock_accepted;
  51	wait_queue_head_t hwdep_wait;
  52	u32 notification_bits;
  53	struct fw_iso_resources resources;
  54	struct amdtp_out_stream stream;
  55};
  56
  57MODULE_DESCRIPTION("DICE driver");
  58MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
  59MODULE_LICENSE("GPL v2");
  60
  61static const unsigned int dice_rates[] = {
  62	/* mode 0 */
  63	[0] =  32000,
  64	[1] =  44100,
  65	[2] =  48000,
  66	/* mode 1 */
  67	[3] =  88200,
  68	[4] =  96000,
  69	/* mode 2 */
  70	[5] = 176400,
  71	[6] = 192000,
  72};
  73
  74static unsigned int rate_to_index(unsigned int rate)
  75{
  76	unsigned int i;
  77
  78	for (i = 0; i < ARRAY_SIZE(dice_rates); ++i)
  79		if (dice_rates[i] == rate)
  80			return i;
  81
  82	return 0;
  83}
  84
  85static unsigned int rate_index_to_mode(unsigned int rate_index)
  86{
  87	return ((int)rate_index - 1) / 2;
  88}
  89
  90static void dice_lock_changed(struct dice *dice)
  91{
  92	dice->dev_lock_changed = true;
  93	wake_up(&dice->hwdep_wait);
  94}
  95
  96static int dice_try_lock(struct dice *dice)
  97{
  98	int err;
  99
 100	spin_lock_irq(&dice->lock);
 101
 102	if (dice->dev_lock_count < 0) {
 103		err = -EBUSY;
 104		goto out;
 105	}
 106
 107	if (dice->dev_lock_count++ == 0)
 108		dice_lock_changed(dice);
 109	err = 0;
 110
 111out:
 112	spin_unlock_irq(&dice->lock);
 113
 114	return err;
 115}
 116
 117static void dice_unlock(struct dice *dice)
 118{
 119	spin_lock_irq(&dice->lock);
 120
 121	if (WARN_ON(dice->dev_lock_count <= 0))
 122		goto out;
 123
 124	if (--dice->dev_lock_count == 0)
 125		dice_lock_changed(dice);
 126
 127out:
 128	spin_unlock_irq(&dice->lock);
 129}
 130
 131static inline u64 global_address(struct dice *dice, unsigned int offset)
 132{
 133	return DICE_PRIVATE_SPACE + dice->global_offset + offset;
 134}
 135
 136// TODO: rx index
 137static inline u64 rx_address(struct dice *dice, unsigned int offset)
 138{
 139	return DICE_PRIVATE_SPACE + dice->rx_offset + offset;
 140}
 141
 142static int dice_owner_set(struct dice *dice)
 143{
 144	struct fw_device *device = fw_parent_device(dice->unit);
 145	__be64 *buffer;
 146	int err, errors = 0;
 147
 148	buffer = kmalloc(2 * 8, GFP_KERNEL);
 149	if (!buffer)
 150		return -ENOMEM;
 151
 152	for (;;) {
 153		buffer[0] = cpu_to_be64(OWNER_NO_OWNER);
 154		buffer[1] = cpu_to_be64(
 155			((u64)device->card->node_id << OWNER_NODE_SHIFT) |
 156			dice->notification_handler.offset);
 157
 158		dice->owner_generation = device->generation;
 159		smp_rmb(); /* node_id vs. generation */
 160		err = snd_fw_transaction(dice->unit,
 161					 TCODE_LOCK_COMPARE_SWAP,
 162					 global_address(dice, GLOBAL_OWNER),
 163					 buffer, 2 * 8,
 164					 FW_FIXED_GENERATION |
 165							dice->owner_generation);
 166
 167		if (err == 0) {
 168			if (buffer[0] != cpu_to_be64(OWNER_NO_OWNER)) {
 169				dev_err(&dice->unit->device,
 170					"device is already in use\n");
 171				err = -EBUSY;
 172			}
 173			break;
 174		}
 175		if (err != -EAGAIN || ++errors >= 3)
 176			break;
 177
 178		msleep(20);
 179	}
 180
 181	kfree(buffer);
 182
 183	return err;
 184}
 185
 186static int dice_owner_update(struct dice *dice)
 187{
 188	struct fw_device *device = fw_parent_device(dice->unit);
 189	__be64 *buffer;
 190	int err;
 191
 192	if (dice->owner_generation == -1)
 193		return 0;
 194
 195	buffer = kmalloc(2 * 8, GFP_KERNEL);
 196	if (!buffer)
 197		return -ENOMEM;
 198
 199	buffer[0] = cpu_to_be64(OWNER_NO_OWNER);
 200	buffer[1] = cpu_to_be64(
 201		((u64)device->card->node_id << OWNER_NODE_SHIFT) |
 202		dice->notification_handler.offset);
 203
 204	dice->owner_generation = device->generation;
 205	smp_rmb(); /* node_id vs. generation */
 206	err = snd_fw_transaction(dice->unit, TCODE_LOCK_COMPARE_SWAP,
 207				 global_address(dice, GLOBAL_OWNER),
 208				 buffer, 2 * 8,
 209				 FW_FIXED_GENERATION | dice->owner_generation);
 210
 211	if (err == 0) {
 212		if (buffer[0] != cpu_to_be64(OWNER_NO_OWNER)) {
 213			dev_err(&dice->unit->device,
 214				"device is already in use\n");
 215			err = -EBUSY;
 216		}
 217	} else if (err == -EAGAIN) {
 218		err = 0; /* try again later */
 219	}
 220
 221	kfree(buffer);
 222
 223	if (err < 0)
 224		dice->owner_generation = -1;
 225
 226	return err;
 227}
 228
 229static void dice_owner_clear(struct dice *dice)
 230{
 231	struct fw_device *device = fw_parent_device(dice->unit);
 232	__be64 *buffer;
 233
 234	buffer = kmalloc(2 * 8, GFP_KERNEL);
 235	if (!buffer)
 236		return;
 237
 238	buffer[0] = cpu_to_be64(
 239		((u64)device->card->node_id << OWNER_NODE_SHIFT) |
 240		dice->notification_handler.offset);
 241	buffer[1] = cpu_to_be64(OWNER_NO_OWNER);
 242	snd_fw_transaction(dice->unit, TCODE_LOCK_COMPARE_SWAP,
 243			   global_address(dice, GLOBAL_OWNER),
 244			   buffer, 2 * 8, FW_QUIET |
 245			   FW_FIXED_GENERATION | dice->owner_generation);
 246
 247	kfree(buffer);
 248
 249	dice->owner_generation = -1;
 250}
 251
 252static int dice_enable_set(struct dice *dice)
 253{
 254	__be32 value;
 255	int err;
 256
 257	value = cpu_to_be32(1);
 258	err = snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST,
 259				 global_address(dice, GLOBAL_ENABLE),
 260				 &value, 4,
 261				 FW_FIXED_GENERATION | dice->owner_generation);
 262	if (err < 0)
 263		return err;
 264
 265	dice->global_enabled = true;
 266
 267	return 0;
 268}
 269
 270static void dice_enable_clear(struct dice *dice)
 271{
 272	__be32 value;
 273
 274	if (!dice->global_enabled)
 275		return;
 276
 277	value = 0;
 278	snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST,
 279			   global_address(dice, GLOBAL_ENABLE),
 280			   &value, 4, FW_QUIET |
 281			   FW_FIXED_GENERATION | dice->owner_generation);
 282
 283	dice->global_enabled = false;
 284}
 285
 286static void dice_notification(struct fw_card *card, struct fw_request *request,
 287			      int tcode, int destination, int source,
 288			      int generation, unsigned long long offset,
 289			      void *data, size_t length, void *callback_data)
 290{
 291	struct dice *dice = callback_data;
 292	u32 bits;
 293	unsigned long flags;
 294
 295	if (tcode != TCODE_WRITE_QUADLET_REQUEST) {
 296		fw_send_response(card, request, RCODE_TYPE_ERROR);
 297		return;
 298	}
 299	if ((offset & 3) != 0) {
 300		fw_send_response(card, request, RCODE_ADDRESS_ERROR);
 301		return;
 302	}
 303
 304	bits = be32_to_cpup(data);
 305
 306	spin_lock_irqsave(&dice->lock, flags);
 307	dice->notification_bits |= bits;
 308	spin_unlock_irqrestore(&dice->lock, flags);
 309
 310	fw_send_response(card, request, RCODE_COMPLETE);
 311
 312	if (bits & NOTIFY_CLOCK_ACCEPTED)
 313		complete(&dice->clock_accepted);
 314	wake_up(&dice->hwdep_wait);
 315}
 316
 317static int dice_rate_constraint(struct snd_pcm_hw_params *params,
 318				struct snd_pcm_hw_rule *rule)
 319{
 320	struct dice *dice = rule->private;
 321	const struct snd_interval *channels =
 322		hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_CHANNELS);
 323	struct snd_interval *rate =
 324		hw_param_interval(params, SNDRV_PCM_HW_PARAM_RATE);
 325	struct snd_interval allowed_rates = {
 326		.min = UINT_MAX, .max = 0, .integer = 1
 327	};
 328	unsigned int i, mode;
 329
 330	for (i = 0; i < ARRAY_SIZE(dice_rates); ++i) {
 331		mode = rate_index_to_mode(i);
 332		if ((dice->clock_caps & (1 << i)) &&
 333		    snd_interval_test(channels, dice->rx_channels[mode])) {
 334			allowed_rates.min = min(allowed_rates.min,
 335						dice_rates[i]);
 336			allowed_rates.max = max(allowed_rates.max,
 337						dice_rates[i]);
 338		}
 339	}
 340
 341	return snd_interval_refine(rate, &allowed_rates);
 342}
 343
 344static int dice_channels_constraint(struct snd_pcm_hw_params *params,
 345				    struct snd_pcm_hw_rule *rule)
 346{
 347	struct dice *dice = rule->private;
 348	const struct snd_interval *rate =
 349		hw_param_interval_c(params, SNDRV_PCM_HW_PARAM_RATE);
 350	struct snd_interval *channels =
 351		hw_param_interval(params, SNDRV_PCM_HW_PARAM_CHANNELS);
 352	struct snd_interval allowed_channels = {
 353		.min = UINT_MAX, .max = 0, .integer = 1
 354	};
 355	unsigned int i, mode;
 356
 357	for (i = 0; i < ARRAY_SIZE(dice_rates); ++i)
 358		if ((dice->clock_caps & (1 << i)) &&
 359		    snd_interval_test(rate, dice_rates[i])) {
 360			mode = rate_index_to_mode(i);
 361			allowed_channels.min = min(allowed_channels.min,
 362						   dice->rx_channels[mode]);
 363			allowed_channels.max = max(allowed_channels.max,
 364						   dice->rx_channels[mode]);
 365		}
 366
 367	return snd_interval_refine(channels, &allowed_channels);
 368}
 369
 370static int dice_open(struct snd_pcm_substream *substream)
 371{
 372	static const struct snd_pcm_hardware hardware = {
 373		.info = SNDRV_PCM_INFO_MMAP |
 374			SNDRV_PCM_INFO_MMAP_VALID |
 375			SNDRV_PCM_INFO_BATCH |
 376			SNDRV_PCM_INFO_INTERLEAVED |
 377			SNDRV_PCM_INFO_BLOCK_TRANSFER,
 378		.formats = AMDTP_OUT_PCM_FORMAT_BITS,
 379		.channels_min = UINT_MAX,
 380		.channels_max = 0,
 381		.buffer_bytes_max = 16 * 1024 * 1024,
 382		.period_bytes_min = 1,
 383		.period_bytes_max = UINT_MAX,
 384		.periods_min = 1,
 385		.periods_max = UINT_MAX,
 386	};
 387	struct dice *dice = substream->private_data;
 388	struct snd_pcm_runtime *runtime = substream->runtime;
 389	unsigned int i;
 390	int err;
 391
 392	err = dice_try_lock(dice);
 393	if (err < 0)
 394		goto error;
 395
 396	runtime->hw = hardware;
 397
 398	for (i = 0; i < ARRAY_SIZE(dice_rates); ++i)
 399		if (dice->clock_caps & (1 << i))
 400			runtime->hw.rates |=
 401				snd_pcm_rate_to_rate_bit(dice_rates[i]);
 402	snd_pcm_limit_hw_rates(runtime);
 403
 404	for (i = 0; i < 3; ++i)
 405		if (dice->rx_channels[i]) {
 406			runtime->hw.channels_min = min(runtime->hw.channels_min,
 407						       dice->rx_channels[i]);
 408			runtime->hw.channels_max = max(runtime->hw.channels_max,
 409						       dice->rx_channels[i]);
 410		}
 411
 412	err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_RATE,
 413				  dice_rate_constraint, dice,
 414				  SNDRV_PCM_HW_PARAM_CHANNELS, -1);
 415	if (err < 0)
 416		goto err_lock;
 417	err = snd_pcm_hw_rule_add(runtime, 0, SNDRV_PCM_HW_PARAM_CHANNELS,
 418				  dice_channels_constraint, dice,
 419				  SNDRV_PCM_HW_PARAM_RATE, -1);
 420	if (err < 0)
 421		goto err_lock;
 422
 423	err = snd_pcm_hw_constraint_step(runtime, 0,
 424					 SNDRV_PCM_HW_PARAM_PERIOD_SIZE, 32);
 425	if (err < 0)
 426		goto err_lock;
 427	err = snd_pcm_hw_constraint_step(runtime, 0,
 428					 SNDRV_PCM_HW_PARAM_BUFFER_SIZE, 32);
 429	if (err < 0)
 430		goto err_lock;
 431
 432	err = snd_pcm_hw_constraint_minmax(runtime,
 433					   SNDRV_PCM_HW_PARAM_PERIOD_TIME,
 434					   5000, UINT_MAX);
 435	if (err < 0)
 436		goto err_lock;
 437
 438	err = snd_pcm_hw_constraint_msbits(runtime, 0, 32, 24);
 439	if (err < 0)
 440		goto err_lock;
 441
 442	return 0;
 443
 444err_lock:
 445	dice_unlock(dice);
 446error:
 447	return err;
 448}
 449
 450static int dice_close(struct snd_pcm_substream *substream)
 451{
 452	struct dice *dice = substream->private_data;
 453
 454	dice_unlock(dice);
 455
 456	return 0;
 457}
 458
 459static int dice_stream_start_packets(struct dice *dice)
 460{
 461	int err;
 462
 463	if (amdtp_out_stream_running(&dice->stream))
 464		return 0;
 465
 466	err = amdtp_out_stream_start(&dice->stream, dice->resources.channel,
 467				     fw_parent_device(dice->unit)->max_speed);
 468	if (err < 0)
 469		return err;
 470
 471	err = dice_enable_set(dice);
 472	if (err < 0) {
 473		amdtp_out_stream_stop(&dice->stream);
 474		return err;
 475	}
 476
 477	return 0;
 478}
 479
 480static int dice_stream_start(struct dice *dice)
 481{
 482	__be32 channel;
 483	int err;
 484
 485	if (!dice->resources.allocated) {
 486		err = fw_iso_resources_allocate(&dice->resources,
 487				amdtp_out_stream_get_max_payload(&dice->stream),
 488				fw_parent_device(dice->unit)->max_speed);
 489		if (err < 0)
 490			goto error;
 491
 492		channel = cpu_to_be32(dice->resources.channel);
 493		err = snd_fw_transaction(dice->unit,
 494					 TCODE_WRITE_QUADLET_REQUEST,
 495					 rx_address(dice, RX_ISOCHRONOUS),
 496					 &channel, 4, 0);
 497		if (err < 0)
 498			goto err_resources;
 499	}
 500
 501	err = dice_stream_start_packets(dice);
 502	if (err < 0)
 503		goto err_rx_channel;
 504
 505	return 0;
 506
 507err_rx_channel:
 508	channel = cpu_to_be32((u32)-1);
 509	snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST,
 510			   rx_address(dice, RX_ISOCHRONOUS), &channel, 4, 0);
 511err_resources:
 512	fw_iso_resources_free(&dice->resources);
 513error:
 514	return err;
 515}
 516
 517static void dice_stream_stop_packets(struct dice *dice)
 518{
 519	if (amdtp_out_stream_running(&dice->stream)) {
 520		dice_enable_clear(dice);
 521		amdtp_out_stream_stop(&dice->stream);
 522	}
 523}
 524
 525static void dice_stream_stop(struct dice *dice)
 526{
 527	__be32 channel;
 528
 529	dice_stream_stop_packets(dice);
 530
 531	if (!dice->resources.allocated)
 532		return;
 533
 534	channel = cpu_to_be32((u32)-1);
 535	snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST,
 536			   rx_address(dice, RX_ISOCHRONOUS), &channel, 4, 0);
 537
 538	fw_iso_resources_free(&dice->resources);
 539}
 540
 541static int dice_change_rate(struct dice *dice, unsigned int clock_rate)
 542{
 543	__be32 value;
 544	int err;
 545
 546	reinit_completion(&dice->clock_accepted);
 547
 548	value = cpu_to_be32(clock_rate | CLOCK_SOURCE_ARX1);
 549	err = snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST,
 550				 global_address(dice, GLOBAL_CLOCK_SELECT),
 551				 &value, 4, 0);
 552	if (err < 0)
 553		return err;
 554
 555	if (!wait_for_completion_timeout(&dice->clock_accepted,
 556					 msecs_to_jiffies(100)))
 557		dev_warn(&dice->unit->device, "clock change timed out\n");
 558
 559	return 0;
 560}
 561
 562static int dice_hw_params(struct snd_pcm_substream *substream,
 563			  struct snd_pcm_hw_params *hw_params)
 564{
 565	struct dice *dice = substream->private_data;
 566	unsigned int rate_index, mode;
 567	int err;
 568
 569	mutex_lock(&dice->mutex);
 570	dice_stream_stop(dice);
 571	mutex_unlock(&dice->mutex);
 572
 573	err = snd_pcm_lib_alloc_vmalloc_buffer(substream,
 574					       params_buffer_bytes(hw_params));
 575	if (err < 0)
 576		return err;
 577
 578	rate_index = rate_to_index(params_rate(hw_params));
 579	err = dice_change_rate(dice, rate_index << CLOCK_RATE_SHIFT);
 580	if (err < 0)
 581		return err;
 582
 583	mode = rate_index_to_mode(rate_index);
 584	amdtp_out_stream_set_parameters(&dice->stream,
 585					params_rate(hw_params),
 586					params_channels(hw_params),
 587					dice->rx_midi_ports[mode]);
 588	amdtp_out_stream_set_pcm_format(&dice->stream,
 589					params_format(hw_params));
 590
 591	return 0;
 592}
 593
 594static int dice_hw_free(struct snd_pcm_substream *substream)
 595{
 596	struct dice *dice = substream->private_data;
 597
 598	mutex_lock(&dice->mutex);
 599	dice_stream_stop(dice);
 600	mutex_unlock(&dice->mutex);
 601
 602	return snd_pcm_lib_free_vmalloc_buffer(substream);
 603}
 604
 605static int dice_prepare(struct snd_pcm_substream *substream)
 606{
 607	struct dice *dice = substream->private_data;
 608	int err;
 609
 610	mutex_lock(&dice->mutex);
 611
 612	if (amdtp_out_streaming_error(&dice->stream))
 613		dice_stream_stop_packets(dice);
 614
 615	err = dice_stream_start(dice);
 616	if (err < 0) {
 617		mutex_unlock(&dice->mutex);
 618		return err;
 619	}
 620
 621	mutex_unlock(&dice->mutex);
 622
 623	amdtp_out_stream_pcm_prepare(&dice->stream);
 624
 625	return 0;
 626}
 627
 628static int dice_trigger(struct snd_pcm_substream *substream, int cmd)
 629{
 630	struct dice *dice = substream->private_data;
 631	struct snd_pcm_substream *pcm;
 632
 633	switch (cmd) {
 634	case SNDRV_PCM_TRIGGER_START:
 635		pcm = substream;
 636		break;
 637	case SNDRV_PCM_TRIGGER_STOP:
 638		pcm = NULL;
 639		break;
 640	default:
 641		return -EINVAL;
 642	}
 643	amdtp_out_stream_pcm_trigger(&dice->stream, pcm);
 644
 645	return 0;
 646}
 647
 648static snd_pcm_uframes_t dice_pointer(struct snd_pcm_substream *substream)
 649{
 650	struct dice *dice = substream->private_data;
 651
 652	return amdtp_out_stream_pcm_pointer(&dice->stream);
 653}
 654
 655static int dice_create_pcm(struct dice *dice)
 656{
 657	static struct snd_pcm_ops ops = {
 658		.open      = dice_open,
 659		.close     = dice_close,
 660		.ioctl     = snd_pcm_lib_ioctl,
 661		.hw_params = dice_hw_params,
 662		.hw_free   = dice_hw_free,
 663		.prepare   = dice_prepare,
 664		.trigger   = dice_trigger,
 665		.pointer   = dice_pointer,
 666		.page      = snd_pcm_lib_get_vmalloc_page,
 667		.mmap      = snd_pcm_lib_mmap_vmalloc,
 668	};
 669	struct snd_pcm *pcm;
 670	int err;
 671
 672	err = snd_pcm_new(dice->card, "DICE", 0, 1, 0, &pcm);
 673	if (err < 0)
 674		return err;
 675	pcm->private_data = dice;
 676	strcpy(pcm->name, dice->card->shortname);
 677	pcm->streams[SNDRV_PCM_STREAM_PLAYBACK].substream->ops = &ops;
 678
 679	return 0;
 680}
 681
 682static long dice_hwdep_read(struct snd_hwdep *hwdep, char __user *buf,
 683			    long count, loff_t *offset)
 684{
 685	struct dice *dice = hwdep->private_data;
 686	DEFINE_WAIT(wait);
 687	union snd_firewire_event event;
 688
 689	spin_lock_irq(&dice->lock);
 690
 691	while (!dice->dev_lock_changed && dice->notification_bits == 0) {
 692		prepare_to_wait(&dice->hwdep_wait, &wait, TASK_INTERRUPTIBLE);
 693		spin_unlock_irq(&dice->lock);
 694		schedule();
 695		finish_wait(&dice->hwdep_wait, &wait);
 696		if (signal_pending(current))
 697			return -ERESTARTSYS;
 698		spin_lock_irq(&dice->lock);
 699	}
 700
 701	memset(&event, 0, sizeof(event));
 702	if (dice->dev_lock_changed) {
 703		event.lock_status.type = SNDRV_FIREWIRE_EVENT_LOCK_STATUS;
 704		event.lock_status.status = dice->dev_lock_count > 0;
 705		dice->dev_lock_changed = false;
 706
 707		count = min(count, (long)sizeof(event.lock_status));
 708	} else {
 709		event.dice_notification.type = SNDRV_FIREWIRE_EVENT_DICE_NOTIFICATION;
 710		event.dice_notification.notification = dice->notification_bits;
 711		dice->notification_bits = 0;
 712
 713		count = min(count, (long)sizeof(event.dice_notification));
 714	}
 715
 716	spin_unlock_irq(&dice->lock);
 717
 718	if (copy_to_user(buf, &event, count))
 719		return -EFAULT;
 720
 721	return count;
 722}
 723
 724static unsigned int dice_hwdep_poll(struct snd_hwdep *hwdep, struct file *file,
 725				    poll_table *wait)
 726{
 727	struct dice *dice = hwdep->private_data;
 728	unsigned int events;
 729
 730	poll_wait(file, &dice->hwdep_wait, wait);
 731
 732	spin_lock_irq(&dice->lock);
 733	if (dice->dev_lock_changed || dice->notification_bits != 0)
 734		events = POLLIN | POLLRDNORM;
 735	else
 736		events = 0;
 737	spin_unlock_irq(&dice->lock);
 738
 739	return events;
 740}
 741
 742static int dice_hwdep_get_info(struct dice *dice, void __user *arg)
 743{
 744	struct fw_device *dev = fw_parent_device(dice->unit);
 745	struct snd_firewire_get_info info;
 746
 747	memset(&info, 0, sizeof(info));
 748	info.type = SNDRV_FIREWIRE_TYPE_DICE;
 749	info.card = dev->card->index;
 750	*(__be32 *)&info.guid[0] = cpu_to_be32(dev->config_rom[3]);
 751	*(__be32 *)&info.guid[4] = cpu_to_be32(dev->config_rom[4]);
 752	strlcpy(info.device_name, dev_name(&dev->device),
 753		sizeof(info.device_name));
 754
 755	if (copy_to_user(arg, &info, sizeof(info)))
 756		return -EFAULT;
 757
 758	return 0;
 759}
 760
 761static int dice_hwdep_lock(struct dice *dice)
 762{
 763	int err;
 764
 765	spin_lock_irq(&dice->lock);
 766
 767	if (dice->dev_lock_count == 0) {
 768		dice->dev_lock_count = -1;
 769		err = 0;
 770	} else {
 771		err = -EBUSY;
 772	}
 773
 774	spin_unlock_irq(&dice->lock);
 775
 776	return err;
 777}
 778
 779static int dice_hwdep_unlock(struct dice *dice)
 780{
 781	int err;
 782
 783	spin_lock_irq(&dice->lock);
 784
 785	if (dice->dev_lock_count == -1) {
 786		dice->dev_lock_count = 0;
 787		err = 0;
 788	} else {
 789		err = -EBADFD;
 790	}
 791
 792	spin_unlock_irq(&dice->lock);
 793
 794	return err;
 795}
 796
 797static int dice_hwdep_release(struct snd_hwdep *hwdep, struct file *file)
 798{
 799	struct dice *dice = hwdep->private_data;
 800
 801	spin_lock_irq(&dice->lock);
 802	if (dice->dev_lock_count == -1)
 803		dice->dev_lock_count = 0;
 804	spin_unlock_irq(&dice->lock);
 805
 806	return 0;
 807}
 808
 809static int dice_hwdep_ioctl(struct snd_hwdep *hwdep, struct file *file,
 810			    unsigned int cmd, unsigned long arg)
 811{
 812	struct dice *dice = hwdep->private_data;
 813
 814	switch (cmd) {
 815	case SNDRV_FIREWIRE_IOCTL_GET_INFO:
 816		return dice_hwdep_get_info(dice, (void __user *)arg);
 817	case SNDRV_FIREWIRE_IOCTL_LOCK:
 818		return dice_hwdep_lock(dice);
 819	case SNDRV_FIREWIRE_IOCTL_UNLOCK:
 820		return dice_hwdep_unlock(dice);
 821	default:
 822		return -ENOIOCTLCMD;
 823	}
 824}
 825
 826#ifdef CONFIG_COMPAT
 827static int dice_hwdep_compat_ioctl(struct snd_hwdep *hwdep, struct file *file,
 828				   unsigned int cmd, unsigned long arg)
 829{
 830	return dice_hwdep_ioctl(hwdep, file, cmd,
 831				(unsigned long)compat_ptr(arg));
 832}
 833#else
 834#define dice_hwdep_compat_ioctl NULL
 835#endif
 836
 837static int dice_create_hwdep(struct dice *dice)
 838{
 839	static const struct snd_hwdep_ops ops = {
 840		.read         = dice_hwdep_read,
 841		.release      = dice_hwdep_release,
 842		.poll         = dice_hwdep_poll,
 843		.ioctl        = dice_hwdep_ioctl,
 844		.ioctl_compat = dice_hwdep_compat_ioctl,
 845	};
 846	struct snd_hwdep *hwdep;
 847	int err;
 848
 849	err = snd_hwdep_new(dice->card, "DICE", 0, &hwdep);
 850	if (err < 0)
 851		return err;
 852	strcpy(hwdep->name, "DICE");
 853	hwdep->iface = SNDRV_HWDEP_IFACE_FW_DICE;
 854	hwdep->ops = ops;
 855	hwdep->private_data = dice;
 856	hwdep->exclusive = true;
 857
 858	return 0;
 859}
 860
 861static int dice_proc_read_mem(struct dice *dice, void *buffer,
 862			      unsigned int offset_q, unsigned int quadlets)
 863{
 864	unsigned int i;
 865	int err;
 866
 867	err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST,
 868				 DICE_PRIVATE_SPACE + 4 * offset_q,
 869				 buffer, 4 * quadlets, 0);
 870	if (err < 0)
 871		return err;
 872
 873	for (i = 0; i < quadlets; ++i)
 874		be32_to_cpus(&((u32 *)buffer)[i]);
 875
 876	return 0;
 877}
 878
 879static const char *str_from_array(const char *const strs[], unsigned int count,
 880				  unsigned int i)
 881{
 882	if (i < count)
 883		return strs[i];
 884	else
 885		return "(unknown)";
 886}
 887
 888static void dice_proc_fixup_string(char *s, unsigned int size)
 889{
 890	unsigned int i;
 891
 892	for (i = 0; i < size; i += 4)
 893		cpu_to_le32s((u32 *)(s + i));
 894
 895	for (i = 0; i < size - 2; ++i) {
 896		if (s[i] == '\0')
 897			return;
 898		if (s[i] == '\\' && s[i + 1] == '\\') {
 899			s[i + 2] = '\0';
 900			return;
 901		}
 902	}
 903	s[size - 1] = '\0';
 904}
 905
 906static void dice_proc_read(struct snd_info_entry *entry,
 907			   struct snd_info_buffer *buffer)
 908{
 909	static const char *const section_names[5] = {
 910		"global", "tx", "rx", "ext_sync", "unused2"
 911	};
 912	static const char *const clock_sources[] = {
 913		"aes1", "aes2", "aes3", "aes4", "aes", "adat", "tdif",
 914		"wc", "arx1", "arx2", "arx3", "arx4", "internal"
 915	};
 916	static const char *const rates[] = {
 917		"32000", "44100", "48000", "88200", "96000", "176400", "192000",
 918		"any low", "any mid", "any high", "none"
 919	};
 920	struct dice *dice = entry->private_data;
 921	u32 sections[ARRAY_SIZE(section_names) * 2];
 922	struct {
 923		u32 number;
 924		u32 size;
 925	} tx_rx_header;
 926	union {
 927		struct {
 928			u32 owner_hi, owner_lo;
 929			u32 notification;
 930			char nick_name[NICK_NAME_SIZE];
 931			u32 clock_select;
 932			u32 enable;
 933			u32 status;
 934			u32 extended_status;
 935			u32 sample_rate;
 936			u32 version;
 937			u32 clock_caps;
 938			char clock_source_names[CLOCK_SOURCE_NAMES_SIZE];
 939		} global;
 940		struct {
 941			u32 iso;
 942			u32 number_audio;
 943			u32 number_midi;
 944			u32 speed;
 945			char names[TX_NAMES_SIZE];
 946			u32 ac3_caps;
 947			u32 ac3_enable;
 948		} tx;
 949		struct {
 950			u32 iso;
 951			u32 seq_start;
 952			u32 number_audio;
 953			u32 number_midi;
 954			char names[RX_NAMES_SIZE];
 955			u32 ac3_caps;
 956			u32 ac3_enable;
 957		} rx;
 958		struct {
 959			u32 clock_source;
 960			u32 locked;
 961			u32 rate;
 962			u32 adat_user_data;
 963		} ext_sync;
 964	} buf;
 965	unsigned int quadlets, stream, i;
 966
 967	if (dice_proc_read_mem(dice, sections, 0, ARRAY_SIZE(sections)) < 0)
 968		return;
 969	snd_iprintf(buffer, "sections:\n");
 970	for (i = 0; i < ARRAY_SIZE(section_names); ++i)
 971		snd_iprintf(buffer, "  %s: offset %u, size %u\n",
 972			    section_names[i],
 973			    sections[i * 2], sections[i * 2 + 1]);
 974
 975	quadlets = min_t(u32, sections[1], sizeof(buf.global) / 4);
 976	if (dice_proc_read_mem(dice, &buf.global, sections[0], quadlets) < 0)
 977		return;
 978	snd_iprintf(buffer, "global:\n");
 979	snd_iprintf(buffer, "  owner: %04x:%04x%08x\n",
 980		    buf.global.owner_hi >> 16,
 981		    buf.global.owner_hi & 0xffff, buf.global.owner_lo);
 982	snd_iprintf(buffer, "  notification: %08x\n", buf.global.notification);
 983	dice_proc_fixup_string(buf.global.nick_name, NICK_NAME_SIZE);
 984	snd_iprintf(buffer, "  nick name: %s\n", buf.global.nick_name);
 985	snd_iprintf(buffer, "  clock select: %s %s\n",
 986		    str_from_array(clock_sources, ARRAY_SIZE(clock_sources),
 987				   buf.global.clock_select & CLOCK_SOURCE_MASK),
 988		    str_from_array(rates, ARRAY_SIZE(rates),
 989				   (buf.global.clock_select & CLOCK_RATE_MASK)
 990				   >> CLOCK_RATE_SHIFT));
 991	snd_iprintf(buffer, "  enable: %u\n", buf.global.enable);
 992	snd_iprintf(buffer, "  status: %slocked %s\n",
 993		    buf.global.status & STATUS_SOURCE_LOCKED ? "" : "un",
 994		    str_from_array(rates, ARRAY_SIZE(rates),
 995				   (buf.global.status &
 996				    STATUS_NOMINAL_RATE_MASK)
 997				   >> CLOCK_RATE_SHIFT));
 998	snd_iprintf(buffer, "  ext status: %08x\n", buf.global.extended_status);
 999	snd_iprintf(buffer, "  sample rate: %u\n", buf.global.sample_rate);
1000	snd_iprintf(buffer, "  version: %u.%u.%u.%u\n",
1001		    (buf.global.version >> 24) & 0xff,
1002		    (buf.global.version >> 16) & 0xff,
1003		    (buf.global.version >>  8) & 0xff,
1004		    (buf.global.version >>  0) & 0xff);
1005	if (quadlets >= 90) {
1006		snd_iprintf(buffer, "  clock caps:");
1007		for (i = 0; i <= 6; ++i)
1008			if (buf.global.clock_caps & (1 << i))
1009				snd_iprintf(buffer, " %s", rates[i]);
1010		for (i = 0; i <= 12; ++i)
1011			if (buf.global.clock_caps & (1 << (16 + i)))
1012				snd_iprintf(buffer, " %s", clock_sources[i]);
1013		snd_iprintf(buffer, "\n");
1014		dice_proc_fixup_string(buf.global.clock_source_names,
1015				       CLOCK_SOURCE_NAMES_SIZE);
1016		snd_iprintf(buffer, "  clock source names: %s\n",
1017			    buf.global.clock_source_names);
1018	}
1019
1020	if (dice_proc_read_mem(dice, &tx_rx_header, sections[2], 2) < 0)
1021		return;
1022	quadlets = min_t(u32, tx_rx_header.size, sizeof(buf.tx) / 4);
1023	for (stream = 0; stream < tx_rx_header.number; ++stream) {
1024		if (dice_proc_read_mem(dice, &buf.tx, sections[2] + 2 +
1025				       stream * tx_rx_header.size,
1026				       quadlets) < 0)
1027			break;
1028		snd_iprintf(buffer, "tx %u:\n", stream);
1029		snd_iprintf(buffer, "  iso channel: %d\n", (int)buf.tx.iso);
1030		snd_iprintf(buffer, "  audio channels: %u\n",
1031			    buf.tx.number_audio);
1032		snd_iprintf(buffer, "  midi ports: %u\n", buf.tx.number_midi);
1033		snd_iprintf(buffer, "  speed: S%u\n", 100u << buf.tx.speed);
1034		if (quadlets >= 68) {
1035			dice_proc_fixup_string(buf.tx.names, TX_NAMES_SIZE);
1036			snd_iprintf(buffer, "  names: %s\n", buf.tx.names);
1037		}
1038		if (quadlets >= 70) {
1039			snd_iprintf(buffer, "  ac3 caps: %08x\n",
1040				    buf.tx.ac3_caps);
1041			snd_iprintf(buffer, "  ac3 enable: %08x\n",
1042				    buf.tx.ac3_enable);
1043		}
1044	}
1045
1046	if (dice_proc_read_mem(dice, &tx_rx_header, sections[4], 2) < 0)
1047		return;
1048	quadlets = min_t(u32, tx_rx_header.size, sizeof(buf.rx) / 4);
1049	for (stream = 0; stream < tx_rx_header.number; ++stream) {
1050		if (dice_proc_read_mem(dice, &buf.rx, sections[4] + 2 +
1051				       stream * tx_rx_header.size,
1052				       quadlets) < 0)
1053			break;
1054		snd_iprintf(buffer, "rx %u:\n", stream);
1055		snd_iprintf(buffer, "  iso channel: %d\n", (int)buf.rx.iso);
1056		snd_iprintf(buffer, "  sequence start: %u\n", buf.rx.seq_start);
1057		snd_iprintf(buffer, "  audio channels: %u\n",
1058			    buf.rx.number_audio);
1059		snd_iprintf(buffer, "  midi ports: %u\n", buf.rx.number_midi);
1060		if (quadlets >= 68) {
1061			dice_proc_fixup_string(buf.rx.names, RX_NAMES_SIZE);
1062			snd_iprintf(buffer, "  names: %s\n", buf.rx.names);
1063		}
1064		if (quadlets >= 70) {
1065			snd_iprintf(buffer, "  ac3 caps: %08x\n",
1066				    buf.rx.ac3_caps);
1067			snd_iprintf(buffer, "  ac3 enable: %08x\n",
1068				    buf.rx.ac3_enable);
1069		}
1070	}
1071
1072	quadlets = min_t(u32, sections[7], sizeof(buf.ext_sync) / 4);
1073	if (quadlets >= 4) {
1074		if (dice_proc_read_mem(dice, &buf.ext_sync,
1075				       sections[6], 4) < 0)
1076			return;
1077		snd_iprintf(buffer, "ext status:\n");
1078		snd_iprintf(buffer, "  clock source: %s\n",
1079			    str_from_array(clock_sources,
1080					   ARRAY_SIZE(clock_sources),
1081					   buf.ext_sync.clock_source));
1082		snd_iprintf(buffer, "  locked: %u\n", buf.ext_sync.locked);
1083		snd_iprintf(buffer, "  rate: %s\n",
1084			    str_from_array(rates, ARRAY_SIZE(rates),
1085					   buf.ext_sync.rate));
1086		snd_iprintf(buffer, "  adat user data: ");
1087		if (buf.ext_sync.adat_user_data & ADAT_USER_DATA_NO_DATA)
1088			snd_iprintf(buffer, "-\n");
1089		else
1090			snd_iprintf(buffer, "%x\n",
1091				    buf.ext_sync.adat_user_data);
1092	}
1093}
1094
1095static void dice_create_proc(struct dice *dice)
1096{
1097	struct snd_info_entry *entry;
1098
1099	if (!snd_card_proc_new(dice->card, "dice", &entry))
1100		snd_info_set_text_ops(entry, dice, dice_proc_read);
1101}
1102
1103static void dice_card_free(struct snd_card *card)
1104{
1105	struct dice *dice = card->private_data;
1106
1107	amdtp_out_stream_destroy(&dice->stream);
1108	fw_core_remove_address_handler(&dice->notification_handler);
1109	mutex_destroy(&dice->mutex);
1110}
1111
1112#define OUI_WEISS		0x001c6a
1113
1114#define DICE_CATEGORY_ID	0x04
1115#define WEISS_CATEGORY_ID	0x00
1116
1117static int dice_interface_check(struct fw_unit *unit)
1118{
1119	static const int min_values[10] = {
1120		10, 0x64 / 4,
1121		10, 0x18 / 4,
1122		10, 0x18 / 4,
1123		0, 0,
1124		0, 0,
1125	};
1126	struct fw_device *device = fw_parent_device(unit);
1127	struct fw_csr_iterator it;
1128	int key, value, vendor = -1, model = -1, err;
1129	unsigned int category, i;
1130	__be32 pointers[ARRAY_SIZE(min_values)];
1131	__be32 tx_data[4];
1132	__be32 version;
1133
1134	/*
1135	 * Check that GUID and unit directory are constructed according to DICE
1136	 * rules, i.e., that the specifier ID is the GUID's OUI, and that the
1137	 * GUID chip ID consists of the 8-bit category ID, the 10-bit product
1138	 * ID, and a 22-bit serial number.
1139	 */
1140	fw_csr_iterator_init(&it, unit->directory);
1141	while (fw_csr_iterator_next(&it, &key, &value)) {
1142		switch (key) {
1143		case CSR_SPECIFIER_ID:
1144			vendor = value;
1145			break;
1146		case CSR_MODEL:
1147			model = value;
1148			break;
1149		}
1150	}
1151	if (vendor == OUI_WEISS)
1152		category = WEISS_CATEGORY_ID;
1153	else
1154		category = DICE_CATEGORY_ID;
1155	if (device->config_rom[3] != ((vendor << 8) | category) ||
1156	    device->config_rom[4] >> 22 != model)
1157		return -ENODEV;
1158
1159	/*
1160	 * Check that the sub address spaces exist and are located inside the
1161	 * private address space.  The minimum values are chosen so that all
1162	 * minimally required registers are included.
1163	 */
1164	err = snd_fw_transaction(unit, TCODE_READ_BLOCK_REQUEST,
1165				 DICE_PRIVATE_SPACE,
1166				 pointers, sizeof(pointers), 0);
1167	if (err < 0)
1168		return -ENODEV;
1169	for (i = 0; i < ARRAY_SIZE(pointers); ++i) {
1170		value = be32_to_cpu(pointers[i]);
1171		if (value < min_values[i] || value >= 0x40000)
1172			return -ENODEV;
1173	}
1174
1175	/* We support playback only. Let capture devices be handled by FFADO. */
1176	err = snd_fw_transaction(unit, TCODE_READ_BLOCK_REQUEST,
1177				 DICE_PRIVATE_SPACE +
1178				 be32_to_cpu(pointers[2]) * 4,
1179				 tx_data, sizeof(tx_data), 0);
1180	if (err < 0 || (tx_data[0] && tx_data[3]))
1181		return -ENODEV;
1182
1183	/*
1184	 * Check that the implemented DICE driver specification major version
1185	 * number matches.
1186	 */
1187	err = snd_fw_transaction(unit, TCODE_READ_QUADLET_REQUEST,
1188				 DICE_PRIVATE_SPACE +
1189				 be32_to_cpu(pointers[0]) * 4 + GLOBAL_VERSION,
1190				 &version, 4, 0);
1191	if (err < 0)
1192		return -ENODEV;
1193	if ((version & cpu_to_be32(0xff000000)) != cpu_to_be32(0x01000000)) {
1194		dev_err(&unit->device,
1195			"unknown DICE version: 0x%08x\n", be32_to_cpu(version));
1196		return -ENODEV;
1197	}
1198
1199	return 0;
1200}
1201
1202static int highest_supported_mode_rate(struct dice *dice, unsigned int mode)
1203{
1204	int i;
1205
1206	for (i = ARRAY_SIZE(dice_rates) - 1; i >= 0; --i)
1207		if ((dice->clock_caps & (1 << i)) &&
1208		    rate_index_to_mode(i) == mode)
1209			return i;
1210
1211	return -1;
1212}
1213
1214static int dice_read_mode_params(struct dice *dice, unsigned int mode)
1215{
1216	__be32 values[2];
1217	int rate_index, err;
1218
1219	rate_index = highest_supported_mode_rate(dice, mode);
1220	if (rate_index < 0) {
1221		dice->rx_channels[mode] = 0;
1222		dice->rx_midi_ports[mode] = 0;
1223		return 0;
1224	}
1225
1226	err = dice_change_rate(dice, rate_index << CLOCK_RATE_SHIFT);
1227	if (err < 0)
1228		return err;
1229
1230	err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST,
1231				 rx_address(dice, RX_NUMBER_AUDIO),
1232				 values, 2 * 4, 0);
1233	if (err < 0)
1234		return err;
1235
1236	dice->rx_channels[mode]   = be32_to_cpu(values[0]);
1237	dice->rx_midi_ports[mode] = be32_to_cpu(values[1]);
1238
1239	return 0;
1240}
1241
1242static int dice_read_params(struct dice *dice)
1243{
1244	__be32 pointers[6];
1245	__be32 value;
1246	int mode, err;
1247
1248	err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST,
1249				 DICE_PRIVATE_SPACE,
1250				 pointers, sizeof(pointers), 0);
1251	if (err < 0)
1252		return err;
1253
1254	dice->global_offset = be32_to_cpu(pointers[0]) * 4;
1255	dice->rx_offset = be32_to_cpu(pointers[4]) * 4;
1256
1257	/* some very old firmwares don't tell about their clock support */
1258	if (be32_to_cpu(pointers[1]) * 4 >= GLOBAL_CLOCK_CAPABILITIES + 4) {
1259		err = snd_fw_transaction(
1260				dice->unit, TCODE_READ_QUADLET_REQUEST,
1261				global_address(dice, GLOBAL_CLOCK_CAPABILITIES),
1262				&value, 4, 0);
1263		if (err < 0)
1264			return err;
1265		dice->clock_caps = be32_to_cpu(value);
1266	} else {
1267		/* this should be supported by any device */
1268		dice->clock_caps = CLOCK_CAP_RATE_44100 |
1269				   CLOCK_CAP_RATE_48000 |
1270				   CLOCK_CAP_SOURCE_ARX1 |
1271				   CLOCK_CAP_SOURCE_INTERNAL;
1272	}
1273
1274	for (mode = 2; mode >= 0; --mode) {
1275		err = dice_read_mode_params(dice, mode);
1276		if (err < 0)
1277			return err;
1278	}
1279
1280	return 0;
1281}
1282
1283static void dice_card_strings(struct dice *dice)
1284{
1285	struct snd_card *card = dice->card;
1286	struct fw_device *dev = fw_parent_device(dice->unit);
1287	char vendor[32], model[32];
1288	unsigned int i;
1289	int err;
1290
1291	strcpy(card->driver, "DICE");
1292
1293	strcpy(card->shortname, "DICE");
1294	BUILD_BUG_ON(NICK_NAME_SIZE < sizeof(card->shortname));
1295	err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST,
1296				 global_address(dice, GLOBAL_NICK_NAME),
1297				 card->shortname, sizeof(card->shortname), 0);
1298	if (err >= 0) {
1299		/* DICE strings are returned in "always-wrong" endianness */
1300		BUILD_BUG_ON(sizeof(card->shortname) % 4 != 0);
1301		for (i = 0; i < sizeof(card->shortname); i += 4)
1302			swab32s((u32 *)&card->shortname[i]);
1303		card->shortname[sizeof(card->shortname) - 1] = '\0';
1304	}
1305
1306	strcpy(vendor, "?");
1307	fw_csr_string(dev->config_rom + 5, CSR_VENDOR, vendor, sizeof(vendor));
1308	strcpy(model, "?");
1309	fw_csr_string(dice->unit->directory, CSR_MODEL, model, sizeof(model));
1310	snprintf(card->longname, sizeof(card->longname),
1311		 "%s %s (serial %u) at %s, S%d",
1312		 vendor, model, dev->config_rom[4] & 0x3fffff,
1313		 dev_name(&dice->unit->device), 100 << dev->max_speed);
1314
1315	strcpy(card->mixername, "DICE");
1316}
1317
1318static int dice_probe(struct fw_unit *unit, const struct ieee1394_device_id *id)
1319{
1320	struct snd_card *card;
1321	struct dice *dice;
1322	__be32 clock_sel;
1323	int err;
1324
1325	err = dice_interface_check(unit);
1326	if (err < 0)
1327		return err;
1328
1329	err = snd_card_new(&unit->device, -1, NULL, THIS_MODULE,
1330			   sizeof(*dice), &card);
1331	if (err < 0)
1332		return err;
1333
1334	dice = card->private_data;
1335	dice->card = card;
1336	spin_lock_init(&dice->lock);
1337	mutex_init(&dice->mutex);
1338	dice->unit = unit;
1339	init_completion(&dice->clock_accepted);
1340	init_waitqueue_head(&dice->hwdep_wait);
1341
1342	dice->notification_handler.length = 4;
1343	dice->notification_handler.address_callback = dice_notification;
1344	dice->notification_handler.callback_data = dice;
1345	err = fw_core_add_address_handler(&dice->notification_handler,
1346					  &fw_high_memory_region);
1347	if (err < 0)
1348		goto err_mutex;
1349
1350	err = dice_owner_set(dice);
1351	if (err < 0)
1352		goto err_notification_handler;
1353
1354	err = dice_read_params(dice);
1355	if (err < 0)
1356		goto err_owner;
1357
1358	err = fw_iso_resources_init(&dice->resources, unit);
1359	if (err < 0)
1360		goto err_owner;
1361	dice->resources.channels_mask = 0x00000000ffffffffuLL;
1362
1363	err = amdtp_out_stream_init(&dice->stream, unit,
1364				    CIP_BLOCKING | CIP_HI_DUALWIRE);
1365	if (err < 0)
1366		goto err_resources;
1367
1368	card->private_free = dice_card_free;
1369
1370	dice_card_strings(dice);
1371
1372	err = snd_fw_transaction(unit, TCODE_READ_QUADLET_REQUEST,
1373				 global_address(dice, GLOBAL_CLOCK_SELECT),
1374				 &clock_sel, 4, 0);
1375	if (err < 0)
1376		goto error;
1377	clock_sel &= cpu_to_be32(~CLOCK_SOURCE_MASK);
1378	clock_sel |= cpu_to_be32(CLOCK_SOURCE_ARX1);
1379	err = snd_fw_transaction(unit, TCODE_WRITE_QUADLET_REQUEST,
1380				 global_address(dice, GLOBAL_CLOCK_SELECT),
1381				 &clock_sel, 4, 0);
1382	if (err < 0)
1383		goto error;
1384
1385	err = dice_create_pcm(dice);
1386	if (err < 0)
1387		goto error;
1388
1389	err = dice_create_hwdep(dice);
1390	if (err < 0)
1391		goto error;
1392
1393	dice_create_proc(dice);
1394
1395	err = snd_card_register(card);
1396	if (err < 0)
1397		goto error;
1398
1399	dev_set_drvdata(&unit->device, dice);
1400
1401	return 0;
1402
1403err_resources:
1404	fw_iso_resources_destroy(&dice->resources);
1405err_owner:
1406	dice_owner_clear(dice);
1407err_notification_handler:
1408	fw_core_remove_address_handler(&dice->notification_handler);
1409err_mutex:
1410	mutex_destroy(&dice->mutex);
1411error:
1412	snd_card_free(card);
1413	return err;
1414}
1415
1416static void dice_remove(struct fw_unit *unit)
1417{
1418	struct dice *dice = dev_get_drvdata(&unit->device);
1419
1420	amdtp_out_stream_pcm_abort(&dice->stream);
1421
1422	snd_card_disconnect(dice->card);
1423
1424	mutex_lock(&dice->mutex);
1425
1426	dice_stream_stop(dice);
1427	dice_owner_clear(dice);
1428
1429	mutex_unlock(&dice->mutex);
1430
1431	snd_card_free_when_closed(dice->card);
1432}
1433
1434static void dice_bus_reset(struct fw_unit *unit)
1435{
1436	struct dice *dice = dev_get_drvdata(&unit->device);
1437
1438	/*
1439	 * On a bus reset, the DICE firmware disables streaming and then goes
1440	 * off contemplating its own navel for hundreds of milliseconds before
1441	 * it can react to any of our attempts to reenable streaming.  This
1442	 * means that we lose synchronization anyway, so we force our streams
1443	 * to stop so that the application can restart them in an orderly
1444	 * manner.
1445	 */
1446	amdtp_out_stream_pcm_abort(&dice->stream);
1447
1448	mutex_lock(&dice->mutex);
1449
1450	dice->global_enabled = false;
1451	dice_stream_stop_packets(dice);
1452
1453	dice_owner_update(dice);
1454
1455	fw_iso_resources_update(&dice->resources);
1456
1457	mutex_unlock(&dice->mutex);
1458}
1459
1460#define DICE_INTERFACE	0x000001
1461
1462static const struct ieee1394_device_id dice_id_table[] = {
1463	{
1464		.match_flags = IEEE1394_MATCH_VERSION,
1465		.version     = DICE_INTERFACE,
1466	},
1467	{ }
1468};
1469MODULE_DEVICE_TABLE(ieee1394, dice_id_table);
1470
1471static struct fw_driver dice_driver = {
1472	.driver   = {
1473		.owner	= THIS_MODULE,
1474		.name	= KBUILD_MODNAME,
1475		.bus	= &fw_bus_type,
1476	},
1477	.probe    = dice_probe,
1478	.update   = dice_bus_reset,
1479	.remove   = dice_remove,
1480	.id_table = dice_id_table,
1481};
1482
1483static int __init alsa_dice_init(void)
1484{
1485	return driver_register(&dice_driver.driver);
1486}
1487
1488static void __exit alsa_dice_exit(void)
1489{
1490	driver_unregister(&dice_driver.driver);
1491}
1492
1493module_init(alsa_dice_init);
1494module_exit(alsa_dice_exit);