Lines Matching +full:reg +full:- +full:data
1 // SPDX-License-Identifier: GPL-2.0-only
3 * motu-protocol-v2.c - a part of driver for MOTU FireWire series
5 * Copyright (c) 2015-2017 Takashi Sakamoto <o-takashi@sakamocchi.jp>
27 static int get_clock_rate(u32 data, unsigned int *rate) in get_clock_rate() argument
29 unsigned int index = (data & V2_CLOCK_RATE_MASK) >> V2_CLOCK_RATE_SHIFT; in get_clock_rate()
31 return -EIO; in get_clock_rate()
41 __be32 reg; in snd_motu_protocol_v2_get_clock_rate() local
44 err = snd_motu_transaction_read(motu, V2_CLOCK_STATUS_OFFSET, ®, in snd_motu_protocol_v2_get_clock_rate()
45 sizeof(reg)); in snd_motu_protocol_v2_get_clock_rate()
49 return get_clock_rate(be32_to_cpu(reg), rate); in snd_motu_protocol_v2_get_clock_rate()
55 __be32 reg; in snd_motu_protocol_v2_set_clock_rate() local
56 u32 data; in snd_motu_protocol_v2_set_clock_rate() local
65 return -EINVAL; in snd_motu_protocol_v2_set_clock_rate()
67 err = snd_motu_transaction_read(motu, V2_CLOCK_STATUS_OFFSET, ®, in snd_motu_protocol_v2_set_clock_rate()
68 sizeof(reg)); in snd_motu_protocol_v2_set_clock_rate()
71 data = be32_to_cpu(reg); in snd_motu_protocol_v2_set_clock_rate()
73 data &= ~V2_CLOCK_RATE_MASK; in snd_motu_protocol_v2_set_clock_rate()
74 data |= i << V2_CLOCK_RATE_SHIFT; in snd_motu_protocol_v2_set_clock_rate()
76 reg = cpu_to_be32(data); in snd_motu_protocol_v2_set_clock_rate()
77 return snd_motu_transaction_write(motu, V2_CLOCK_STATUS_OFFSET, ®, in snd_motu_protocol_v2_set_clock_rate()
78 sizeof(reg)); in snd_motu_protocol_v2_set_clock_rate()
81 static int detect_clock_source_optical_model(struct snd_motu *motu, u32 data, in detect_clock_source_optical_model() argument
84 switch (data) { in detect_clock_source_optical_model()
93 __be32 reg; in detect_clock_source_optical_model() local
96 int err = snd_motu_transaction_read(motu, V2_IN_OUT_CONF_OFFSET, ®, sizeof(reg)); in detect_clock_source_optical_model()
100 if (((data & V2_OPT_IN_IFACE_MASK) >> V2_OPT_IN_IFACE_SHIFT) == V2_OPT_IFACE_MODE_SPDIF) in detect_clock_source_optical_model()
123 static int v2_detect_clock_source(struct snd_motu *motu, u32 data, in v2_detect_clock_source() argument
126 switch (data) { in v2_detect_clock_source()
147 static int get_clock_source(struct snd_motu *motu, u32 data, in get_clock_source() argument
150 data &= V2_CLOCK_SRC_MASK; in get_clock_source()
151 if (motu->spec == &snd_motu_spec_828mk2 || in get_clock_source()
152 motu->spec == &snd_motu_spec_traveler) in get_clock_source()
153 return detect_clock_source_optical_model(motu, data, src); in get_clock_source()
155 return v2_detect_clock_source(motu, data, src); in get_clock_source()
161 __be32 reg; in snd_motu_protocol_v2_get_clock_source() local
164 err = snd_motu_transaction_read(motu, V2_CLOCK_STATUS_OFFSET, ®, in snd_motu_protocol_v2_get_clock_source()
165 sizeof(reg)); in snd_motu_protocol_v2_get_clock_source()
169 return get_clock_source(motu, be32_to_cpu(reg), src); in snd_motu_protocol_v2_get_clock_source()
173 static int switch_fetching_mode_cyclone(struct snd_motu *motu, u32 *data, in switch_fetching_mode_cyclone() argument
176 *data |= V2_CLOCK_MODEL_SPECIFIC; in switch_fetching_mode_cyclone()
182 static int switch_fetching_mode_spartan(struct snd_motu *motu, u32 *data, in switch_fetching_mode_spartan() argument
189 err = get_clock_source(motu, *data, &src); in switch_fetching_mode_spartan()
193 err = get_clock_rate(*data, &rate); in switch_fetching_mode_spartan()
198 *data |= V2_CLOCK_MODEL_SPECIFIC; in switch_fetching_mode_spartan()
206 if (motu->spec == &snd_motu_spec_828mk2) { in snd_motu_protocol_v2_switch_fetching_mode()
210 __be32 reg; in snd_motu_protocol_v2_switch_fetching_mode() local
211 u32 data; in snd_motu_protocol_v2_switch_fetching_mode() local
215 ®, sizeof(reg)); in snd_motu_protocol_v2_switch_fetching_mode()
218 data = be32_to_cpu(reg); in snd_motu_protocol_v2_switch_fetching_mode()
220 data &= ~(V2_CLOCK_FETCH_ENABLE | V2_CLOCK_MODEL_SPECIFIC); in snd_motu_protocol_v2_switch_fetching_mode()
222 data |= V2_CLOCK_FETCH_ENABLE; in snd_motu_protocol_v2_switch_fetching_mode()
224 if (motu->spec == &snd_motu_spec_traveler) in snd_motu_protocol_v2_switch_fetching_mode()
225 err = switch_fetching_mode_cyclone(motu, &data, enable); in snd_motu_protocol_v2_switch_fetching_mode()
227 err = switch_fetching_mode_spartan(motu, &data, enable); in snd_motu_protocol_v2_switch_fetching_mode()
231 reg = cpu_to_be32(data); in snd_motu_protocol_v2_switch_fetching_mode()
233 ®, sizeof(reg)); in snd_motu_protocol_v2_switch_fetching_mode()
237 static int detect_packet_formats_828mk2(struct snd_motu *motu, u32 data) in detect_packet_formats_828mk2() argument
239 if (((data & V2_OPT_IN_IFACE_MASK) >> V2_OPT_IN_IFACE_SHIFT) == in detect_packet_formats_828mk2()
241 motu->tx_packet_formats.pcm_chunks[0] += 8; in detect_packet_formats_828mk2()
242 motu->tx_packet_formats.pcm_chunks[1] += 4; in detect_packet_formats_828mk2()
245 if (((data & V2_OPT_OUT_IFACE_MASK) >> V2_OPT_OUT_IFACE_SHIFT) == in detect_packet_formats_828mk2()
247 motu->rx_packet_formats.pcm_chunks[0] += 8; in detect_packet_formats_828mk2()
248 motu->rx_packet_formats.pcm_chunks[1] += 4; in detect_packet_formats_828mk2()
254 static int detect_packet_formats_traveler(struct snd_motu *motu, u32 data) in detect_packet_formats_traveler() argument
256 if (((data & V2_OPT_IN_IFACE_MASK) >> V2_OPT_IN_IFACE_SHIFT) == in detect_packet_formats_traveler()
258 motu->tx_packet_formats.pcm_chunks[0] += 8; in detect_packet_formats_traveler()
259 motu->tx_packet_formats.pcm_chunks[1] += 4; in detect_packet_formats_traveler()
262 if (((data & V2_OPT_OUT_IFACE_MASK) >> V2_OPT_OUT_IFACE_SHIFT) == in detect_packet_formats_traveler()
264 motu->rx_packet_formats.pcm_chunks[0] += 8; in detect_packet_formats_traveler()
265 motu->rx_packet_formats.pcm_chunks[1] += 4; in detect_packet_formats_traveler()
271 static int detect_packet_formats_8pre(struct snd_motu *motu, u32 data) in detect_packet_formats_8pre() argument
273 if (((data & V2_OPT_IN_IFACE_MASK) >> V2_OPT_IN_IFACE_SHIFT) == in detect_packet_formats_8pre()
275 motu->tx_packet_formats.pcm_chunks[0] += 8; in detect_packet_formats_8pre()
276 motu->tx_packet_formats.pcm_chunks[1] += 8; in detect_packet_formats_8pre()
279 if (((data & V2_OPT_OUT_IFACE_MASK) >> V2_OPT_OUT_IFACE_SHIFT) == in detect_packet_formats_8pre()
281 motu->rx_packet_formats.pcm_chunks[0] += 8; in detect_packet_formats_8pre()
282 motu->rx_packet_formats.pcm_chunks[1] += 8; in detect_packet_formats_8pre()
290 __be32 reg; in snd_motu_protocol_v2_cache_packet_formats() local
291 u32 data; in snd_motu_protocol_v2_cache_packet_formats() local
294 motu->tx_packet_formats.pcm_byte_offset = 10; in snd_motu_protocol_v2_cache_packet_formats()
295 motu->rx_packet_formats.pcm_byte_offset = 10; in snd_motu_protocol_v2_cache_packet_formats()
297 motu->tx_packet_formats.msg_chunks = 2; in snd_motu_protocol_v2_cache_packet_formats()
298 motu->rx_packet_formats.msg_chunks = 2; in snd_motu_protocol_v2_cache_packet_formats()
300 err = snd_motu_transaction_read(motu, V2_IN_OUT_CONF_OFFSET, ®, in snd_motu_protocol_v2_cache_packet_formats()
301 sizeof(reg)); in snd_motu_protocol_v2_cache_packet_formats()
304 data = be32_to_cpu(reg); in snd_motu_protocol_v2_cache_packet_formats()
306 memcpy(motu->tx_packet_formats.pcm_chunks, in snd_motu_protocol_v2_cache_packet_formats()
307 motu->spec->tx_fixed_pcm_chunks, in snd_motu_protocol_v2_cache_packet_formats()
308 sizeof(motu->tx_packet_formats.pcm_chunks)); in snd_motu_protocol_v2_cache_packet_formats()
309 memcpy(motu->rx_packet_formats.pcm_chunks, in snd_motu_protocol_v2_cache_packet_formats()
310 motu->spec->rx_fixed_pcm_chunks, in snd_motu_protocol_v2_cache_packet_formats()
311 sizeof(motu->rx_packet_formats.pcm_chunks)); in snd_motu_protocol_v2_cache_packet_formats()
313 if (motu->spec == &snd_motu_spec_828mk2) in snd_motu_protocol_v2_cache_packet_formats()
314 return detect_packet_formats_828mk2(motu, data); in snd_motu_protocol_v2_cache_packet_formats()
315 else if (motu->spec == &snd_motu_spec_traveler) in snd_motu_protocol_v2_cache_packet_formats()
316 return detect_packet_formats_traveler(motu, data); in snd_motu_protocol_v2_cache_packet_formats()
317 else if (motu->spec == &snd_motu_spec_8pre) in snd_motu_protocol_v2_cache_packet_formats()
318 return detect_packet_formats_8pre(motu, data); in snd_motu_protocol_v2_cache_packet_formats()
355 // Two dummy chunks always in the end of data block.