History

[media] cx25840: Prevent device probe failure due to volume control ERANGE error

This patch fixes a regression that crept into 2.6.36. The volume control scale in the cx25840 driver has an unusual mapping from register values to v4l2 volume control values. Enforce the mapping limits, so that the default volume control setting does not fall out of bounds to prevent the cx25840 module device probe from failing.

Andy Walls committed 15 years ago

Commit f23b7951 parent 387c31c1 file · +17 −2Browse files

Unified · Split

drivers/media/video/cx25840/cx25840-core.c+17−2
@@ -1989,8 +1989,23 @@ static int cx25840_probe(struct i2c_client *client, · 1988 unmodified lines
19891989 v4l2_ctrl_new_std(&state->hdl, &cx25840_ctrl_ops,
19901990 V4L2_CID_HUE, -128, 127, 1, 0);
19911991 if (!is_cx2583x(state)) {
1992− default_volume = 228 - cx25840_read(client, 0x8d4);
1993− default_volume = ((default_volume / 2) + 23) << 9;
1992+ default_volume = cx25840_read(client, 0x8d4);
1993+ /*
1994+ * Enforce the legacy PVR-350/MSP3400 to PVR-150/CX25843 volume
1995+ * scale mapping limits to avoid -ERANGE errors when
1996+ * initializing the volume control
1997+ */
1998+ if (default_volume > 228) {
1999+ /* Bottom out at -96 dB, v4l2 vol range 0x2e00-0x2fff */
2000+ default_volume = 228;
2001+ cx25840_write(client, 0x8d4, 228);
2002+ }
2003+ else if (default_volume < 20) {
2004+ /* Top out at + 8 dB, v4l2 vol range 0xfe00-0xffff */
2005+ default_volume = 20;
2006+ cx25840_write(client, 0x8d4, 20);
2007+ }
2008+ default_volume = (((228 - default_volume) >> 1) + 23) << 9;
19942009
19952010 state->volume = v4l2_ctrl_new_std(&state->hdl,
19962011 &cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_VOLUME,