aboutsummaryrefslogtreecommitdiffstats
path: root/extras/recipes-kernel/linux/linux-omap/linus/0050-cx25840-Prevent-device-probe-failure-due-to-volume-c.patch
diff options
context:
space:
mode:
Diffstat (limited to 'extras/recipes-kernel/linux/linux-omap/linus/0050-cx25840-Prevent-device-probe-failure-due-to-volume-c.patch')
-rw-r--r--extras/recipes-kernel/linux/linux-omap/linus/0050-cx25840-Prevent-device-probe-failure-due-to-volume-c.patch52
1 files changed, 52 insertions, 0 deletions
diff --git a/extras/recipes-kernel/linux/linux-omap/linus/0050-cx25840-Prevent-device-probe-failure-due-to-volume-c.patch b/extras/recipes-kernel/linux/linux-omap/linus/0050-cx25840-Prevent-device-probe-failure-due-to-volume-c.patch
new file mode 100644
index 00000000..b1b84018
--- /dev/null
+++ b/extras/recipes-kernel/linux/linux-omap/linus/0050-cx25840-Prevent-device-probe-failure-due-to-volume-c.patch
@@ -0,0 +1,52 @@
+From 99ce7fb9211326fed836b7dee035f8a4b1df0250 Mon Sep 17 00:00:00 2001
+From: Andy Walls <awalls@md.metrocast.net>
+Date: Sun, 5 Dec 2010 19:42:30 -0300
+Subject: [PATCH 50/65] 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.
+
+Signed-off-by: Andy Walls <awalls@md.metrocast.net>
+Cc: Hans Verkuil <hverkuil@xs4all.nl>
+Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
+---
+ drivers/media/video/cx25840/cx25840-core.c | 19 +++++++++++++++++--
+ 1 files changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/video/cx25840/cx25840-core.c b/drivers/media/video/cx25840/cx25840-core.c
+index dfb198d..f164618 100644
+--- a/drivers/media/video/cx25840/cx25840-core.c
++++ b/drivers/media/video/cx25840/cx25840-core.c
+@@ -1989,8 +1989,23 @@ static int cx25840_probe(struct i2c_client *client,
+ v4l2_ctrl_new_std(&state->hdl, &cx25840_ctrl_ops,
+ V4L2_CID_HUE, -128, 127, 1, 0);
+ if (!is_cx2583x(state)) {
+- default_volume = 228 - cx25840_read(client, 0x8d4);
+- default_volume = ((default_volume / 2) + 23) << 9;
++ default_volume = cx25840_read(client, 0x8d4);
++ /*
++ * Enforce the legacy PVR-350/MSP3400 to PVR-150/CX25843 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;
++ cx25840_write(client, 0x8d4, 228);
++ }
++ else if (default_volume < 20) {
++ /* Top out at + 8 dB, v4l2 vol range 0xfe00-0xffff */
++ default_volume = 20;
++ cx25840_write(client, 0x8d4, 20);
++ }
++ default_volume = (((228 - default_volume) >> 1) + 23) << 9;
+
+ state->volume = v4l2_ctrl_new_std(&state->hdl,
+ &cx25840_audio_ctrl_ops, V4L2_CID_AUDIO_VOLUME,
+--
+1.6.6.1
+