2020-05-01 17:58:50 +03:00
/* SPDX-License-Identifier: GPL-2.0-only
2017-10-13 02:49:38 +03:00
*
2018-07-02 09:24:04 +03:00
* Copyright ( C ) 2013 - 15 , Intel Corporation . All rights reserved .
2017-10-13 02:49:38 +03:00
*/
# ifndef __LINUX_SND_SOC_ACPI_H
# define __LINUX_SND_SOC_ACPI_H
# include <linux/stddef.h>
# include <linux/acpi.h>
2018-01-05 01:35:52 +03:00
# include <linux/mod_devicetable.h>
2023-08-01 00:32:38 +03:00
# include <linux/soundwire/sdw.h>
2017-10-13 02:49:38 +03:00
struct snd_soc_acpi_package_context {
char * name ; /* package name */
int length ; /* number of elements */
struct acpi_buffer * format ;
struct acpi_buffer * state ;
bool data_valid ;
} ;
2018-01-11 22:52:09 +03:00
/* codec name is used in DAIs is i2c-<HID>:00 with HID being 8 chars */
# define SND_ACPI_I2C_ID_LEN (4 + ACPI_ID_LEN + 3 + 1)
2017-10-13 02:49:38 +03:00
# if IS_ENABLED(CONFIG_ACPI)
2019-01-25 23:16:17 +03:00
/* acpi match */
struct snd_soc_acpi_mach *
snd_soc_acpi_find_machine ( struct snd_soc_acpi_mach * machines ) ;
2017-10-13 02:49:38 +03:00
bool snd_soc_acpi_find_package_from_hid ( const u8 hid [ ACPI_ID_LEN ] ,
struct snd_soc_acpi_package_context * ctx ) ;
2019-01-25 23:16:17 +03:00
/* check all codecs */
struct snd_soc_acpi_mach * snd_soc_acpi_codec_list ( void * arg ) ;
2017-10-13 02:49:38 +03:00
# else
2019-01-25 23:16:17 +03:00
/* acpi match */
static inline struct snd_soc_acpi_mach *
snd_soc_acpi_find_machine ( struct snd_soc_acpi_mach * machines )
{
return NULL ;
}
2017-10-13 02:49:38 +03:00
static inline bool
snd_soc_acpi_find_package_from_hid ( const u8 hid [ ACPI_ID_LEN ] ,
struct snd_soc_acpi_package_context * ctx )
{
return false ;
}
2019-01-25 23:16:17 +03:00
/* check all codecs */
static inline struct snd_soc_acpi_mach * snd_soc_acpi_codec_list ( void * arg )
{
return NULL ;
}
# endif
2017-10-13 02:49:38 +03:00
2018-11-02 00:34:48 +03:00
/**
* snd_soc_acpi_mach_params : interface for machine driver configuration
*
* @ acpi_ipc_irq_index : used for BYT - CR detection
2020-08-24 23:09:12 +03:00
* @ platform : string used for HDAudio codec support
2018-11-02 00:34:48 +03:00
* @ codec_mask : used for HDAudio support
2022-03-08 22:25:51 +03:00
* @ dmic_num : number of SoC - or chipset - attached PDM digital microphones
2019-10-29 16:40:11 +03:00
* @ common_hdmi_codec_drv : use commom HDAudio HDMI codec driver
2022-03-08 22:25:51 +03:00
* @ link_mask : SoundWire links enabled on the board
* @ links : array of SoundWire link _ADR descriptors , null terminated
2022-03-08 22:25:52 +03:00
* @ i2s_link_mask : I2S / TDM links enabled on the board
2021-04-10 01:01:17 +03:00
* @ num_dai_drivers : number of elements in @ dai_drivers
* @ dai_drivers : pointer to dai_drivers , used e . g . in nocodec mode
2023-09-12 19:32:05 +03:00
* @ subsystem_vendor : optional PCI SSID vendor value
* @ subsystem_device : optional PCI SSID device value
* @ subsystem_id_set : true if a value has been written to
* subsystem_vendor and subsystem_device .
2018-11-02 00:34:48 +03:00
*/
struct snd_soc_acpi_mach_params {
u32 acpi_ipc_irq_index ;
const char * platform ;
u32 codec_mask ;
2018-11-17 03:47:05 +03:00
u32 dmic_num ;
2019-10-29 16:40:11 +03:00
bool common_hdmi_codec_drv ;
2020-01-11 01:25:25 +03:00
u32 link_mask ;
const struct snd_soc_acpi_link_adr * links ;
2022-03-08 22:25:52 +03:00
u32 i2s_link_mask ;
2021-04-10 01:01:17 +03:00
u32 num_dai_drivers ;
struct snd_soc_dai_driver * dai_drivers ;
2023-09-12 19:32:05 +03:00
unsigned short subsystem_vendor ;
unsigned short subsystem_device ;
bool subsystem_id_set ;
2020-01-11 01:25:25 +03:00
} ;
/**
2020-03-26 00:50:17 +03:00
* snd_soc_acpi_endpoint - endpoint descriptor
* @ num : endpoint number ( mandatory , unique per device )
* @ aggregated : 0 ( independent ) or 1 ( logically grouped )
* @ group_position : zero - based order ( only when @ aggregated is 1 )
* @ group_id : platform - unique group identifier ( only when @ aggregrated is 1 )
*/
struct snd_soc_acpi_endpoint {
u8 num ;
u8 aggregated ;
u8 group_position ;
u8 group_id ;
} ;
/**
* snd_soc_acpi_adr_device - descriptor for _ADR - enumerated device
* @ adr : 64 bit ACPI _ADR value
* @ num_endpoints : number of endpoints for this device
* @ endpoints : array of endpoints
2020-09-23 11:05:11 +03:00
* @ name_prefix : string used for codec controls
2020-03-26 00:50:17 +03:00
*/
struct snd_soc_acpi_adr_device {
const u64 adr ;
const u8 num_endpoints ;
const struct snd_soc_acpi_endpoint * endpoints ;
2020-09-23 11:05:11 +03:00
const char * name_prefix ;
2020-03-26 00:50:17 +03:00
} ;
/**
* snd_soc_acpi_link_adr - ACPI - based list of _ADR enumerated devices
2020-01-11 01:25:25 +03:00
* @ mask : one bit set indicates the link this list applies to
2020-03-26 00:50:17 +03:00
* @ num_adr : ARRAY_SIZE of devices
* @ adr_d : array of devices
*
* The number of devices per link can be more than 1 , e . g . in SoundWire
* multi - drop configurations .
2020-01-11 01:25:25 +03:00
*/
struct snd_soc_acpi_link_adr {
const u32 mask ;
const u32 num_adr ;
2020-03-26 00:50:17 +03:00
const struct snd_soc_acpi_adr_device * adr_d ;
2018-11-02 00:34:48 +03:00
} ;
2022-03-08 22:25:56 +03:00
/*
* when set the topology uses the - ssp < N > suffix , where N is determined based on
* BIOS or DMI information
*/
# define SND_SOC_ACPI_TPLG_INTEL_SSP_NUMBER BIT(0)
/*
* when more than one SSP is reported in the link mask , use the most significant .
* This choice was found to be valid on platforms with ES8336 codecs .
*/
# define SND_SOC_ACPI_TPLG_INTEL_SSP_MSB BIT(1)
/*
* when set the topology uses the - dmic < N > ch suffix , where N is determined based on
* BIOS or DMI information
*/
# define SND_SOC_ACPI_TPLG_INTEL_DMIC_NUMBER BIT(2)
2017-10-13 02:49:38 +03:00
/**
* snd_soc_acpi_mach : ACPI - based machine descriptor . Most of the fields are
* related to the hardware , except for the firmware and topology file names .
2017-10-13 02:49:40 +03:00
* A platform supported by legacy and Sound Open Firmware ( SOF ) would expose
* all firmware / topology related fields .
2017-10-13 02:49:38 +03:00
*
* @ id : ACPI ID ( usually the codec ' s ) used to find a matching machine driver .
2023-08-03 19:23:12 +03:00
* @ uid : ACPI Unique ID , can be used to disambiguate matches .
2021-10-29 20:14:04 +03:00
* @ comp_ids : list of compatible audio codecs using the same machine driver ,
* firmware and topology
2019-09-17 00:42:40 +03:00
* @ link_mask : describes required board layout , e . g . for SoundWire .
2020-01-11 01:25:25 +03:00
* @ links : array of link _ADR descriptors , null terminated .
2017-10-13 02:49:38 +03:00
* @ drv_name : machine driver name
2017-10-13 02:49:40 +03:00
* @ fw_filename : firmware file name . Used when SOF is not enabled .
2022-05-16 13:11:03 +03:00
* @ tplg_filename : topology file name . Used when SOF is not enabled .
2017-10-13 02:49:38 +03:00
* @ board : board name
* @ machine_quirk : pointer to quirk , usually based on DMI information when
* ACPI ID alone is not sufficient , wrong or misleading
* @ quirk_data : data used to uniquely identify a machine , usually a list of
* audio codecs whose presence if checked with ACPI
* @ pdata : intended for platform data or machine specific - ops . This structure
* is not constant since this field may be updated at run - time
2017-10-13 02:49:40 +03:00
* @ sof_tplg_filename : Sound Open Firmware topology file name , if enabled
2022-03-08 22:25:56 +03:00
* @ tplg_quirk_mask : quirks to select different topology files dynamically
2017-10-13 02:49:38 +03:00
*/
/* Descriptor for SST ASoC machine driver */
struct snd_soc_acpi_mach {
2021-11-18 18:30:14 +03:00
u8 id [ ACPI_ID_LEN ] ;
2023-05-19 23:17:09 +03:00
const char * uid ;
2021-10-29 20:14:04 +03:00
const struct snd_soc_acpi_codecs * comp_ids ;
2019-09-17 00:42:40 +03:00
const u32 link_mask ;
2020-01-11 01:25:25 +03:00
const struct snd_soc_acpi_link_adr * links ;
2017-10-13 02:49:38 +03:00
const char * drv_name ;
const char * fw_filename ;
2022-05-16 13:11:03 +03:00
const char * tplg_filename ;
2017-10-13 02:49:38 +03:00
const char * board ;
struct snd_soc_acpi_mach * ( * machine_quirk ) ( void * arg ) ;
const void * quirk_data ;
void * pdata ;
2018-11-02 00:34:48 +03:00
struct snd_soc_acpi_mach_params mach_params ;
2017-10-13 02:49:40 +03:00
const char * sof_tplg_filename ;
2022-03-08 22:25:56 +03:00
const u32 tplg_quirk_mask ;
2017-10-13 02:49:38 +03:00
} ;
# define SND_SOC_ACPI_MAX_CODECS 3
/**
* struct snd_soc_acpi_codecs : Structure to hold secondary codec information
* apart from the matched one , this data will be passed to the quirk function
* to match with the ACPI detected devices
*
* @ num_codecs : number of secondary codecs used in the platform
* @ codecs : holds the codec IDs
*
*/
struct snd_soc_acpi_codecs {
int num_codecs ;
u8 codecs [ SND_SOC_ACPI_MAX_CODECS ] [ ACPI_ID_LEN ] ;
} ;
2020-11-13 01:38:15 +03:00
static inline bool snd_soc_acpi_sof_parent ( struct device * dev )
{
return dev - > parent & & dev - > parent - > driver & & dev - > parent - > driver - > name & &
2021-03-02 03:31:19 +03:00
! strncmp ( dev - > parent - > driver - > name , " sof-audio-acpi " , strlen ( " sof-audio-acpi " ) ) ;
2020-11-13 01:38:15 +03:00
}
2023-08-01 00:32:38 +03:00
bool snd_soc_acpi_sdw_link_slaves_found ( struct device * dev ,
const struct snd_soc_acpi_link_adr * link ,
struct sdw_extended_slave_id * ids ,
int num_slaves ) ;
2017-10-13 02:49:38 +03:00
# endif