2 * TC Applied Technologies Digital Interface Communications Engine driver
4 * Copyright (c) Clemens Ladisch <clemens@ladisch.de>
5 * Licensed under the terms of the GNU General Public License, version 2.
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>
30 #include "iso-resources.h"
32 #include "dice-interface.h"
36 struct snd_card
*card
;
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
;
47 int dev_lock_count
; /* > 0 driver, < 0 userspace */
48 bool dev_lock_changed
;
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_stream stream
;
57 MODULE_DESCRIPTION("DICE driver");
58 MODULE_AUTHOR("Clemens Ladisch <clemens@ladisch.de>");
59 MODULE_LICENSE("GPL v2");
61 static const unsigned int dice_rates
[] = {
74 static unsigned int rate_to_index(unsigned int rate
)
78 for (i
= 0; i
< ARRAY_SIZE(dice_rates
); ++i
)
79 if (dice_rates
[i
] == rate
)
85 static unsigned int rate_index_to_mode(unsigned int rate_index
)
87 return ((int)rate_index
- 1) / 2;
90 static void dice_lock_changed(struct dice
*dice
)
92 dice
->dev_lock_changed
= true;
93 wake_up(&dice
->hwdep_wait
);
96 static int dice_try_lock(struct dice
*dice
)
100 spin_lock_irq(&dice
->lock
);
102 if (dice
->dev_lock_count
< 0) {
107 if (dice
->dev_lock_count
++ == 0)
108 dice_lock_changed(dice
);
112 spin_unlock_irq(&dice
->lock
);
117 static void dice_unlock(struct dice
*dice
)
119 spin_lock_irq(&dice
->lock
);
121 if (WARN_ON(dice
->dev_lock_count
<= 0))
124 if (--dice
->dev_lock_count
== 0)
125 dice_lock_changed(dice
);
128 spin_unlock_irq(&dice
->lock
);
131 static inline u64
global_address(struct dice
*dice
, unsigned int offset
)
133 return DICE_PRIVATE_SPACE
+ dice
->global_offset
+ offset
;
137 static inline u64
rx_address(struct dice
*dice
, unsigned int offset
)
139 return DICE_PRIVATE_SPACE
+ dice
->rx_offset
+ offset
;
142 static int dice_owner_set(struct dice
*dice
)
144 struct fw_device
*device
= fw_parent_device(dice
->unit
);
148 buffer
= kmalloc(2 * 8, GFP_KERNEL
);
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
);
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
),
164 FW_FIXED_GENERATION
|
165 dice
->owner_generation
);
168 if (buffer
[0] != cpu_to_be64(OWNER_NO_OWNER
)) {
169 dev_err(&dice
->unit
->device
,
170 "device is already in use\n");
175 if (err
!= -EAGAIN
|| ++errors
>= 3)
186 static int dice_owner_update(struct dice
*dice
)
188 struct fw_device
*device
= fw_parent_device(dice
->unit
);
192 if (dice
->owner_generation
== -1)
195 buffer
= kmalloc(2 * 8, GFP_KERNEL
);
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
);
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
),
209 FW_FIXED_GENERATION
| dice
->owner_generation
);
212 if (buffer
[0] != cpu_to_be64(OWNER_NO_OWNER
)) {
213 dev_err(&dice
->unit
->device
,
214 "device is already in use\n");
217 } else if (err
== -EAGAIN
) {
218 err
= 0; /* try again later */
224 dice
->owner_generation
= -1;
229 static void dice_owner_clear(struct dice
*dice
)
231 struct fw_device
*device
= fw_parent_device(dice
->unit
);
234 buffer
= kmalloc(2 * 8, GFP_KERNEL
);
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
);
249 dice
->owner_generation
= -1;
252 static int dice_enable_set(struct dice
*dice
)
257 value
= cpu_to_be32(1);
258 err
= snd_fw_transaction(dice
->unit
, TCODE_WRITE_QUADLET_REQUEST
,
259 global_address(dice
, GLOBAL_ENABLE
),
261 FW_FIXED_GENERATION
| dice
->owner_generation
);
265 dice
->global_enabled
= true;
270 static void dice_enable_clear(struct dice
*dice
)
274 if (!dice
->global_enabled
)
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
);
283 dice
->global_enabled
= false;
286 static 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
)
291 struct dice
*dice
= callback_data
;
295 if (tcode
!= TCODE_WRITE_QUADLET_REQUEST
) {
296 fw_send_response(card
, request
, RCODE_TYPE_ERROR
);
299 if ((offset
& 3) != 0) {
300 fw_send_response(card
, request
, RCODE_ADDRESS_ERROR
);
304 bits
= be32_to_cpup(data
);
306 spin_lock_irqsave(&dice
->lock
, flags
);
307 dice
->notification_bits
|= bits
;
308 spin_unlock_irqrestore(&dice
->lock
, flags
);
310 fw_send_response(card
, request
, RCODE_COMPLETE
);
312 if (bits
& NOTIFY_CLOCK_ACCEPTED
)
313 complete(&dice
->clock_accepted
);
314 wake_up(&dice
->hwdep_wait
);
317 static int dice_rate_constraint(struct snd_pcm_hw_params
*params
,
318 struct snd_pcm_hw_rule
*rule
)
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
328 unsigned int i
, mode
;
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
,
336 allowed_rates
.max
= max(allowed_rates
.max
,
341 return snd_interval_refine(rate
, &allowed_rates
);
344 static int dice_channels_constraint(struct snd_pcm_hw_params
*params
,
345 struct snd_pcm_hw_rule
*rule
)
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
355 unsigned int i
, mode
;
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
]);
367 return snd_interval_refine(channels
, &allowed_channels
);
370 static int dice_open(struct snd_pcm_substream
*substream
)
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
,
381 .buffer_bytes_max
= 16 * 1024 * 1024,
382 .period_bytes_min
= 1,
383 .period_bytes_max
= UINT_MAX
,
385 .periods_max
= UINT_MAX
,
387 struct dice
*dice
= substream
->private_data
;
388 struct snd_pcm_runtime
*runtime
= substream
->runtime
;
392 err
= dice_try_lock(dice
);
396 runtime
->hw
= hardware
;
398 for (i
= 0; i
< ARRAY_SIZE(dice_rates
); ++i
)
399 if (dice
->clock_caps
& (1 << i
))
401 snd_pcm_rate_to_rate_bit(dice_rates
[i
]);
402 snd_pcm_limit_hw_rates(runtime
);
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
]);
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);
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);
423 err
= amdtp_stream_add_pcm_hw_constraints(&dice
->stream
, runtime
);
435 static int dice_close(struct snd_pcm_substream
*substream
)
437 struct dice
*dice
= substream
->private_data
;
444 static int dice_stream_start_packets(struct dice
*dice
)
448 if (amdtp_stream_running(&dice
->stream
))
451 err
= amdtp_stream_start(&dice
->stream
, dice
->resources
.channel
,
452 fw_parent_device(dice
->unit
)->max_speed
);
456 err
= dice_enable_set(dice
);
458 amdtp_stream_stop(&dice
->stream
);
465 static int dice_stream_start(struct dice
*dice
)
470 if (!dice
->resources
.allocated
) {
471 err
= fw_iso_resources_allocate(&dice
->resources
,
472 amdtp_stream_get_max_payload(&dice
->stream
),
473 fw_parent_device(dice
->unit
)->max_speed
);
477 channel
= cpu_to_be32(dice
->resources
.channel
);
478 err
= snd_fw_transaction(dice
->unit
,
479 TCODE_WRITE_QUADLET_REQUEST
,
480 rx_address(dice
, RX_ISOCHRONOUS
),
486 err
= dice_stream_start_packets(dice
);
493 channel
= cpu_to_be32((u32
)-1);
494 snd_fw_transaction(dice
->unit
, TCODE_WRITE_QUADLET_REQUEST
,
495 rx_address(dice
, RX_ISOCHRONOUS
), &channel
, 4, 0);
497 fw_iso_resources_free(&dice
->resources
);
502 static void dice_stream_stop_packets(struct dice
*dice
)
504 if (amdtp_stream_running(&dice
->stream
)) {
505 dice_enable_clear(dice
);
506 amdtp_stream_stop(&dice
->stream
);
510 static void dice_stream_stop(struct dice
*dice
)
514 dice_stream_stop_packets(dice
);
516 if (!dice
->resources
.allocated
)
519 channel
= cpu_to_be32((u32
)-1);
520 snd_fw_transaction(dice
->unit
, TCODE_WRITE_QUADLET_REQUEST
,
521 rx_address(dice
, RX_ISOCHRONOUS
), &channel
, 4, 0);
523 fw_iso_resources_free(&dice
->resources
);
526 static int dice_change_rate(struct dice
*dice
, unsigned int clock_rate
)
531 reinit_completion(&dice
->clock_accepted
);
533 value
= cpu_to_be32(clock_rate
| CLOCK_SOURCE_ARX1
);
534 err
= snd_fw_transaction(dice
->unit
, TCODE_WRITE_QUADLET_REQUEST
,
535 global_address(dice
, GLOBAL_CLOCK_SELECT
),
540 if (!wait_for_completion_timeout(&dice
->clock_accepted
,
541 msecs_to_jiffies(100)))
542 dev_warn(&dice
->unit
->device
, "clock change timed out\n");
547 static int dice_hw_params(struct snd_pcm_substream
*substream
,
548 struct snd_pcm_hw_params
*hw_params
)
550 struct dice
*dice
= substream
->private_data
;
551 unsigned int rate_index
, mode
, rate
, channels
, i
;
554 mutex_lock(&dice
->mutex
);
555 dice_stream_stop(dice
);
556 mutex_unlock(&dice
->mutex
);
558 err
= snd_pcm_lib_alloc_vmalloc_buffer(substream
,
559 params_buffer_bytes(hw_params
));
563 rate
= params_rate(hw_params
);
564 rate_index
= rate_to_index(rate
);
565 err
= dice_change_rate(dice
, rate_index
<< CLOCK_RATE_SHIFT
);
570 * At 176.4/192.0 kHz, Dice has a quirk to transfer two PCM frames in
571 * one data block of AMDTP packet. Thus sampling transfer frequency is
572 * a half of PCM sampling frequency, i.e. PCM frames at 192.0 kHz are
573 * transferred on AMDTP packets at 96 kHz. Two successive samples of a
574 * channel are stored consecutively in the packet. This quirk is called
576 * For this quirk, blocking mode is required and PCM buffer size should
577 * be aligned to SYT_INTERVAL.
579 channels
= params_channels(hw_params
);
580 if (rate_index
> 4) {
581 if (channels
> AMDTP_MAX_CHANNELS_FOR_PCM
/ 2) {
588 dice
->stream
.double_pcm_frames
= true;
590 dice
->stream
.double_pcm_frames
= false;
593 mode
= rate_index_to_mode(rate_index
);
594 amdtp_stream_set_parameters(&dice
->stream
, rate
, channels
,
595 dice
->rx_midi_ports
[mode
]);
596 if (rate_index
> 4) {
599 for (i
= 0; i
< channels
; i
++) {
600 dice
->stream
.pcm_positions
[i
] = i
* 2;
601 dice
->stream
.pcm_positions
[i
+ channels
] = i
* 2 + 1;
605 amdtp_stream_set_pcm_format(&dice
->stream
,
606 params_format(hw_params
));
611 static int dice_hw_free(struct snd_pcm_substream
*substream
)
613 struct dice
*dice
= substream
->private_data
;
615 mutex_lock(&dice
->mutex
);
616 dice_stream_stop(dice
);
617 mutex_unlock(&dice
->mutex
);
619 return snd_pcm_lib_free_vmalloc_buffer(substream
);
622 static int dice_prepare(struct snd_pcm_substream
*substream
)
624 struct dice
*dice
= substream
->private_data
;
627 mutex_lock(&dice
->mutex
);
629 if (amdtp_streaming_error(&dice
->stream
))
630 dice_stream_stop_packets(dice
);
632 err
= dice_stream_start(dice
);
634 mutex_unlock(&dice
->mutex
);
638 mutex_unlock(&dice
->mutex
);
640 amdtp_stream_pcm_prepare(&dice
->stream
);
645 static int dice_trigger(struct snd_pcm_substream
*substream
, int cmd
)
647 struct dice
*dice
= substream
->private_data
;
648 struct snd_pcm_substream
*pcm
;
651 case SNDRV_PCM_TRIGGER_START
:
654 case SNDRV_PCM_TRIGGER_STOP
:
660 amdtp_stream_pcm_trigger(&dice
->stream
, pcm
);
665 static snd_pcm_uframes_t
dice_pointer(struct snd_pcm_substream
*substream
)
667 struct dice
*dice
= substream
->private_data
;
669 return amdtp_stream_pcm_pointer(&dice
->stream
);
672 static int dice_create_pcm(struct dice
*dice
)
674 static struct snd_pcm_ops ops
= {
677 .ioctl
= snd_pcm_lib_ioctl
,
678 .hw_params
= dice_hw_params
,
679 .hw_free
= dice_hw_free
,
680 .prepare
= dice_prepare
,
681 .trigger
= dice_trigger
,
682 .pointer
= dice_pointer
,
683 .page
= snd_pcm_lib_get_vmalloc_page
,
684 .mmap
= snd_pcm_lib_mmap_vmalloc
,
689 err
= snd_pcm_new(dice
->card
, "DICE", 0, 1, 0, &pcm
);
692 pcm
->private_data
= dice
;
693 strcpy(pcm
->name
, dice
->card
->shortname
);
694 pcm
->streams
[SNDRV_PCM_STREAM_PLAYBACK
].substream
->ops
= &ops
;
699 static long dice_hwdep_read(struct snd_hwdep
*hwdep
, char __user
*buf
,
700 long count
, loff_t
*offset
)
702 struct dice
*dice
= hwdep
->private_data
;
704 union snd_firewire_event event
;
706 spin_lock_irq(&dice
->lock
);
708 while (!dice
->dev_lock_changed
&& dice
->notification_bits
== 0) {
709 prepare_to_wait(&dice
->hwdep_wait
, &wait
, TASK_INTERRUPTIBLE
);
710 spin_unlock_irq(&dice
->lock
);
712 finish_wait(&dice
->hwdep_wait
, &wait
);
713 if (signal_pending(current
))
715 spin_lock_irq(&dice
->lock
);
718 memset(&event
, 0, sizeof(event
));
719 if (dice
->dev_lock_changed
) {
720 event
.lock_status
.type
= SNDRV_FIREWIRE_EVENT_LOCK_STATUS
;
721 event
.lock_status
.status
= dice
->dev_lock_count
> 0;
722 dice
->dev_lock_changed
= false;
724 count
= min(count
, (long)sizeof(event
.lock_status
));
726 event
.dice_notification
.type
= SNDRV_FIREWIRE_EVENT_DICE_NOTIFICATION
;
727 event
.dice_notification
.notification
= dice
->notification_bits
;
728 dice
->notification_bits
= 0;
730 count
= min(count
, (long)sizeof(event
.dice_notification
));
733 spin_unlock_irq(&dice
->lock
);
735 if (copy_to_user(buf
, &event
, count
))
741 static unsigned int dice_hwdep_poll(struct snd_hwdep
*hwdep
, struct file
*file
,
744 struct dice
*dice
= hwdep
->private_data
;
747 poll_wait(file
, &dice
->hwdep_wait
, wait
);
749 spin_lock_irq(&dice
->lock
);
750 if (dice
->dev_lock_changed
|| dice
->notification_bits
!= 0)
751 events
= POLLIN
| POLLRDNORM
;
754 spin_unlock_irq(&dice
->lock
);
759 static int dice_hwdep_get_info(struct dice
*dice
, void __user
*arg
)
761 struct fw_device
*dev
= fw_parent_device(dice
->unit
);
762 struct snd_firewire_get_info info
;
764 memset(&info
, 0, sizeof(info
));
765 info
.type
= SNDRV_FIREWIRE_TYPE_DICE
;
766 info
.card
= dev
->card
->index
;
767 *(__be32
*)&info
.guid
[0] = cpu_to_be32(dev
->config_rom
[3]);
768 *(__be32
*)&info
.guid
[4] = cpu_to_be32(dev
->config_rom
[4]);
769 strlcpy(info
.device_name
, dev_name(&dev
->device
),
770 sizeof(info
.device_name
));
772 if (copy_to_user(arg
, &info
, sizeof(info
)))
778 static int dice_hwdep_lock(struct dice
*dice
)
782 spin_lock_irq(&dice
->lock
);
784 if (dice
->dev_lock_count
== 0) {
785 dice
->dev_lock_count
= -1;
791 spin_unlock_irq(&dice
->lock
);
796 static int dice_hwdep_unlock(struct dice
*dice
)
800 spin_lock_irq(&dice
->lock
);
802 if (dice
->dev_lock_count
== -1) {
803 dice
->dev_lock_count
= 0;
809 spin_unlock_irq(&dice
->lock
);
814 static int dice_hwdep_release(struct snd_hwdep
*hwdep
, struct file
*file
)
816 struct dice
*dice
= hwdep
->private_data
;
818 spin_lock_irq(&dice
->lock
);
819 if (dice
->dev_lock_count
== -1)
820 dice
->dev_lock_count
= 0;
821 spin_unlock_irq(&dice
->lock
);
826 static int dice_hwdep_ioctl(struct snd_hwdep
*hwdep
, struct file
*file
,
827 unsigned int cmd
, unsigned long arg
)
829 struct dice
*dice
= hwdep
->private_data
;
832 case SNDRV_FIREWIRE_IOCTL_GET_INFO
:
833 return dice_hwdep_get_info(dice
, (void __user
*)arg
);
834 case SNDRV_FIREWIRE_IOCTL_LOCK
:
835 return dice_hwdep_lock(dice
);
836 case SNDRV_FIREWIRE_IOCTL_UNLOCK
:
837 return dice_hwdep_unlock(dice
);
844 static int dice_hwdep_compat_ioctl(struct snd_hwdep
*hwdep
, struct file
*file
,
845 unsigned int cmd
, unsigned long arg
)
847 return dice_hwdep_ioctl(hwdep
, file
, cmd
,
848 (unsigned long)compat_ptr(arg
));
851 #define dice_hwdep_compat_ioctl NULL
854 static int dice_create_hwdep(struct dice
*dice
)
856 static const struct snd_hwdep_ops ops
= {
857 .read
= dice_hwdep_read
,
858 .release
= dice_hwdep_release
,
859 .poll
= dice_hwdep_poll
,
860 .ioctl
= dice_hwdep_ioctl
,
861 .ioctl_compat
= dice_hwdep_compat_ioctl
,
863 struct snd_hwdep
*hwdep
;
866 err
= snd_hwdep_new(dice
->card
, "DICE", 0, &hwdep
);
869 strcpy(hwdep
->name
, "DICE");
870 hwdep
->iface
= SNDRV_HWDEP_IFACE_FW_DICE
;
872 hwdep
->private_data
= dice
;
873 hwdep
->exclusive
= true;
878 static int dice_proc_read_mem(struct dice
*dice
, void *buffer
,
879 unsigned int offset_q
, unsigned int quadlets
)
884 err
= snd_fw_transaction(dice
->unit
, TCODE_READ_BLOCK_REQUEST
,
885 DICE_PRIVATE_SPACE
+ 4 * offset_q
,
886 buffer
, 4 * quadlets
, 0);
890 for (i
= 0; i
< quadlets
; ++i
)
891 be32_to_cpus(&((u32
*)buffer
)[i
]);
896 static const char *str_from_array(const char *const strs
[], unsigned int count
,
905 static void dice_proc_fixup_string(char *s
, unsigned int size
)
909 for (i
= 0; i
< size
; i
+= 4)
910 cpu_to_le32s((u32
*)(s
+ i
));
912 for (i
= 0; i
< size
- 2; ++i
) {
915 if (s
[i
] == '\\' && s
[i
+ 1] == '\\') {
923 static void dice_proc_read(struct snd_info_entry
*entry
,
924 struct snd_info_buffer
*buffer
)
926 static const char *const section_names
[5] = {
927 "global", "tx", "rx", "ext_sync", "unused2"
929 static const char *const clock_sources
[] = {
930 "aes1", "aes2", "aes3", "aes4", "aes", "adat", "tdif",
931 "wc", "arx1", "arx2", "arx3", "arx4", "internal"
933 static const char *const rates
[] = {
934 "32000", "44100", "48000", "88200", "96000", "176400", "192000",
935 "any low", "any mid", "any high", "none"
937 struct dice
*dice
= entry
->private_data
;
938 u32 sections
[ARRAY_SIZE(section_names
) * 2];
945 u32 owner_hi
, owner_lo
;
947 char nick_name
[NICK_NAME_SIZE
];
955 char clock_source_names
[CLOCK_SOURCE_NAMES_SIZE
];
962 char names
[TX_NAMES_SIZE
];
971 char names
[RX_NAMES_SIZE
];
982 unsigned int quadlets
, stream
, i
;
984 if (dice_proc_read_mem(dice
, sections
, 0, ARRAY_SIZE(sections
)) < 0)
986 snd_iprintf(buffer
, "sections:\n");
987 for (i
= 0; i
< ARRAY_SIZE(section_names
); ++i
)
988 snd_iprintf(buffer
, " %s: offset %u, size %u\n",
990 sections
[i
* 2], sections
[i
* 2 + 1]);
992 quadlets
= min_t(u32
, sections
[1], sizeof(buf
.global
) / 4);
993 if (dice_proc_read_mem(dice
, &buf
.global
, sections
[0], quadlets
) < 0)
995 snd_iprintf(buffer
, "global:\n");
996 snd_iprintf(buffer
, " owner: %04x:%04x%08x\n",
997 buf
.global
.owner_hi
>> 16,
998 buf
.global
.owner_hi
& 0xffff, buf
.global
.owner_lo
);
999 snd_iprintf(buffer
, " notification: %08x\n", buf
.global
.notification
);
1000 dice_proc_fixup_string(buf
.global
.nick_name
, NICK_NAME_SIZE
);
1001 snd_iprintf(buffer
, " nick name: %s\n", buf
.global
.nick_name
);
1002 snd_iprintf(buffer
, " clock select: %s %s\n",
1003 str_from_array(clock_sources
, ARRAY_SIZE(clock_sources
),
1004 buf
.global
.clock_select
& CLOCK_SOURCE_MASK
),
1005 str_from_array(rates
, ARRAY_SIZE(rates
),
1006 (buf
.global
.clock_select
& CLOCK_RATE_MASK
)
1007 >> CLOCK_RATE_SHIFT
));
1008 snd_iprintf(buffer
, " enable: %u\n", buf
.global
.enable
);
1009 snd_iprintf(buffer
, " status: %slocked %s\n",
1010 buf
.global
.status
& STATUS_SOURCE_LOCKED
? "" : "un",
1011 str_from_array(rates
, ARRAY_SIZE(rates
),
1012 (buf
.global
.status
&
1013 STATUS_NOMINAL_RATE_MASK
)
1014 >> CLOCK_RATE_SHIFT
));
1015 snd_iprintf(buffer
, " ext status: %08x\n", buf
.global
.extended_status
);
1016 snd_iprintf(buffer
, " sample rate: %u\n", buf
.global
.sample_rate
);
1017 snd_iprintf(buffer
, " version: %u.%u.%u.%u\n",
1018 (buf
.global
.version
>> 24) & 0xff,
1019 (buf
.global
.version
>> 16) & 0xff,
1020 (buf
.global
.version
>> 8) & 0xff,
1021 (buf
.global
.version
>> 0) & 0xff);
1022 if (quadlets
>= 90) {
1023 snd_iprintf(buffer
, " clock caps:");
1024 for (i
= 0; i
<= 6; ++i
)
1025 if (buf
.global
.clock_caps
& (1 << i
))
1026 snd_iprintf(buffer
, " %s", rates
[i
]);
1027 for (i
= 0; i
<= 12; ++i
)
1028 if (buf
.global
.clock_caps
& (1 << (16 + i
)))
1029 snd_iprintf(buffer
, " %s", clock_sources
[i
]);
1030 snd_iprintf(buffer
, "\n");
1031 dice_proc_fixup_string(buf
.global
.clock_source_names
,
1032 CLOCK_SOURCE_NAMES_SIZE
);
1033 snd_iprintf(buffer
, " clock source names: %s\n",
1034 buf
.global
.clock_source_names
);
1037 if (dice_proc_read_mem(dice
, &tx_rx_header
, sections
[2], 2) < 0)
1039 quadlets
= min_t(u32
, tx_rx_header
.size
, sizeof(buf
.tx
) / 4);
1040 for (stream
= 0; stream
< tx_rx_header
.number
; ++stream
) {
1041 if (dice_proc_read_mem(dice
, &buf
.tx
, sections
[2] + 2 +
1042 stream
* tx_rx_header
.size
,
1045 snd_iprintf(buffer
, "tx %u:\n", stream
);
1046 snd_iprintf(buffer
, " iso channel: %d\n", (int)buf
.tx
.iso
);
1047 snd_iprintf(buffer
, " audio channels: %u\n",
1048 buf
.tx
.number_audio
);
1049 snd_iprintf(buffer
, " midi ports: %u\n", buf
.tx
.number_midi
);
1050 snd_iprintf(buffer
, " speed: S%u\n", 100u << buf
.tx
.speed
);
1051 if (quadlets
>= 68) {
1052 dice_proc_fixup_string(buf
.tx
.names
, TX_NAMES_SIZE
);
1053 snd_iprintf(buffer
, " names: %s\n", buf
.tx
.names
);
1055 if (quadlets
>= 70) {
1056 snd_iprintf(buffer
, " ac3 caps: %08x\n",
1058 snd_iprintf(buffer
, " ac3 enable: %08x\n",
1063 if (dice_proc_read_mem(dice
, &tx_rx_header
, sections
[4], 2) < 0)
1065 quadlets
= min_t(u32
, tx_rx_header
.size
, sizeof(buf
.rx
) / 4);
1066 for (stream
= 0; stream
< tx_rx_header
.number
; ++stream
) {
1067 if (dice_proc_read_mem(dice
, &buf
.rx
, sections
[4] + 2 +
1068 stream
* tx_rx_header
.size
,
1071 snd_iprintf(buffer
, "rx %u:\n", stream
);
1072 snd_iprintf(buffer
, " iso channel: %d\n", (int)buf
.rx
.iso
);
1073 snd_iprintf(buffer
, " sequence start: %u\n", buf
.rx
.seq_start
);
1074 snd_iprintf(buffer
, " audio channels: %u\n",
1075 buf
.rx
.number_audio
);
1076 snd_iprintf(buffer
, " midi ports: %u\n", buf
.rx
.number_midi
);
1077 if (quadlets
>= 68) {
1078 dice_proc_fixup_string(buf
.rx
.names
, RX_NAMES_SIZE
);
1079 snd_iprintf(buffer
, " names: %s\n", buf
.rx
.names
);
1081 if (quadlets
>= 70) {
1082 snd_iprintf(buffer
, " ac3 caps: %08x\n",
1084 snd_iprintf(buffer
, " ac3 enable: %08x\n",
1089 quadlets
= min_t(u32
, sections
[7], sizeof(buf
.ext_sync
) / 4);
1090 if (quadlets
>= 4) {
1091 if (dice_proc_read_mem(dice
, &buf
.ext_sync
,
1092 sections
[6], 4) < 0)
1094 snd_iprintf(buffer
, "ext status:\n");
1095 snd_iprintf(buffer
, " clock source: %s\n",
1096 str_from_array(clock_sources
,
1097 ARRAY_SIZE(clock_sources
),
1098 buf
.ext_sync
.clock_source
));
1099 snd_iprintf(buffer
, " locked: %u\n", buf
.ext_sync
.locked
);
1100 snd_iprintf(buffer
, " rate: %s\n",
1101 str_from_array(rates
, ARRAY_SIZE(rates
),
1102 buf
.ext_sync
.rate
));
1103 snd_iprintf(buffer
, " adat user data: ");
1104 if (buf
.ext_sync
.adat_user_data
& ADAT_USER_DATA_NO_DATA
)
1105 snd_iprintf(buffer
, "-\n");
1107 snd_iprintf(buffer
, "%x\n",
1108 buf
.ext_sync
.adat_user_data
);
1112 static void dice_create_proc(struct dice
*dice
)
1114 struct snd_info_entry
*entry
;
1116 if (!snd_card_proc_new(dice
->card
, "dice", &entry
))
1117 snd_info_set_text_ops(entry
, dice
, dice_proc_read
);
1120 static void dice_card_free(struct snd_card
*card
)
1122 struct dice
*dice
= card
->private_data
;
1124 amdtp_stream_destroy(&dice
->stream
);
1125 fw_core_remove_address_handler(&dice
->notification_handler
);
1126 mutex_destroy(&dice
->mutex
);
1129 #define OUI_WEISS 0x001c6a
1131 #define DICE_CATEGORY_ID 0x04
1132 #define WEISS_CATEGORY_ID 0x00
1134 static int dice_interface_check(struct fw_unit
*unit
)
1136 static const int min_values
[10] = {
1143 struct fw_device
*device
= fw_parent_device(unit
);
1144 struct fw_csr_iterator it
;
1145 int key
, value
, vendor
= -1, model
= -1, err
;
1146 unsigned int category
, i
;
1147 __be32 pointers
[ARRAY_SIZE(min_values
)];
1152 * Check that GUID and unit directory are constructed according to DICE
1153 * rules, i.e., that the specifier ID is the GUID's OUI, and that the
1154 * GUID chip ID consists of the 8-bit category ID, the 10-bit product
1155 * ID, and a 22-bit serial number.
1157 fw_csr_iterator_init(&it
, unit
->directory
);
1158 while (fw_csr_iterator_next(&it
, &key
, &value
)) {
1160 case CSR_SPECIFIER_ID
:
1168 if (vendor
== OUI_WEISS
)
1169 category
= WEISS_CATEGORY_ID
;
1171 category
= DICE_CATEGORY_ID
;
1172 if (device
->config_rom
[3] != ((vendor
<< 8) | category
) ||
1173 device
->config_rom
[4] >> 22 != model
)
1177 * Check that the sub address spaces exist and are located inside the
1178 * private address space. The minimum values are chosen so that all
1179 * minimally required registers are included.
1181 err
= snd_fw_transaction(unit
, TCODE_READ_BLOCK_REQUEST
,
1183 pointers
, sizeof(pointers
), 0);
1186 for (i
= 0; i
< ARRAY_SIZE(pointers
); ++i
) {
1187 value
= be32_to_cpu(pointers
[i
]);
1188 if (value
< min_values
[i
] || value
>= 0x40000)
1192 /* We support playback only. Let capture devices be handled by FFADO. */
1193 err
= snd_fw_transaction(unit
, TCODE_READ_BLOCK_REQUEST
,
1194 DICE_PRIVATE_SPACE
+
1195 be32_to_cpu(pointers
[2]) * 4,
1196 tx_data
, sizeof(tx_data
), 0);
1197 if (err
< 0 || (tx_data
[0] && tx_data
[3]))
1201 * Check that the implemented DICE driver specification major version
1204 err
= snd_fw_transaction(unit
, TCODE_READ_QUADLET_REQUEST
,
1205 DICE_PRIVATE_SPACE
+
1206 be32_to_cpu(pointers
[0]) * 4 + GLOBAL_VERSION
,
1210 if ((version
& cpu_to_be32(0xff000000)) != cpu_to_be32(0x01000000)) {
1211 dev_err(&unit
->device
,
1212 "unknown DICE version: 0x%08x\n", be32_to_cpu(version
));
1219 static int highest_supported_mode_rate(struct dice
*dice
, unsigned int mode
)
1223 for (i
= ARRAY_SIZE(dice_rates
) - 1; i
>= 0; --i
)
1224 if ((dice
->clock_caps
& (1 << i
)) &&
1225 rate_index_to_mode(i
) == mode
)
1231 static int dice_read_mode_params(struct dice
*dice
, unsigned int mode
)
1234 int rate_index
, err
;
1236 rate_index
= highest_supported_mode_rate(dice
, mode
);
1237 if (rate_index
< 0) {
1238 dice
->rx_channels
[mode
] = 0;
1239 dice
->rx_midi_ports
[mode
] = 0;
1243 err
= dice_change_rate(dice
, rate_index
<< CLOCK_RATE_SHIFT
);
1247 err
= snd_fw_transaction(dice
->unit
, TCODE_READ_BLOCK_REQUEST
,
1248 rx_address(dice
, RX_NUMBER_AUDIO
),
1253 dice
->rx_channels
[mode
] = be32_to_cpu(values
[0]);
1254 dice
->rx_midi_ports
[mode
] = be32_to_cpu(values
[1]);
1259 static int dice_read_params(struct dice
*dice
)
1265 err
= snd_fw_transaction(dice
->unit
, TCODE_READ_BLOCK_REQUEST
,
1267 pointers
, sizeof(pointers
), 0);
1271 dice
->global_offset
= be32_to_cpu(pointers
[0]) * 4;
1272 dice
->rx_offset
= be32_to_cpu(pointers
[4]) * 4;
1274 /* some very old firmwares don't tell about their clock support */
1275 if (be32_to_cpu(pointers
[1]) * 4 >= GLOBAL_CLOCK_CAPABILITIES
+ 4) {
1276 err
= snd_fw_transaction(
1277 dice
->unit
, TCODE_READ_QUADLET_REQUEST
,
1278 global_address(dice
, GLOBAL_CLOCK_CAPABILITIES
),
1282 dice
->clock_caps
= be32_to_cpu(value
);
1284 /* this should be supported by any device */
1285 dice
->clock_caps
= CLOCK_CAP_RATE_44100
|
1286 CLOCK_CAP_RATE_48000
|
1287 CLOCK_CAP_SOURCE_ARX1
|
1288 CLOCK_CAP_SOURCE_INTERNAL
;
1291 for (mode
= 2; mode
>= 0; --mode
) {
1292 err
= dice_read_mode_params(dice
, mode
);
1300 static void dice_card_strings(struct dice
*dice
)
1302 struct snd_card
*card
= dice
->card
;
1303 struct fw_device
*dev
= fw_parent_device(dice
->unit
);
1304 char vendor
[32], model
[32];
1308 strcpy(card
->driver
, "DICE");
1310 strcpy(card
->shortname
, "DICE");
1311 BUILD_BUG_ON(NICK_NAME_SIZE
< sizeof(card
->shortname
));
1312 err
= snd_fw_transaction(dice
->unit
, TCODE_READ_BLOCK_REQUEST
,
1313 global_address(dice
, GLOBAL_NICK_NAME
),
1314 card
->shortname
, sizeof(card
->shortname
), 0);
1316 /* DICE strings are returned in "always-wrong" endianness */
1317 BUILD_BUG_ON(sizeof(card
->shortname
) % 4 != 0);
1318 for (i
= 0; i
< sizeof(card
->shortname
); i
+= 4)
1319 swab32s((u32
*)&card
->shortname
[i
]);
1320 card
->shortname
[sizeof(card
->shortname
) - 1] = '\0';
1323 strcpy(vendor
, "?");
1324 fw_csr_string(dev
->config_rom
+ 5, CSR_VENDOR
, vendor
, sizeof(vendor
));
1326 fw_csr_string(dice
->unit
->directory
, CSR_MODEL
, model
, sizeof(model
));
1327 snprintf(card
->longname
, sizeof(card
->longname
),
1328 "%s %s (serial %u) at %s, S%d",
1329 vendor
, model
, dev
->config_rom
[4] & 0x3fffff,
1330 dev_name(&dice
->unit
->device
), 100 << dev
->max_speed
);
1332 strcpy(card
->mixername
, "DICE");
1335 static int dice_probe(struct fw_unit
*unit
, const struct ieee1394_device_id
*id
)
1337 struct snd_card
*card
;
1342 err
= dice_interface_check(unit
);
1346 err
= snd_card_new(&unit
->device
, -1, NULL
, THIS_MODULE
,
1347 sizeof(*dice
), &card
);
1351 dice
= card
->private_data
;
1353 spin_lock_init(&dice
->lock
);
1354 mutex_init(&dice
->mutex
);
1356 init_completion(&dice
->clock_accepted
);
1357 init_waitqueue_head(&dice
->hwdep_wait
);
1359 dice
->notification_handler
.length
= 4;
1360 dice
->notification_handler
.address_callback
= dice_notification
;
1361 dice
->notification_handler
.callback_data
= dice
;
1362 err
= fw_core_add_address_handler(&dice
->notification_handler
,
1363 &fw_high_memory_region
);
1367 err
= dice_owner_set(dice
);
1369 goto err_notification_handler
;
1371 err
= dice_read_params(dice
);
1375 err
= fw_iso_resources_init(&dice
->resources
, unit
);
1378 dice
->resources
.channels_mask
= 0x00000000ffffffffuLL
;
1380 err
= amdtp_stream_init(&dice
->stream
, unit
, AMDTP_OUT_STREAM
,
1385 card
->private_free
= dice_card_free
;
1387 dice_card_strings(dice
);
1389 err
= snd_fw_transaction(unit
, TCODE_READ_QUADLET_REQUEST
,
1390 global_address(dice
, GLOBAL_CLOCK_SELECT
),
1394 clock_sel
&= cpu_to_be32(~CLOCK_SOURCE_MASK
);
1395 clock_sel
|= cpu_to_be32(CLOCK_SOURCE_ARX1
);
1396 err
= snd_fw_transaction(unit
, TCODE_WRITE_QUADLET_REQUEST
,
1397 global_address(dice
, GLOBAL_CLOCK_SELECT
),
1402 err
= dice_create_pcm(dice
);
1406 err
= dice_create_hwdep(dice
);
1410 dice_create_proc(dice
);
1412 err
= snd_card_register(card
);
1416 dev_set_drvdata(&unit
->device
, dice
);
1421 fw_iso_resources_destroy(&dice
->resources
);
1423 dice_owner_clear(dice
);
1424 err_notification_handler
:
1425 fw_core_remove_address_handler(&dice
->notification_handler
);
1427 mutex_destroy(&dice
->mutex
);
1429 snd_card_free(card
);
1433 static void dice_remove(struct fw_unit
*unit
)
1435 struct dice
*dice
= dev_get_drvdata(&unit
->device
);
1437 amdtp_stream_pcm_abort(&dice
->stream
);
1439 snd_card_disconnect(dice
->card
);
1441 mutex_lock(&dice
->mutex
);
1443 dice_stream_stop(dice
);
1444 dice_owner_clear(dice
);
1446 mutex_unlock(&dice
->mutex
);
1448 snd_card_free_when_closed(dice
->card
);
1451 static void dice_bus_reset(struct fw_unit
*unit
)
1453 struct dice
*dice
= dev_get_drvdata(&unit
->device
);
1456 * On a bus reset, the DICE firmware disables streaming and then goes
1457 * off contemplating its own navel for hundreds of milliseconds before
1458 * it can react to any of our attempts to reenable streaming. This
1459 * means that we lose synchronization anyway, so we force our streams
1460 * to stop so that the application can restart them in an orderly
1463 amdtp_stream_pcm_abort(&dice
->stream
);
1465 mutex_lock(&dice
->mutex
);
1467 dice
->global_enabled
= false;
1468 dice_stream_stop_packets(dice
);
1470 dice_owner_update(dice
);
1472 fw_iso_resources_update(&dice
->resources
);
1474 mutex_unlock(&dice
->mutex
);
1477 #define DICE_INTERFACE 0x000001
1479 static const struct ieee1394_device_id dice_id_table
[] = {
1481 .match_flags
= IEEE1394_MATCH_VERSION
,
1482 .version
= DICE_INTERFACE
,
1486 MODULE_DEVICE_TABLE(ieee1394
, dice_id_table
);
1488 static struct fw_driver dice_driver
= {
1490 .owner
= THIS_MODULE
,
1491 .name
= KBUILD_MODNAME
,
1492 .bus
= &fw_bus_type
,
1494 .probe
= dice_probe
,
1495 .update
= dice_bus_reset
,
1496 .remove
= dice_remove
,
1497 .id_table
= dice_id_table
,
1500 static int __init
alsa_dice_init(void)
1502 return driver_register(&dice_driver
.driver
);
1505 static void __exit
alsa_dice_exit(void)
1507 driver_unregister(&dice_driver
.driver
);
1510 module_init(alsa_dice_init
);
1511 module_exit(alsa_dice_exit
);