| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * bebob_terratec.c - a part of driver for BeBoB based devices | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (c) 2013-2014 Takashi Sakamoto | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Licensed under the terms of the GNU General Public License, version 2. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "./bebob.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-21 08:26:10 +02:00
										 |  |  | static const char *const phase88_rack_clk_src_labels[] = { | 
					
						
							| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | 	SND_BEBOB_CLOCK_INTERNAL, "Digital In", "Word Clock" | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | phase88_rack_clk_src_get(struct snd_bebob *bebob, unsigned int *id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	unsigned int enable_ext, enable_word; | 
					
						
							|  |  |  | 	int err; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-10 23:32:49 +09:00
										 |  |  | 	err = avc_audio_get_selector(bebob->unit, 0, 9, &enable_ext); | 
					
						
							| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | 	if (err < 0) | 
					
						
							|  |  |  | 		goto end; | 
					
						
							| 
									
										
										
										
											2014-10-10 23:32:49 +09:00
										 |  |  | 	err = avc_audio_get_selector(bebob->unit, 0, 8, &enable_word); | 
					
						
							| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | 	if (err < 0) | 
					
						
							|  |  |  | 		goto end; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-26 22:49:45 +09:00
										 |  |  | 	if (enable_ext == 0) | 
					
						
							|  |  |  | 		*id = 0; | 
					
						
							|  |  |  | 	else if (enable_word == 0) | 
					
						
							|  |  |  | 		*id = 1; | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		*id = 2; | 
					
						
							| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | end: | 
					
						
							|  |  |  | 	return err; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-10-21 08:26:10 +02:00
										 |  |  | static const char *const phase24_series_clk_src_labels[] = { | 
					
						
							| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | 	SND_BEBOB_CLOCK_INTERNAL, "Digital In" | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | static int | 
					
						
							|  |  |  | phase24_series_clk_src_get(struct snd_bebob *bebob, unsigned int *id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	return avc_audio_get_selector(bebob->unit, 0, 4, id); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-28 00:14:45 +09:00
										 |  |  | static struct snd_bebob_rate_spec phase_series_rate_spec = { | 
					
						
							| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | 	.get	= &snd_bebob_stream_get_rate, | 
					
						
							|  |  |  | 	.set	= &snd_bebob_stream_set_rate, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* PHASE 88 Rack FW */ | 
					
						
							| 
									
										
										
										
											2014-05-28 00:14:45 +09:00
										 |  |  | static struct snd_bebob_clock_spec phase88_rack_clk = { | 
					
						
							| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | 	.num	= ARRAY_SIZE(phase88_rack_clk_src_labels), | 
					
						
							|  |  |  | 	.labels	= phase88_rack_clk_src_labels, | 
					
						
							|  |  |  | 	.get	= &phase88_rack_clk_src_get, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | struct snd_bebob_spec phase88_rack_spec = { | 
					
						
							|  |  |  | 	.clock	= &phase88_rack_clk, | 
					
						
							|  |  |  | 	.rate	= &phase_series_rate_spec, | 
					
						
							|  |  |  | 	.meter	= NULL | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* 'PHASE 24 FW' and 'PHASE X24 FW' */ | 
					
						
							| 
									
										
										
										
											2014-05-28 00:14:45 +09:00
										 |  |  | static struct snd_bebob_clock_spec phase24_series_clk = { | 
					
						
							| 
									
										
										
										
											2014-04-25 22:45:22 +09:00
										 |  |  | 	.num	= ARRAY_SIZE(phase24_series_clk_src_labels), | 
					
						
							|  |  |  | 	.labels	= phase24_series_clk_src_labels, | 
					
						
							|  |  |  | 	.get	= &phase24_series_clk_src_get, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | struct snd_bebob_spec phase24_series_spec = { | 
					
						
							|  |  |  | 	.clock	= &phase24_series_clk, | 
					
						
							|  |  |  | 	.rate	= &phase_series_rate_spec, | 
					
						
							|  |  |  | 	.meter	= NULL | 
					
						
							|  |  |  | }; |