diff options
Diffstat (limited to 'drivers/media/video/cx88/cx88-blackbird.c')
-rw-r--r-- | drivers/media/video/cx88/cx88-blackbird.c | 89 |
1 files changed, 69 insertions, 20 deletions
diff --git a/drivers/media/video/cx88/cx88-blackbird.c b/drivers/media/video/cx88/cx88-blackbird.c index f802b5653569..7ce37f46b753 100644 --- a/drivers/media/video/cx88/cx88-blackbird.c +++ b/drivers/media/video/cx88/cx88-blackbird.c | |||
@@ -536,6 +536,9 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev) | |||
536 | dprintk(1,"Initialize codec\n"); | 536 | dprintk(1,"Initialize codec\n"); |
537 | retval = blackbird_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0); /* ping */ | 537 | retval = blackbird_api_cmd(dev, CX2341X_ENC_PING_FW, 0, 0); /* ping */ |
538 | if (retval < 0) { | 538 | if (retval < 0) { |
539 | |||
540 | dev->mpeg_active = 0; | ||
541 | |||
539 | /* ping was not successful, reset and upload firmware */ | 542 | /* ping was not successful, reset and upload firmware */ |
540 | cx_write(MO_SRST_IO, 0); /* SYS_RSTO=0 */ | 543 | cx_write(MO_SRST_IO, 0); /* SYS_RSTO=0 */ |
541 | msleep(1); | 544 | msleep(1); |
@@ -572,38 +575,80 @@ static int blackbird_initialize_codec(struct cx8802_dev *dev) | |||
572 | blackbird_codec_settings(dev); | 575 | blackbird_codec_settings(dev); |
573 | msleep(1); | 576 | msleep(1); |
574 | 577 | ||
575 | /* blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0xef, 0xef); | ||
576 | blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0xf0, 0xf0); | ||
577 | blackbird_api_cmd(dev, IVTV_API_ASSIGN_NUM_VSYNC_LINES, 4, 0, 0x180, 0x180); */ | ||
578 | blackbird_api_cmd(dev, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, 0, | 578 | blackbird_api_cmd(dev, CX2341X_ENC_SET_NUM_VSYNC_LINES, 2, 0, |
579 | BLACKBIRD_FIELD1_SAA7115, | 579 | BLACKBIRD_FIELD1_SAA7115, |
580 | BLACKBIRD_FIELD2_SAA7115 | 580 | BLACKBIRD_FIELD2_SAA7115 |
581 | ); | 581 | ); |
582 | 582 | ||
583 | /* blackbird_api_cmd(dev, IVTV_API_ASSIGN_PLACEHOLDER, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); */ | ||
584 | blackbird_api_cmd(dev, CX2341X_ENC_SET_PLACEHOLDER, 12, 0, | 583 | blackbird_api_cmd(dev, CX2341X_ENC_SET_PLACEHOLDER, 12, 0, |
585 | BLACKBIRD_CUSTOM_EXTENSION_USR_DATA, | 584 | BLACKBIRD_CUSTOM_EXTENSION_USR_DATA, |
586 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); | 585 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0); |
587 | 586 | ||
588 | /* initialize the video input */ | ||
589 | blackbird_api_cmd(dev, CX2341X_ENC_INITIALIZE_INPUT, 0, 0); | ||
590 | |||
591 | msleep(1); | 587 | msleep(1); |
588 | return 0; | ||
589 | } | ||
590 | |||
591 | static int blackbird_start_codec(struct file *file, void *priv) | ||
592 | { | ||
593 | struct cx8802_dev *dev = ((struct cx8802_fh *)priv)->dev; | ||
594 | struct cx88_core *core = dev->core; | ||
595 | /* start capturing to the host interface */ | ||
596 | u32 reg; | ||
597 | |||
598 | int i; | ||
599 | int lastchange = -1; | ||
600 | int lastval = 0; | ||
601 | |||
602 | for (i=0; (i < 10) && (i < (lastchange + 4)); i++) | ||
603 | { | ||
604 | reg = cx_read(AUD_STATUS); | ||
605 | |||
606 | dprintk(1,"AUD_STATUS:%dL: 0x%x\n", i, reg); | ||
607 | if ((reg & 0x0F) != lastval) | ||
608 | { | ||
609 | lastval = reg & 0x0F; | ||
610 | lastchange = i; | ||
611 | } | ||
612 | msleep(100); | ||
613 | } | ||
614 | |||
615 | /* unmute audio source */ | ||
616 | cx_clear(AUD_VOL_CTL, (1 << 6)); | ||
592 | 617 | ||
593 | blackbird_api_cmd(dev, CX2341X_ENC_MUTE_VIDEO, 1, 0, BLACKBIRD_UNMUTE); | 618 | blackbird_api_cmd(dev, CX2341X_ENC_MUTE_VIDEO, 1, 0, BLACKBIRD_UNMUTE); |
594 | msleep(1); | 619 | msleep(1); |
595 | blackbird_api_cmd(dev, CX2341X_ENC_MUTE_AUDIO, 1, 0, BLACKBIRD_UNMUTE); | 620 | blackbird_api_cmd(dev, CX2341X_ENC_MUTE_AUDIO, 1, 0, BLACKBIRD_UNMUTE); |
596 | msleep(1); | 621 | msleep(1); |
597 | 622 | ||
623 | blackbird_api_cmd(dev, CX2341X_ENC_REFRESH_INPUT, 0,0); | ||
624 | |||
625 | /* initialize the video input */ | ||
626 | blackbird_api_cmd(dev, CX2341X_ENC_INITIALIZE_INPUT, 0, 0); | ||
627 | |||
598 | /* start capturing to the host interface */ | 628 | /* start capturing to the host interface */ |
599 | /* blackbird_api_cmd(dev, CX2341X_ENC_START_CAPTURE, 2, 0, 0, 0x13); */ | ||
600 | blackbird_api_cmd(dev, CX2341X_ENC_START_CAPTURE, 2, 0, | 629 | blackbird_api_cmd(dev, CX2341X_ENC_START_CAPTURE, 2, 0, |
601 | BLACKBIRD_MPEG_CAPTURE, | 630 | BLACKBIRD_MPEG_CAPTURE, |
602 | BLACKBIRD_RAW_BITS_NONE | 631 | BLACKBIRD_RAW_BITS_NONE |
603 | ); | 632 | ); |
604 | msleep(10); | 633 | msleep(10); |
605 | 634 | ||
606 | blackbird_api_cmd(dev, CX2341X_ENC_REFRESH_INPUT, 0,0); | 635 | dev->mpeg_active = 1; |
636 | return 0; | ||
637 | } | ||
638 | |||
639 | static int blackbird_stop_codec(struct cx8802_dev *dev) | ||
640 | { | ||
641 | struct cx88_core *core = dev->core; | ||
642 | |||
643 | blackbird_api_cmd(dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, | ||
644 | BLACKBIRD_END_NOW, | ||
645 | BLACKBIRD_MPEG_CAPTURE, | ||
646 | BLACKBIRD_RAW_BITS_NONE | ||
647 | ); | ||
648 | /* mute audio source */ | ||
649 | cx_set(AUD_VOL_CTL, (1 << 6)); | ||
650 | |||
651 | dev->mpeg_active = 0; | ||
607 | return 0; | 652 | return 0; |
608 | } | 653 | } |
609 | 654 | ||
@@ -833,6 +878,10 @@ static int vidioc_s_ext_ctrls (struct file *file, void *priv, | |||
833 | 878 | ||
834 | if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG) | 879 | if (f->ctrl_class != V4L2_CTRL_CLASS_MPEG) |
835 | return -EINVAL; | 880 | return -EINVAL; |
881 | |||
882 | if (dev->mpeg_active) | ||
883 | blackbird_stop_codec(dev); | ||
884 | |||
836 | p = dev->params; | 885 | p = dev->params; |
837 | err = cx2341x_ext_ctrls(&p, 0, f, VIDIOC_S_EXT_CTRLS); | 886 | err = cx2341x_ext_ctrls(&p, 0, f, VIDIOC_S_EXT_CTRLS); |
838 | if (!err) { | 887 | if (!err) { |
@@ -864,10 +913,9 @@ static int vidioc_s_frequency (struct file *file, void *priv, | |||
864 | struct cx8802_dev *dev = fh->dev; | 913 | struct cx8802_dev *dev = fh->dev; |
865 | struct cx88_core *core = dev->core; | 914 | struct cx88_core *core = dev->core; |
866 | 915 | ||
867 | blackbird_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, | 916 | if (dev->mpeg_active) |
868 | BLACKBIRD_END_NOW, | 917 | blackbird_stop_codec(dev); |
869 | BLACKBIRD_MPEG_CAPTURE, | 918 | |
870 | BLACKBIRD_RAW_BITS_NONE); | ||
871 | cx88_set_freq (core,f); | 919 | cx88_set_freq (core,f); |
872 | blackbird_initialize_codec(dev); | 920 | blackbird_initialize_codec(dev); |
873 | cx88_set_scale(dev->core, dev->width, dev->height, | 921 | cx88_set_scale(dev->core, dev->width, dev->height, |
@@ -1073,15 +1121,11 @@ static int mpeg_open(struct inode *inode, struct file *file) | |||
1073 | static int mpeg_release(struct inode *inode, struct file *file) | 1121 | static int mpeg_release(struct inode *inode, struct file *file) |
1074 | { | 1122 | { |
1075 | struct cx8802_fh *fh = file->private_data; | 1123 | struct cx8802_fh *fh = file->private_data; |
1076 | struct cx8802_dev *dev = NULL; | 1124 | struct cx8802_dev *dev = fh->dev; |
1077 | struct cx8802_driver *drv = NULL; | 1125 | struct cx8802_driver *drv = NULL; |
1078 | 1126 | ||
1079 | /* blackbird_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, BLACKBIRD_END_NOW, 0, 0x13); */ | 1127 | if (dev->mpeg_active) |
1080 | blackbird_api_cmd(fh->dev, CX2341X_ENC_STOP_CAPTURE, 3, 0, | 1128 | blackbird_stop_codec(dev); |
1081 | BLACKBIRD_END_NOW, | ||
1082 | BLACKBIRD_MPEG_CAPTURE, | ||
1083 | BLACKBIRD_RAW_BITS_NONE | ||
1084 | ); | ||
1085 | 1129 | ||
1086 | cx8802_cancel_buffers(fh->dev); | 1130 | cx8802_cancel_buffers(fh->dev); |
1087 | /* stop mpeg capture */ | 1131 | /* stop mpeg capture */ |
@@ -1107,6 +1151,10 @@ static ssize_t | |||
1107 | mpeg_read(struct file *file, char __user *data, size_t count, loff_t *ppos) | 1151 | mpeg_read(struct file *file, char __user *data, size_t count, loff_t *ppos) |
1108 | { | 1152 | { |
1109 | struct cx8802_fh *fh = file->private_data; | 1153 | struct cx8802_fh *fh = file->private_data; |
1154 | struct cx8802_dev *dev = fh->dev; | ||
1155 | |||
1156 | if (!dev->mpeg_active) | ||
1157 | blackbird_start_codec(file, fh); | ||
1110 | 1158 | ||
1111 | return videobuf_read_stream(&fh->mpegq, data, count, ppos, 0, | 1159 | return videobuf_read_stream(&fh->mpegq, data, count, ppos, 0, |
1112 | file->f_flags & O_NONBLOCK); | 1160 | file->f_flags & O_NONBLOCK); |
@@ -1282,6 +1330,7 @@ static int cx8802_blackbird_probe(struct cx8802_driver *drv) | |||
1282 | core->name); | 1330 | core->name); |
1283 | host_setup(dev->core); | 1331 | host_setup(dev->core); |
1284 | 1332 | ||
1333 | blackbird_initialize_codec(dev); | ||
1285 | blackbird_register_video(dev); | 1334 | blackbird_register_video(dev); |
1286 | 1335 | ||
1287 | /* initial device configuration: needed ? */ | 1336 | /* initial device configuration: needed ? */ |