162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * intel-nhlt.h - Intel HDA Platform NHLT header 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (c) 2015-2019 Intel Corporation 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#ifndef __INTEL_NHLT_H__ 962306a36Sopenharmony_ci#define __INTEL_NHLT_H__ 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#include <linux/acpi.h> 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_cienum nhlt_link_type { 1462306a36Sopenharmony_ci NHLT_LINK_HDA = 0, 1562306a36Sopenharmony_ci NHLT_LINK_DSP = 1, 1662306a36Sopenharmony_ci NHLT_LINK_DMIC = 2, 1762306a36Sopenharmony_ci NHLT_LINK_SSP = 3, 1862306a36Sopenharmony_ci NHLT_LINK_INVALID 1962306a36Sopenharmony_ci}; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cienum nhlt_device_type { 2262306a36Sopenharmony_ci NHLT_DEVICE_BT = 0, 2362306a36Sopenharmony_ci NHLT_DEVICE_DMIC = 1, 2462306a36Sopenharmony_ci NHLT_DEVICE_I2S = 4, 2562306a36Sopenharmony_ci NHLT_DEVICE_INVALID 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct wav_fmt { 2962306a36Sopenharmony_ci u16 fmt_tag; 3062306a36Sopenharmony_ci u16 channels; 3162306a36Sopenharmony_ci u32 samples_per_sec; 3262306a36Sopenharmony_ci u32 avg_bytes_per_sec; 3362306a36Sopenharmony_ci u16 block_align; 3462306a36Sopenharmony_ci u16 bits_per_sample; 3562306a36Sopenharmony_ci u16 cb_size; 3662306a36Sopenharmony_ci} __packed; 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cistruct wav_fmt_ext { 3962306a36Sopenharmony_ci struct wav_fmt fmt; 4062306a36Sopenharmony_ci union samples { 4162306a36Sopenharmony_ci u16 valid_bits_per_sample; 4262306a36Sopenharmony_ci u16 samples_per_block; 4362306a36Sopenharmony_ci u16 reserved; 4462306a36Sopenharmony_ci } sample; 4562306a36Sopenharmony_ci u32 channel_mask; 4662306a36Sopenharmony_ci u8 sub_fmt[16]; 4762306a36Sopenharmony_ci} __packed; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_cistruct nhlt_specific_cfg { 5062306a36Sopenharmony_ci u32 size; 5162306a36Sopenharmony_ci u8 caps[]; 5262306a36Sopenharmony_ci} __packed; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cistruct nhlt_fmt_cfg { 5562306a36Sopenharmony_ci struct wav_fmt_ext fmt_ext; 5662306a36Sopenharmony_ci struct nhlt_specific_cfg config; 5762306a36Sopenharmony_ci} __packed; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_cistruct nhlt_fmt { 6062306a36Sopenharmony_ci u8 fmt_count; 6162306a36Sopenharmony_ci struct nhlt_fmt_cfg fmt_config[]; 6262306a36Sopenharmony_ci} __packed; 6362306a36Sopenharmony_ci 6462306a36Sopenharmony_cistruct nhlt_endpoint { 6562306a36Sopenharmony_ci u32 length; 6662306a36Sopenharmony_ci u8 linktype; 6762306a36Sopenharmony_ci u8 instance_id; 6862306a36Sopenharmony_ci u16 vendor_id; 6962306a36Sopenharmony_ci u16 device_id; 7062306a36Sopenharmony_ci u16 revision_id; 7162306a36Sopenharmony_ci u32 subsystem_id; 7262306a36Sopenharmony_ci u8 device_type; 7362306a36Sopenharmony_ci u8 direction; 7462306a36Sopenharmony_ci u8 virtual_bus_id; 7562306a36Sopenharmony_ci struct nhlt_specific_cfg config; 7662306a36Sopenharmony_ci} __packed; 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistruct nhlt_acpi_table { 7962306a36Sopenharmony_ci struct acpi_table_header header; 8062306a36Sopenharmony_ci u8 endpoint_count; 8162306a36Sopenharmony_ci struct nhlt_endpoint desc[]; 8262306a36Sopenharmony_ci} __packed; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_cistruct nhlt_resource_desc { 8562306a36Sopenharmony_ci u32 extra; 8662306a36Sopenharmony_ci u16 flags; 8762306a36Sopenharmony_ci u64 addr_spc_gra; 8862306a36Sopenharmony_ci u64 min_addr; 8962306a36Sopenharmony_ci u64 max_addr; 9062306a36Sopenharmony_ci u64 addr_trans_offset; 9162306a36Sopenharmony_ci u64 length; 9262306a36Sopenharmony_ci} __packed; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci#define MIC_ARRAY_2CH 2 9562306a36Sopenharmony_ci#define MIC_ARRAY_4CH 4 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistruct nhlt_device_specific_config { 9862306a36Sopenharmony_ci u8 virtual_slot; 9962306a36Sopenharmony_ci u8 config_type; 10062306a36Sopenharmony_ci} __packed; 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_cistruct nhlt_dmic_array_config { 10362306a36Sopenharmony_ci struct nhlt_device_specific_config device_config; 10462306a36Sopenharmony_ci u8 array_type; 10562306a36Sopenharmony_ci} __packed; 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_cistruct nhlt_vendor_dmic_array_config { 10862306a36Sopenharmony_ci struct nhlt_dmic_array_config dmic_config; 10962306a36Sopenharmony_ci u8 nb_mics; 11062306a36Sopenharmony_ci /* TODO add vendor mic config */ 11162306a36Sopenharmony_ci} __packed; 11262306a36Sopenharmony_ci 11362306a36Sopenharmony_cienum { 11462306a36Sopenharmony_ci NHLT_CONFIG_TYPE_GENERIC = 0, 11562306a36Sopenharmony_ci NHLT_CONFIG_TYPE_MIC_ARRAY = 1 11662306a36Sopenharmony_ci}; 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_cienum { 11962306a36Sopenharmony_ci NHLT_MIC_ARRAY_2CH_SMALL = 0xa, 12062306a36Sopenharmony_ci NHLT_MIC_ARRAY_2CH_BIG = 0xb, 12162306a36Sopenharmony_ci NHLT_MIC_ARRAY_4CH_1ST_GEOM = 0xc, 12262306a36Sopenharmony_ci NHLT_MIC_ARRAY_4CH_L_SHAPED = 0xd, 12362306a36Sopenharmony_ci NHLT_MIC_ARRAY_4CH_2ND_GEOM = 0xe, 12462306a36Sopenharmony_ci NHLT_MIC_ARRAY_VENDOR_DEFINED = 0xf, 12562306a36Sopenharmony_ci}; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_INTEL_NHLT) 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistruct nhlt_acpi_table *intel_nhlt_init(struct device *dev); 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_civoid intel_nhlt_free(struct nhlt_acpi_table *addr); 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ciint intel_nhlt_get_dmic_geo(struct device *dev, struct nhlt_acpi_table *nhlt); 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_cibool intel_nhlt_has_endpoint_type(struct nhlt_acpi_table *nhlt, u8 link_type); 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ciint intel_nhlt_ssp_endpoint_mask(struct nhlt_acpi_table *nhlt, u8 device_type); 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ciint intel_nhlt_ssp_mclk_mask(struct nhlt_acpi_table *nhlt, int ssp_num); 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistruct nhlt_specific_cfg * 14262306a36Sopenharmony_ciintel_nhlt_get_endpoint_blob(struct device *dev, struct nhlt_acpi_table *nhlt, 14362306a36Sopenharmony_ci u32 bus_id, u8 link_type, u8 vbps, u8 bps, 14462306a36Sopenharmony_ci u8 num_ch, u32 rate, u8 dir, u8 dev_type); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ci#else 14762306a36Sopenharmony_ci 14862306a36Sopenharmony_cistatic inline struct nhlt_acpi_table *intel_nhlt_init(struct device *dev) 14962306a36Sopenharmony_ci{ 15062306a36Sopenharmony_ci return NULL; 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistatic inline void intel_nhlt_free(struct nhlt_acpi_table *addr) 15462306a36Sopenharmony_ci{ 15562306a36Sopenharmony_ci} 15662306a36Sopenharmony_ci 15762306a36Sopenharmony_cistatic inline int intel_nhlt_get_dmic_geo(struct device *dev, 15862306a36Sopenharmony_ci struct nhlt_acpi_table *nhlt) 15962306a36Sopenharmony_ci{ 16062306a36Sopenharmony_ci return 0; 16162306a36Sopenharmony_ci} 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_cistatic inline bool intel_nhlt_has_endpoint_type(struct nhlt_acpi_table *nhlt, 16462306a36Sopenharmony_ci u8 link_type) 16562306a36Sopenharmony_ci{ 16662306a36Sopenharmony_ci return false; 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic inline int intel_nhlt_ssp_endpoint_mask(struct nhlt_acpi_table *nhlt, u8 device_type) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci return 0; 17262306a36Sopenharmony_ci} 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_cistatic inline int intel_nhlt_ssp_mclk_mask(struct nhlt_acpi_table *nhlt, int ssp_num) 17562306a36Sopenharmony_ci{ 17662306a36Sopenharmony_ci return 0; 17762306a36Sopenharmony_ci} 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_cistatic inline struct nhlt_specific_cfg * 18062306a36Sopenharmony_ciintel_nhlt_get_endpoint_blob(struct device *dev, struct nhlt_acpi_table *nhlt, 18162306a36Sopenharmony_ci u32 bus_id, u8 link_type, u8 vbps, u8 bps, 18262306a36Sopenharmony_ci u8 num_ch, u32 rate, u8 dir, u8 dev_type) 18362306a36Sopenharmony_ci{ 18462306a36Sopenharmony_ci return NULL; 18562306a36Sopenharmony_ci} 18662306a36Sopenharmony_ci 18762306a36Sopenharmony_ci#endif 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_ci#endif 190