2 * digi00x-proc.c - a part of driver for Digidesign Digi 002/003 family
4 * Copyright (c) 2014-2015 Takashi Sakamoto
6 * Licensed under the terms of the GNU General Public License, version 2.
11 static int get_optical_iface_mode(struct snd_dg00x
*dg00x
,
12 enum snd_dg00x_optical_mode
*mode
)
17 err
= snd_fw_transaction(dg00x
->unit
, TCODE_READ_QUADLET_REQUEST
,
18 DG00X_ADDR_BASE
+ DG00X_OFFSET_OPT_IFACE_MODE
,
19 &data
, sizeof(data
), 0);
21 *mode
= be32_to_cpu(data
) & 0x01;
26 static void proc_read_clock(struct snd_info_entry
*entry
,
27 struct snd_info_buffer
*buf
)
29 static const char *const source_name
[] = {
30 [SND_DG00X_CLOCK_INTERNAL
] = "internal",
31 [SND_DG00X_CLOCK_SPDIF
] = "s/pdif",
32 [SND_DG00X_CLOCK_ADAT
] = "adat",
33 [SND_DG00X_CLOCK_WORD
] = "word clock",
35 static const char *const optical_name
[] = {
36 [SND_DG00X_OPT_IFACE_MODE_ADAT
] = "adat",
37 [SND_DG00X_OPT_IFACE_MODE_SPDIF
] = "s/pdif",
39 struct snd_dg00x
*dg00x
= entry
->private_data
;
40 enum snd_dg00x_optical_mode mode
;
42 enum snd_dg00x_clock clock
;
45 if (get_optical_iface_mode(dg00x
, &mode
) < 0)
47 if (snd_dg00x_stream_get_local_rate(dg00x
, &rate
) < 0)
49 if (snd_dg00x_stream_get_clock(dg00x
, &clock
) < 0)
52 snd_iprintf(buf
, "Optical mode: %s\n", optical_name
[mode
]);
53 snd_iprintf(buf
, "Sampling Rate: %d\n", rate
);
54 snd_iprintf(buf
, "Clock Source: %s\n", source_name
[clock
]);
56 if (clock
== SND_DG00X_CLOCK_INTERNAL
)
59 if (snd_dg00x_stream_check_external_clock(dg00x
, &detect
) < 0)
61 snd_iprintf(buf
, "External source: %s\n", detect
? "detected" : "not");
65 if (snd_dg00x_stream_get_external_rate(dg00x
, &rate
) >= 0)
66 snd_iprintf(buf
, "External sampling rate: %d\n", rate
);
69 void snd_dg00x_proc_init(struct snd_dg00x
*dg00x
)
71 struct snd_info_entry
*root
, *entry
;
74 * All nodes are automatically removed at snd_card_disconnect(),
75 * by following to link list.
77 root
= snd_info_create_card_entry(dg00x
->card
, "firewire",
78 dg00x
->card
->proc_root
);
82 root
->mode
= S_IFDIR
| S_IRUGO
| S_IXUGO
;
83 if (snd_info_register(root
) < 0) {
84 snd_info_free_entry(root
);
88 entry
= snd_info_create_card_entry(dg00x
->card
, "clock", root
);
90 snd_info_free_entry(root
);
94 snd_info_set_text_ops(entry
, dg00x
, proc_read_clock
);
95 if (snd_info_register(entry
) < 0) {
96 snd_info_free_entry(entry
);
97 snd_info_free_entry(root
);