1 // SPDX-License-Identifier: GPL-2.0-only 2 /* 3 * bebob_terratec.c - a part of driver for BeBoB based devices 4 * 5 * Copyright (c) 2013-2014 Takashi Sakamoto 6 */ 7 8 #include "./bebob.h" 9 10 static const enum snd_bebob_clock_type phase88_rack_clk_src_types[] = { 11 SND_BEBOB_CLOCK_TYPE_INTERNAL, 12 SND_BEBOB_CLOCK_TYPE_EXTERNAL, /* S/PDIF */ 13 SND_BEBOB_CLOCK_TYPE_EXTERNAL, /* Word Clock */ 14 }; 15 static int 16 phase88_rack_clk_src_get(struct snd_bebob *bebob, unsigned int *id) 17 { 18 unsigned int enable_ext, enable_word; 19 int err; 20 21 err = avc_audio_get_selector(bebob->unit, 0, 9, &enable_ext); 22 if (err < 0) 23 goto end; 24 err = avc_audio_get_selector(bebob->unit, 0, 8, &enable_word); 25 if (err < 0) 26 goto end; 27 28 if (enable_ext == 0) 29 *id = 0; 30 else if (enable_word == 0) 31 *id = 1; 32 else 33 *id = 2; 34 end: 35 return err; 36 } 37 38 static const struct snd_bebob_rate_spec phase_series_rate_spec = { 39 .get = &snd_bebob_stream_get_rate, 40 .set = &snd_bebob_stream_set_rate, 41 }; 42 43 /* PHASE 88 Rack FW */ 44 static const struct snd_bebob_clock_spec phase88_rack_clk = { 45 .num = ARRAY_SIZE(phase88_rack_clk_src_types), 46 .types = phase88_rack_clk_src_types, 47 .get = &phase88_rack_clk_src_get, 48 }; 49 const struct snd_bebob_spec phase88_rack_spec = { 50 .clock = &phase88_rack_clk, 51 .rate = &phase_series_rate_spec, 52 .meter = NULL 53 }; 54