On Sunday, December 12, 2010 19:09:36 Andy Walls wrote:
> Hans,
> 
> This has at least the same two problems the change for cx25840 had:
> 
> 1. Volume control init should use 65535 not 65335
> 
> 2. You cannot trust reg 0x8d4 to have a value in it for the default volume 
> that won't give an ERANGE error when you go to init the volume control.  
> Subdev probe will fail. See my previous cx25840 patches sent to the list, 
> awaiting action.
> 
> (The cx25840 code that trusts the volume register to be in range is already 
> in 2.6.36 and breaks IR and analog for CX23885/7/8 chips.)
> 
> I'll give this whole patch a harder look later this evening if I can.
> 
> Regards,
> Andy
> 

Would the patch below fix these issues? It compiles, but I didn't test it.

Regards,

        Hans

diff --git a/drivers/media/video/cx18/cx18-av-core.c 
b/drivers/media/video/cx18/cx18-av-core.c
index e1f58f1..73b6f4d 100644
--- a/drivers/media/video/cx18/cx18-av-core.c
+++ b/drivers/media/video/cx18/cx18-av-core.c
@@ -248,8 +248,22 @@ static void cx18_av_initialize(struct v4l2_subdev *sd)
 /*             CxDevWrReg(CXADEC_SRC_COMB_CFG, 0x6628021F); */
 /*    } */
        cx18_av_write4(cx, CXADEC_SRC_COMB_CFG, 0x6628021F);
-       default_volume = 228 - cx18_av_read(cx, 0x8d4);
-       default_volume = ((default_volume / 2) + 23) << 9;
+       default_volume = cx18_av_read(cx, 0x8d4);
+       /*
+        * Enforce the legacy volume scale mapping limits to avoid -ERANGE
+        * errors when initializing the volume control
+        */
+       if (default_volume > 228) {
+               /* Bottom out at -96 dB, v4l2 vol range 0x2e00-0x2fff */
+               default_volume = 228;
+               cx18_av_write(cx, 0x8d4, 228);
+       }
+       else if (default_volume < 20) {
+               /* Top out at + 8 dB, v4l2 vol range 0xfe00-0xffff */
+               default_volume = 20;
+               cx18_av_write(cx, 0x8d4, 20);
+       }
+       default_volume = (((228 - default_volume) >> 1) + 23) << 9;
        state->volume->cur.val = state->volume->default_value = default_volume;
        v4l2_ctrl_handler_setup(&state->hdl);
 }
@@ -1359,7 +1373,7 @@ int cx18_av_probe(struct cx18 *cx)
 
        state->volume = v4l2_ctrl_new_std(&state->hdl,
                        &cx18_av_audio_ctrl_ops, V4L2_CID_AUDIO_VOLUME,
-                       0, 65335, 65535 / 100, 0);
+                       0, 65535, 65535 / 100, 0);
        v4l2_ctrl_new_std(&state->hdl,
                        &cx18_av_audio_ctrl_ops, V4L2_CID_AUDIO_MUTE,
                        0, 1, 1, 0);

-- 
Hans Verkuil - video4linux developer - sponsored by Cisco
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to