]> git.ipfire.org Git - people/teissler/ipfire-2.x.git/blobdiff - src/patches/linux-3.2-bcm2835-alsamixer.patch
kernel: updated omap and rpi kernel to 2.6.42.19 (aka 3.2.19).
[people/teissler/ipfire-2.x.git] / src / patches / linux-3.2-bcm2835-alsamixer.patch
diff --git a/src/patches/linux-3.2-bcm2835-alsamixer.patch b/src/patches/linux-3.2-bcm2835-alsamixer.patch
new file mode 100644 (file)
index 0000000..bfe3d02
--- /dev/null
@@ -0,0 +1,48 @@
+diff -Naur linux-3.2.19.org/sound/arm/bcm2835-ctl.c linux-3.2.19/sound/arm/bcm2835-ctl.c
+--- linux-3.2.19.org/sound/arm/bcm2835-ctl.c   2012-06-04 21:11:15.000000000 +0200
++++ linux-3.2.19/sound/arm/bcm2835-ctl.c       2012-06-04 21:32:37.969298501 +0200
+@@ -33,6 +33,19 @@
+ #include "bcm2835.h"
++
++/* functions to convert alsa to chip volume and back. */
++int alsa2chip(int vol)
++{
++      return -((vol << 8) / 100);
++}
++
++int chip2alsa(int vol)
++{
++      return -((vol * 100) >> 8);
++}
++
++
+ static int snd_bcm2835_ctl_info(struct snd_kcontrol *kcontrol,
+                               struct snd_ctl_elem_info *uinfo)
+ {
+@@ -64,7 +77,7 @@
+       BUG_ON(!chip && !(chip->avail_substreams & AVAIL_SUBSTREAMS_MASK));
+       if (kcontrol->private_value == PCM_PLAYBACK_VOLUME)
+-              ucontrol->value.integer.value[0] = chip->volume;
++              ucontrol->value.integer.value[0] = chip2alsa(chip->volume);
+       else if (kcontrol->private_value == PCM_PLAYBACK_MUTE)
+               ucontrol->value.integer.value[0] = chip->mute;
+       else if (kcontrol->private_value == PCM_PLAYBACK_DEVICE)
+@@ -85,13 +98,10 @@
+                       changed = 1;
+               }
+               if (changed
+-                  || (ucontrol->value.integer.value[0] != chip->volume)) {
+-                      int atten;
++                  || (ucontrol->value.integer.value[0] != chip2alsa(chip->volume))) {
+-                      chip->volume = ucontrol->value.integer.value[0];
++                      chip->volume = alsa2chip(ucontrol->value.integer.value[0]);
+                       changed = 1;
+-                      atten = -((chip->volume << 8) / 100);
+-                      chip->volume = atten;
+               }
+       } else if (kcontrol->private_value == PCM_PLAYBACK_MUTE) {