Lines Matching refs:dev
114 static int cadet_getstereo(struct cadet *dev) in cadet_getstereo() argument
118 if (!dev->is_fm_band) /* Only FM has stereo capability! */ in cadet_getstereo()
121 outb(7, dev->io); /* Select tuner control */ in cadet_getstereo()
122 if ((inb(dev->io + 1) & 0x40) == 0) in cadet_getstereo()
127 static unsigned cadet_gettune(struct cadet *dev) in cadet_gettune() argument
136 outb(7, dev->io); /* Select tuner control */ in cadet_gettune()
137 curvol = inb(dev->io + 1); /* Save current volume/mute setting */ in cadet_gettune()
138 outb(0x00, dev->io + 1); /* Ensure WRITE-ENABLE is LOW */ in cadet_gettune()
139 dev->tunestat = 0xffff; in cadet_gettune()
145 fifo = (fifo << 1) | ((inb(dev->io + 1) >> 7) & 0x01); in cadet_gettune()
147 outb(0x01, dev->io + 1); in cadet_gettune()
148 dev->tunestat &= inb(dev->io + 1); in cadet_gettune()
149 outb(0x00, dev->io + 1); in cadet_gettune()
156 outb(curvol, dev->io + 1); in cadet_gettune()
160 static unsigned cadet_getfreq(struct cadet *dev) in cadet_getfreq() argument
168 fifo = cadet_gettune(dev); in cadet_getfreq()
173 if (!dev->is_fm_band) /* AM */ in cadet_getfreq()
188 static void cadet_settune(struct cadet *dev, unsigned fifo) in cadet_settune() argument
193 outb(7, dev->io); /* Select tuner control */ in cadet_settune()
200 outb(7, dev->io); /* Select tuner control */ in cadet_settune()
201 outb(test, dev->io + 1); /* Initialize for write */ in cadet_settune()
204 outb(test, dev->io + 1); in cadet_settune()
206 outb(test, dev->io + 1); in cadet_settune()
209 outb(test, dev->io + 1); in cadet_settune()
213 static void cadet_setfreq(struct cadet *dev, unsigned freq) in cadet_setfreq() argument
219 freq = clamp(freq, bands[dev->is_fm_band].rangelow, in cadet_setfreq()
220 bands[dev->is_fm_band].rangehigh); in cadet_setfreq()
221 dev->curfreq = freq; in cadet_setfreq()
226 if (dev->is_fm_band) { /* FM */ in cadet_setfreq()
247 outb(7, dev->io); /* Select tuner control */ in cadet_setfreq()
248 curvol = inb(dev->io + 1); in cadet_setfreq()
254 cadet_settune(dev, fifo | (j << 16)); in cadet_setfreq()
256 outb(7, dev->io); /* Select tuner control */ in cadet_setfreq()
257 outb(curvol, dev->io + 1); in cadet_setfreq()
261 cadet_gettune(dev); in cadet_setfreq()
262 if ((dev->tunestat & 0x40) == 0) { /* Tuned */ in cadet_setfreq()
263 dev->sigstrength = sigtable[dev->is_fm_band][j]; in cadet_setfreq()
267 dev->sigstrength = 0; in cadet_setfreq()
269 outb(3, dev->io); in cadet_setfreq()
270 outb(inb(dev->io + 1) & 0x7f, dev->io + 1); in cadet_setfreq()
273 static bool cadet_has_rds_data(struct cadet *dev) in cadet_has_rds_data() argument
277 mutex_lock(&dev->lock); in cadet_has_rds_data()
278 result = dev->rdsin != dev->rdsout; in cadet_has_rds_data()
279 mutex_unlock(&dev->lock); in cadet_has_rds_data()
286 struct cadet *dev = (void *)data; in cadet_handler() local
289 if (mutex_trylock(&dev->lock)) { in cadet_handler()
290 outb(0x3, dev->io); /* Select RDS Decoder Control */ in cadet_handler()
291 if ((inb(dev->io + 1) & 0x20) != 0) in cadet_handler()
293 outb(0x80, dev->io); /* Select RDS fifo */ in cadet_handler()
295 while ((inb(dev->io) & 0x80) != 0) { in cadet_handler()
296 dev->rdsbuf[dev->rdsin] = inb(dev->io + 1); in cadet_handler()
297 if (dev->rdsin + 1 != dev->rdsout) in cadet_handler()
298 dev->rdsin++; in cadet_handler()
300 mutex_unlock(&dev->lock); in cadet_handler()
306 if (cadet_has_rds_data(dev)) in cadet_handler()
307 wake_up_interruptible(&dev->read_queue); in cadet_handler()
312 init_timer(&dev->readtimer); in cadet_handler()
313 dev->readtimer.function = cadet_handler; in cadet_handler()
314 dev->readtimer.data = data; in cadet_handler()
315 dev->readtimer.expires = jiffies + msecs_to_jiffies(50); in cadet_handler()
316 add_timer(&dev->readtimer); in cadet_handler()
319 static void cadet_start_rds(struct cadet *dev) in cadet_start_rds() argument
321 dev->rdsstat = 1; in cadet_start_rds()
322 outb(0x80, dev->io); /* Select RDS fifo */ in cadet_start_rds()
323 init_timer(&dev->readtimer); in cadet_start_rds()
324 dev->readtimer.function = cadet_handler; in cadet_start_rds()
325 dev->readtimer.data = (unsigned long)dev; in cadet_start_rds()
326 dev->readtimer.expires = jiffies + msecs_to_jiffies(50); in cadet_start_rds()
327 add_timer(&dev->readtimer); in cadet_start_rds()
332 struct cadet *dev = video_drvdata(file); in cadet_read() local
336 mutex_lock(&dev->lock); in cadet_read()
337 if (dev->rdsstat == 0) in cadet_read()
338 cadet_start_rds(dev); in cadet_read()
339 mutex_unlock(&dev->lock); in cadet_read()
341 if (!cadet_has_rds_data(dev) && (file->f_flags & O_NONBLOCK)) in cadet_read()
343 i = wait_event_interruptible(dev->read_queue, cadet_has_rds_data(dev)); in cadet_read()
347 mutex_lock(&dev->lock); in cadet_read()
348 while (i < count && dev->rdsin != dev->rdsout) in cadet_read()
349 readbuf[i++] = dev->rdsbuf[dev->rdsout++]; in cadet_read()
350 mutex_unlock(&dev->lock); in cadet_read()
373 struct cadet *dev = video_drvdata(file); in vidioc_g_tuner() local
382 if (dev->is_fm_band) { in vidioc_g_tuner()
383 v->rxsubchans = cadet_getstereo(dev); in vidioc_g_tuner()
384 outb(3, dev->io); in vidioc_g_tuner()
385 outb(inb(dev->io + 1) & 0x7f, dev->io + 1); in vidioc_g_tuner()
387 outb(3, dev->io); in vidioc_g_tuner()
388 if (inb(dev->io + 1) & 0x80) in vidioc_g_tuner()
396 v->signal = dev->sigstrength; /* We might need to modify scaling of this */ in vidioc_g_tuner()
420 struct cadet *dev = video_drvdata(file); in vidioc_g_frequency() local
425 f->frequency = dev->curfreq; in vidioc_g_frequency()
433 struct cadet *dev = video_drvdata(file); in vidioc_s_frequency() local
437 dev->is_fm_band = in vidioc_s_frequency()
439 cadet_setfreq(dev, f->frequency); in vidioc_s_frequency()
445 struct cadet *dev = container_of(ctrl->handler, struct cadet, ctrl_handler); in cadet_s_ctrl() local
449 outb(7, dev->io); /* Select tuner control */ in cadet_s_ctrl()
451 outb(0x00, dev->io + 1); in cadet_s_ctrl()
453 outb(0x20, dev->io + 1); in cadet_s_ctrl()
461 struct cadet *dev = video_drvdata(file); in cadet_open() local
464 mutex_lock(&dev->lock); in cadet_open()
469 init_waitqueue_head(&dev->read_queue); in cadet_open()
471 mutex_unlock(&dev->lock); in cadet_open()
477 struct cadet *dev = video_drvdata(file); in cadet_release() local
479 mutex_lock(&dev->lock); in cadet_release()
480 if (v4l2_fh_is_singular_file(file) && dev->rdsstat) { in cadet_release()
481 del_timer_sync(&dev->readtimer); in cadet_release()
482 dev->rdsstat = 0; in cadet_release()
485 mutex_unlock(&dev->lock); in cadet_release()
491 struct cadet *dev = video_drvdata(file); in cadet_poll() local
495 poll_wait(file, &dev->read_queue, wait); in cadet_poll()
496 if (dev->rdsstat == 0 && (req_events & (POLLIN | POLLRDNORM))) { in cadet_poll()
497 mutex_lock(&dev->lock); in cadet_poll()
498 if (dev->rdsstat == 0) in cadet_poll()
499 cadet_start_rds(dev); in cadet_poll()
500 mutex_unlock(&dev->lock); in cadet_poll()
502 if (cadet_has_rds_data(dev)) in cadet_poll()
543 static int cadet_pnp_probe(struct pnp_dev *dev, const struct pnp_device_id *dev_id) in cadet_pnp_probe() argument
545 if (!dev) in cadet_pnp_probe()
551 if (!pnp_port_valid(dev, 0)) in cadet_pnp_probe()
554 io = pnp_port_start(dev, 0); in cadet_pnp_probe()
572 static void cadet_probe(struct cadet *dev) in cadet_probe() argument
578 dev->io = iovals[i]; in cadet_probe()
579 if (request_region(dev->io, 2, "cadet-probe")) { in cadet_probe()
580 cadet_setfreq(dev, bands[1].rangelow); in cadet_probe()
581 if (cadet_getfreq(dev) == bands[1].rangelow) { in cadet_probe()
582 release_region(dev->io, 2); in cadet_probe()
585 release_region(dev->io, 2); in cadet_probe()
588 dev->io = -1; in cadet_probe()
598 struct cadet *dev = &cadet_card; in cadet_init() local
599 struct v4l2_device *v4l2_dev = &dev->v4l2_dev; in cadet_init()
604 mutex_init(&dev->lock); in cadet_init()
609 dev->io = io; in cadet_init()
612 if (dev->io < 0) in cadet_init()
613 cadet_probe(dev); in cadet_init()
616 if (dev->io < 0) { in cadet_init()
623 if (!request_region(dev->io, 2, "cadet")) in cadet_init()
628 release_region(dev->io, 2); in cadet_init()
633 hdl = &dev->ctrl_handler; in cadet_init()
644 dev->is_fm_band = true; in cadet_init()
645 dev->curfreq = bands[dev->is_fm_band].rangelow; in cadet_init()
646 cadet_setfreq(dev, dev->curfreq); in cadet_init()
647 strlcpy(dev->vdev.name, v4l2_dev->name, sizeof(dev->vdev.name)); in cadet_init()
648 dev->vdev.v4l2_dev = v4l2_dev; in cadet_init()
649 dev->vdev.fops = &cadet_fops; in cadet_init()
650 dev->vdev.ioctl_ops = &cadet_ioctl_ops; in cadet_init()
651 dev->vdev.release = video_device_release_empty; in cadet_init()
652 dev->vdev.lock = &dev->lock; in cadet_init()
653 video_set_drvdata(&dev->vdev, dev); in cadet_init()
655 res = video_register_device(&dev->vdev, VFL_TYPE_RADIO, radio_nr); in cadet_init()
658 v4l2_info(v4l2_dev, "ADS Cadet Radio Card at 0x%x\n", dev->io); in cadet_init()
663 release_region(dev->io, 2); in cadet_init()
671 struct cadet *dev = &cadet_card; in cadet_exit() local
673 video_unregister_device(&dev->vdev); in cadet_exit()
674 v4l2_ctrl_handler_free(&dev->ctrl_handler); in cadet_exit()
675 v4l2_device_unregister(&dev->v4l2_dev); in cadet_exit()
676 outb(7, dev->io); /* Mute */ in cadet_exit()
677 outb(0x00, dev->io + 1); in cadet_exit()
678 release_region(dev->io, 2); in cadet_exit()