1813e311eSShenghao Ding /* SPDX-License-Identifier: GPL-2.0-only 2813e311eSShenghao Ding * 3813e311eSShenghao Ding * HDA audio driver for Texas Instruments TAS2781 smart amp 4813e311eSShenghao Ding * 5813e311eSShenghao Ding * Copyright (C) 2025 Texas Instruments, Inc. 6813e311eSShenghao Ding */ 7813e311eSShenghao Ding #ifndef __TAS2781_HDA_H__ 8813e311eSShenghao Ding #define __TAS2781_HDA_H__ 9813e311eSShenghao Ding 10813e311eSShenghao Ding #include <sound/asound.h> 11813e311eSShenghao Ding 12*4fe23851SShenghao Ding /* Flag of calibration registers address. */ 13*4fe23851SShenghao Ding #define TASDEV_UEFI_CALI_REG_ADDR_FLG BIT(7) 149fa6a693SShenghao Ding #define TASDEVICE_CALIBRATION_DATA_NAME L"CALI_DATA" 159fa6a693SShenghao Ding #define TASDEV_CALIB_N 5 169fa6a693SShenghao Ding 17813e311eSShenghao Ding /* 18813e311eSShenghao Ding * No standard control callbacks for SNDRV_CTL_ELEM_IFACE_CARD 19813e311eSShenghao Ding * Define two controls, one is Volume control callbacks, the other is 20813e311eSShenghao Ding * flag setting control callbacks. 21813e311eSShenghao Ding */ 22813e311eSShenghao Ding 23813e311eSShenghao Ding /* Volume control callbacks for tas2781 */ 24813e311eSShenghao Ding #define ACARD_SINGLE_RANGE_EXT_TLV(xname, xreg, xshift, xmin, xmax, xinvert, \ 25813e311eSShenghao Ding xhandler_get, xhandler_put, tlv_array) { \ 26813e311eSShenghao Ding .iface = SNDRV_CTL_ELEM_IFACE_CARD, .name = (xname), \ 27813e311eSShenghao Ding .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \ 28813e311eSShenghao Ding SNDRV_CTL_ELEM_ACCESS_READWRITE, \ 29813e311eSShenghao Ding .tlv.p = (tlv_array), \ 30813e311eSShenghao Ding .info = snd_soc_info_volsw, \ 31813e311eSShenghao Ding .get = xhandler_get, .put = xhandler_put, \ 32813e311eSShenghao Ding .private_value = (unsigned long)&(struct soc_mixer_control) { \ 33813e311eSShenghao Ding .reg = xreg, .rreg = xreg, \ 34813e311eSShenghao Ding .shift = xshift, .rshift = xshift,\ 35813e311eSShenghao Ding .min = xmin, .max = xmax, .invert = xinvert, \ 36813e311eSShenghao Ding } \ 37813e311eSShenghao Ding } 38813e311eSShenghao Ding 39813e311eSShenghao Ding /* Flag control callbacks for tas2781 */ 40813e311eSShenghao Ding #define ACARD_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) { \ 41813e311eSShenghao Ding .iface = SNDRV_CTL_ELEM_IFACE_CARD, \ 42813e311eSShenghao Ding .name = xname, \ 43813e311eSShenghao Ding .info = snd_ctl_boolean_mono_info, \ 44813e311eSShenghao Ding .get = xhandler_get, \ 45813e311eSShenghao Ding .put = xhandler_put, \ 46813e311eSShenghao Ding .private_value = xdata, \ 47813e311eSShenghao Ding } 48813e311eSShenghao Ding 49*4fe23851SShenghao Ding enum device_catlog_id { 50*4fe23851SShenghao Ding DELL = 0, 51*4fe23851SShenghao Ding HP, 52*4fe23851SShenghao Ding LENOVO, 53*4fe23851SShenghao Ding OTHERS 54*4fe23851SShenghao Ding }; 55*4fe23851SShenghao Ding 5628a09d9eSShenghao Ding struct tas2781_hda { 5728a09d9eSShenghao Ding struct device *dev; 5828a09d9eSShenghao Ding struct tasdevice_priv *priv; 5928a09d9eSShenghao Ding struct snd_kcontrol *dsp_prog_ctl; 6028a09d9eSShenghao Ding struct snd_kcontrol *dsp_conf_ctl; 6128a09d9eSShenghao Ding struct snd_kcontrol *prof_ctl; 6228a09d9eSShenghao Ding enum device_catlog_id catlog_id; 6328a09d9eSShenghao Ding void *hda_priv; 6428a09d9eSShenghao Ding }; 6528a09d9eSShenghao Ding 66*4fe23851SShenghao Ding extern const efi_guid_t tasdev_fct_efi_guid[]; 67*4fe23851SShenghao Ding 68*4fe23851SShenghao Ding int tas2781_save_calibration(struct tas2781_hda *p); 6928a09d9eSShenghao Ding void tas2781_hda_remove(struct device *dev, 7028a09d9eSShenghao Ding const struct component_ops *ops); 7128a09d9eSShenghao Ding int tasdevice_info_profile(struct snd_kcontrol *kctl, 7228a09d9eSShenghao Ding struct snd_ctl_elem_info *uctl); 7328a09d9eSShenghao Ding int tasdevice_info_programs(struct snd_kcontrol *kctl, 7428a09d9eSShenghao Ding struct snd_ctl_elem_info *uctl); 7528a09d9eSShenghao Ding int tasdevice_info_config(struct snd_kcontrol *kctl, 7628a09d9eSShenghao Ding struct snd_ctl_elem_info *uctl); 7728a09d9eSShenghao Ding int tasdevice_set_profile_id(struct snd_kcontrol *kctl, 7828a09d9eSShenghao Ding struct snd_ctl_elem_value *uctl); 7928a09d9eSShenghao Ding int tasdevice_get_profile_id(struct snd_kcontrol *kctl, 8028a09d9eSShenghao Ding struct snd_ctl_elem_value *uctl); 8128a09d9eSShenghao Ding int tasdevice_program_get(struct snd_kcontrol *kctl, 8228a09d9eSShenghao Ding struct snd_ctl_elem_value *uctl); 8328a09d9eSShenghao Ding int tasdevice_program_put(struct snd_kcontrol *kctl, 8428a09d9eSShenghao Ding struct snd_ctl_elem_value *uctl); 8528a09d9eSShenghao Ding int tasdevice_config_put(struct snd_kcontrol *kctl, 8628a09d9eSShenghao Ding struct snd_ctl_elem_value *uctl); 8728a09d9eSShenghao Ding int tasdevice_config_get(struct snd_kcontrol *kctl, 8828a09d9eSShenghao Ding struct snd_ctl_elem_value *uctl); 8928a09d9eSShenghao Ding 90813e311eSShenghao Ding #endif 91