ALSA: hda: intel-nhlt: handle NHLT VENDOR_DEFINED DMIC geometry
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 29 Jul 2019 15:51:49 +0000 (10:51 -0500)
committerTakashi Iwai <tiwai@suse.de>
Wed, 31 Jul 2019 13:46:00 +0000 (15:46 +0200)
The NHLT spec defines a VENDOR_DEFINED geometry, which requires
reading additional information to figure out the number of
microphones.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
include/sound/intel-nhlt.h
sound/hda/intel-nhlt.c

index 857922f..f657fd8 100644 (file)
@@ -96,16 +96,22 @@ struct nhlt_resource_desc  {
 #define MIC_ARRAY_2CH 2
 #define MIC_ARRAY_4CH 4
 
-struct nhlt_tdm_config {
+struct nhlt_device_specific_config {
        u8 virtual_slot;
        u8 config_type;
 } __packed;
 
 struct nhlt_dmic_array_config {
-       struct nhlt_tdm_config tdm_config;
+       struct nhlt_device_specific_config device_config;
        u8 array_type;
 } __packed;
 
+struct nhlt_vendor_dmic_array_config {
+       struct nhlt_dmic_array_config dmic_config;
+       u8 nb_mics;
+       /* TODO add vendor mic config */
+} __packed;
+
 enum {
        NHLT_MIC_ARRAY_2CH_SMALL = 0xa,
        NHLT_MIC_ARRAY_2CH_BIG = 0xb,
index 7a62e03..daede96 100644 (file)
@@ -63,6 +63,7 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
 {
        struct nhlt_endpoint *epnt;
        struct nhlt_dmic_array_config *cfg;
+       struct nhlt_vendor_dmic_array_config *cfg_vendor;
        unsigned int dmic_geo = 0;
        u8 j;
 
@@ -86,7 +87,10 @@ int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
                        case NHLT_MIC_ARRAY_4CH_2ND_GEOM:
                                dmic_geo = MIC_ARRAY_4CH;
                                break;
-
+                       case NHLT_MIC_ARRAY_VENDOR_DEFINED:
+                               cfg_vendor = (struct nhlt_vendor_dmic_array_config *)cfg;
+                               dmic_geo = cfg_vendor->nb_mics;
+                               break;
                        default:
                                dev_warn(dev, "undefined DMIC array_type 0x%0x\n",
                                         cfg->array_type);