Lines Matching refs:dev

115 static int cadet_getstereo(struct cadet *dev)
119 if (!dev->is_fm_band) /* Only FM has stereo capability! */
122 outb(7, dev->io); /* Select tuner control */
123 if ((inb(dev->io + 1) & 0x40) == 0)
128 static unsigned cadet_gettune(struct cadet *dev)
137 outb(7, dev->io); /* Select tuner control */
138 curvol = inb(dev->io + 1); /* Save current volume/mute setting */
139 outb(0x00, dev->io + 1); /* Ensure WRITE-ENABLE is LOW */
140 dev->tunestat = 0xffff;
146 fifo = (fifo << 1) | ((inb(dev->io + 1) >> 7) & 0x01);
148 outb(0x01, dev->io + 1);
149 dev->tunestat &= inb(dev->io + 1);
150 outb(0x00, dev->io + 1);
157 outb(curvol, dev->io + 1);
161 static unsigned cadet_getfreq(struct cadet *dev)
169 fifo = cadet_gettune(dev);
174 if (!dev->is_fm_band) /* AM */
189 static void cadet_settune(struct cadet *dev, unsigned fifo)
194 outb(7, dev->io); /* Select tuner control */
201 outb(7, dev->io); /* Select tuner control */
202 outb(test, dev->io + 1); /* Initialize for write */
205 outb(test, dev->io + 1);
207 outb(test, dev->io + 1);
210 outb(test, dev->io + 1);
214 static void cadet_setfreq(struct cadet *dev, unsigned freq)
220 freq = clamp(freq, bands[dev->is_fm_band].rangelow,
221 bands[dev->is_fm_band].rangehigh);
222 dev->curfreq = freq;
227 if (dev->is_fm_band) { /* FM */
248 outb(7, dev->io); /* Select tuner control */
249 curvol = inb(dev->io + 1);
255 cadet_settune(dev, fifo | (j << 16));
257 outb(7, dev->io); /* Select tuner control */
258 outb(curvol, dev->io + 1);
262 cadet_gettune(dev);
263 if ((dev->tunestat & 0x40) == 0) { /* Tuned */
264 dev->sigstrength = sigtable[dev->is_fm_band][j];
268 dev->sigstrength = 0;
270 outb(3, dev->io);
271 outb(inb(dev->io + 1) & 0x7f, dev->io + 1);
274 static bool cadet_has_rds_data(struct cadet *dev)
278 mutex_lock(&dev->lock);
279 result = dev->rdsin != dev->rdsout;
280 mutex_unlock(&dev->lock);
287 struct cadet *dev = from_timer(dev, t, readtimer);
290 if (mutex_trylock(&dev->lock)) {
291 outb(0x3, dev->io); /* Select RDS Decoder Control */
292 if ((inb(dev->io + 1) & 0x20) != 0)
294 outb(0x80, dev->io); /* Select RDS fifo */
296 while ((inb(dev->io) & 0x80) != 0) {
297 dev->rdsbuf[dev->rdsin] = inb(dev->io + 1);
298 if (dev->rdsin + 1 != dev->rdsout)
299 dev->rdsin++;
301 mutex_unlock(&dev->lock);
307 if (cadet_has_rds_data(dev))
308 wake_up_interruptible(&dev->read_queue);
313 dev->readtimer.expires = jiffies + msecs_to_jiffies(50);
314 add_timer(&dev->readtimer);
317 static void cadet_start_rds(struct cadet *dev)
319 dev->rdsstat = 1;
320 outb(0x80, dev->io); /* Select RDS fifo */
321 timer_setup(&dev->readtimer, cadet_handler, 0);
322 dev->readtimer.expires = jiffies + msecs_to_jiffies(50);
323 add_timer(&dev->readtimer);
328 struct cadet *dev = video_drvdata(file);
332 mutex_lock(&dev->lock);
333 if (dev->rdsstat == 0)
334 cadet_start_rds(dev);
335 mutex_unlock(&dev->lock);
337 if (!cadet_has_rds_data(dev) && (file->f_flags & O_NONBLOCK))
339 i = wait_event_interruptible(dev->read_queue, cadet_has_rds_data(dev));
343 mutex_lock(&dev->lock);
344 while (i < count && dev->rdsin != dev->rdsout)
345 readbuf[i++] = dev->rdsbuf[dev->rdsout++];
346 mutex_unlock(&dev->lock);
366 struct cadet *dev = video_drvdata(file);
375 if (dev->is_fm_band) {
376 v->rxsubchans = cadet_getstereo(dev);
377 outb(3, dev->io);
378 outb(inb(dev->io + 1) & 0x7f, dev->io + 1);
380 outb(3, dev->io);
381 if (inb(dev->io + 1) & 0x80)
389 v->signal = dev->sigstrength; /* We might need to modify scaling of this */
413 struct cadet *dev = video_drvdata(file);
418 f->frequency = dev->curfreq;
426 struct cadet *dev = video_drvdata(file);
430 dev->is_fm_band =
432 cadet_setfreq(dev, f->frequency);
438 struct cadet *dev = container_of(ctrl->handler, struct cadet, ctrl_handler);
442 outb(7, dev->io); /* Select tuner control */
444 outb(0x00, dev->io + 1);
446 outb(0x20, dev->io + 1);
454 struct cadet *dev = video_drvdata(file);
457 mutex_lock(&dev->lock);
462 init_waitqueue_head(&dev->read_queue);
464 mutex_unlock(&dev->lock);
470 struct cadet *dev = video_drvdata(file);
472 mutex_lock(&dev->lock);
473 if (v4l2_fh_is_singular_file(file) && dev->rdsstat) {
474 del_timer_sync(&dev->readtimer);
475 dev->rdsstat = 0;
478 mutex_unlock(&dev->lock);
484 struct cadet *dev = video_drvdata(file);
488 poll_wait(file, &dev->read_queue, wait);
489 if (dev->rdsstat == 0 && (req_events & (EPOLLIN | EPOLLRDNORM))) {
490 mutex_lock(&dev->lock);
491 if (dev->rdsstat == 0)
492 cadet_start_rds(dev);
493 mutex_unlock(&dev->lock);
495 if (cadet_has_rds_data(dev))
536 static int cadet_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id)
538 if (!dev)
544 if (!pnp_port_valid(dev, 0))
547 io = pnp_port_start(dev, 0);
565 static void cadet_probe(struct cadet *dev)
571 dev->io = iovals[i];
572 if (request_region(dev->io, 2, "cadet-probe")) {
573 cadet_setfreq(dev, bands[1].rangelow);
574 if (cadet_getfreq(dev) == bands[1].rangelow) {
575 release_region(dev->io, 2);
578 release_region(dev->io, 2);
581 dev->io = -1;
591 struct cadet *dev = &cadet_card;
592 struct v4l2_device *v4l2_dev = &dev->v4l2_dev;
597 mutex_init(&dev->lock);
602 dev->io = io;
605 if (dev->io < 0)
606 cadet_probe(dev);
609 if (dev->io < 0) {
616 if (!request_region(dev->io, 2, "cadet"))
621 release_region(dev->io, 2);
626 hdl = &dev->ctrl_handler;
637 dev->is_fm_band = true;
638 dev->curfreq = bands[dev->is_fm_band].rangelow;
639 cadet_setfreq(dev, dev->curfreq);
640 strscpy(dev->vdev.name, v4l2_dev->name, sizeof(dev->vdev.name));
641 dev->vdev.v4l2_dev = v4l2_dev;
642 dev->vdev.fops = &cadet_fops;
643 dev->vdev.ioctl_ops = &cadet_ioctl_ops;
644 dev->vdev.release = video_device_release_empty;
645 dev->vdev.lock = &dev->lock;
646 dev->vdev.device_caps = V4L2_CAP_TUNER | V4L2_CAP_RADIO |
648 video_set_drvdata(&dev->vdev, dev);
650 res = video_register_device(&dev->vdev, VFL_TYPE_RADIO, radio_nr);
653 v4l2_info(v4l2_dev, "ADS Cadet Radio Card at 0x%x\n", dev->io);
658 release_region(dev->io, 2);
666 struct cadet *dev = &cadet_card;
668 video_unregister_device(&dev->vdev);
669 v4l2_ctrl_handler_free(&dev->ctrl_handler);
670 v4l2_device_unregister(&dev->v4l2_dev);
671 outb(7, dev->io); /* Mute */
672 outb(0x00, dev->io + 1);
673 release_region(dev->io, 2);