diff options
Diffstat (limited to 'sound/firewire/fireworks/fireworks.h')
-rw-r--r-- | sound/firewire/fireworks/fireworks.h | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/sound/firewire/fireworks/fireworks.h b/sound/firewire/fireworks/fireworks.h new file mode 100644 index 000000000000..d2b36be4d2f8 --- /dev/null +++ b/sound/firewire/fireworks/fireworks.h | |||
@@ -0,0 +1,233 @@ | |||
1 | /* | ||
2 | * fireworks.h - a part of driver for Fireworks based devices | ||
3 | * | ||
4 | * Copyright (c) 2009-2010 Clemens Ladisch | ||
5 | * Copyright (c) 2013-2014 Takashi Sakamoto | ||
6 | * | ||
7 | * Licensed under the terms of the GNU General Public License, version 2. | ||
8 | */ | ||
9 | #ifndef SOUND_FIREWORKS_H_INCLUDED | ||
10 | #define SOUND_FIREWORKS_H_INCLUDED | ||
11 | |||
12 | #include <linux/compat.h> | ||
13 | #include <linux/device.h> | ||
14 | #include <linux/firewire.h> | ||
15 | #include <linux/firewire-constants.h> | ||
16 | #include <linux/module.h> | ||
17 | #include <linux/mod_devicetable.h> | ||
18 | #include <linux/delay.h> | ||
19 | #include <linux/slab.h> | ||
20 | |||
21 | #include <sound/core.h> | ||
22 | #include <sound/initval.h> | ||
23 | #include <sound/pcm.h> | ||
24 | #include <sound/info.h> | ||
25 | #include <sound/rawmidi.h> | ||
26 | #include <sound/pcm_params.h> | ||
27 | #include <sound/firewire.h> | ||
28 | #include <sound/hwdep.h> | ||
29 | |||
30 | #include "../packets-buffer.h" | ||
31 | #include "../iso-resources.h" | ||
32 | #include "../amdtp.h" | ||
33 | #include "../cmp.h" | ||
34 | #include "../lib.h" | ||
35 | |||
36 | #define SND_EFW_MAX_MIDI_OUT_PORTS 2 | ||
37 | #define SND_EFW_MAX_MIDI_IN_PORTS 2 | ||
38 | |||
39 | #define SND_EFW_MULTIPLIER_MODES 3 | ||
40 | #define HWINFO_NAME_SIZE_BYTES 32 | ||
41 | #define HWINFO_MAX_CAPS_GROUPS 8 | ||
42 | |||
43 | /* | ||
44 | * This should be greater than maximum bytes for EFW response content. | ||
45 | * Currently response against command for isochronous channel mapping is | ||
46 | * confirmed to be the maximum one. But for flexibility, use maximum data | ||
47 | * payload for asynchronous primary packets at S100 (Cable base rate) in | ||
48 | * IEEE Std 1394-1995. | ||
49 | */ | ||
50 | #define SND_EFW_RESPONSE_MAXIMUM_BYTES 0x200U | ||
51 | |||
52 | extern unsigned int snd_efw_resp_buf_size; | ||
53 | extern bool snd_efw_resp_buf_debug; | ||
54 | |||
55 | struct snd_efw_phys_grp { | ||
56 | u8 type; /* see enum snd_efw_grp_type */ | ||
57 | u8 count; | ||
58 | } __packed; | ||
59 | |||
60 | struct snd_efw { | ||
61 | struct snd_card *card; | ||
62 | struct fw_unit *unit; | ||
63 | int card_index; | ||
64 | |||
65 | struct mutex mutex; | ||
66 | spinlock_t lock; | ||
67 | |||
68 | /* for transaction */ | ||
69 | u32 seqnum; | ||
70 | bool resp_addr_changable; | ||
71 | |||
72 | /* for quirks */ | ||
73 | bool is_af9; | ||
74 | u32 firmware_version; | ||
75 | |||
76 | unsigned int midi_in_ports; | ||
77 | unsigned int midi_out_ports; | ||
78 | |||
79 | unsigned int supported_sampling_rate; | ||
80 | unsigned int pcm_capture_channels[SND_EFW_MULTIPLIER_MODES]; | ||
81 | unsigned int pcm_playback_channels[SND_EFW_MULTIPLIER_MODES]; | ||
82 | |||
83 | struct amdtp_stream *master; | ||
84 | struct amdtp_stream tx_stream; | ||
85 | struct amdtp_stream rx_stream; | ||
86 | struct cmp_connection out_conn; | ||
87 | struct cmp_connection in_conn; | ||
88 | atomic_t capture_substreams; | ||
89 | atomic_t playback_substreams; | ||
90 | |||
91 | /* hardware metering parameters */ | ||
92 | unsigned int phys_out; | ||
93 | unsigned int phys_in; | ||
94 | unsigned int phys_out_grp_count; | ||
95 | unsigned int phys_in_grp_count; | ||
96 | struct snd_efw_phys_grp phys_out_grps[HWINFO_MAX_CAPS_GROUPS]; | ||
97 | struct snd_efw_phys_grp phys_in_grps[HWINFO_MAX_CAPS_GROUPS]; | ||
98 | |||
99 | /* for uapi */ | ||
100 | int dev_lock_count; | ||
101 | bool dev_lock_changed; | ||
102 | wait_queue_head_t hwdep_wait; | ||
103 | |||
104 | /* response queue */ | ||
105 | u8 *resp_buf; | ||
106 | u8 *pull_ptr; | ||
107 | u8 *push_ptr; | ||
108 | unsigned int resp_queues; | ||
109 | }; | ||
110 | |||
111 | int snd_efw_transaction_cmd(struct fw_unit *unit, | ||
112 | const void *cmd, unsigned int size); | ||
113 | int snd_efw_transaction_run(struct fw_unit *unit, | ||
114 | const void *cmd, unsigned int cmd_size, | ||
115 | void *resp, unsigned int resp_size); | ||
116 | int snd_efw_transaction_register(void); | ||
117 | void snd_efw_transaction_unregister(void); | ||
118 | void snd_efw_transaction_bus_reset(struct fw_unit *unit); | ||
119 | void snd_efw_transaction_add_instance(struct snd_efw *efw); | ||
120 | void snd_efw_transaction_remove_instance(struct snd_efw *efw); | ||
121 | |||
122 | struct snd_efw_hwinfo { | ||
123 | u32 flags; | ||
124 | u32 guid_hi; | ||
125 | u32 guid_lo; | ||
126 | u32 type; | ||
127 | u32 version; | ||
128 | char vendor_name[HWINFO_NAME_SIZE_BYTES]; | ||
129 | char model_name[HWINFO_NAME_SIZE_BYTES]; | ||
130 | u32 supported_clocks; | ||
131 | u32 amdtp_rx_pcm_channels; | ||
132 | u32 amdtp_tx_pcm_channels; | ||
133 | u32 phys_out; | ||
134 | u32 phys_in; | ||
135 | u32 phys_out_grp_count; | ||
136 | struct snd_efw_phys_grp phys_out_grps[HWINFO_MAX_CAPS_GROUPS]; | ||
137 | u32 phys_in_grp_count; | ||
138 | struct snd_efw_phys_grp phys_in_grps[HWINFO_MAX_CAPS_GROUPS]; | ||
139 | u32 midi_out_ports; | ||
140 | u32 midi_in_ports; | ||
141 | u32 max_sample_rate; | ||
142 | u32 min_sample_rate; | ||
143 | u32 dsp_version; | ||
144 | u32 arm_version; | ||
145 | u32 mixer_playback_channels; | ||
146 | u32 mixer_capture_channels; | ||
147 | u32 fpga_version; | ||
148 | u32 amdtp_rx_pcm_channels_2x; | ||
149 | u32 amdtp_tx_pcm_channels_2x; | ||
150 | u32 amdtp_rx_pcm_channels_4x; | ||
151 | u32 amdtp_tx_pcm_channels_4x; | ||
152 | u32 reserved[16]; | ||
153 | } __packed; | ||
154 | enum snd_efw_grp_type { | ||
155 | SND_EFW_CH_TYPE_ANALOG = 0, | ||
156 | SND_EFW_CH_TYPE_SPDIF = 1, | ||
157 | SND_EFW_CH_TYPE_ADAT = 2, | ||
158 | SND_EFW_CH_TYPE_SPDIF_OR_ADAT = 3, | ||
159 | SND_EFW_CH_TYPE_ANALOG_MIRRORING = 4, | ||
160 | SND_EFW_CH_TYPE_HEADPHONES = 5, | ||
161 | SND_EFW_CH_TYPE_I2S = 6, | ||
162 | SND_EFW_CH_TYPE_GUITAR = 7, | ||
163 | SND_EFW_CH_TYPE_PIEZO_GUITAR = 8, | ||
164 | SND_EFW_CH_TYPE_GUITAR_STRING = 9, | ||
165 | SND_EFW_CH_TYPE_VIRTUAL = 0x10000, | ||
166 | SND_EFW_CH_TYPE_DUMMY | ||
167 | }; | ||
168 | struct snd_efw_phys_meters { | ||
169 | u32 status; /* guitar state/midi signal/clock input detect */ | ||
170 | u32 reserved0; | ||
171 | u32 reserved1; | ||
172 | u32 reserved2; | ||
173 | u32 reserved3; | ||
174 | u32 out_meters; | ||
175 | u32 in_meters; | ||
176 | u32 reserved4; | ||
177 | u32 reserved5; | ||
178 | u32 values[0]; | ||
179 | } __packed; | ||
180 | enum snd_efw_clock_source { | ||
181 | SND_EFW_CLOCK_SOURCE_INTERNAL = 0, | ||
182 | SND_EFW_CLOCK_SOURCE_SYTMATCH = 1, | ||
183 | SND_EFW_CLOCK_SOURCE_WORDCLOCK = 2, | ||
184 | SND_EFW_CLOCK_SOURCE_SPDIF = 3, | ||
185 | SND_EFW_CLOCK_SOURCE_ADAT_1 = 4, | ||
186 | SND_EFW_CLOCK_SOURCE_ADAT_2 = 5, | ||
187 | SND_EFW_CLOCK_SOURCE_CONTINUOUS = 6 /* internal variable clock */ | ||
188 | }; | ||
189 | enum snd_efw_transport_mode { | ||
190 | SND_EFW_TRANSPORT_MODE_WINDOWS = 0, | ||
191 | SND_EFW_TRANSPORT_MODE_IEC61883 = 1, | ||
192 | }; | ||
193 | int snd_efw_command_set_resp_addr(struct snd_efw *efw, | ||
194 | u16 addr_high, u32 addr_low); | ||
195 | int snd_efw_command_set_tx_mode(struct snd_efw *efw, | ||
196 | enum snd_efw_transport_mode mode); | ||
197 | int snd_efw_command_get_hwinfo(struct snd_efw *efw, | ||
198 | struct snd_efw_hwinfo *hwinfo); | ||
199 | int snd_efw_command_get_phys_meters(struct snd_efw *efw, | ||
200 | struct snd_efw_phys_meters *meters, | ||
201 | unsigned int len); | ||
202 | int snd_efw_command_get_clock_source(struct snd_efw *efw, | ||
203 | enum snd_efw_clock_source *source); | ||
204 | int snd_efw_command_get_sampling_rate(struct snd_efw *efw, unsigned int *rate); | ||
205 | int snd_efw_command_set_sampling_rate(struct snd_efw *efw, unsigned int rate); | ||
206 | |||
207 | int snd_efw_stream_init_duplex(struct snd_efw *efw); | ||
208 | int snd_efw_stream_start_duplex(struct snd_efw *efw, unsigned int rate); | ||
209 | void snd_efw_stream_stop_duplex(struct snd_efw *efw); | ||
210 | void snd_efw_stream_update_duplex(struct snd_efw *efw); | ||
211 | void snd_efw_stream_destroy_duplex(struct snd_efw *efw); | ||
212 | void snd_efw_stream_lock_changed(struct snd_efw *efw); | ||
213 | int snd_efw_stream_lock_try(struct snd_efw *efw); | ||
214 | void snd_efw_stream_lock_release(struct snd_efw *efw); | ||
215 | |||
216 | void snd_efw_proc_init(struct snd_efw *efw); | ||
217 | |||
218 | int snd_efw_create_midi_devices(struct snd_efw *efw); | ||
219 | |||
220 | int snd_efw_create_pcm_devices(struct snd_efw *efw); | ||
221 | int snd_efw_get_multiplier_mode(unsigned int sampling_rate, unsigned int *mode); | ||
222 | |||
223 | int snd_efw_create_hwdep_device(struct snd_efw *efw); | ||
224 | |||
225 | #define SND_EFW_DEV_ENTRY(vendor, model) \ | ||
226 | { \ | ||
227 | .match_flags = IEEE1394_MATCH_VENDOR_ID | \ | ||
228 | IEEE1394_MATCH_MODEL_ID, \ | ||
229 | .vendor_id = vendor,\ | ||
230 | .model_id = model \ | ||
231 | } | ||
232 | |||
233 | #endif | ||