Lines Matching defs:tea

162 static u32 tea5777_freq_to_v4l2_freq(struct radio_tea5777 *tea, u32 freq)
164 switch (tea->band) {
173 int radio_tea5777_set_freq(struct radio_tea5777 *tea)
178 freq = clamp(tea->freq, bands[tea->band].rangelow,
179 bands[tea->band].rangehigh);
182 switch (tea->band) {
184 tea->write_reg &= ~TEA5777_W_AM_FM_MASK;
186 tea->write_reg &= ~TEA5777_W_FM_PLL_MASK;
187 tea->write_reg |= (u64)freq << TEA5777_W_FM_PLL_SHIFT;
188 tea->write_reg &= ~TEA5777_W_FM_FREF_MASK;
189 tea->write_reg |= TEA5777_W_FM_FREF_VALUE <<
191 tea->write_reg &= ~TEA5777_W_FM_FORCEMONO_MASK;
192 if (tea->audmode == V4L2_TUNER_MODE_MONO)
193 tea->write_reg |= 1LL << TEA5777_W_FM_FORCEMONO_SHIFT;
196 tea->write_reg &= ~TEA5777_W_AM_FM_MASK;
197 tea->write_reg |= (1LL << TEA5777_W_AM_FM_SHIFT);
199 tea->write_reg &= ~TEA5777_W_AM_PLL_MASK;
200 tea->write_reg |= (u64)freq << TEA5777_W_AM_PLL_SHIFT;
201 tea->write_reg &= ~TEA5777_W_AM_AGCRF_MASK;
202 tea->write_reg &= ~TEA5777_W_AM_AGCRF_MASK;
203 tea->write_reg &= ~TEA5777_W_AM_MWLW_MASK;
204 tea->write_reg |= TEA5777_W_AM_MW << TEA5777_W_AM_MWLW_SHIFT;
205 tea->write_reg &= ~TEA5777_W_AM_LNA_MASK;
206 tea->write_reg |= 1LL << TEA5777_W_AM_LNA_SHIFT;
207 tea->write_reg &= ~TEA5777_W_AM_PEAK_MASK;
208 tea->write_reg |= 1LL << TEA5777_W_AM_PEAK_SHIFT;
209 tea->write_reg &= ~TEA5777_W_AM_CALLIGN_MASK;
213 res = tea->ops->write_reg(tea, tea->write_reg);
217 tea->needs_write = false;
218 tea->read_reg = -1;
219 tea->freq = tea5777_freq_to_v4l2_freq(tea, freq);
224 static int radio_tea5777_update_read_reg(struct radio_tea5777 *tea, int wait)
228 if (tea->read_reg != -1)
231 if (tea->write_before_read && tea->needs_write) {
232 res = radio_tea5777_set_freq(tea);
242 res = tea->ops->read_reg(tea, &tea->read_reg);
246 tea->needs_write = true;
257 struct radio_tea5777 *tea = video_drvdata(file);
259 strscpy(v->driver, tea->v4l2_dev->name, sizeof(v->driver));
260 strscpy(v->card, tea->card, sizeof(v->card));
262 strscpy(v->bus_info, tea->bus_info, sizeof(v->bus_info));
269 struct radio_tea5777 *tea = video_drvdata(file);
272 (!tea->has_am && band->index == BAND_AM))
282 struct radio_tea5777 *tea = video_drvdata(file);
288 res = radio_tea5777_update_read_reg(tea, 0);
293 if (tea->has_am)
302 v->rangelow = tea->has_am ? bands[BAND_AM].rangelow :
305 if (tea->band == BAND_FM &&
306 (tea->read_reg & TEA5777_R_FM_STEREO_MASK))
310 v->audmode = tea->audmode;
312 v->signal = (tea->read_reg & TEA5777_R_LEVEL_MASK) >>
316 tea->read_reg = -1;
324 struct radio_tea5777 *tea = video_drvdata(file);
325 u32 orig_audmode = tea->audmode;
330 tea->audmode = v->audmode;
331 if (tea->audmode > V4L2_TUNER_MODE_STEREO)
332 tea->audmode = V4L2_TUNER_MODE_STEREO;
334 if (tea->audmode != orig_audmode && tea->band == BAND_FM)
335 return radio_tea5777_set_freq(tea);
343 struct radio_tea5777 *tea = video_drvdata(file);
348 f->frequency = tea->freq;
355 struct radio_tea5777 *tea = video_drvdata(file);
360 if (tea->has_am && f->frequency < (20000 * 16))
361 tea->band = BAND_AM;
363 tea->band = BAND_FM;
365 tea->freq = f->frequency;
366 return radio_tea5777_set_freq(tea);
372 struct radio_tea5777 *tea = video_drvdata(file);
387 if (i == BAND_AM && !tea->has_am)
396 tea->band = i;
397 if (tea->freq < rangelow || tea->freq > rangehigh) {
398 tea->freq = clamp(tea->freq, rangelow,
400 res = radio_tea5777_set_freq(tea);
405 rangelow = bands[tea->band].rangelow;
406 rangehigh = bands[tea->band].rangehigh;
409 spacing = (tea->band == BAND_AM) ? (5 * 16) : (200 * 16); /* kHz */
410 orig_freq = tea->freq;
412 tea->write_reg |= TEA5777_W_PROGBLIM_MASK;
413 if (tea->seek_rangelow != rangelow) {
414 tea->write_reg &= ~TEA5777_W_UPDWN_MASK;
415 tea->freq = rangelow;
416 res = radio_tea5777_set_freq(tea);
419 tea->seek_rangelow = rangelow;
421 if (tea->seek_rangehigh != rangehigh) {
422 tea->write_reg |= TEA5777_W_UPDWN_MASK;
423 tea->freq = rangehigh;
424 res = radio_tea5777_set_freq(tea);
427 tea->seek_rangehigh = rangehigh;
429 tea->write_reg &= ~TEA5777_W_PROGBLIM_MASK;
431 tea->write_reg |= TEA5777_W_SEARCH_MASK;
433 tea->write_reg |= TEA5777_W_UPDWN_MASK;
434 tea->freq = orig_freq + spacing;
436 tea->write_reg &= ~TEA5777_W_UPDWN_MASK;
437 tea->freq = orig_freq - spacing;
439 res = radio_tea5777_set_freq(tea);
450 res = radio_tea5777_update_read_reg(tea, 100);
455 * Note we use tea->freq to track how far we've searched sofar
459 tea->freq = (tea->read_reg & TEA5777_R_FM_PLL_MASK);
460 tea->freq = tea5777_freq_to_v4l2_freq(tea, tea->freq);
462 if ((tea->read_reg & TEA5777_R_SFOUND_MASK)) {
463 tea->write_reg &= ~TEA5777_W_SEARCH_MASK;
467 if (tea->read_reg & TEA5777_R_BLIM_MASK) {
473 tea->read_reg = -1;
476 tea->write_reg &= ~TEA5777_W_PROGBLIM_MASK;
477 tea->write_reg &= ~TEA5777_W_SEARCH_MASK;
478 tea->freq = orig_freq;
479 radio_tea5777_set_freq(tea);
485 struct radio_tea5777 *tea =
491 tea->write_reg |= TEA5777_W_MUTE_MASK;
493 tea->write_reg &= ~TEA5777_W_MUTE_MASK;
495 return radio_tea5777_set_freq(tea);
530 int radio_tea5777_init(struct radio_tea5777 *tea, struct module *owner)
534 tea->write_reg = (1LL << TEA5777_W_IFCE_SHIFT) |
539 tea->freq = 90500 * 16; /* 90.5Mhz default */
540 tea->audmode = V4L2_TUNER_MODE_STEREO;
541 res = radio_tea5777_set_freq(tea);
543 v4l2_err(tea->v4l2_dev, "can't set initial freq (%d)\n", res);
547 tea->vd = tea575x_radio;
548 video_set_drvdata(&tea->vd, tea);
549 mutex_init(&tea->mutex);
550 strscpy(tea->vd.name, tea->v4l2_dev->name, sizeof(tea->vd.name));
551 tea->vd.lock = &tea->mutex;
552 tea->vd.v4l2_dev = tea->v4l2_dev;
553 tea->vd.device_caps = V4L2_CAP_TUNER | V4L2_CAP_RADIO |
555 tea->fops = tea575x_fops;
556 tea->fops.owner = owner;
557 tea->vd.fops = &tea->fops;
559 tea->vd.ctrl_handler = &tea->ctrl_handler;
560 v4l2_ctrl_handler_init(&tea->ctrl_handler, 1);
561 v4l2_ctrl_new_std(&tea->ctrl_handler, &tea575x_ctrl_ops,
563 res = tea->ctrl_handler.error;
565 v4l2_err(tea->v4l2_dev, "can't initialize controls\n");
566 v4l2_ctrl_handler_free(&tea->ctrl_handler);
569 v4l2_ctrl_handler_setup(&tea->ctrl_handler);
571 res = video_register_device(&tea->vd, VFL_TYPE_RADIO, -1);
573 v4l2_err(tea->v4l2_dev, "can't register video device!\n");
574 v4l2_ctrl_handler_free(tea->vd.ctrl_handler);
582 void radio_tea5777_exit(struct radio_tea5777 *tea)
584 video_unregister_device(&tea->vd);
585 v4l2_ctrl_handler_free(tea->vd.ctrl_handler);