maestro3 hardware volume control

Pyun YongHyeon yongari at rndsoft.co.kr
Thu May 26 23:23:16 PDT 2005


Hi,

I noticed hardware volume control of maestro3 didn't work.  With
small patch it worked on my system(Gateway Solo 5300).

Hardware volume control of maestro3 can be configured with two
different control pins. Unfortunately it seems that it's hard to
know which control pin was wired to control the volume.
At present maestro3 provides a way via hint file to select one of
the two configurations.

hint.pcm.0.hwvol_config="0" : select GD(game port interface) pin 6, 7
hint.pcm.0.hwvol_config="1" : select GPIO pin 4,5
If there is no hint the driver select GD pin 6, 7.

In my system selecting GD pins didn't work and a comment at the
beginning of the driver source indicates it didn't ever work. So I'd
like to change to select GPIO pins as a default hardware volume
control. For users needs to select GD pins it could be easily done
with hint.pcm.0.hwvol_config="0" in /boot/device.hints file.
But I think there are no such users since device.hints file had no
such entry.

-- 
Regards,
Pyun YongHyeon
http://www.kr.freebsd.org/~yongari	|	yongari at freebsd.org
-------------- next part --------------
--- sys/dev/sound/pci/maestro3.c.orig	Mon May 23 15:27:07 2005
+++ sys/dev/sound/pci/maestro3.c	Fri May 27 14:49:56 2005
@@ -34,7 +34,7 @@
  * (+) /dev/mixer sets left/right volumes.
  * (+) /dev/dsp recording works.  Tested successfully with the cdrom channel
  * (+) apm suspend/resume works, and works properly!.
- * (-) hardware volme controls don't work =-(
+ * (+) hardware volme controls works.
  * (-) setblocksize() does nothing.
  *
  * The real credit goes to:
@@ -93,6 +93,12 @@
 #define M3_RCHANS 1
 #define M3_MAXADDR ((1 << 27) - 1)
 
+#define M3_HW_VOL_UP 	0xaa
+#define M3_HW_VOL_DOWN 	0x66
+#define M3_HW_VOL_MUTE 	0x99
+#define M3_HW_VOL_NOP 	0x88
+#define M3_HW_VOL_ACPI_STOP 	0xff
+
 struct sc_info;
 
 struct sc_pchinfo {
@@ -998,21 +1004,24 @@
 
 		event = m3_rd_1(sc, HW_VOL_COUNTER_MASTER);
 		switch (event) {
-		case 0x99:
+		case M3_HW_VOL_MUTE:
 			mixer_hwvol_mute(sc->dev);
 			break;
-		case 0xaa:
+		case M3_HW_VOL_UP:
 			mixer_hwvol_step(sc->dev, 1, 1);
 			break;
-		case 0x66:
+		case M3_HW_VOL_DOWN:
 			mixer_hwvol_step(sc->dev, -1, -1);
 			break;
-		case 0x88:
+		case M3_HW_VOL_NOP:
+		case M3_HW_VOL_ACPI_STOP:
 			break;
 		default:
-			device_printf(sc->dev, "Unknown HWVOL event\n");
+			device_printf(sc->dev, "unknown HWVOL event 0x%x\n",
+			    event);
+			break;
 		}
-		m3_wr_1(sc, HW_VOL_COUNTER_MASTER, 0x88);
+		m3_wr_1(sc, HW_VOL_COUNTER_MASTER, M3_HW_VOL_NOP);
 
 	}
 
@@ -1512,7 +1521,8 @@
 			       "hwvol_config", &hint) == 0)
 		hv_cfg = (hint > 0) ? HV_BUTTON_FROM_GD : 0;
 	else
-		hv_cfg = HV_BUTTON_FROM_GD;
+		/* no hint, select GPIO[5:4] as h/w volume controls */
+		hv_cfg = 0;
 
 	data = pci_read_config(sc->dev, PCI_ALLEGRO_CONFIG, 4);
 	data &= ~HV_BUTTON_FROM_GD;


More information about the freebsd-multimedia mailing list