Lines Matching +full:clock +full:- +full:freq

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Support for Digigram Lola PCI-e boards
17 unsigned int freq; in lola_sample_rate_convert() local
21 case 0: freq = 48000; break; in lola_sample_rate_convert()
22 case 1: freq = 44100; break; in lola_sample_rate_convert()
23 case 2: freq = 32000; break; in lola_sample_rate_convert()
31 case (1 << 2): freq *= 2; break; in lola_sample_rate_convert()
32 case (2 << 2): freq *= 4; break; in lola_sample_rate_convert()
33 case (5 << 2): freq /= 2; break; in lola_sample_rate_convert()
34 case (6 << 2): freq /= 4; break; in lola_sample_rate_convert()
41 case (1 << 5): freq = (freq * 999) / 1000; break; in lola_sample_rate_convert()
42 case (2 << 5): freq = (freq * 1001) / 1000; break; in lola_sample_rate_convert()
45 return freq; in lola_sample_rate_convert()
57 unsigned int freq) in check_gran_clock_compatibility() argument
59 if (!chip->granularity) in check_gran_clock_compatibility()
67 if (freq > LOLA_MAXFREQ_AT_GRANULARITY_MIN) in check_gran_clock_compatibility()
70 if (freq > LOLA_MAXFREQ_AT_GRANULARITY_BELOW_MAX) in check_gran_clock_compatibility()
81 if (val == chip->granularity) in lola_set_granularity()
85 if (chip->audio_in_alloc_mask || chip->audio_out_alloc_mask) in lola_set_granularity()
86 return -EBUSY; in lola_set_granularity()
89 chip->clock.cur_freq)) in lola_set_granularity()
90 return -EINVAL; in lola_set_granularity()
93 chip->granularity = val; in lola_set_granularity()
107 * Clock widget handling
118 dev_err(chip->card->dev, "Can't read wcaps for 0x%x\n", nid); in lola_init_clock_widget()
123 dev_dbg(chip->card->dev, "No valid clock widget\n"); in lola_init_clock_widget()
127 chip->clock.nid = nid; in lola_init_clock_widget()
128 chip->clock.items = val & 0xff; in lola_init_clock_widget()
129 dev_dbg(chip->card->dev, "clock_list nid=%x, entries=%d\n", nid, in lola_init_clock_widget()
130 chip->clock.items); in lola_init_clock_widget()
131 if (chip->clock.items > MAX_SAMPLE_CLOCK_COUNT) { in lola_init_clock_widget()
132 dev_err(chip->card->dev, "CLOCK_LIST too big: %d\n", in lola_init_clock_widget()
133 chip->clock.items); in lola_init_clock_widget()
134 return -EINVAL; in lola_init_clock_widget()
137 nitems = chip->clock.items; in lola_init_clock_widget()
148 dev_err(chip->card->dev, "Can't read CLOCK_LIST\n"); in lola_init_clock_widget()
149 return -EINVAL; in lola_init_clock_widget()
159 unsigned int freq = items[j] & 0xff; in lola_init_clock_widget() local
163 freq = lola_sample_rate_convert(freq); in lola_init_clock_widget()
164 if (freq < chip->sample_rate_min) in lola_init_clock_widget()
166 else if (freq == 48000) { in lola_init_clock_widget()
167 chip->clock.cur_index = idx_list; in lola_init_clock_widget()
168 chip->clock.cur_freq = 48000; in lola_init_clock_widget()
169 chip->clock.cur_valid = true; in lola_init_clock_widget()
172 freq = lola_sample_rate_convert(freq); in lola_init_clock_widget()
173 if (freq < chip->sample_rate_min) in lola_init_clock_widget()
175 /* video clock has a format (0:NTSC, 1:PAL)*/ in lola_init_clock_widget()
183 sc = &chip->clock.sample_clock[idx_list]; in lola_init_clock_widget()
184 sc->type = type; in lola_init_clock_widget()
185 sc->format = format; in lola_init_clock_widget()
186 sc->freq = freq; in lola_init_clock_widget()
188 chip->clock.idx_lookup[idx_list] = idx; in lola_init_clock_widget()
191 chip->clock.items--; in lola_init_clock_widget()
200 /* enable unsolicited events of the clock widget */
206 err = lola_codec_read(chip, chip->clock.nid, in lola_enable_clock_events()
213 dev_warn(chip->card->dev, "error in enable_clock_events %d\n", in lola_enable_clock_events()
215 return -EINVAL; in lola_enable_clock_events()
225 err = lola_codec_read(chip, chip->clock.nid, in lola_set_clock_index()
227 chip->clock.idx_lookup[idx], in lola_set_clock_index()
232 dev_warn(chip->card->dev, "error in set_clock %d\n", res); in lola_set_clock_index()
233 return -EINVAL; in lola_set_clock_index()
242 /* the current EXTERNAL clock information gets updated by interrupt in lola_update_ext_clock_freq()
252 if (chip->clock.sample_clock[chip->clock.cur_index].type != in lola_update_ext_clock_freq()
254 chip->clock.cur_freq = lola_sample_rate_convert(val & 0x7f); in lola_update_ext_clock_freq()
255 chip->clock.cur_valid = (val & 0x100) != 0; in lola_update_ext_clock_freq()
262 int freq = 0; in lola_set_clock() local
265 if (idx == chip->clock.cur_index) { in lola_set_clock()
266 /* current clock is allowed */ in lola_set_clock()
267 freq = chip->clock.cur_freq; in lola_set_clock()
268 valid = chip->clock.cur_valid; in lola_set_clock()
269 } else if (chip->clock.sample_clock[idx].type == in lola_set_clock()
272 freq = chip->clock.sample_clock[idx].freq; in lola_set_clock()
276 if (!freq || !valid) in lola_set_clock()
277 return -EINVAL; in lola_set_clock()
279 if (!check_gran_clock_compatibility(chip, chip->granularity, freq)) in lola_set_clock()
280 return -EINVAL; in lola_set_clock()
282 if (idx != chip->clock.cur_index) { in lola_set_clock()
287 chip->clock.cur_index = idx; in lola_set_clock()
288 chip->clock.cur_freq = freq; in lola_set_clock()
289 chip->clock.cur_valid = true; in lola_set_clock()
298 if (chip->clock.cur_freq == rate && chip->clock.cur_valid) in lola_set_sample_rate()
301 for (i = 0; i < chip->clock.items; i++) { in lola_set_sample_rate()
302 if (chip->clock.sample_clock[i].type == LOLA_CLOCK_TYPE_INTERNAL && in lola_set_sample_rate()
303 chip->clock.sample_clock[i].freq == rate) in lola_set_sample_rate()
306 if (i >= chip->clock.items) in lola_set_sample_rate()
307 return -EINVAL; in lola_set_sample_rate()