|
@@ -5402,6 +5402,54 @@ static int stac92hd71bxx_connected_smuxes(struct hda_codec *codec,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/* HP dv7 bass switch - GPIO5 */
|
|
|
+#define stac_hp_bass_gpio_info snd_ctl_boolean_mono_info
|
|
|
+static int stac_hp_bass_gpio_get(struct snd_kcontrol *kcontrol,
|
|
|
+ struct snd_ctl_elem_value *ucontrol)
|
|
|
+{
|
|
|
+ struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
+ struct sigmatel_spec *spec = codec->spec;
|
|
|
+ ucontrol->value.integer.value[0] = !!(spec->gpio_data & 0x20);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int stac_hp_bass_gpio_put(struct snd_kcontrol *kcontrol,
|
|
|
+ struct snd_ctl_elem_value *ucontrol)
|
|
|
+{
|
|
|
+ struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
|
|
|
+ struct sigmatel_spec *spec = codec->spec;
|
|
|
+ unsigned int gpio_data;
|
|
|
+
|
|
|
+ gpio_data = (spec->gpio_data & ~0x20) |
|
|
|
+ (ucontrol->value.integer.value[0] ? 0x20 : 0);
|
|
|
+ if (gpio_data == spec->gpio_data)
|
|
|
+ return 0;
|
|
|
+ spec->gpio_data = gpio_data;
|
|
|
+ stac_gpio_set(codec, spec->gpio_mask, spec->gpio_dir, spec->gpio_data);
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+static struct snd_kcontrol_new stac_hp_bass_sw_ctrl = {
|
|
|
+ .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
|
|
|
+ .info = stac_hp_bass_gpio_info,
|
|
|
+ .get = stac_hp_bass_gpio_get,
|
|
|
+ .put = stac_hp_bass_gpio_put,
|
|
|
+};
|
|
|
+
|
|
|
+static int stac_add_hp_bass_switch(struct hda_codec *codec)
|
|
|
+{
|
|
|
+ struct sigmatel_spec *spec = codec->spec;
|
|
|
+
|
|
|
+ if (!stac_control_new(spec, &stac_hp_bass_sw_ctrl,
|
|
|
+ "Bass Speaker Playback Switch", 0))
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ spec->gpio_mask |= 0x20;
|
|
|
+ spec->gpio_dir |= 0x20;
|
|
|
+ spec->gpio_data |= 0x20;
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static int patch_stac92hd71bxx(struct hda_codec *codec)
|
|
|
{
|
|
|
struct sigmatel_spec *spec;
|
|
@@ -5642,6 +5690,15 @@ again:
|
|
|
return err;
|
|
|
}
|
|
|
|
|
|
+ /* enable bass on HP dv7 */
|
|
|
+ if (spec->board_config == STAC_HP_DV5) {
|
|
|
+ unsigned int cap;
|
|
|
+ cap = snd_hda_param_read(codec, 0x1, AC_PAR_GPIO_CAP);
|
|
|
+ cap &= AC_GPIO_IO_COUNT;
|
|
|
+ if (cap >= 6)
|
|
|
+ stac_add_hp_bass_switch(codec);
|
|
|
+ }
|
|
|
+
|
|
|
codec->proc_widget_hook = stac92hd7x_proc_hook;
|
|
|
|
|
|
return 0;
|