16014e902STakashi Iwai /* SPDX-License-Identifier: GPL-2.0-only 26014e902STakashi Iwai * 36014e902STakashi Iwai * HDA audio driver for Texas Instruments TAS2781 smart amp 46014e902STakashi Iwai * 56014e902STakashi Iwai * Copyright (C) 2025 Texas Instruments, Inc. 66014e902STakashi Iwai */ 76014e902STakashi Iwai #ifndef __TAS2781_HDA_H__ 86014e902STakashi Iwai #define __TAS2781_HDA_H__ 96014e902STakashi Iwai 106014e902STakashi Iwai #include <sound/asound.h> 116014e902STakashi Iwai 126014e902STakashi Iwai /* Flag of calibration registers address. */ 136014e902STakashi Iwai #define TASDEV_UEFI_CALI_REG_ADDR_FLG BIT(7) 14*cac5f2afSShenghao Ding 156014e902STakashi Iwai #define TASDEV_CALIB_N 5 166014e902STakashi Iwai 176014e902STakashi Iwai /* 186014e902STakashi Iwai * No standard control callbacks for SNDRV_CTL_ELEM_IFACE_CARD 196014e902STakashi Iwai * Define two controls, one is Volume control callbacks, the other is 206014e902STakashi Iwai * flag setting control callbacks. 216014e902STakashi Iwai */ 226014e902STakashi Iwai 236014e902STakashi Iwai /* Volume control callbacks for tas2781 */ 246014e902STakashi Iwai #define ACARD_SINGLE_RANGE_EXT_TLV(xname, xreg, xshift, xmin, xmax, xinvert, \ 256014e902STakashi Iwai xhandler_get, xhandler_put, tlv_array) { \ 266014e902STakashi Iwai .iface = SNDRV_CTL_ELEM_IFACE_CARD, .name = (xname), \ 276014e902STakashi Iwai .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 286014e902STakashi Iwai SNDRV_CTL_ELEM_ACCESS_READWRITE, \ 296014e902STakashi Iwai .tlv.p = (tlv_array), \ 306014e902STakashi Iwai .info = snd_soc_info_volsw, \ 316014e902STakashi Iwai .get = xhandler_get, .put = xhandler_put, \ 326014e902STakashi Iwai .private_value = (unsigned long)&(struct soc_mixer_control) { \ 336014e902STakashi Iwai .reg = xreg, .rreg = xreg, \ 346014e902STakashi Iwai .shift = xshift, .rshift = xshift,\ 356014e902STakashi Iwai .min = xmin, .max = xmax, .invert = xinvert, \ 366014e902STakashi Iwai } \ 376014e902STakashi Iwai } 386014e902STakashi Iwai 396014e902STakashi Iwai /* Flag control callbacks for tas2781 */ 406014e902STakashi Iwai #define ACARD_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) { \ 416014e902STakashi Iwai .iface = SNDRV_CTL_ELEM_IFACE_CARD, \ 426014e902STakashi Iwai .name = xname, \ 436014e902STakashi Iwai .info = snd_ctl_boolean_mono_info, \ 446014e902STakashi Iwai .get = xhandler_get, \ 456014e902STakashi Iwai .put = xhandler_put, \ 466014e902STakashi Iwai .private_value = xdata, \ 476014e902STakashi Iwai } 486014e902STakashi Iwai 496014e902STakashi Iwai enum device_catlog_id { 506014e902STakashi Iwai DELL = 0, 516014e902STakashi Iwai HP, 526014e902STakashi Iwai LENOVO, 536014e902STakashi Iwai OTHERS 546014e902STakashi Iwai }; 556014e902STakashi Iwai 566014e902STakashi Iwai struct tas2781_hda { 576014e902STakashi Iwai struct device *dev; 586014e902STakashi Iwai struct tasdevice_priv *priv; 596014e902STakashi Iwai struct snd_kcontrol *dsp_prog_ctl; 606014e902STakashi Iwai struct snd_kcontrol *dsp_conf_ctl; 616014e902STakashi Iwai struct snd_kcontrol *prof_ctl; 626014e902STakashi Iwai enum device_catlog_id catlog_id; 636014e902STakashi Iwai void *hda_priv; 646014e902STakashi Iwai }; 656014e902STakashi Iwai 666014e902STakashi Iwai extern const efi_guid_t tasdev_fct_efi_guid[]; 676014e902STakashi Iwai 686014e902STakashi Iwai int tas2781_save_calibration(struct tas2781_hda *p); 696014e902STakashi Iwai void tas2781_hda_remove(struct device *dev, 706014e902STakashi Iwai const struct component_ops *ops); 716014e902STakashi Iwai int tasdevice_info_profile(struct snd_kcontrol *kctl, 726014e902STakashi Iwai struct snd_ctl_elem_info *uctl); 736014e902STakashi Iwai int tasdevice_info_programs(struct snd_kcontrol *kctl, 746014e902STakashi Iwai struct snd_ctl_elem_info *uctl); 756014e902STakashi Iwai int tasdevice_info_config(struct snd_kcontrol *kctl, 766014e902STakashi Iwai struct snd_ctl_elem_info *uctl); 776014e902STakashi Iwai int tasdevice_set_profile_id(struct snd_kcontrol *kctl, 786014e902STakashi Iwai struct snd_ctl_elem_value *uctl); 796014e902STakashi Iwai int tasdevice_get_profile_id(struct snd_kcontrol *kctl, 806014e902STakashi Iwai struct snd_ctl_elem_value *uctl); 816014e902STakashi Iwai int tasdevice_program_get(struct snd_kcontrol *kctl, 826014e902STakashi Iwai struct snd_ctl_elem_value *uctl); 836014e902STakashi Iwai int tasdevice_program_put(struct snd_kcontrol *kctl, 846014e902STakashi Iwai struct snd_ctl_elem_value *uctl); 856014e902STakashi Iwai int tasdevice_config_put(struct snd_kcontrol *kctl, 866014e902STakashi Iwai struct snd_ctl_elem_value *uctl); 876014e902STakashi Iwai int tasdevice_config_get(struct snd_kcontrol *kctl, 886014e902STakashi Iwai struct snd_ctl_elem_value *uctl); 896014e902STakashi Iwai 906014e902STakashi Iwai #endif 91