200 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * intel-nhlt.h - Intel HDA Platform NHLT header4 *5 * Copyright (c) 2015-2019 Intel Corporation6 */7 8#ifndef __INTEL_NHLT_H__9#define __INTEL_NHLT_H__10 11#include <linux/acpi.h>12 13enum nhlt_link_type {14 NHLT_LINK_HDA = 0,15 NHLT_LINK_DSP = 1,16 NHLT_LINK_DMIC = 2,17 NHLT_LINK_SSP = 3,18 NHLT_LINK_INVALID19};20 21enum nhlt_device_type {22 NHLT_DEVICE_BT = 0,23 NHLT_DEVICE_DMIC = 1,24 NHLT_DEVICE_I2S = 4,25 NHLT_DEVICE_INVALID26};27 28struct wav_fmt {29 u16 fmt_tag;30 u16 channels;31 u32 samples_per_sec;32 u32 avg_bytes_per_sec;33 u16 block_align;34 u16 bits_per_sample;35 u16 cb_size;36} __packed;37 38struct wav_fmt_ext {39 struct wav_fmt fmt;40 union samples {41 u16 valid_bits_per_sample;42 u16 samples_per_block;43 u16 reserved;44 } sample;45 u32 channel_mask;46 u8 sub_fmt[16];47} __packed;48 49struct nhlt_specific_cfg {50 u32 size;51 u8 caps[];52} __packed;53 54struct nhlt_fmt_cfg {55 struct wav_fmt_ext fmt_ext;56 struct nhlt_specific_cfg config;57} __packed;58 59struct nhlt_fmt {60 u8 fmt_count;61 struct nhlt_fmt_cfg fmt_config[];62} __packed;63 64struct nhlt_endpoint {65 u32 length;66 u8 linktype;67 u8 instance_id;68 u16 vendor_id;69 u16 device_id;70 u16 revision_id;71 u32 subsystem_id;72 u8 device_type;73 u8 direction;74 u8 virtual_bus_id;75 struct nhlt_specific_cfg config;76} __packed;77 78struct nhlt_acpi_table {79 struct acpi_table_header header;80 u8 endpoint_count;81 struct nhlt_endpoint desc[];82} __packed;83 84struct nhlt_resource_desc {85 u32 extra;86 u16 flags;87 u64 addr_spc_gra;88 u64 min_addr;89 u64 max_addr;90 u64 addr_trans_offset;91 u64 length;92} __packed;93 94#define MIC_ARRAY_2CH 295#define MIC_ARRAY_4CH 496 97struct nhlt_device_specific_config {98 u8 virtual_slot;99 u8 config_type;100} __packed;101 102struct nhlt_dmic_array_config {103 struct nhlt_device_specific_config device_config;104 u8 array_type;105} __packed;106 107struct nhlt_vendor_dmic_array_config {108 struct nhlt_dmic_array_config dmic_config;109 u8 nb_mics;110 /* TODO add vendor mic config */111} __packed;112 113enum {114 NHLT_CONFIG_TYPE_GENERIC = 0,115 NHLT_CONFIG_TYPE_MIC_ARRAY = 1116};117 118enum {119 NHLT_MIC_ARRAY_2CH_SMALL = 0xa,120 NHLT_MIC_ARRAY_2CH_BIG = 0xb,121 NHLT_MIC_ARRAY_4CH_1ST_GEOM = 0xc,122 NHLT_MIC_ARRAY_4CH_L_SHAPED = 0xd,123 NHLT_MIC_ARRAY_4CH_2ND_GEOM = 0xe,124 NHLT_MIC_ARRAY_VENDOR_DEFINED = 0xf,125};126 127#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_INTEL_NHLT)128 129struct nhlt_acpi_table *intel_nhlt_init(struct device *dev);130 131void intel_nhlt_free(struct nhlt_acpi_table *addr);132 133int intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt);134 135bool intel_nhlt_has_endpoint_type(struct nhlt_acpi_table *nhlt, u8 link_type);136 137int intel_nhlt_ssp_endpoint_mask(struct nhlt_acpi_table *nhlt, u8 device_type);138 139int intel_nhlt_ssp_mclk_mask(struct nhlt_acpi_table *nhlt, int ssp_num);140 141struct nhlt_specific_cfg *142intel_nhlt_get_endpoint_blob(struct device *dev, struct nhlt_acpi_table *nhlt,143 u32 bus_id, u8 link_type, u8 vbps, u8 bps,144 u8 num_ch, u32 rate, u8 dir, u8 dev_type);145 146int intel_nhlt_ssp_device_type(struct device *dev, struct nhlt_acpi_table *nhlt,147 u8 virtual_bus_id);148 149#else150 151static inline struct nhlt_acpi_table *intel_nhlt_init(struct device *dev)152{153 return NULL;154}155 156static inline void intel_nhlt_free(struct nhlt_acpi_table *addr)157{158}159 160static inline int intel_nhlt_get_dmic_geo(struct device *dev,161 struct nhlt_acpi_table *nhlt)162{163 return 0;164}165 166static inline bool intel_nhlt_has_endpoint_type(struct nhlt_acpi_table *nhlt,167 u8 link_type)168{169 return false;170}171 172static inline int intel_nhlt_ssp_endpoint_mask(struct nhlt_acpi_table *nhlt, u8 device_type)173{174 return 0;175}176 177static inline int intel_nhlt_ssp_mclk_mask(struct nhlt_acpi_table *nhlt, int ssp_num)178{179 return 0;180}181 182static inline struct nhlt_specific_cfg *183intel_nhlt_get_endpoint_blob(struct device *dev, struct nhlt_acpi_table *nhlt,184 u32 bus_id, u8 link_type, u8 vbps, u8 bps,185 u8 num_ch, u32 rate, u8 dir, u8 dev_type)186{187 return NULL;188}189 190static inline int intel_nhlt_ssp_device_type(struct device *dev,191 struct nhlt_acpi_table *nhlt,192 u8 virtual_bus_id)193{194 return -EINVAL;195}196 197#endif198 199#endif200