Commit fd8b281a authored by Hans Verkuil's avatar Hans Verkuil Committed by Mauro Carvalho Chehab

V4L/DVB (6093): ivtv: reorganized and cleanup ivtv struct

Signed-off-by: default avatarHans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@infradead.org>
parent 33c0fcad
...@@ -667,7 +667,7 @@ static int __devinit ivtv_init_struct1(struct ivtv *itv) ...@@ -667,7 +667,7 @@ static int __devinit ivtv_init_struct1(struct ivtv *itv)
cx2341x_fill_defaults(&itv->params); cx2341x_fill_defaults(&itv->params);
itv->params.port = CX2341X_PORT_MEMORY; itv->params.port = CX2341X_PORT_MEMORY;
itv->params.capabilities = CX2341X_CAP_HAS_SLICED_VBI; itv->params.capabilities = CX2341X_CAP_HAS_SLICED_VBI;
init_waitqueue_head(&itv->cap_w); init_waitqueue_head(&itv->eos_waitq);
init_waitqueue_head(&itv->event_waitq); init_waitqueue_head(&itv->event_waitq);
init_waitqueue_head(&itv->vsync_waitq); init_waitqueue_head(&itv->vsync_waitq);
init_waitqueue_head(&itv->dma_waitq); init_waitqueue_head(&itv->dma_waitq);
...@@ -713,14 +713,6 @@ static void __devinit ivtv_init_struct2(struct ivtv *itv) ...@@ -713,14 +713,6 @@ static void __devinit ivtv_init_struct2(struct ivtv *itv)
break; break;
itv->nof_audio_inputs = i; itv->nof_audio_inputs = i;
/* 0x00EF = saa7114(239) 0x00F0 = saa7115(240) 0x0106 = micro */
if (itv->card->hw_all & (IVTV_HW_SAA7115 | IVTV_HW_SAA717X))
itv->digitizer = 0xF1;
else if (itv->card->hw_all & IVTV_HW_SAA7114)
itv->digitizer = 0xEF;
else /* cx25840 */
itv->digitizer = 0x140;
if (itv->card->hw_all & IVTV_HW_CX25840) { if (itv->card->hw_all & IVTV_HW_CX25840) {
itv->vbi.sliced_size = 288; /* multiple of 16, real size = 284 */ itv->vbi.sliced_size = 288; /* multiple of 16, real size = 284 */
} else { } else {
...@@ -749,6 +741,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev, ...@@ -749,6 +741,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev,
const struct pci_device_id *pci_id) const struct pci_device_id *pci_id)
{ {
u16 cmd; u16 cmd;
u8 card_rev;
unsigned char pci_latency; unsigned char pci_latency;
IVTV_DEBUG_INFO("Enabling pci device\n"); IVTV_DEBUG_INFO("Enabling pci device\n");
...@@ -795,7 +788,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev, ...@@ -795,7 +788,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev,
} }
IVTV_DEBUG_INFO("Bus Mastering Enabled.\n"); IVTV_DEBUG_INFO("Bus Mastering Enabled.\n");
pci_read_config_byte(dev, PCI_CLASS_REVISION, &itv->card_rev); pci_read_config_byte(dev, PCI_CLASS_REVISION, &card_rev);
pci_read_config_byte(dev, PCI_LATENCY_TIMER, &pci_latency); pci_read_config_byte(dev, PCI_LATENCY_TIMER, &pci_latency);
if (pci_latency < 64 && ivtv_pci_latency) { if (pci_latency < 64 && ivtv_pci_latency) {
...@@ -812,7 +805,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev, ...@@ -812,7 +805,7 @@ static int ivtv_setup_pci(struct ivtv *itv, struct pci_dev *dev,
IVTV_DEBUG_INFO("%d (rev %d) at %02x:%02x.%x, " IVTV_DEBUG_INFO("%d (rev %d) at %02x:%02x.%x, "
"irq: %d, latency: %d, memory: 0x%lx\n", "irq: %d, latency: %d, memory: 0x%lx\n",
itv->dev->device, itv->card_rev, dev->bus->number, itv->dev->device, card_rev, dev->bus->number,
PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn), PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn),
itv->dev->irq, pci_latency, (unsigned long)itv->base_addr); itv->dev->irq, pci_latency, (unsigned long)itv->base_addr);
......
This diff is collapsed.
...@@ -405,7 +405,7 @@ static int ivtvfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar ...@@ -405,7 +405,7 @@ static int ivtvfb_ioctl(struct fb_info *info, unsigned int cmd, unsigned long ar
if (itv->is_50hz && trace > 312) trace -= 312; if (itv->is_50hz && trace > 312) trace -= 312;
else if (itv->is_60hz && trace > 262) trace -= 262; else if (itv->is_60hz && trace > 262) trace -= 262;
if (trace == 1) vblank.flags |= FB_VBLANK_VSYNCING; if (trace == 1) vblank.flags |= FB_VBLANK_VSYNCING;
vblank.count = itv->lastVsyncFrame; vblank.count = itv->last_vsync_frame;
vblank.vcount = trace; vblank.vcount = trace;
vblank.hcount = 0; vblank.hcount = 0;
if (copy_to_user((void __user *)arg, &vblank, sizeof(vblank))) if (copy_to_user((void __user *)arg, &vblank, sizeof(vblank)))
......
...@@ -163,7 +163,7 @@ void ivtv_set_osd_alpha(struct ivtv *itv) ...@@ -163,7 +163,7 @@ void ivtv_set_osd_alpha(struct ivtv *itv)
{ {
ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3, ivtv_vapi(itv, CX2341X_OSD_SET_GLOBAL_ALPHA, 3,
itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state); itv->osd_global_alpha_state, itv->osd_global_alpha, !itv->osd_local_alpha_state);
ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_color_key_state, itv->osd_color_key); ivtv_vapi(itv, CX2341X_OSD_SET_CHROMA_KEY, 2, itv->osd_chroma_key_state, itv->osd_chroma_key);
} }
int ivtv_set_speed(struct ivtv *itv, int speed) int ivtv_set_speed(struct ivtv *itv, int speed)
...@@ -426,7 +426,7 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm ...@@ -426,7 +426,7 @@ static int ivtv_get_fmt(struct ivtv *itv, int streamtype, struct v4l2_format *fm
case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY: case V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY:
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
return -EINVAL; return -EINVAL;
fmt->fmt.win.chromakey = itv->osd_color_key; fmt->fmt.win.chromakey = itv->osd_chroma_key;
fmt->fmt.win.global_alpha = itv->osd_global_alpha; fmt->fmt.win.global_alpha = itv->osd_global_alpha;
break; break;
...@@ -546,7 +546,7 @@ static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype, ...@@ -546,7 +546,7 @@ static int ivtv_try_or_set_fmt(struct ivtv *itv, int streamtype,
if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT)) if (!(itv->v4l2_cap & V4L2_CAP_VIDEO_OUTPUT))
return -EINVAL; return -EINVAL;
if (set_fmt) { if (set_fmt) {
itv->osd_color_key = fmt->fmt.win.chromakey; itv->osd_chroma_key = fmt->fmt.win.chromakey;
itv->osd_global_alpha = fmt->fmt.win.global_alpha; itv->osd_global_alpha = fmt->fmt.win.global_alpha;
ivtv_set_osd_alpha(itv); ivtv_set_osd_alpha(itv);
} }
...@@ -1197,7 +1197,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -1197,7 +1197,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA; fb->flags |= V4L2_FBUF_FLAG_GLOBAL_ALPHA;
if (itv->osd_local_alpha_state) if (itv->osd_local_alpha_state)
fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA; fb->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
if (itv->osd_color_key_state) if (itv->osd_chroma_key_state)
fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY; fb->flags |= V4L2_FBUF_FLAG_CHROMAKEY;
break; break;
} }
...@@ -1209,7 +1209,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void ...@@ -1209,7 +1209,7 @@ int ivtv_v4l2_ioctls(struct ivtv *itv, struct file *filp, unsigned int cmd, void
return -EINVAL; return -EINVAL;
itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0; itv->osd_global_alpha_state = (fb->flags & V4L2_FBUF_FLAG_GLOBAL_ALPHA) != 0;
itv->osd_local_alpha_state = (fb->flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) != 0; itv->osd_local_alpha_state = (fb->flags & V4L2_FBUF_FLAG_LOCAL_ALPHA) != 0;
itv->osd_color_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0; itv->osd_chroma_key_state = (fb->flags & V4L2_FBUF_FLAG_CHROMAKEY) != 0;
ivtv_set_osd_alpha(itv); ivtv_set_osd_alpha(itv);
break; break;
} }
......
...@@ -750,8 +750,8 @@ static void ivtv_irq_vsync(struct ivtv *itv) ...@@ -750,8 +750,8 @@ static void ivtv_irq_vsync(struct ivtv *itv)
if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n"); if (0) IVTV_DEBUG_IRQ("DEC VSYNC\n");
if (((frame ^ itv->yuv_info.sync_field[last_dma_frame]) == 0 && if (((frame ^ itv->yuv_info.sync_field[last_dma_frame]) == 0 &&
((itv->lastVsyncFrame & 1) ^ itv->yuv_info.sync_field[last_dma_frame])) || ((itv->last_vsync_frame & 1) ^ itv->yuv_info.sync_field[last_dma_frame])) ||
(frame != (itv->lastVsyncFrame & 1) && !itv->yuv_info.frame_interlaced)) { (frame != (itv->last_vsync_frame & 1) && !itv->yuv_info.frame_interlaced)) {
int next_dma_frame = last_dma_frame; int next_dma_frame = last_dma_frame;
if (!(itv->yuv_info.frame_interlaced && itv->yuv_info.field_delay[next_dma_frame] && itv->yuv_info.fields_lapsed < 1)) { if (!(itv->yuv_info.frame_interlaced && itv->yuv_info.field_delay[next_dma_frame] && itv->yuv_info.fields_lapsed < 1)) {
...@@ -766,10 +766,10 @@ static void ivtv_irq_vsync(struct ivtv *itv) ...@@ -766,10 +766,10 @@ static void ivtv_irq_vsync(struct ivtv *itv)
} }
} }
} }
if (frame != (itv->lastVsyncFrame & 1)) { if (frame != (itv->last_vsync_frame & 1)) {
struct ivtv_stream *s = ivtv_get_output_stream(itv); struct ivtv_stream *s = ivtv_get_output_stream(itv);
itv->lastVsyncFrame += 1; itv->last_vsync_frame += 1;
if (frame == 0) { if (frame == 0) {
clear_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags); clear_bit(IVTV_F_I_VALID_DEC_TIMINGS, &itv->i_flags);
clear_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags); clear_bit(IVTV_F_I_EV_VSYNC_FIELD, &itv->i_flags);
...@@ -834,7 +834,7 @@ irqreturn_t ivtv_irq_handler(int irq, void *dev_id) ...@@ -834,7 +834,7 @@ irqreturn_t ivtv_irq_handler(int irq, void *dev_id)
*/ */
if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) { if (~itv->irqmask & IVTV_IRQ_DEC_VSYNC) {
/* vsync is enabled, see if we're in a new field */ /* vsync is enabled, see if we're in a new field */
if ((itv->lastVsyncFrame & 1) != (read_reg(0x28c0) & 1)) { if ((itv->last_vsync_frame & 1) != (read_reg(0x28c0) & 1)) {
/* New field, looks like we missed it */ /* New field, looks like we missed it */
IVTV_DEBUG_YUV("VSync interrupt missed %d\n",read_reg(0x28c0)>>16); IVTV_DEBUG_YUV("VSync interrupt missed %d\n",read_reg(0x28c0)>>16);
vsync_force = 1; vsync_force = 1;
...@@ -888,7 +888,7 @@ irqreturn_t ivtv_irq_handler(int irq, void *dev_id) ...@@ -888,7 +888,7 @@ irqreturn_t ivtv_irq_handler(int irq, void *dev_id)
if (combo & IVTV_IRQ_ENC_EOS) { if (combo & IVTV_IRQ_ENC_EOS) {
IVTV_DEBUG_IRQ("ENC EOS\n"); IVTV_DEBUG_IRQ("ENC EOS\n");
set_bit(IVTV_F_I_EOS, &itv->i_flags); set_bit(IVTV_F_I_EOS, &itv->i_flags);
wake_up(&itv->cap_w); wake_up(&itv->eos_waitq);
} }
if (combo & IVTV_IRQ_DEC_DATA_REQ) { if (combo & IVTV_IRQ_DEC_DATA_REQ) {
......
...@@ -404,8 +404,8 @@ static void ivtv_vbi_setup(struct ivtv *itv) ...@@ -404,8 +404,8 @@ static void ivtv_vbi_setup(struct ivtv *itv)
if (!itv->vbi.fpi) if (!itv->vbi.fpi)
itv->vbi.fpi = 1; itv->vbi.fpi = 1;
IVTV_DEBUG_INFO("Setup VBI start 0x%08x frames %d fpi %d lines 0x%08x\n", IVTV_DEBUG_INFO("Setup VBI start 0x%08x frames %d fpi %d\n",
itv->vbi.enc_start, data[1], itv->vbi.fpi, itv->digitizer); itv->vbi.enc_start, data[1], itv->vbi.fpi);
/* select VBI lines. /* select VBI lines.
Note that the sliced argument seems to have no effect. */ Note that the sliced argument seems to have no effect. */
...@@ -494,6 +494,8 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) ...@@ -494,6 +494,8 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s)
clear_bit(IVTV_F_S_STREAMOFF, &s->s_flags); clear_bit(IVTV_F_S_STREAMOFF, &s->s_flags);
if (atomic_read(&itv->capturing) == 0) { if (atomic_read(&itv->capturing) == 0) {
int digitizer;
/* Always use frame based mode. Experiments have demonstrated that byte /* Always use frame based mode. Experiments have demonstrated that byte
stream based mode results in dropped frames and corruption. Not often, stream based mode results in dropped frames and corruption. Not often,
but occasionally. Many thanks go to Leonard Orb who spent a lot of but occasionally. Many thanks go to Leonard Orb who spent a lot of
...@@ -519,7 +521,14 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s) ...@@ -519,7 +521,14 @@ int ivtv_start_v4l2_encode_stream(struct ivtv_stream *s)
ivtv_vapi(itv, CX2341X_ENC_SET_PLACEHOLDER, 12, ivtv_vapi(itv, CX2341X_ENC_SET_PLACEHOLDER, 12,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
ivtv_vapi(itv, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, itv->digitizer, itv->digitizer); if (itv->card->hw_all & (IVTV_HW_SAA7115 | IVTV_HW_SAA717X))
digitizer = 0xF1;
else if (itv->card->hw_all & IVTV_HW_SAA7114)
digitizer = 0xEF;
else /* cx25840 */
digitizer = 0x140;
ivtv_vapi(itv, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, digitizer, digitizer);
/* Setup VBI */ /* Setup VBI */
if (itv->v4l2_cap & V4L2_CAP_VBI_CAPTURE) { if (itv->v4l2_cap & V4L2_CAP_VBI_CAPTURE) {
...@@ -761,7 +770,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end) ...@@ -761,7 +770,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
unsigned long duration; unsigned long duration;
then = jiffies; then = jiffies;
add_wait_queue(&itv->cap_w, &wait); add_wait_queue(&itv->eos_waitq, &wait);
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
...@@ -787,7 +796,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end) ...@@ -787,7 +796,7 @@ int ivtv_stop_v4l2_encode_stream(struct ivtv_stream *s, int gop_end)
IVTV_DEBUG_INFO("%s: EOS took %lu ms to occur.\n", s->name, duration); IVTV_DEBUG_INFO("%s: EOS took %lu ms to occur.\n", s->name, duration);
} }
set_current_state(TASK_RUNNING); set_current_state(TASK_RUNNING);
remove_wait_queue(&itv->cap_w, &wait); remove_wait_queue(&itv->eos_waitq, &wait);
} }
then = jiffies; then = jiffies;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment