]> git.proxmox.com Git - mirror_ubuntu-eoan-kernel.git/commitdiff
ASoC: Intel: Skylake: use common NHLT module
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Mon, 10 Feb 2020 08:44:00 +0000 (09:44 +0100)
committerKleber Sacilotto de Souza <kleber.souza@canonical.com>
Fri, 14 Feb 2020 13:20:15 +0000 (14:20 +0100)
BugLink: https://bugs.launchpad.net/bugs/1837828
No functionality change, only use common functions now.

Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
(cherry picked from commit 1169cbf6b98e11397715d457e42070e066325fc0)
Signed-off-by: Hui Wang <hui.wang@canonical.com>
Acked-by: Sultan Alsawaf <sultan.alsawaf@canonical.com>
Acked-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
Signed-off-by: Kleber Sacilotto de Souza <kleber.souza@canonical.com>
sound/soc/intel/Kconfig
sound/soc/intel/skylake/skl-nhlt.c
sound/soc/intel/skylake/skl.c
sound/soc/intel/skylake/skl.h

index 0e2ac88eaedb436fadfb9e1b86285b4ac3716e51..f646ec4292f3b57500b7bafda66ef6771c9cf921 100644 (file)
@@ -218,6 +218,7 @@ config SND_SOC_INTEL_SKYLAKE_COMMON
        select SND_SOC_INTEL_SST
        select SND_SOC_HDAC_HDA if SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC
        select SND_SOC_ACPI_INTEL_MATCH
+       select SND_INTEL_NHLT
        help
          If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/
          GeminiLake or CannonLake platform with the DSP enabled in the BIOS
index 8ae61666adf4170260b3c7c1d9e8d32af0c7b135..e6c4745155aff9bb742c75ecc5a8cc779af5e083 100644 (file)
 #include "skl.h"
 #include "skl-i2s.h"
 
-#define NHLT_ACPI_HEADER_SIG   "NHLT"
-
-/* Unique identification for getting NHLT blobs */
-static guid_t osc_guid =
-       GUID_INIT(0xA69F886E, 0x6CEB, 0x4594,
-                 0xA4, 0x1F, 0x7B, 0x5D, 0xCE, 0x24, 0xC5, 0x53);
-
-
-struct nhlt_acpi_table *skl_nhlt_init(struct device *dev)
-{
-       acpi_handle handle;
-       union acpi_object *obj;
-       struct nhlt_resource_desc  *nhlt_ptr = NULL;
-       struct nhlt_acpi_table *nhlt_table = NULL;
-
-       handle = ACPI_HANDLE(dev);
-       if (!handle) {
-               dev_err(dev, "Didn't find ACPI_HANDLE\n");
-               return NULL;
-       }
-
-       obj = acpi_evaluate_dsm(handle, &osc_guid, 1, 1, NULL);
-       if (obj && obj->type == ACPI_TYPE_BUFFER) {
-               nhlt_ptr = (struct nhlt_resource_desc  *)obj->buffer.pointer;
-               if (nhlt_ptr->length)
-                       nhlt_table = (struct nhlt_acpi_table *)
-                               memremap(nhlt_ptr->min_addr, nhlt_ptr->length,
-                               MEMREMAP_WB);
-               ACPI_FREE(obj);
-               if (nhlt_table && (strncmp(nhlt_table->header.signature,
-                                       NHLT_ACPI_HEADER_SIG,
-                                       strlen(NHLT_ACPI_HEADER_SIG)) != 0)) {
-                       memunmap(nhlt_table);
-                       dev_err(dev, "NHLT ACPI header signature incorrect\n");
-                       return NULL;
-               }
-               return nhlt_table;
-       }
-
-       dev_err(dev, "device specific method to extract NHLT blob failed\n");
-       return NULL;
-}
-
-void skl_nhlt_free(struct nhlt_acpi_table *nhlt)
-{
-       memunmap((void *) nhlt);
-}
-
 static struct nhlt_specific_cfg *skl_get_specific_cfg(
                struct device *dev, struct nhlt_fmt *fmt,
                u8 no_ch, u32 rate, u16 bps, u8 linktype)
@@ -163,48 +115,6 @@ struct nhlt_specific_cfg
        return NULL;
 }
 
-int skl_get_dmic_geo(struct skl *skl)
-{
-       struct nhlt_acpi_table *nhlt = (struct nhlt_acpi_table *)skl->nhlt;
-       struct nhlt_endpoint *epnt;
-       struct nhlt_dmic_array_config *cfg;
-       struct device *dev = &skl->pci->dev;
-       unsigned int dmic_geo = 0;
-       u8 j;
-
-       if (!nhlt)
-               return 0;
-
-       epnt = (struct nhlt_endpoint *)nhlt->desc;
-
-       for (j = 0; j < nhlt->endpoint_count; j++) {
-               if (epnt->linktype == NHLT_LINK_DMIC) {
-                       cfg = (struct nhlt_dmic_array_config  *)
-                                       (epnt->config.caps);
-                       switch (cfg->array_type) {
-                       case NHLT_MIC_ARRAY_2CH_SMALL:
-                       case NHLT_MIC_ARRAY_2CH_BIG:
-                               dmic_geo |= MIC_ARRAY_2CH;
-                               break;
-
-                       case NHLT_MIC_ARRAY_4CH_1ST_GEOM:
-                       case NHLT_MIC_ARRAY_4CH_L_SHAPED:
-                       case NHLT_MIC_ARRAY_4CH_2ND_GEOM:
-                               dmic_geo |= MIC_ARRAY_4CH;
-                               break;
-
-                       default:
-                               dev_warn(dev, "undefined DMIC array_type 0x%0x\n",
-                                               cfg->array_type);
-
-                       }
-               }
-               epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
-       }
-
-       return dmic_geo;
-}
-
 static void skl_nhlt_trim_space(char *trim)
 {
        char *s = trim;
index 3362e71b45638bc98025339b6d87be8ce702f1fe..2b5159890a57acce09e3cfea2602db386c23b6db 100644 (file)
 #include <sound/hdaudio.h>
 #include <sound/hda_i915.h>
 #include <sound/hda_codec.h>
+#include <sound/intel-nhlt.h>
 #include "skl.h"
 #include "skl-sst-dsp.h"
 #include "skl-sst-ipc.h"
+
 #if IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC)
 #include "../../../soc/codecs/hdac_hda.h"
 #endif
@@ -516,7 +518,9 @@ static int skl_find_machine(struct skl *skl, void *driver_data)
 
        if (pdata) {
                skl->use_tplg_pcm = pdata->use_tplg_pcm;
-               mach->mach_params.dmic_num = skl_get_dmic_geo(skl);
+               mach->mach_params.dmic_num =
+                       intel_nhlt_get_dmic_geo(&skl->pci->dev,
+                                               skl->nhlt);
        }
 
        return 0;
@@ -1029,7 +1033,7 @@ static int skl_probe(struct pci_dev *pci,
 
        device_disable_async_suspend(bus->dev);
 
-       skl->nhlt = skl_nhlt_init(bus->dev);
+       skl->nhlt = intel_nhlt_init(bus->dev);
 
        if (skl->nhlt == NULL) {
 #if !IS_ENABLED(CONFIG_SND_SOC_INTEL_SKYLAKE_HDAUDIO_CODEC)
@@ -1095,7 +1099,7 @@ out_dsp_free:
 out_clk_free:
        skl_clock_device_unregister(skl);
 out_nhlt_free:
-       skl_nhlt_free(skl->nhlt);
+       intel_nhlt_free(skl->nhlt);
 out_free:
        skl_free(bus);
 
@@ -1144,7 +1148,7 @@ static void skl_remove(struct pci_dev *pci)
        skl_dmic_device_unregister(skl);
        skl_clock_device_unregister(skl);
        skl_nhlt_remove_sysfs(skl);
-       skl_nhlt_free(skl->nhlt);
+       intel_nhlt_free(skl->nhlt);
        skl_free(bus);
        dev_set_drvdata(&pci->dev, NULL);
 }
index 928e8115a1a784e66f8efede121d06a9c9721a4d..f4dd6c7679932964e5bba2aabc7fb0c036cf3375 100644 (file)
@@ -128,13 +128,10 @@ struct skl_dsp_ops {
 int skl_platform_unregister(struct device *dev);
 int skl_platform_register(struct device *dev);
 
-struct nhlt_acpi_table *skl_nhlt_init(struct device *dev);
-void skl_nhlt_free(struct nhlt_acpi_table *addr);
 struct nhlt_specific_cfg *skl_get_ep_blob(struct skl *skl, u32 instance,
                                        u8 link_type, u8 s_fmt, u8 no_ch,
                                        u32 s_rate, u8 dirn, u8 dev_type);
 
-int skl_get_dmic_geo(struct skl *skl);
 int skl_nhlt_update_topology_bin(struct skl *skl);
 int skl_init_dsp(struct skl *skl);
 int skl_free_dsp(struct skl *skl);