Lines Matching refs:solo_dev
46 struct solo6010_dev *solo_dev;
58 static void erase_on(struct solo6010_dev *solo_dev)
60 solo_reg_write(solo_dev, SOLO_VO_DISP_ERASE, SOLO_VO_DISP_ERASE_ON);
61 solo_dev->erasing = 1;
62 solo_dev->frame_blank = 0;
65 static int erase_off(struct solo6010_dev *solo_dev)
67 if (!solo_dev->erasing)
71 if (!solo_dev->frame_blank)
72 solo_reg_write(solo_dev, SOLO_VO_DISP_ERASE, 0);
74 if (solo_dev->frame_blank++ >= 8)
75 solo_dev->erasing = 0;
80 void solo_video_in_isr(struct solo6010_dev *solo_dev)
82 solo_reg_write(solo_dev, SOLO_IRQ_STAT, SOLO_IRQ_VIDEO_IN);
83 wake_up_interruptible(&solo_dev->disp_thread_wait);
86 static void solo_win_setup(struct solo6010_dev *solo_dev, u8 ch,
89 if (ch >= solo_dev->nr_chans)
93 solo_reg_write(solo_dev, SOLO_VI_WIN_CTRL0(ch),
99 solo_reg_write(solo_dev, SOLO_VI_WIN_CTRL1(ch),
104 static int solo_v4l2_ch_ext_4up(struct solo6010_dev *solo_dev, u8 idx, int on)
108 if (ch >= solo_dev->nr_chans)
114 solo_win_setup(solo_dev, i, solo_dev->video_hsize,
115 solo_vlines(solo_dev),
116 solo_dev->video_hsize,
117 solo_vlines(solo_dev), 0);
122 solo_win_setup(solo_dev, ch, 0, 0, solo_dev->video_hsize / 2,
123 solo_vlines(solo_dev) / 2, 3);
124 solo_win_setup(solo_dev, ch + 1, solo_dev->video_hsize / 2, 0,
125 solo_dev->video_hsize, solo_vlines(solo_dev) / 2, 3);
127 solo_win_setup(solo_dev, ch + 2, 0, solo_vlines(solo_dev) / 2,
128 solo_dev->video_hsize / 2, solo_vlines(solo_dev), 3);
129 solo_win_setup(solo_dev, ch + 3, solo_dev->video_hsize / 2,
130 solo_vlines(solo_dev) / 2, solo_dev->video_hsize,
131 solo_vlines(solo_dev), 3);
136 static int solo_v4l2_ch_ext_16up(struct solo6010_dev *solo_dev, int on)
142 solo_win_setup(solo_dev, i, solo_dev->video_hsize,
143 solo_vlines(solo_dev),
144 solo_dev->video_hsize,
145 solo_vlines(solo_dev), 0);
149 ysize = solo_vlines(solo_dev) / 4;
150 hsize = solo_dev->video_hsize / 4;
153 solo_win_setup(solo_dev, i * 4, 0, sy, hsize,
155 solo_win_setup(solo_dev, (i * 4) + 1, hsize, sy,
157 solo_win_setup(solo_dev, (i * 4) + 2, hsize * 2, sy,
159 solo_win_setup(solo_dev, (i * 4) + 3, hsize * 3, sy,
160 solo_dev->video_hsize, sy + ysize, 5);
166 static int solo_v4l2_ch(struct solo6010_dev *solo_dev, u8 ch, int on)
170 if (ch < solo_dev->nr_chans) {
171 solo_win_setup(solo_dev, ch, on ? 0 : solo_dev->video_hsize,
172 on ? 0 : solo_vlines(solo_dev),
173 solo_dev->video_hsize, solo_vlines(solo_dev),
178 if (ch >= solo_dev->nr_chans + solo_dev->nr_ext)
181 ext_ch = ch - solo_dev->nr_chans;
185 return solo_v4l2_ch_ext_4up(solo_dev, ext_ch, on);
188 return solo_v4l2_ch_ext_16up(solo_dev, on);
191 static int solo_v4l2_set_ch(struct solo6010_dev *solo_dev, u8 ch)
193 if (ch >= solo_dev->nr_chans + solo_dev->nr_ext)
196 erase_on(solo_dev);
198 solo_v4l2_ch(solo_dev, solo_dev->cur_disp_ch, 0);
199 solo_v4l2_ch(solo_dev, ch, 1);
201 solo_dev->cur_disp_ch = ch;
209 struct solo6010_dev *solo_dev = fh->solo_dev;
219 if (erase_off(solo_dev)) {
221 int image_size = solo_image_size(solo_dev);
230 frame_size = SOLO_HW_BPL * solo_vlines(solo_dev);
231 fdma_addr = SOLO_DISP_EXT_ADDR(solo_dev) + (fh->old_write * frame_size);
236 if (solo_p2m_dma_t(solo_dev, SOLO_P2M_DMA_ID_DISP, 0,
238 solo_bytesperline(solo_dev)))
240 vbuf += solo_bytesperline(solo_dev);
277 cur_write = SOLO_VI_STATUS0_PAGE(solo_reg_read(fh->solo_dev,
297 struct solo6010_dev *solo_dev = fh->solo_dev;
301 add_wait_queue(&solo_dev->disp_thread_wait, &wait);
311 remove_wait_queue(&solo_dev->disp_thread_wait, &wait);
338 struct solo6010_dev *solo_dev = fh->solo_dev;
340 *size = solo_image_size(solo_dev);
352 struct solo6010_dev *solo_dev = fh->solo_dev;
354 vb->size = solo_image_size(solo_dev);
358 vb->width = solo_dev->video_hsize;
359 vb->height = solo_vlines(solo_dev);
360 vb->bytesperline = solo_bytesperline(solo_dev);
380 struct solo6010_dev *solo_dev = fh->solo_dev;
384 wake_up_interruptible(&solo_dev->disp_thread_wait);
418 struct solo6010_dev *solo_dev = video_drvdata(file);
427 fh->solo_dev = solo_dev;
436 &solo_dev->pdev->dev, &fh->slock,
469 struct solo6010_dev *solo_dev = fh->solo_dev;
474 pci_name(solo_dev->pdev));
482 static int solo_enum_ext_input(struct solo6010_dev *solo_dev,
492 if (input->index >= (solo_dev->nr_chans + solo_dev->nr_ext))
495 if (solo_dev->nr_ext == 5)
497 else if (solo_dev->nr_ext == 2)
503 dispnames[input->index - solo_dev->nr_chans]);
512 struct solo6010_dev *solo_dev = fh->solo_dev;
514 if (input->index >= solo_dev->nr_chans) {
515 int ret = solo_enum_ext_input(solo_dev, input);
523 if (!tw28_get_video_status(solo_dev, input->index))
529 if (solo_dev->video_type == SOLO_VO_FMT_TYPE_NTSC)
541 return solo_v4l2_set_ch(fh->solo_dev, index);
548 *index = fh->solo_dev->cur_disp_ch;
569 struct solo6010_dev *solo_dev = fh->solo_dev;
571 int image_size = solo_image_size(solo_dev);
574 if (pix->width != solo_dev->video_hsize)
575 pix->width = solo_dev->video_hsize;
576 if (pix->height != solo_vlines(solo_dev))
577 pix->height = solo_vlines(solo_dev);
610 struct solo6010_dev *solo_dev = fh->solo_dev;
613 pix->width = solo_dev->video_hsize;
614 pix->height = solo_vlines(solo_dev);
617 pix->sizeimage = solo_image_size(solo_dev);
619 pix->bytesperline = solo_bytesperline(solo_dev);
716 struct solo6010_dev *solo_dev = fh->solo_dev;
720 ctrl->value = solo_reg_read(solo_dev, SOLO_VI_MOTION_BAR)
731 struct solo6010_dev *solo_dev = fh->solo_dev;
736 solo_reg_write(solo_dev, SOLO_VI_MOTION_BORDER,
741 solo_reg_write(solo_dev, SOLO_VI_MOTION_BAR,
747 solo_reg_write(solo_dev, SOLO_VI_MOTION_BORDER, 0);
748 solo_reg_write(solo_dev, SOLO_VI_MOTION_BAR, 0);
801 int solo_v4l2_init(struct solo6010_dev *solo_dev)
806 init_waitqueue_head(&solo_dev->disp_thread_wait);
808 solo_dev->vfd = video_device_alloc();
809 if (!solo_dev->vfd)
812 *solo_dev->vfd = solo_v4l2_template;
813 solo_dev->vfd->parent = &solo_dev->pdev->dev;
815 ret = video_register_device(solo_dev->vfd, VFL_TYPE_GRABBER, video_nr);
817 video_device_release(solo_dev->vfd);
818 solo_dev->vfd = NULL;
822 video_set_drvdata(solo_dev->vfd, solo_dev);
824 snprintf(solo_dev->vfd->name, sizeof(solo_dev->vfd->name), "%s (%i)",
825 SOLO6010_NAME, solo_dev->vfd->num);
830 dev_info(&solo_dev->pdev->dev, "Display as /dev/video%d with "
831 "%d inputs (%d extended)\n", solo_dev->vfd->num,
832 solo_dev->nr_chans, solo_dev->nr_ext);
835 for (i = 0; i < solo_dev->nr_chans; i++) {
836 solo_v4l2_set_ch(solo_dev, i);
837 while (erase_off(solo_dev))
842 solo_v4l2_set_ch(solo_dev, 0);
843 while (erase_off(solo_dev))
846 solo6010_irq_on(solo_dev, SOLO_IRQ_VIDEO_IN);
851 void solo_v4l2_exit(struct solo6010_dev *solo_dev)
853 solo6010_irq_off(solo_dev, SOLO_IRQ_VIDEO_IN);
854 if (solo_dev->vfd) {
855 video_unregister_device(solo_dev->vfd);
856 solo_dev->vfd = NULL;