[alsa-devel] [RFC PATCH 3/6] ASoC: Intel: common: move parts of NHLT code to new module
Takashi Iwai
tiwai at suse.de
Fri May 24 09:54:36 CEST 2019
On Fri, 24 May 2019 01:39:48 +0200,
Pierre-Louis Bossart wrote:
>
> Move parts of the code outside of the Skylake driver to help detect
> the presence of DMICs (which are not supported by the HDaudio legacy
> driver).
>
> No functionality change, only indentation and checkpatch fixes, and making sure that the code compiles without ACPI
>
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart at linux.intel.com>
This is no ASoC-specific code, which will be called from the legacy
HDA driver, too. So better to drop SOC_ prefix.
thanks,
Takashi
> ---
> sound/soc/intel/Kconfig | 3 +
> sound/soc/intel/common/Makefile | 3 +
> sound/soc/intel/common/intel-nhlt.c | 98 +++++++++++++++++++++++++++++
> sound/soc/intel/common/intel-nhlt.h | 28 +++++++++
> 4 files changed, 132 insertions(+)
> create mode 100644 sound/soc/intel/common/intel-nhlt.c
>
> diff --git a/sound/soc/intel/Kconfig b/sound/soc/intel/Kconfig
> index b089ed3bf77f..71f19b73eed7 100644
> --- a/sound/soc/intel/Kconfig
> +++ b/sound/soc/intel/Kconfig
> @@ -205,6 +205,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_SOC_INTEL_NHLT
> help
> If you have a Intel Skylake/Broxton/ApolloLake/KabyLake/
> GeminiLake or CannonLake platform with the DSP enabled in the BIOS
> @@ -224,6 +225,8 @@ config SND_SOC_ACPI_INTEL_MATCH
>
> endif ## SND_SOC_INTEL_SST_TOPLEVEL || SND_SOC_SOF_INTEL_TOPLEVEL
>
> +config SND_SOC_INTEL_NHLT
> + tristate
>
> # ASoC codec drivers
> source "sound/soc/intel/boards/Kconfig"
> diff --git a/sound/soc/intel/common/Makefile b/sound/soc/intel/common/Makefile
> index 56c81e20b5bf..4a5d2e4c28e4 100644
> --- a/sound/soc/intel/common/Makefile
> +++ b/sound/soc/intel/common/Makefile
> @@ -10,7 +10,10 @@ snd-soc-acpi-intel-match-objs := soc-acpi-intel-byt-match.o soc-acpi-intel-cht-m
> soc-acpi-intel-cnl-match.o soc-acpi-intel-icl-match.o \
> soc-acpi-intel-hda-match.o
>
> +snd-soc-intel-nhlt-objs := intel-nhlt.o
> +
> obj-$(CONFIG_SND_SOC_INTEL_SST) += snd-soc-sst-dsp.o snd-soc-sst-ipc.o
> obj-$(CONFIG_SND_SOC_INTEL_SST_ACPI) += snd-soc-sst-acpi.o
> obj-$(CONFIG_SND_SOC_INTEL_SST_FIRMWARE) += snd-soc-sst-firmware.o
> obj-$(CONFIG_SND_SOC_ACPI_INTEL_MATCH) += snd-soc-acpi-intel-match.o
> +obj-$(CONFIG_SND_SOC_INTEL_NHLT) += snd-soc-intel-nhlt.o
> diff --git a/sound/soc/intel/common/intel-nhlt.c b/sound/soc/intel/common/intel-nhlt.c
> new file mode 100644
> index 000000000000..d93ecc32d996
> --- /dev/null
> +++ b/sound/soc/intel/common/intel-nhlt.c
> @@ -0,0 +1,98 @@
> +// SPDX-License-Identifier: GPL-2.0
> +// Copyright (c) 2015-2019 Intel Corporation
> +
> +#include <linux/acpi.h>
> +#include "intel-nhlt.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 *intel_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_dbg(dev, "No NHLT table found\n");
> + return NULL;
> +}
> +EXPORT_SYMBOL_GPL(intel_nhlt_init);
> +
> +void intel_nhlt_free(struct nhlt_acpi_table *nhlt)
> +{
> + memunmap((void *)nhlt);
> +}
> +EXPORT_SYMBOL_GPL(intel_nhlt_free);
> +
> +int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt)
> +{
> + struct nhlt_endpoint *epnt;
> + struct nhlt_dmic_array_config *cfg;
> + 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;
> +}
> +EXPORT_SYMBOL_GPL(intel_nhlt_get_dmic_geo);
> +
> +MODULE_LICENSE("GPL v2");
> +MODULE_DESCRIPTION("Intel NHLT driver");
> diff --git a/sound/soc/intel/common/intel-nhlt.h b/sound/soc/intel/common/intel-nhlt.h
> index 116534e7b3c5..125e47ae9a3c 100644
> --- a/sound/soc/intel/common/intel-nhlt.h
> +++ b/sound/soc/intel/common/intel-nhlt.h
> @@ -20,6 +20,8 @@
> #ifndef __SKL_NHLT_H__
> #define __SKL_NHLT_H__
>
> +#if IS_ENABLED(CONFIG_ACPI)
> +
> #include <linux/acpi.h>
>
> struct wav_fmt {
> @@ -125,4 +127,30 @@ enum {
> NHLT_MIC_ARRAY_VENDOR_DEFINED = 0xf,
> };
>
> +struct nhlt_acpi_table *intel_nhlt_init(struct device *dev);
> +
> +void intel_nhlt_free(struct nhlt_acpi_table *addr);
> +
> +int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt);
> +
> +#else
> +
> +struct nhlt_acpi_table;
> +
> +static inline nhlt_acpi_table *intel_nhlt_init(struct device *dev)
> +{
> + return NULL;
> +}
> +
> +static inline void intel_nhlt_free(struct nhlt_acpi_table *addr)
> +{
> +}
> +
> +static inline int intel_nhlt_get_dmic_geo(struct device *dev,
> + struct nhlt_acpi_table *nhlt)
> +{
> + return 0;
> +}
> +#endif
> +
> #endif
> --
> 2.20.1
>
More information about the Alsa-devel
mailing list