Skip to content

Commit

Permalink
I add the ability to accept the default pin widget configuration to help
Browse files Browse the repository at this point in the history
with various laptops using hdaa(4) sound devices.  We don't seem to know
the "correct" configurations for these devices and the defaults are far
superiour, e.g. they work if you don't nuke the default configs.

PR:	200526
Differential Revision:	https://reviews.freebsd.org/D17772
  • Loading branch information
seanbruno committed Jul 17, 2019
1 parent 31b6752 commit fceeeec
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 6 deletions.
8 changes: 7 additions & 1 deletion share/man/man4/snd_hda.4
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd April 1, 2018
.Dd July 16, 2019
.Dt SND_HDA 4
.Os
.Sh NAME
Expand Down Expand Up @@ -153,6 +153,12 @@ The
and
.Dq Li ovref Ns Ar X
options control the voltage used to power external microphones.
.It Va dev.hdaa.%d.init_clear
Zero out the pin widget config setup by the system.
Some systems seem to have unuseable audio devices if the pin widgit
configuration is cleared.
Set this value to 0 to accept the default configuration values setup by the
BIOS.
.It Va hint.hdaa.%d.gpio_config
Overrides audio function GPIO pins configuration set by BIOS.
May be specified as a set of space-separated
Expand Down
16 changes: 11 additions & 5 deletions sys/dev/sound/pci/hda/hdaa.c
Original file line number Diff line number Diff line change
Expand Up @@ -5034,11 +5034,13 @@ hdaa_audio_prepare_pin_ctrl(struct hdaa_devinfo *devinfo)
pincap = w->wclass.pin.cap;

/* Disable everything. */
w->wclass.pin.ctrl &= ~(
HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE |
HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE |
HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE |
HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK);
if (devinfo->init_clear) {
w->wclass.pin.ctrl &= ~(
HDA_CMD_SET_PIN_WIDGET_CTRL_HPHN_ENABLE |
HDA_CMD_SET_PIN_WIDGET_CTRL_OUT_ENABLE |
HDA_CMD_SET_PIN_WIDGET_CTRL_IN_ENABLE |
HDA_CMD_SET_PIN_WIDGET_CTRL_VREF_ENABLE_MASK);
}

if (w->enable == 0) {
/* Pin is unused so left it disabled. */
Expand Down Expand Up @@ -6671,6 +6673,10 @@ hdaa_attach(device_t dev)
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
"reconfig", CTLTYPE_INT | CTLFLAG_RW,
dev, 0, hdaa_sysctl_reconfig, "I", "Reprocess configuration");
SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
"init_clear", CTLFLAG_RW,
&devinfo->init_clear, 1,"Clear initial pin widget configuration");
bus_generic_attach(dev);
return (0);
}
Expand Down
1 change: 1 addition & 0 deletions sys/dev/sound/pci/hda/hdaa.h
Original file line number Diff line number Diff line change
Expand Up @@ -214,6 +214,7 @@ struct hdaa_devinfo {
struct hdaa_chan *chans;
struct callout poll_jack;
int poll_ival;
uint32_t init_clear;
};

#define HDAA_CHN_RUNNING 0x00000001
Expand Down

0 comments on commit fceeeec

Please sign in to comment.