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