|
List Info
Thread: Fix maestro2 hardware volume control
|
|
| Fix maestro2 hardware volume control |

|
2006-09-09 20:28:58 |
From 66b98feefd7b35e8fceb50c3379508f91c3cc55a Mon Sep 17
00:00:00 2001
From: Daniel T. Chen <crimsun garnish.localdomain>
Date: Wed, 6 Sep 2006 15:46:39 -0400
Subject: [PATCH] [UBUNTU:sound/pci/] Fix maestro2 hardware
volume control
UpstreamStatus: Added in upstream alsa-kernel hg changeset:
a4d363dd2dc2 [http://hg-mirror.alsa-project.org/alsa-kernel?cmd=changes
et;node=a4d363dd2dc2122d8a772bcf4bab9a4bb14cf441;style=raw
a>]
This patch fixes the maestro2 hardware volume control and is
confirmed working on a Dell Inspiron 7000.
Signed-off-by: Ville Syrjala <syrjala sci.fi>
Signed-off-by: Daniel T Chen <crimsun ubuntu.com>
---
sound/pci/es1968.c | 40
+++++++++++++++++++++++-----------------
1 files changed, 23 insertions(+), 17 deletions(-)
diff --git a/sound/pci/es1968.c b/sound/pci/es1968.c
index 50079dc..cb98c6e 100644
--- a/sound/pci/es1968.c
+++ b/sound/pci/es1968.c
 -1906,7
+1906,7  static void es1968_update_hw_volume(unsi
/* Figure out which volume control button was pushed,
based on differences from the default register
values. */
- x = inb(chip->io_port + 0x1c);
+ x = inb(chip->io_port + 0x1c) & 0xee;
/* Reset the volume control registers. */
outb(0x88, chip->io_port + 0x1c);
outb(0x88, chip->io_port + 0x1d);
 -1922,7
+1922,8  static void es1968_update_hw_volume(unsi
/* FIXME: we can't call snd_ac97_* functions since here
is in tasklet. */
spin_lock_irqsave(&chip->ac97_lock, flags);
val = chip->ac97->regs[AC97_MASTER];
- if (x & 1) {
+ switch (x) {
+ case 0x88:
/* mute */
val ^= 0x8000;
chip->ac97->regs[AC97_MASTER] = val;
 -1930,26
+1931,31  static void es1968_update_hw_volume(unsi
outb(AC97_MASTER, chip->io_port + ESM_AC97_INDEX);
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
&chip->master_switch->id);
- } else {
- val &= 0x7fff;
- if (((x>>1) & 7) > 4) {
- /* volume up */
- if ((val & 0xff) > 0)
- val--;
- if ((val & 0xff00) > 0)
- val -= 0x0100;
- } else {
- /* volume down */
- if ((val & 0xff) < 0x1f)
- val++;
- if ((val & 0xff00) < 0x1f00)
- val += 0x0100;
- }
+ break;
+ case 0xaa:
+ /* volume up */
+ if ((val & 0x7f) > 0)
+ val--;
+ if ((val & 0x7f00) > 0)
+ val -= 0x0100;
+ chip->ac97->regs[AC97_MASTER] = val;
+ outw(val, chip->io_port + ESM_AC97_DATA);
+ outb(AC97_MASTER, chip->io_port + ESM_AC97_INDEX);
+ snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
+ &chip->master_volume->id);
+ break;
+ case 0x66:
+ /* volume down */
+ if ((val & 0x7f) < 0x1f)
+ val++;
+ if ((val & 0x7f00) < 0x1f00)
+ val += 0x0100;
chip->ac97->regs[AC97_MASTER] = val;
outw(val, chip->io_port + ESM_AC97_DATA);
outb(AC97_MASTER, chip->io_port + ESM_AC97_INDEX);
snd_ctl_notify(chip->card, SNDRV_CTL_EVENT_MASK_VALUE,
&chip->master_volume->id);
+ break;
}
spin_unlock_irqrestore(&chip->ac97_lock, flags);
}
--
1.4.1
--
Daniel T. Chen crimsun ubuntu.com
GPG key: 0xC88ABDA3
--
kernel-team mailing list
kernel-team lists.ubuntu.com
https://lists.ubuntu.com/mailman/listinfo/kernel-team
|
|
[1]
|
|
|
about | contact Other archives ( Real Estate discussion Medical topics )
|