3030#define SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK BIT(4)
3131#define SOF_ES8336_ENABLE_DMIC BIT(5)
3232#define SOF_ES8336_JD_INVERTED BIT(6)
33+ #define SOF_ES8336_HEADPHONE_GPIO BIT(7)
3334
3435static unsigned long quirk ;
3536
@@ -39,7 +40,7 @@ MODULE_PARM_DESC(quirk, "Board-specific quirk override");
3940
4041struct sof_es8336_private {
4142 struct device * codec_dev ;
42- struct gpio_desc * gpio_speakers ;
43+ struct gpio_desc * gpio_speakers , * gpio_headphone ;
4344 struct snd_soc_jack jack ;
4445 struct list_head hdmi_pcm_list ;
4546 bool speaker_en ;
@@ -51,15 +52,27 @@ struct sof_hdmi_pcm {
5152 int device ;
5253};
5354
54- static const struct acpi_gpio_params speakers_enable_gpio0 = { 0 , 0 , true };
55+ static const struct acpi_gpio_params enable_gpio0 = { 0 , 0 , true };
56+ static const struct acpi_gpio_params enable_gpio1 = { 1 , 0 , true };
57+
5558static const struct acpi_gpio_mapping acpi_speakers_enable_gpio0 [] = {
56- { "speakers-enable-gpios" , & speakers_enable_gpio0 , 1 },
59+ { "speakers-enable-gpios" , & enable_gpio0 , 1 },
5760 { }
5861};
5962
60- static const struct acpi_gpio_params speakers_enable_gpio1 = { 1 , 0 , true };
6163static const struct acpi_gpio_mapping acpi_speakers_enable_gpio1 [] = {
62- { "speakers-enable-gpios" , & speakers_enable_gpio1 , 1 },
64+ { "speakers-enable-gpios" , & enable_gpio1 , 1 },
65+ };
66+
67+ static const struct acpi_gpio_mapping acpi_enable_both_gpios [] = {
68+ { "speakers-enable-gpios" , & enable_gpio0 , 1 },
69+ { "headphone-enable-gpios" , & enable_gpio1 , 1 },
70+ { }
71+ };
72+
73+ static const struct acpi_gpio_mapping acpi_enable_both_gpios_rev_order [] = {
74+ { "speakers-enable-gpios" , & enable_gpio1 , 1 },
75+ { "headphone-enable-gpios" , & enable_gpio0 , 1 },
6376 { }
6477};
6578
@@ -73,6 +86,8 @@ static void log_quirks(struct device *dev)
7386 dev_info (dev , "quirk DMIC enabled\n" );
7487 if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK )
7588 dev_info (dev , "Speakers GPIO1 quirk enabled\n" );
89+ if (quirk & SOF_ES8336_HEADPHONE_GPIO )
90+ dev_info (dev , "quirk headphone GPIO enabled\n" );
7691 if (quirk & SOF_ES8336_JD_INVERTED )
7792 dev_info (dev , "quirk JD inverted enabled\n" );
7893}
@@ -83,13 +98,24 @@ static int sof_es8316_speaker_power_event(struct snd_soc_dapm_widget *w,
8398 struct snd_soc_card * card = w -> dapm -> card ;
8499 struct sof_es8336_private * priv = snd_soc_card_get_drvdata (card );
85100
101+ if (priv -> speaker_en == !SND_SOC_DAPM_EVENT_ON (event ))
102+ return 0 ;
103+
104+ priv -> speaker_en = !SND_SOC_DAPM_EVENT_ON (event );
105+
86106 if (SND_SOC_DAPM_EVENT_ON (event ))
87- priv -> speaker_en = false;
88- else
89- priv -> speaker_en = true;
107+ msleep (70 );
90108
91109 gpiod_set_value_cansleep (priv -> gpio_speakers , priv -> speaker_en );
92110
111+ if (!(quirk & SOF_ES8336_HEADPHONE_GPIO ))
112+ return 0 ;
113+
114+ if (SND_SOC_DAPM_EVENT_ON (event ))
115+ msleep (70 );
116+
117+ gpiod_set_value_cansleep (priv -> gpio_headphone , priv -> speaker_en );
118+
93119 return 0 ;
94120}
95121
@@ -114,7 +140,7 @@ static const struct snd_soc_dapm_route sof_es8316_audio_map[] = {
114140
115141 /*
116142 * There is no separate speaker output instead the speakers are muxed to
117- * the HP outputs. The mux is controlled by the " Speaker Power" supply .
143+ * the HP outputs. The mux is controlled Speaker and/or headphone switch .
118144 */
119145 {"Speaker" , NULL , "HPOL" },
120146 {"Speaker" , NULL , "HPOR" },
@@ -233,8 +259,14 @@ static int sof_es8336_quirk_cb(const struct dmi_system_id *id)
233259{
234260 quirk = (unsigned long )id -> driver_data ;
235261
236- if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK )
262+ if (quirk & SOF_ES8336_HEADPHONE_GPIO ) {
263+ if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK )
264+ gpio_mapping = acpi_enable_both_gpios ;
265+ else
266+ gpio_mapping = acpi_enable_both_gpios_rev_order ;
267+ } else if (quirk & SOF_ES8336_SPEAKERS_EN_GPIO1_QUIRK ) {
237268 gpio_mapping = acpi_speakers_enable_gpio1 ;
269+ }
238270
239271 return 1 ;
240272}
@@ -592,6 +624,13 @@ static int sof_es8336_probe(struct platform_device *pdev)
592624 goto err_put_codec ;
593625 }
594626
627+ priv -> gpio_headphone = gpiod_get_optional (codec_dev , "headphone-enable" , GPIOD_OUT_LOW );
628+ if (IS_ERR (priv -> gpio_headphone )) {
629+ ret = dev_err_probe (dev , PTR_ERR (priv -> gpio_headphone ),
630+ "could not get headphone-enable GPIO\n" );
631+ goto err_put_codec ;
632+ }
633+
595634 INIT_LIST_HEAD (& priv -> hdmi_pcm_list );
596635
597636 snd_soc_card_set_drvdata (card , priv );
0 commit comments