V4L/DVB (8377): ivtv/cx18: ensure the default control values are correct
authorHans Verkuil <hverkuil@xs4all.nl>
Thu, 17 Jul 2008 15:26:45 +0000 (12:26 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Sun, 20 Jul 2008 10:28:07 +0000 (07:28 -0300)
For several MPEG controls and the volume control the default as returned
by VIDIOC_QUERYCTRL was incorrect and did not match the actual initial
value.

This is now fixed for cx18 and ivtv.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/cx18/cx18-av-core.c
drivers/media/video/cx18/cx18-av-core.h
drivers/media/video/cx2341x.c
drivers/media/video/cx25840/cx25840-core.c
drivers/media/video/cx25840/cx25840-core.h

index 3ccdf613bce0c0019bf07418b74937c87c919eec..12401425356902e0d608c0daee5f0186ddb07a0d 100644 (file)
@@ -80,6 +80,7 @@ static void log_video_status(struct cx18 *cx);
 
 static void cx18_av_initialize(struct cx18 *cx)
 {
+       struct cx18_av_state *state = &cx->av_state;
        u32 v;
 
        cx18_av_loadfw(cx);
@@ -159,6 +160,8 @@ static void cx18_av_initialize(struct cx18 *cx)
 /*             CxDevWrReg(CXADEC_SRC_COMB_CFG, 0x6628021F); */
 /*    } */
        cx18_av_write4(cx, CXADEC_SRC_COMB_CFG, 0x6628021F);
+       state->default_volume = 228 - cx18_av_read(cx, 0x8d4);
+       state->default_volume = ((state->default_volume / 2) + 23) << 9;
 }
 
 /* ----------------------------------------------------------------------- */
@@ -559,6 +562,8 @@ int cx18_av_cmd(struct cx18 *cx, unsigned int cmd, void *arg)
 
                switch (qc->id) {
                case V4L2_CID_AUDIO_VOLUME:
+                       return v4l2_ctrl_query_fill(qc, 0, 65535,
+                               65535 / 100, state->default_volume);
                case V4L2_CID_AUDIO_MUTE:
                case V4L2_CID_AUDIO_BALANCE:
                case V4L2_CID_AUDIO_BASS:
index b54239959a684e1a197946990f110a27f7eefa2f..49e31bccc5577351439994c62ebb8c741b907db2 100644 (file)
@@ -79,6 +79,7 @@ struct cx18_av_state {
        u32 audclk_freq;
        int audmode;
        int vbi_line_offset;
+       int default_volume;
        u32 id;
        u32 rev;
        int is_initialized;
index 5e40c6bd69b6f4b6b58c531b277122849249ed9f..22847a0444f59d051acd3e3d68bcbc2ad6852c50 100644 (file)
@@ -77,6 +77,61 @@ const u32 cx2341x_mpeg_ctrls[] = {
 };
 EXPORT_SYMBOL(cx2341x_mpeg_ctrls);
 
+static const struct cx2341x_mpeg_params default_params = {
+       /* misc */
+       .capabilities = 0,
+       .port = CX2341X_PORT_MEMORY,
+       .width = 720,
+       .height = 480,
+       .is_50hz = 0,
+
+       /* 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,
+       .audio_encoding = V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
+       .audio_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_224K,
+       .audio_mode = V4L2_MPEG_AUDIO_MODE_STEREO,
+       .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,
+       .video_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3,
+       .video_b_frames = 2,
+       .video_gop_size = 12,
+       .video_gop_closure = 1,
+       .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,
+       .video_spatial_filter = 0,
+       .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 = 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,
+       .video_chroma_median_filter_top = 255,
+       .video_chroma_median_filter_bottom = 0,
+};
+
 
 /* Map the control ID to the correct field in the cx2341x_mpeg_params
    struct. Return -EINVAL if the ID is unknown, else return 0. */
@@ -430,13 +485,13 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                return v4l2_ctrl_query_fill(qctrl,
                                V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
                                V4L2_MPEG_AUDIO_ENCODING_LAYER_2, 1,
-                               V4L2_MPEG_AUDIO_ENCODING_LAYER_2);
+                               default_params.audio_encoding);
 
        case V4L2_CID_MPEG_AUDIO_L2_BITRATE:
                return v4l2_ctrl_query_fill(qctrl,
                                V4L2_MPEG_AUDIO_L2_BITRATE_192K,
                                V4L2_MPEG_AUDIO_L2_BITRATE_384K, 1,
-                               V4L2_MPEG_AUDIO_L2_BITRATE_224K);
+                               default_params.audio_l2_bitrate);
 
        case V4L2_CID_MPEG_AUDIO_L1_BITRATE:
        case V4L2_CID_MPEG_AUDIO_L3_BITRATE:
@@ -479,17 +534,22 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                return cx2341x_ctrl_query_fill(qctrl,
                                V4L2_MPEG_STREAM_VBI_FMT_NONE,
                                V4L2_MPEG_STREAM_VBI_FMT_NONE, 1,
-                               V4L2_MPEG_STREAM_VBI_FMT_NONE);
+                               default_params.stream_vbi_fmt);
+
+       case V4L2_CID_MPEG_VIDEO_GOP_SIZE:
+               return v4l2_ctrl_query_fill(qctrl, 1, 34, 1,
+                               params->is_50hz ? 12 : 15);
 
        /* CX23415/6 specific */
        case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE:
                return cx2341x_ctrl_query_fill(qctrl,
                        V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL,
                        V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO, 1,
-                       V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_MANUAL);
+                       default_params.video_spatial_filter_mode);
 
        case V4L2_CID_MPEG_CX2341X_VIDEO_SPATIAL_FILTER:
-               cx2341x_ctrl_query_fill(qctrl, 0, 15, 1, 0);
+               cx2341x_ctrl_query_fill(qctrl, 0, 15, 1,
+                               default_params.video_spatial_filter);
                qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
                if (params->video_spatial_filter_mode ==
                            V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
@@ -501,7 +561,7 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                        V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF,
                        V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_2D_SYM_NON_SEPARABLE,
                        1,
-                       V4L2_MPEG_CX2341X_VIDEO_LUMA_SPATIAL_FILTER_TYPE_OFF);
+                       default_params.video_luma_spatial_filter_type);
                if (params->video_spatial_filter_mode ==
                            V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
                        qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
@@ -512,7 +572,7 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                    V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF,
                    V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_1D_HOR,
                    1,
-                   V4L2_MPEG_CX2341X_VIDEO_CHROMA_SPATIAL_FILTER_TYPE_OFF);
+                   default_params.video_chroma_spatial_filter_type);
                if (params->video_spatial_filter_mode ==
                        V4L2_MPEG_CX2341X_VIDEO_SPATIAL_FILTER_MODE_AUTO)
                        qctrl->flags |= V4L2_CTRL_FLAG_INACTIVE;
@@ -522,10 +582,11 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                return cx2341x_ctrl_query_fill(qctrl,
                        V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL,
                        V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO, 1,
-                       V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_MANUAL);
+                       default_params.video_temporal_filter_mode);
 
        case V4L2_CID_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER:
-               cx2341x_ctrl_query_fill(qctrl, 0, 31, 1, 0);
+               cx2341x_ctrl_query_fill(qctrl, 0, 31, 1,
+                               default_params.video_temporal_filter);
                qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
                if (params->video_temporal_filter_mode ==
                        V4L2_MPEG_CX2341X_VIDEO_TEMPORAL_FILTER_MODE_AUTO)
@@ -536,10 +597,11 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                return cx2341x_ctrl_query_fill(qctrl,
                        V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF,
                        V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_DIAG, 1,
-                       V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF);
+                       default_params.video_median_filter_type);
 
        case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_TOP:
-               cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 255);
+               cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,
+                               default_params.video_luma_median_filter_top);
                qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
                if (params->video_median_filter_type ==
                                V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
@@ -547,7 +609,8 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                return 0;
 
        case V4L2_CID_MPEG_CX2341X_VIDEO_LUMA_MEDIAN_FILTER_BOTTOM:
-               cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 0);
+               cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,
+                               default_params.video_luma_median_filter_bottom);
                qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
                if (params->video_median_filter_type ==
                                V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
@@ -555,7 +618,8 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                return 0;
 
        case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_TOP:
-               cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 255);
+               cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,
+                               default_params.video_chroma_median_filter_top);
                qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
                if (params->video_median_filter_type ==
                                V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
@@ -563,7 +627,8 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                return 0;
 
        case V4L2_CID_MPEG_CX2341X_VIDEO_CHROMA_MEDIAN_FILTER_BOTTOM:
-               cx2341x_ctrl_query_fill(qctrl, 0, 255, 1, 0);
+               cx2341x_ctrl_query_fill(qctrl, 0, 255, 1,
+                       default_params.video_chroma_median_filter_bottom);
                qctrl->flags |= V4L2_CTRL_FLAG_SLIDER;
                if (params->video_median_filter_type ==
                                V4L2_MPEG_CX2341X_VIDEO_MEDIAN_FILTER_TYPE_OFF)
@@ -571,7 +636,8 @@ int cx2341x_ctrl_query(const struct cx2341x_mpeg_params *params,
                return 0;
 
        case V4L2_CID_MPEG_CX2341X_STREAM_INSERT_NAV_PACKETS:
-               return cx2341x_ctrl_query_fill(qctrl, 0, 1, 1, 0);
+               return cx2341x_ctrl_query_fill(qctrl, 0, 1, 1,
+                               default_params.stream_insert_nav_packets);
 
        default:
                return v4l2_ctrl_query_fill_std(qctrl);
@@ -725,61 +791,6 @@ EXPORT_SYMBOL(cx2341x_ext_ctrls);
 
 void cx2341x_fill_defaults(struct cx2341x_mpeg_params *p)
 {
-       static struct cx2341x_mpeg_params default_params = {
-       /* misc */
-       .capabilities = 0,
-       .port = CX2341X_PORT_MEMORY,
-       .width = 720,
-       .height = 480,
-       .is_50hz = 0,
-
-       /* 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,
-       .audio_encoding = V4L2_MPEG_AUDIO_ENCODING_LAYER_2,
-       .audio_l2_bitrate = V4L2_MPEG_AUDIO_L2_BITRATE_224K,
-       .audio_mode = V4L2_MPEG_AUDIO_MODE_STEREO,
-       .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,
-       .video_aspect = V4L2_MPEG_VIDEO_ASPECT_4x3,
-       .video_b_frames = 2,
-       .video_gop_size = 12,
-       .video_gop_closure = 1,
-       .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,
-       .video_spatial_filter = 0,
-       .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 = 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,
-       .video_chroma_median_filter_top = 255,
-       .video_chroma_median_filter_bottom = 0,
-       };
-
        *p = default_params;
        cx2341x_calc_audio_properties(p);
 }
index 120c498cb60ca08d55a9f29d995552d8ffadc6bd..e7bf4f4c1319a220f448f4b352aaace26e92c5c4 100644 (file)
@@ -1204,6 +1204,8 @@ static int cx25840_command(struct i2c_client *client, unsigned int cmd,
 
                switch (qc->id) {
                        case V4L2_CID_AUDIO_VOLUME:
+                               return v4l2_ctrl_query_fill(qc, 0, 65535,
+                                       65535 / 100, state->default_volume);
                        case V4L2_CID_AUDIO_MUTE:
                        case V4L2_CID_AUDIO_BALANCE:
                        case V4L2_CID_AUDIO_BASS:
@@ -1411,6 +1413,8 @@ static int cx25840_probe(struct i2c_client *client,
        state->pvr150_workaround = 0;
        state->audmode = V4L2_TUNER_MODE_LANG1;
        state->unmute_volume = -1;
+       state->default_volume = 228 - cx25840_read(client, 0x8d4);
+       state->default_volume = ((state->default_volume / 2) + 23) << 9;
        state->vbi_line_offset = 8;
        state->id = id;
        state->rev = device_id;
index 27d8e52cd67e8db6d655685d0df76db6ab824e87..72916ba975a8a24108773a2f9487703114c414d4 100644 (file)
@@ -44,6 +44,7 @@ struct cx25840_state {
        u32 audclk_freq;
        int audmode;
        int unmute_volume; /* -1 if not muted */
+       int default_volume;
        int vbi_line_offset;
        u32 id;
        u32 rev;