Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0-only
2 *
3 * HDA audio driver for Texas Instruments TAS2781 smart amp
4 *
5 * Copyright (C) 2025 Texas Instruments, Inc.
6 */
7#ifndef __TAS2781_HDA_H__
8#define __TAS2781_HDA_H__
9
10#include <sound/asound.h>
11
12/* Flag of calibration registers address. */
13#define TASDEV_UEFI_CALI_REG_ADDR_FLG BIT(7)
14
15#define TASDEV_CALIB_N 5
16
17/*
18 * No standard control callbacks for SNDRV_CTL_ELEM_IFACE_CARD
19 * Define two controls, one is Volume control callbacks, the other is
20 * flag setting control callbacks.
21 */
22
23/* Volume control callbacks for tas2781 */
24#define ACARD_SINGLE_RANGE_EXT_TLV(xname, xreg, xshift, xmin, xmax, xinvert, \
25 xhandler_get, xhandler_put, tlv_array) { \
26 .iface = SNDRV_CTL_ELEM_IFACE_CARD, .name = (xname), \
27 .access = SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
28 SNDRV_CTL_ELEM_ACCESS_READWRITE, \
29 .tlv.p = (tlv_array), \
30 .info = snd_soc_info_volsw, \
31 .get = xhandler_get, .put = xhandler_put, \
32 .private_value = (unsigned long)&(struct soc_mixer_control) { \
33 .reg = xreg, .rreg = xreg, \
34 .shift = xshift, .rshift = xshift,\
35 .min = xmin, .max = xmax, .invert = xinvert, \
36 } \
37}
38
39/* Flag control callbacks for tas2781 */
40#define ACARD_SINGLE_BOOL_EXT(xname, xdata, xhandler_get, xhandler_put) { \
41 .iface = SNDRV_CTL_ELEM_IFACE_CARD, \
42 .name = xname, \
43 .info = snd_ctl_boolean_mono_info, \
44 .get = xhandler_get, \
45 .put = xhandler_put, \
46 .private_value = xdata, \
47}
48
49enum device_catlog_id {
50 DELL = 0,
51 HP,
52 LENOVO,
53 OTHERS
54};
55
56struct tas2781_hda {
57 struct device *dev;
58 struct tasdevice_priv *priv;
59 struct snd_kcontrol *dsp_prog_ctl;
60 struct snd_kcontrol *dsp_conf_ctl;
61 struct snd_kcontrol *prof_ctl;
62 enum device_catlog_id catlog_id;
63 void *hda_priv;
64};
65
66extern const efi_guid_t tasdev_fct_efi_guid[];
67
68int tas2781_save_calibration(struct tas2781_hda *p);
69void tas2781_hda_remove(struct device *dev,
70 const struct component_ops *ops);
71int tasdevice_info_profile(struct snd_kcontrol *kctl,
72 struct snd_ctl_elem_info *uctl);
73int tasdevice_info_programs(struct snd_kcontrol *kctl,
74 struct snd_ctl_elem_info *uctl);
75int tasdevice_info_config(struct snd_kcontrol *kctl,
76 struct snd_ctl_elem_info *uctl);
77int tasdevice_set_profile_id(struct snd_kcontrol *kctl,
78 struct snd_ctl_elem_value *uctl);
79int tasdevice_get_profile_id(struct snd_kcontrol *kctl,
80 struct snd_ctl_elem_value *uctl);
81int tasdevice_program_get(struct snd_kcontrol *kctl,
82 struct snd_ctl_elem_value *uctl);
83int tasdevice_program_put(struct snd_kcontrol *kctl,
84 struct snd_ctl_elem_value *uctl);
85int tasdevice_config_put(struct snd_kcontrol *kctl,
86 struct snd_ctl_elem_value *uctl);
87int tasdevice_config_get(struct snd_kcontrol *kctl,
88 struct snd_ctl_elem_value *uctl);
89
90#endif