socsvn commit: r305935 - soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve

iateaca at FreeBSD.org iateaca at FreeBSD.org
Sun Jul 10 17:37:10 UTC 2016


Author: iateaca
Date: Sun Jul 10 17:37:08 2016
New Revision: 305935
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=305935

Log:
  implement partial the SET/GET AMP GAIN/MUTE controls
  
  M    bhyve/hda_codec.c

Modified:
  soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve/hda_codec.c

Modified: soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve/hda_codec.c
==============================================================================
--- soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve/hda_codec.c	Sun Jul 10 14:17:36 2016	(r305934)
+++ soc2016/iateaca/bhyve-hda-head/usr.sbin/bhyve/hda_codec.c	Sun Jul 10 17:37:08 2016	(r305935)
@@ -24,6 +24,7 @@
 #define HDA_CODEC_CONN_LIST_COUNT		0x01
 #define HDA_CODEC_RESPONSE_EX_UNSOL		0x10
 #define HDA_CODEC_RESPONSE_EX_SOL		0x00
+#define HDA_CODEC_AMP_NUMSTEPS			0x4a
 
 #define HDA_CODEC_SUPP_STREAM_FORMATS_PCM	(1 << HDA_PARAM_SUPP_STREAM_FORMATS_PCM_SHIFT)
 
@@ -57,8 +58,11 @@
 
 #define HDA_CODEC_OUTPUT_AMP_CAP_MUTE_CAP	(1 << HDA_PARAM_OUTPUT_AMP_CAP_MUTE_CAP_SHIFT)
 #define HDA_CODEC_OUTPUT_AMP_CAP_STEPSIZE	(0x03 << HDA_PARAM_OUTPUT_AMP_CAP_STEPSIZE_SHIFT)
-#define HDA_CODEC_OUTPUT_AMP_CAP_NUMSTEPS	(0x1f << HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS_SHIFT)
-#define HDA_CODEC_OUTPUT_AMP_CAP_OFFSET		(0x00 << HDA_PARAM_OUTPUT_AMP_CAP_OFFSET_SHIFT)
+#define HDA_CODEC_OUTPUT_AMP_CAP_NUMSTEPS	(HDA_CODEC_AMP_NUMSTEPS << HDA_PARAM_OUTPUT_AMP_CAP_NUMSTEPS_SHIFT)
+#define HDA_CODEC_OUTPUT_AMP_CAP_OFFSET		(HDA_CODEC_AMP_NUMSTEPS << HDA_PARAM_OUTPUT_AMP_CAP_OFFSET_SHIFT)
+
+#define HDA_CODEC_SET_AMP_GAIN_MUTE_MUTE	0x80
+#define HDA_CODEC_SET_AMP_GAIN_MUTE_GAIN_MASK	0x7f
 
 #define HDA_CODEC_PIN_SENSE_PRESENCE_PLUGGED	(1 << 31)
 #define HDA_CODEC_PIN_WIDGET_CTRL_OUT_ENABLE	(1 << HDA_CMD_GET_PIN_WIDGET_CTRL_OUT_ENABLE_SHIFT)
@@ -116,6 +120,11 @@
 	uint8_t channel;
 	uint16_t fmt;
 
+	uint8_t left_gain;
+	uint8_t right_gain;
+	uint8_t left_mute;
+	uint8_t right_mute;
+
 	struct hda_audio_ctxt actx;
 	struct audio *aud;
 };
@@ -269,12 +278,23 @@
 hda_codec_reset(struct hda_codec_inst *hci)
 {
 	struct hda_ops *hops = NULL;
+	struct hda_codec_softc *sc = NULL;
+	struct hda_codec_stream *st = NULL;
 
 	assert(hci);
 
 	hops = hci->hops;
 	assert(hops);
 
+	sc = (struct hda_codec_softc *)hci->priv;
+	assert(sc);
+
+	st = &sc->streams[HDA_CODEC_STREAM_OUTPUT];
+	st->left_gain = HDA_CODEC_AMP_NUMSTEPS;
+	st->right_gain = HDA_CODEC_AMP_NUMSTEPS;
+	st->left_mute = HDA_CODEC_SET_AMP_GAIN_MUTE_MUTE;
+	st->right_mute = HDA_CODEC_SET_AMP_GAIN_MUTE_MUTE;
+
 	DPRINTF("cad: 0x%x\n", hci->cad);
 
 	if (!hops->signal) {
@@ -439,6 +459,8 @@
 {
 	struct hda_codec_stream *st = NULL;
 	uint32_t res = 0;
+	uint8_t mute = 0;
+	uint8_t gain = 0;
 
 	DPRINTF("verb: 0x%x, payload, 0x%x\n", verb, payload);
 
@@ -448,6 +470,34 @@
 	case HDA_CMD_VERB_SET_CONV_FMT:
 		st->fmt = payload;
 		break;
+	case HDA_CMD_VERB_GET_AMP_GAIN_MUTE:
+		assert(payload & HDA_CMD_GET_AMP_GAIN_MUTE_OUTPUT);
+		if (payload & HDA_CMD_GET_AMP_GAIN_MUTE_LEFT) {
+			res = st->left_gain | st->left_mute;
+			DPRINTF("GET_AMP_GAIN_MUTE_LEFT: 0x%x\n", res);
+		} else {
+			res = st->right_gain | st->right_mute;
+			DPRINTF("GET_AMP_GAIN_MUTE_RIGHT: 0x%x\n", res);
+		}
+		break;
+	case HDA_CMD_VERB_SET_AMP_GAIN_MUTE:
+		assert(payload & HDA_CMD_SET_AMP_GAIN_MUTE_OUTPUT);
+
+		mute = payload & HDA_CODEC_SET_AMP_GAIN_MUTE_MUTE;
+		gain = payload & HDA_CODEC_SET_AMP_GAIN_MUTE_GAIN_MASK;
+
+		if (payload & HDA_CMD_SET_AMP_GAIN_MUTE_LEFT) {
+			st->left_mute = mute;
+			st->left_gain = gain;
+			DPRINTF("SET_AMP_GAIN_MUTE_LEFT: mute: 0x%x gain: 0x%x\n", mute, gain);
+		}
+
+		if (payload & HDA_CMD_SET_AMP_GAIN_MUTE_RIGHT) {
+			st->right_mute = mute;
+			st->right_gain = gain;
+			DPRINTF("SET_AMP_GAIN_MUTE_RIGHT: mute: 0x%x gain: 0x%x\n", mute, gain);
+		}
+		break;
 	case HDA_CMD_VERB_SET_CONV_STREAM_CHAN:
 		st->channel = payload & 0x0f;
 		st->stream = (payload >> 4) & 0x0f;


More information about the svn-soc-all mailing list