Blame view

sound/hda/intel-nhlt.c 1.72 KB
e149ca29f   Pierre-Louis Bossart   ASoC: SOF/Intel: ...
1
  // SPDX-License-Identifier: GPL-2.0-only
303681f43   Pierre-Louis Bossart   ALSA: hda: move p...
2
3
4
5
  // Copyright (c) 2015-2019 Intel Corporation
  
  #include <linux/acpi.h>
  #include <sound/intel-nhlt.h>
303681f43   Pierre-Louis Bossart   ALSA: hda: move p...
6
7
  struct nhlt_acpi_table *intel_nhlt_init(struct device *dev)
  {
0d283287a   Cezary Rojewski   ALSA: hda: Refact...
8
9
  	struct nhlt_acpi_table *nhlt;
  	acpi_status status;
303681f43   Pierre-Louis Bossart   ALSA: hda: move p...
10

0d283287a   Cezary Rojewski   ALSA: hda: Refact...
11
12
13
14
15
  	status = acpi_get_table(ACPI_SIG_NHLT, 0,
  				(struct acpi_table_header **)&nhlt);
  	if (ACPI_FAILURE(status)) {
  		dev_warn(dev, "NHLT table not found
  ");
303681f43   Pierre-Louis Bossart   ALSA: hda: move p...
16
17
  		return NULL;
  	}
0d283287a   Cezary Rojewski   ALSA: hda: Refact...
18
  	return nhlt;
303681f43   Pierre-Louis Bossart   ALSA: hda: move p...
19
20
21
22
23
  }
  EXPORT_SYMBOL_GPL(intel_nhlt_init);
  
  void intel_nhlt_free(struct nhlt_acpi_table *nhlt)
  {
0d283287a   Cezary Rojewski   ALSA: hda: Refact...
24
  	acpi_put_table((struct acpi_table_header *)nhlt);
303681f43   Pierre-Louis Bossart   ALSA: hda: move p...
25
26
27
28
29
30
31
  }
  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;
7a33ea70e   Pierre-Louis Bossart   ALSA: hda: intel-...
32
  	struct nhlt_vendor_dmic_array_config *cfg_vendor;
303681f43   Pierre-Louis Bossart   ALSA: hda: move p...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
  	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;
7a33ea70e   Pierre-Louis Bossart   ALSA: hda: intel-...
56
57
58
59
  			case NHLT_MIC_ARRAY_VENDOR_DEFINED:
  				cfg_vendor = (struct nhlt_vendor_dmic_array_config *)cfg;
  				dmic_geo = cfg_vendor->nb_mics;
  				break;
303681f43   Pierre-Louis Bossart   ALSA: hda: move p...
60
61
62
63
64
65
66
67
68
69
70
71
  			default:
  				dev_warn(dev, "undefined DMIC array_type 0x%0x
  ",
  					 cfg->array_type);
  			}
  		}
  		epnt = (struct nhlt_endpoint *)((u8 *)epnt + epnt->length);
  	}
  
  	return dmic_geo;
  }
  EXPORT_SYMBOL_GPL(intel_nhlt_get_dmic_geo);