Lines Matching refs:dev

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