i2c: Cleanup the includes of <linux/i2c.h>
[powerpc.git] / drivers / media / video / cx2341x.c
index 657e0b9..d73c86a 100644 (file)
@@ -26,7 +26,6 @@
 #include <linux/init.h>
 #include <linux/types.h>
 #include <linux/videodev2.h>
-#include <linux/i2c.h>
 
 #include <media/tuner.h>
 #include <media/cx2341x.h>
@@ -51,16 +50,18 @@ const u32 cx2341x_mpeg_ctrls[] = {
        V4L2_CID_MPEG_AUDIO_MODE_EXTENSION,
        V4L2_CID_MPEG_AUDIO_EMPHASIS,
        V4L2_CID_MPEG_AUDIO_CRC,
+       V4L2_CID_MPEG_AUDIO_MUTE,
        V4L2_CID_MPEG_VIDEO_ENCODING,
        V4L2_CID_MPEG_VIDEO_ASPECT,
        V4L2_CID_MPEG_VIDEO_B_FRAMES,
        V4L2_CID_MPEG_VIDEO_GOP_SIZE,
        V4L2_CID_MPEG_VIDEO_GOP_CLOSURE,
-       V4L2_CID_MPEG_VIDEO_PULLDOWN,
        V4L2_CID_MPEG_VIDEO_BITRATE_MODE,
        V4L2_CID_MPEG_VIDEO_BITRATE,
        V4L2_CID_MPEG_VIDEO_BITRATE_PEAK,
        V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION,
+       V4L2_CID_MPEG_VIDEO_MUTE,
+       V4L2_CID_MPEG_VIDEO_MUTE_YUV,
        V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE,
        V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER,
        V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE,
@@ -72,6 +73,7 @@ const u32 cx2341x_mpeg_ctrls[] = {
        V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP,
        V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM,
        V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP,
+       V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS,
        0
 };
 
@@ -103,6 +105,9 @@ static int cx2341x_get_ctrl(struct cx2341x_mpeg_params *params,
        case V4L2_CID_MPEG_AUDIO_CRC:
                ctrl->value = params->audio_crc;
                break;
+       case V4L2_CID_MPEG_AUDIO_MUTE:
+               ctrl->value = params->audio_mute;
+               break;
        case V4L2_CID_MPEG_VIDEO_ENCODING:
                ctrl->value = params->video_encoding;
                break;
@@ -118,9 +123,6 @@ static int cx2341x_get_ctrl(struct cx2341x_mpeg_params *params,
        case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
                ctrl->value = params->video_gop_closure;
                break;
-       case V4L2_CID_MPEG_VIDEO_PULLDOWN:
-               ctrl->value = params->video_pulldown;
-               break;
        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
                ctrl->value = params->video_bitrate_mode;
                break;
@@ -133,6 +135,12 @@ static int cx2341x_get_ctrl(struct cx2341x_mpeg_params *params,
        case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION:
                ctrl->value = params->video_temporal_decimation;
                break;
+       case V4L2_CID_MPEG_VIDEO_MUTE:
+               ctrl->value = params->video_mute;
+               break;
+       case V4L2_CID_MPEG_VIDEO_MUTE_YUV:
+               ctrl->value = params->video_mute_yuv;
+               break;
        case V4L2_CID_MPEG_STREAM_TYPE:
                ctrl->value = params->stream_type;
                break;
@@ -172,6 +180,9 @@ static int cx2341x_get_ctrl(struct cx2341x_mpeg_params *params,
        case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
                ctrl->value = params->video_chroma_median_filter_bottom;
                break;
+       case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
+               ctrl->value = params->stream_insert_nav_packets;
+               break;
        default:
                return -EINVAL;
        }
@@ -205,6 +216,9 @@ static int cx2341x_set_ctrl(struct cx2341x_mpeg_params *params,
        case V4L2_CID_MPEG_AUDIO_CRC:
                params->audio_crc = ctrl->value;
                break;
+       case V4L2_CID_MPEG_AUDIO_MUTE:
+               params->audio_mute = ctrl->value;
+               break;
        case V4L2_CID_MPEG_VIDEO_ASPECT:
                params->video_aspect = ctrl->value;
                break;
@@ -231,9 +245,6 @@ static int cx2341x_set_ctrl(struct cx2341x_mpeg_params *params,
        case V4L2_CID_MPEG_VIDEO_GOP_CLOSURE:
                params->video_gop_closure = ctrl->value;
                break;
-       case V4L2_CID_MPEG_VIDEO_PULLDOWN:
-               params->video_pulldown = ctrl->value;
-               break;
        case V4L2_CID_MPEG_VIDEO_BITRATE_MODE:
                /* MPEG-1 only allows CBR */
                if (params->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1 &&
@@ -250,6 +261,12 @@ static int cx2341x_set_ctrl(struct cx2341x_mpeg_params *params,
        case V4L2_CID_MPEG_VIDEO_TEMPORAL_DECIMATION:
                params->video_temporal_decimation = ctrl->value;
                break;
+       case V4L2_CID_MPEG_VIDEO_MUTE:
+               params->video_mute = (ctrl->value != 0);
+               break;
+       case V4L2_CID_MPEG_VIDEO_MUTE_YUV:
+               params->video_mute_yuv = ctrl->value;
+               break;
        case V4L2_CID_MPEG_STREAM_TYPE:
                params->stream_type = ctrl->value;
                params->video_encoding =
@@ -297,6 +314,9 @@ static int cx2341x_set_ctrl(struct cx2341x_mpeg_params *params,
        case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
                params->video_chroma_median_filter_bottom = ctrl->value;
                break;
+       case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
+               params->stream_insert_nav_packets = ctrl->value;
+               break;
        default:
                return -EINVAL;
        }
@@ -343,6 +363,9 @@ static int cx2341x_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 ma
        case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
                name = "Median Chroma Filter Minimum";
                break;
+       case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
+               name = "Insert Navigation Packets";
+               break;
 
        default:
                return v4l2_ctrl_query_fill(qctrl, min, max, step, def);
@@ -357,6 +380,12 @@ static int cx2341x_ctrl_query_fill(struct v4l2_queryctrl *qctrl, s32 min, s32 ma
                min = 0;
                step = 1;
                break;
+       case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
+               qctrl->type = V4L2_CTRL_TYPE_BOOLEAN;
+               min = 0;
+               max = 1;
+               step = 1;
+               break;
        default:
                qctrl->type = V4L2_CTRL_TYPE_INTEGER;
                break;
@@ -512,6 +541,9 @@ int cx2341x_ctrl_query(struct cx2341x_mpeg_params *params, struct v4l2_queryctrl
                       qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
                return 0;
 
+       case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
+               return cx2341x_ctrl_query_fill(qctrl, 0, 1, 1, 0);
+
        default:
                return v4l2_ctrl_query_fill_std(qctrl);
 
@@ -663,6 +695,7 @@ void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
        /* stream */
        .stream_type = V4L2_MPEG_STREAM_TYPE_MPEG2_PS,
        .stream_vbi_fmt = V4L2_MPEG_STREAM_VBI_FMT_NONE,
+       .stream_insert_nav_packets = 0,
 
        /* audio */
        .audio_sampling_freq = V4L2_MPEG_AUDIO_SAMPLING_FREQ_48000,
@@ -672,6 +705,7 @@ void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
        .audio_mode_extension = V4L2_MPEG_AUDIO_MODE_EXTENSION_BOUND_4,
        .audio_emphasis = V4L2_MPEG_AUDIO_EMPHASIS_NONE,
        .audio_crc = V4L2_MPEG_AUDIO_CRC_NONE,
+       .audio_mute = 0,
 
        /* video */
        .video_encoding = V4L2_MPEG_VIDEO_ENCODING_MPEG_2,
@@ -679,11 +713,12 @@ void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
        .video_b_frames = 2,
        .video_gop_size = 12,
        .video_gop_closure = 1,
-       .video_pulldown = 0,
        .video_bitrate_mode = V4L2_MPEG_VIDEO_BITRATE_MODE_VBR,
        .video_bitrate = 6000000,
        .video_bitrate_peak = 8000000,
        .video_temporal_decimation = 0,
+       .video_mute = 0,
+       .video_mute_yuv = 0x008080,  /* YCbCr value for black */
 
        /* encoding filters */
        .video_spatial_filter_mode = V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL,
@@ -742,7 +777,6 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
 
        if (old == NULL || old->width != new->width || old->height != new->height ||
                        old->video_encoding != new->video_encoding) {
-               int is_scaling;
                u16 w = new->width;
                u16 h = new->height;
 
@@ -752,20 +786,18 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
                }
                err = cx2341x_api(priv, func, CX2341X_ENC_SET_FRAME_SIZE, 2, h, w);
                if (err) return err;
+       }
 
+       if (new->width != 720 || new->height != (new->is_50hz ? 576 : 480)) {
                /* Adjust temporal filter if necessary. The problem with the temporal
                   filter is that it works well with full resolution capturing, but
                   not when the capture window is scaled (the filter introduces
-                  a ghosting effect). So if the capture window changed, and there is
-                  no updated filter value, then the filter is set depending on whether
-                  the new window is full resolution or not.
+                  a ghosting effect). So if the capture window is scaled, then
+                  force the filter to 0.
 
-                  For full resolution a setting of 8 really improves the video
+                  For full resolution the filter really improves the video
                   quality, especially if the original video quality is suboptimal. */
-               is_scaling = new->width != 720 || new->height != (new->is_50hz ? 576 : 480);
-               if (old && old->video_temporal_filter == temporal) {
-                       temporal = is_scaling ? 0 : 8;
-               }
+               temporal = 0;
        }
 
        if (old == NULL || old->stream_type != new->stream_type) {
@@ -786,14 +818,14 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
                err = cx2341x_api(priv, func, CX2341X_ENC_SET_GOP_CLOSURE, 1, new->video_gop_closure);
                if (err) return err;
        }
-       if (old == NULL || old->video_pulldown != new->video_pulldown) {
-               err = cx2341x_api(priv, func, CX2341X_ENC_SET_3_2_PULLDOWN, 1, new->video_pulldown);
-               if (err) return err;
-       }
        if (old == NULL || old->audio_properties != new->audio_properties) {
                err = cx2341x_api(priv, func, CX2341X_ENC_SET_AUDIO_PROPERTIES, 1, new->audio_properties);
                if (err) return err;
        }
+       if (old == NULL || old->audio_mute != new->audio_mute) {
+               err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_AUDIO, 1, new->audio_mute);
+               if (err) return err;
+       }
        if (old == NULL || old->video_bitrate_mode != new->video_bitrate_mode ||
                old->video_bitrate != new->video_bitrate ||
                old->video_bitrate_peak != new->video_bitrate_peak) {
@@ -841,6 +873,15 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
                        new->video_temporal_decimation);
                if (err) return err;
        }
+       if (old == NULL || old->video_mute != new->video_mute ||
+                       (new->video_mute && old->video_mute_yuv != new->video_mute_yuv)) {
+               err = cx2341x_api(priv, func, CX2341X_ENC_MUTE_VIDEO, 1, new->video_mute | (new->video_mute_yuv << 8));
+               if (err) return err;
+       }
+       if (old == NULL || old->stream_insert_nav_packets != new->stream_insert_nav_packets) {
+               err = cx2341x_api(priv, func, CX2341X_ENC_MISC, 2, 7, new->stream_insert_nav_packets);
+               if (err) return err;
+       }
        return 0;
 }
 
@@ -866,20 +907,25 @@ invalid:
 void cx2341x_log_status(struct cx2341x_mpeg_params *p, const char *prefix)
 {
        int is_mpeg1 = p->video_encoding == V4L2_MPEG_VIDEO_ENCODING_MPEG_1;
+       int temporal = p->video_temporal_filter;
 
        /* Stream */
-       printk(KERN_INFO "%s: Stream: %s\n",
+       printk(KERN_INFO "%s: Stream: %s",
                prefix,
                cx2341x_menu_item(p, V4L2_CID_MPEG_STREAM_TYPE));
+       if (p->stream_insert_nav_packets)
+               printk(" (with navigation packets)");
+       printk("\n");
        printk(KERN_INFO "%s: VBI Format: %s\n",
                prefix,
                cx2341x_menu_item(p, V4L2_CID_MPEG_STREAM_VBI_FMT));
 
        /* Video */
-       printk(KERN_INFO "%s: Video:  %dx%d, %d fps\n",
+       printk(KERN_INFO "%s: Video:  %dx%d, %d fps%s\n",
                prefix,
                p->width / (is_mpeg1 ? 2 : 1), p->height / (is_mpeg1 ? 2 : 1),
-               p->is_50hz ? 25 : 30);
+               p->is_50hz ? 25 : 30,
+               (p->video_mute) ? " (muted)" : "");
        printk(KERN_INFO "%s: Video:  %s, %s, %s, %d",
                prefix,
                cx2341x_menu_item(p, V4L2_CID_MPEG_VIDEO_ENCODING),
@@ -890,23 +936,23 @@ void cx2341x_log_status(struct cx2341x_mpeg_params *p, const char *prefix)
                printk(", Peak %d", p->video_bitrate_peak);
        }
        printk("\n");
-       printk(KERN_INFO "%s: Video:  GOP Size %d, %d B-Frames, %sGOP Closure, %s3:2 Pulldown\n",
+       printk(KERN_INFO "%s: Video:  GOP Size %d, %d B-Frames, %sGOP Closure\n",
                prefix,
                p->video_gop_size, p->video_b_frames,
-               p->video_gop_closure ? "" : "No ",
-               p->video_pulldown ? "" : "No ");
+               p->video_gop_closure ? "" : "No ");
        if (p->video_temporal_decimation) {
                printk(KERN_INFO "%s: Video: Temporal Decimation %d\n",
                        prefix, p->video_temporal_decimation);
        }
 
        /* Audio */
-       printk(KERN_INFO "%s: Audio:  %s, %s, %s, %s",
+       printk(KERN_INFO "%s: Audio:  %s, %s, %s, %s%s",
                prefix,
                cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_SAMPLING_FREQ),
                cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_ENCODING),
                cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_L2_BITRATE),
-               cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE));
+               cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE),
+               p->audio_mute ? " (muted)" : "");
        if (p->audio_mode == V4L2_MPEG_AUDIO_MODE_JOINT_STEREO) {
                printk(", %s",
                        cx2341x_menu_item(p, V4L2_CID_MPEG_AUDIO_MODE_EXTENSION));
@@ -922,10 +968,13 @@ void cx2341x_log_status(struct cx2341x_mpeg_params *p, const char *prefix)
                cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE),
                cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE),
                p->video_spatial_filter);
+       if (p->width != 720 || p->height != (p->is_50hz ? 576 : 480)) {
+               temporal = 0;
+       }
        printk(KERN_INFO "%s: Temporal Filter: %s, %d\n",
                prefix,
                cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE),
-               p->video_temporal_filter);
+               temporal);
        printk(KERN_INFO "%s: Median Filter:   %s, Luma [%d, %d], Chroma [%d, %d]\n",
                prefix,
                cx2341x_menu_item(p, V4L2_CID_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE),