diff mbox series

[v6,5/9] ASoC: SOF: Intel: add support for snd-hda-codec-hdmi

Message ID 20191011112745.25800-6-kai.vehmanen@linux.intel.com (mailing list archive)
State New, archived
Headers show
Series adapt SOF to use snd-hda-codec-hdmi | expand

Commit Message

Kai Vehmanen Oct. 11, 2019, 11:27 a.m. UTC
Add support to implement HDMI/DP audio by using the common
snd-hda-codec-hdmi driver.

Change of codec driver affects user-space as the two
drivers expose different mixer controls. A new kernel
module option "use_common_hdmi" is added to user-space
to indicate which interface should be used. The default
driver can be selected via a Kconfig option.

Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
---
 sound/soc/sof/intel/Kconfig     | 10 ++++++++++
 sound/soc/sof/intel/hda-codec.c | 22 ++++++++++++++++++----
 sound/soc/sof/intel/hda.c       |  6 ++++++
 sound/soc/sof/intel/hda.h       |  6 ++++--
 4 files changed, 38 insertions(+), 6 deletions(-)

Comments

Pierre-Louis Bossart Oct. 11, 2019, 2 p.m. UTC | #1
On 10/11/19 6:27 AM, Kai Vehmanen wrote:
> Add support to implement HDMI/DP audio by using the common
> snd-hda-codec-hdmi driver.
> 
> Change of codec driver affects user-space as the two
> drivers expose different mixer controls. A new kernel
> module option "use_common_hdmi" is added to user-space
> to indicate which interface should be used. The default
> driver can be selected via a Kconfig option.
> 
> Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
> ---
>   sound/soc/sof/intel/Kconfig     | 10 ++++++++++
>   sound/soc/sof/intel/hda-codec.c | 22 ++++++++++++++++++----
>   sound/soc/sof/intel/hda.c       |  6 ++++++
>   sound/soc/sof/intel/hda.h       |  6 ++++--
>   4 files changed, 38 insertions(+), 6 deletions(-)
> 
> diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig
> index 18c41fdc47c8..31d9222e45aa 100644
> --- a/sound/soc/sof/intel/Kconfig
> +++ b/sound/soc/sof/intel/Kconfig
> @@ -273,6 +273,16 @@ config SND_SOC_SOF_HDA_AUDIO_CODEC
>   	  Say Y if you want to enable HDAudio codecs with SOF.
>   	  If unsure select "N".
>   
> +config SND_SOC_SOF_HDA_COMMON_HDMI_CODEC
> +	bool "SOF common HDA HDMI codec driver"
> +	depends on SND_SOC_SOF_HDA_LINK
> +	depends on SND_HDA_CODEC_HDMI
> +	help
> +	  This adds support for HDMI audio by using the common HDA
> +	  HDMI/DisplayPort codec driver.
> +	  Say Y if you want to use the common codec driver with SOF.
> +	  If unsure select "Y".
> +
>   endif ## SND_SOC_SOF_HDA_COMMON

Kai, I get a conflict when I try to apply these patches on Mark's tree? 
You probably want to rebase?
Or was the intent to go through Takashi's tree?

diff --cc sound/soc/sof/intel/Kconfig
index d62f51d33be1,31d9222e45aa..000000000000
--- a/sound/soc/sof/intel/Kconfig
+++ b/sound/soc/sof/intel/Kconfig
@@@ -273,15 -273,15 +273,27 @@@ config SND_SOC_SOF_HDA_AUDIO_CODE
           Say Y if you want to enable HDAudio codecs with SOF.
           If unsure select "N".

++<<<<<<< HEAD
  +config SND_SOC_SOF_HDA_ALWAYS_ENABLE_DMI_L1
  +      bool "SOF enable DMI Link L1"
  +      help
  +        This option enables DMI L1 for both playback and capture
  +        and disables known workarounds for specific HDaudio platforms.
  +        Only use to look into power optimizations on platforms not
  +        affected by DMI L1 issues. This option is not recommended.
  +        Say Y if you want to enable DMI Link L1
  +        If unsure, select "N".
++=======
+ config SND_SOC_SOF_HDA_COMMON_HDMI_CODEC
+       bool "SOF common HDA HDMI codec driver"
+       depends on SND_SOC_SOF_HDA_LINK
+       depends on SND_HDA_CODEC_HDMI
+       help
+         This adds support for HDMI audio by using the common HDA
+         HDMI/DisplayPort codec driver.
+         Say Y if you want to use the common codec driver with SOF.
+         If unsure select "Y".
++>>>>>>> ASoC: SOF: Intel: add support for snd-hda-codec-hdmi

   endif ## SND_SOC_SOF_HDA_COMMON
>   
>   config SND_SOC_SOF_HDA_LINK_BASELINE
> diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c
> index 3ca6795a89ba..9ad36e14072c 100644
> --- a/sound/soc/sof/intel/hda-codec.c
> +++ b/sound/soc/sof/intel/hda-codec.c
> @@ -84,6 +84,8 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address)
>   {
>   #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC)
>   	struct hdac_hda_priv *hda_priv;
> +	struct snd_soc_acpi_mach_params *mach_params = 0;
> +	struct snd_sof_pdata *pdata = sdev->pdata;
>   #endif
>   	struct hda_bus *hbus = sof_to_hbus(sdev);
>   	struct hdac_device *hdev;
> @@ -113,8 +115,19 @@ static int hda_codec_probe(struct snd_sof_dev *sdev, int address)
>   	if (ret < 0)
>   		return ret;
>   
> -	/* use legacy bus only for HDA codecs, idisp uses ext bus */
> -	if ((resp & 0xFFFF0000) != IDISP_VID_INTEL) {
> +	if (pdata->machine)
> +		mach_params = (struct snd_soc_acpi_mach_params *)
> +			&pdata->machine->mach_params;
> +
> +	if ((resp & 0xFFFF0000) == IDISP_VID_INTEL)
> +		hda_priv->need_display_power = true;
> +
> +	/*
> +	 * if common HDMI codec driver is not used, codec load
> +	 * is skipped here and hdac_hdmi is used instead
> +	 */
> +	if ((mach_params && mach_params->common_hdmi_codec_drv) ||
> +	    (resp & 0xFFFF0000) != IDISP_VID_INTEL) {
>   		hdev->type = HDA_DEV_LEGACY;
>   		hda_codec_load_module(&hda_priv->codec);
>   	}
> @@ -155,7 +168,8 @@ int hda_codec_probe_bus(struct snd_sof_dev *sdev)
>   }
>   EXPORT_SYMBOL(hda_codec_probe_bus);
>   
> -#if IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)
> +#if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) || \
> +	IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)
>   
>   void hda_codec_i915_get(struct snd_sof_dev *sdev)
>   {
> @@ -204,6 +218,6 @@ int hda_codec_i915_exit(struct snd_sof_dev *sdev)
>   }
>   EXPORT_SYMBOL(hda_codec_i915_exit);
>   
> -#endif /* CONFIG_SND_SOC_HDAC_HDMI */
> +#endif
>   
>   MODULE_LICENSE("Dual BSD/GPL");
> diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
> index c72e9a09eee1..ee742157516e 100644
> --- a/sound/soc/sof/intel/hda.c
> +++ b/sound/soc/sof/intel/hda.c
> @@ -54,6 +54,11 @@ MODULE_PARM_DESC(use_msi, "SOF HDA use PCI MSI mode");
>   static int hda_dmic_num = -1;
>   module_param_named(dmic_num, hda_dmic_num, int, 0444);
>   MODULE_PARM_DESC(dmic_num, "SOF HDA DMIC number");
> +
> +static bool hda_codec_use_common_hdmi =
> +	IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_COMMON_HDMI_CODEC);
> +module_param_named(use_common_hdmi, hda_codec_use_common_hdmi, bool, 0444);
> +MODULE_PARM_DESC(use_common_hdmi, "SOF HDA use common HDMI codec driver");
>   #endif
>   
>   static const struct hda_dsp_msg_code hda_dsp_rom_msg[] = {
> @@ -458,6 +463,7 @@ static int hda_init_caps(struct snd_sof_dev *sdev)
>   			&pdata->machine->mach_params;
>   		mach_params->codec_mask = bus->codec_mask;
>   		mach_params->platform = dev_name(sdev->dev);
> +		mach_params->common_hdmi_codec_drv = hda_codec_use_common_hdmi;
>   	}
>   
>   	/* create codec instances */
> diff --git a/sound/soc/sof/intel/hda.h b/sound/soc/sof/intel/hda.h
> index 5591841a1b6f..28640a29e1b6 100644
> --- a/sound/soc/sof/intel/hda.h
> +++ b/sound/soc/sof/intel/hda.h
> @@ -562,7 +562,9 @@ void hda_codec_jack_check(struct snd_sof_dev *sdev);
>   
>   #endif /* CONFIG_SND_SOC_SOF_HDA */
>   
> -#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) && IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)
> +#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) && \
> +	(IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) || \
> +	 IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
>   
>   void hda_codec_i915_get(struct snd_sof_dev *sdev);
>   void hda_codec_i915_put(struct snd_sof_dev *sdev);
> @@ -576,7 +578,7 @@ static inline void hda_codec_i915_put(struct snd_sof_dev *sdev)  { }
>   static inline int hda_codec_i915_init(struct snd_sof_dev *sdev) { return 0; }
>   static inline int hda_codec_i915_exit(struct snd_sof_dev *sdev) { return 0; }
>   
> -#endif /* CONFIG_SND_SOC_SOF_HDA && CONFIG_SND_SOC_HDAC_HDMI */
> +#endif
>   
>   /*
>    * Trace Control.
>
Kai Vehmanen Oct. 11, 2019, 2:10 p.m. UTC | #2
Hey,

On Fri, 11 Oct 2019, Pierre-Louis Bossart wrote:
> Kai, I get a conflict when I try to apply these patches on Mark's tree? You
> probably want to rebase?
> Or was the intent to go through Takashi's tree?

I rebased this on top of Takashi's latest before sending:

07be92a0e6b0 (tiwai/master) Merge branch 'for-next'

But yeah, the series will conflict with the DMI patch in Mark's tree:

43b2ab9009b1 ASoC: SOF: Intel: hda: Disable DMI L1 entry during capture

Br, Kai
Takashi Iwai Oct. 17, 2019, 7:58 a.m. UTC | #3
On Fri, 11 Oct 2019 16:10:29 +0200,
Kai Vehmanen wrote:
> 
> Hey,
> 
> On Fri, 11 Oct 2019, Pierre-Louis Bossart wrote:
> > Kai, I get a conflict when I try to apply these patches on Mark's tree? You
> > probably want to rebase?
> > Or was the intent to go through Takashi's tree?
> 
> I rebased this on top of Takashi's latest before sending:
> 
> 07be92a0e6b0 (tiwai/master) Merge branch 'for-next'
> 
> But yeah, the series will conflict with the DMI patch in Mark's tree:
> 
> 43b2ab9009b1 ASoC: SOF: Intel: hda: Disable DMI L1 entry during capture

A trivial conflict can be resolved by either Mark or my side, so don't
worry too much about it.

But if the patches don't rely on the new stuff that are found only in
my tree, maybe it's better to rebase on Mark's tree, so that you can
follow the whole other SOF development.


thanks,

Takashi
Pierre-Louis Bossart Oct. 17, 2019, 1:20 p.m. UTC | #4
On 10/17/19 2:58 AM, Takashi Iwai wrote:
> On Fri, 11 Oct 2019 16:10:29 +0200,
> Kai Vehmanen wrote:
>>
>> Hey,
>>
>> On Fri, 11 Oct 2019, Pierre-Louis Bossart wrote:
>>> Kai, I get a conflict when I try to apply these patches on Mark's tree? You
>>> probably want to rebase?
>>> Or was the intent to go through Takashi's tree?
>>
>> I rebased this on top of Takashi's latest before sending:
>>
>> 07be92a0e6b0 (tiwai/master) Merge branch 'for-next'
>>
>> But yeah, the series will conflict with the DMI patch in Mark's tree:
>>
>> 43b2ab9009b1 ASoC: SOF: Intel: hda: Disable DMI L1 entry during capture
> 
> A trivial conflict can be resolved by either Mark or my side, so don't
> worry too much about it.
> 
> But if the patches don't rely on the new stuff that are found only in
> my tree, maybe it's better to rebase on Mark's tree, so that you can
> follow the whole other SOF development.

I'll let Kai comment, but this change will have ripple effects on 
machine drivers we need to upstream, so it might be better to use Mark's 
tree?
Kai Vehmanen Oct. 22, 2019, 11:19 a.m. UTC | #5
Hey,

On Thu, 17 Oct 2019, Pierre-Louis Bossart wrote:
> On 10/17/19 2:58 AM, Takashi Iwai wrote:
> > A trivial conflict can be resolved by either Mark or my side, so don't
> > worry too much about it.
> > 
> > But if the patches don't rely on the new stuff that are found only in
> > my tree, maybe it's better to rebase on Mark's tree, so that you can
> > follow the whole other SOF development.
> 
> I'll let Kai comment, but this change will have ripple effects on machine
> drivers we need to upstream, so it might be better to use Mark's tree?

ack on both, now that we agree on the few change to generic hda part,
the rest is SOF specific and easier to merge via Mark's tree. I'll 
work with Pierre to submit v7 (either directly, or even as part of 
Pierre's next SOF series).

Br, Kai
Pierre-Louis Bossart Oct. 22, 2019, 1:17 p.m. UTC | #6
>> On 10/17/19 2:58 AM, Takashi Iwai wrote:
>>> A trivial conflict can be resolved by either Mark or my side, so don't
>>> worry too much about it.
>>>
>>> But if the patches don't rely on the new stuff that are found only in
>>> my tree, maybe it's better to rebase on Mark's tree, so that you can
>>> follow the whole other SOF development.
>>
>> I'll let Kai comment, but this change will have ripple effects on machine
>> drivers we need to upstream, so it might be better to use Mark's tree?
> 
> ack on both, now that we agree on the few change to generic hda part,
> the rest is SOF specific and easier to merge via Mark's tree. I'll
> work with Pierre to submit v7 (either directly, or even as part of
> Pierre's next SOF series).

Kai, it's probably better if you manage this directly, the next series 
will be about all the S0ix/DOix support and already quite dense.
diff mbox series

Patch

diff --git a/sound/soc/sof/intel/Kconfig b/sound/soc/sof/intel/Kconfig
index 18c41fdc47c8..31d9222e45aa 100644
--- a/sound/soc/sof/intel/Kconfig
+++ b/sound/soc/sof/intel/Kconfig
@@ -273,6 +273,16 @@  config SND_SOC_SOF_HDA_AUDIO_CODEC
 	  Say Y if you want to enable HDAudio codecs with SOF.
 	  If unsure select "N".
 
+config SND_SOC_SOF_HDA_COMMON_HDMI_CODEC
+	bool "SOF common HDA HDMI codec driver"
+	depends on SND_SOC_SOF_HDA_LINK
+	depends on SND_HDA_CODEC_HDMI
+	help
+	  This adds support for HDMI audio by using the common HDA
+	  HDMI/DisplayPort codec driver.
+	  Say Y if you want to use the common codec driver with SOF.
+	  If unsure select "Y".
+
 endif ## SND_SOC_SOF_HDA_COMMON
 
 config SND_SOC_SOF_HDA_LINK_BASELINE
diff --git a/sound/soc/sof/intel/hda-codec.c b/sound/soc/sof/intel/hda-codec.c
index 3ca6795a89ba..9ad36e14072c 100644
--- a/sound/soc/sof/intel/hda-codec.c
+++ b/sound/soc/sof/intel/hda-codec.c
@@ -84,6 +84,8 @@  static int hda_codec_probe(struct snd_sof_dev *sdev, int address)
 {
 #if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_AUDIO_CODEC)
 	struct hdac_hda_priv *hda_priv;
+	struct snd_soc_acpi_mach_params *mach_params = 0;
+	struct snd_sof_pdata *pdata = sdev->pdata;
 #endif
 	struct hda_bus *hbus = sof_to_hbus(sdev);
 	struct hdac_device *hdev;
@@ -113,8 +115,19 @@  static int hda_codec_probe(struct snd_sof_dev *sdev, int address)
 	if (ret < 0)
 		return ret;
 
-	/* use legacy bus only for HDA codecs, idisp uses ext bus */
-	if ((resp & 0xFFFF0000) != IDISP_VID_INTEL) {
+	if (pdata->machine)
+		mach_params = (struct snd_soc_acpi_mach_params *)
+			&pdata->machine->mach_params;
+
+	if ((resp & 0xFFFF0000) == IDISP_VID_INTEL)
+		hda_priv->need_display_power = true;
+
+	/*
+	 * if common HDMI codec driver is not used, codec load
+	 * is skipped here and hdac_hdmi is used instead
+	 */
+	if ((mach_params && mach_params->common_hdmi_codec_drv) ||
+	    (resp & 0xFFFF0000) != IDISP_VID_INTEL) {
 		hdev->type = HDA_DEV_LEGACY;
 		hda_codec_load_module(&hda_priv->codec);
 	}
@@ -155,7 +168,8 @@  int hda_codec_probe_bus(struct snd_sof_dev *sdev)
 }
 EXPORT_SYMBOL(hda_codec_probe_bus);
 
-#if IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)
+#if IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) || \
+	IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)
 
 void hda_codec_i915_get(struct snd_sof_dev *sdev)
 {
@@ -204,6 +218,6 @@  int hda_codec_i915_exit(struct snd_sof_dev *sdev)
 }
 EXPORT_SYMBOL(hda_codec_i915_exit);
 
-#endif /* CONFIG_SND_SOC_HDAC_HDMI */
+#endif
 
 MODULE_LICENSE("Dual BSD/GPL");
diff --git a/sound/soc/sof/intel/hda.c b/sound/soc/sof/intel/hda.c
index c72e9a09eee1..ee742157516e 100644
--- a/sound/soc/sof/intel/hda.c
+++ b/sound/soc/sof/intel/hda.c
@@ -54,6 +54,11 @@  MODULE_PARM_DESC(use_msi, "SOF HDA use PCI MSI mode");
 static int hda_dmic_num = -1;
 module_param_named(dmic_num, hda_dmic_num, int, 0444);
 MODULE_PARM_DESC(dmic_num, "SOF HDA DMIC number");
+
+static bool hda_codec_use_common_hdmi =
+	IS_ENABLED(CONFIG_SND_SOC_SOF_HDA_COMMON_HDMI_CODEC);
+module_param_named(use_common_hdmi, hda_codec_use_common_hdmi, bool, 0444);
+MODULE_PARM_DESC(use_common_hdmi, "SOF HDA use common HDMI codec driver");
 #endif
 
 static const struct hda_dsp_msg_code hda_dsp_rom_msg[] = {
@@ -458,6 +463,7 @@  static int hda_init_caps(struct snd_sof_dev *sdev)
 			&pdata->machine->mach_params;
 		mach_params->codec_mask = bus->codec_mask;
 		mach_params->platform = dev_name(sdev->dev);
+		mach_params->common_hdmi_codec_drv = hda_codec_use_common_hdmi;
 	}
 
 	/* create codec instances */
diff --git a/sound/soc/sof/intel/hda.h b/sound/soc/sof/intel/hda.h
index 5591841a1b6f..28640a29e1b6 100644
--- a/sound/soc/sof/intel/hda.h
+++ b/sound/soc/sof/intel/hda.h
@@ -562,7 +562,9 @@  void hda_codec_jack_check(struct snd_sof_dev *sdev);
 
 #endif /* CONFIG_SND_SOC_SOF_HDA */
 
-#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) && IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI)
+#if IS_ENABLED(CONFIG_SND_SOC_SOF_HDA) && \
+	(IS_ENABLED(CONFIG_SND_HDA_CODEC_HDMI) || \
+	 IS_ENABLED(CONFIG_SND_SOC_HDAC_HDMI))
 
 void hda_codec_i915_get(struct snd_sof_dev *sdev);
 void hda_codec_i915_put(struct snd_sof_dev *sdev);
@@ -576,7 +578,7 @@  static inline void hda_codec_i915_put(struct snd_sof_dev *sdev)  { }
 static inline int hda_codec_i915_init(struct snd_sof_dev *sdev) { return 0; }
 static inline int hda_codec_i915_exit(struct snd_sof_dev *sdev) { return 0; }
 
-#endif /* CONFIG_SND_SOC_SOF_HDA && CONFIG_SND_SOC_HDAC_HDMI */
+#endif
 
 /*
  * Trace Control.