i2c: Cleanup the includes of <linux/i2c.h>
[powerpc.git] / drivers / media / video / cx2341x.c
index 65f00fc..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,
@@ -691,7 +726,7 @@ void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
        .video_luma_spatial_filter_type = V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_1D_HOR,
        .video_chroma_spatial_filter_type = V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR,
        .video_temporal_filter_mode = V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL,
-       .video_temporal_filter = 0,
+       .video_temporal_filter = 8,
        .video_median_filter_type = V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF,
        .video_luma_median_filter_top = 255,
        .video_luma_median_filter_bottom = 0,
@@ -731,6 +766,7 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
        };
 
        int err = 0;
+       u16 temporal = new->video_temporal_filter;
 
        cx2341x_api(priv, func, CX2341X_ENC_SET_OUTPUT_PORT, 2, new->port, 0);
 
@@ -752,6 +788,18 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
                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 is scaled, then
+                  force the filter to 0.
+
+                  For full resolution the filter really improves the video
+                  quality, especially if the original video quality is suboptimal. */
+               temporal = 0;
+       }
+
        if (old == NULL || old->stream_type != new->stream_type) {
                err = cx2341x_api(priv, func, CX2341X_ENC_SET_STREAM_TYPE, 1, mpeg_stream_type[new->stream_type]);
                if (err) return err;
@@ -770,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) {
@@ -815,9 +863,9 @@ int cx2341x_update(void *priv, cx2341x_mbox_func func,
        }
        if (old == NULL ||
                old->video_spatial_filter != new->video_spatial_filter ||
-               old->video_temporal_filter != new->video_temporal_filter) {
+               old->video_temporal_filter != temporal) {
                err = cx2341x_api(priv, func, CX2341X_ENC_SET_DNR_FILTER_PROPS, 2,
-                       new->video_spatial_filter, new->video_temporal_filter);
+                       new->video_spatial_filter, temporal);
                if (err) return err;
        }
        if (old == NULL || old->video_temporal_decimation != new->video_temporal_decimation) {
@@ -825,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;
 }
 
@@ -850,17 +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),
@@ -871,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));
@@ -903,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),