Merge tag 'dma-mapping-6.5-2023-07-09' of git://git.infradead.org/users/hch/dma-mapping
[platform/kernel/linux-starfive.git] / include / sound / tas2781.h
1 /* SPDX-License-Identifier: GPL-2.0 */
2 //
3 // ALSA SoC Texas Instruments TAS2781 Audio Smart Amplifier
4 //
5 // Copyright (C) 2022 - 2023 Texas Instruments Incorporated
6 // https://www.ti.com
7 //
8 // The TAS2781 driver implements a flexible and configurable
9 // algo coefficient setting for one, two, or even multiple
10 // TAS2781 chips.
11 //
12 // Author: Shenghao Ding <shenghao-ding@ti.com>
13 // Author: Kevin Lu <kevin-lu@ti.com>
14 //
15
16 #ifndef __TAS2781_H__
17 #define __TAS2781_H__
18
19 #include "tas2781-dsp.h"
20
21 /* version number */
22 #define TAS2781_DRV_VER                 1
23 #define SMARTAMP_MODULE_NAME            "tas2781"
24 #define TAS2781_GLOBAL_ADDR     0x40
25 #define TASDEVICE_RATES                 (SNDRV_PCM_RATE_44100 |\
26         SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000 |\
27         SNDRV_PCM_RATE_88200)
28
29 #define TASDEVICE_FORMATS               (SNDRV_PCM_FMTBIT_S16_LE | \
30         SNDRV_PCM_FMTBIT_S24_LE | \
31         SNDRV_PCM_FMTBIT_S32_LE)
32
33 /*PAGE Control Register (available in page0 of each book) */
34 #define TASDEVICE_PAGE_SELECT           0x00
35 #define TASDEVICE_BOOKCTL_PAGE          0x00
36 #define TASDEVICE_BOOKCTL_REG           127
37 #define TASDEVICE_BOOK_ID(reg)          (reg / (256 * 128))
38 #define TASDEVICE_PAGE_ID(reg)          ((reg % (256 * 128)) / 128)
39 #define TASDEVICE_PAGE_REG(reg)         ((reg % (256 * 128)) % 128)
40 #define TASDEVICE_PGRG(reg)             (reg % (256 * 128))
41 #define TASDEVICE_REG(book, page, reg)  (((book * 256 * 128) + \
42                                         (page * 128)) + reg)
43
44 /*Software Reset */
45 #define TAS2781_REG_SWRESET             TASDEVICE_REG(0x0, 0X0, 0x01)
46 #define TAS2781_REG_SWRESET_RESET       BIT(0)
47
48 /*I2C Checksum */
49 #define TASDEVICE_I2CChecksum           TASDEVICE_REG(0x0, 0x0, 0x7E)
50
51 /* Volume control */
52 #define TAS2781_DVC_LVL                 TASDEVICE_REG(0x0, 0x0, 0x1A)
53 #define TAS2781_AMP_LEVEL               TASDEVICE_REG(0x0, 0x0, 0x03)
54 #define TAS2781_AMP_LEVEL_MASK          GENMASK(5, 1)
55
56 #define TASDEVICE_CMD_SING_W            0x1
57 #define TASDEVICE_CMD_BURST             0x2
58 #define TASDEVICE_CMD_DELAY             0x3
59 #define TASDEVICE_CMD_FIELD_W           0x4
60
61 enum audio_device {
62         TAS2781 = 0,
63 };
64
65 enum device_catlog_id {
66         LENOVO = 0,
67         OTHERS
68 };
69
70 struct tasdevice {
71         struct tasdevice_fw *cali_data_fmw;
72         unsigned int dev_addr;
73         unsigned int err_code;
74         unsigned char cur_book;
75         short cur_prog;
76         short cur_conf;
77         bool is_loading;
78         bool is_loaderr;
79 };
80
81 struct tasdevice_irqinfo {
82         int irq_gpio;
83         int irq;
84 };
85
86 struct calidata {
87         unsigned char *data;
88         unsigned long total_sz;
89 };
90
91 struct tasdevice_priv {
92         struct tasdevice tasdevice[TASDEVICE_MAX_CHANNELS];
93         struct tasdevice_irqinfo irq_info;
94         struct tasdevice_rca rcabin;
95         struct calidata cali_data;
96         struct tasdevice_fw *fmw;
97         struct gpio_desc *reset;
98         struct mutex codec_lock;
99         struct regmap *regmap;
100         struct device *dev;
101         struct tm tm;
102
103         enum device_catlog_id catlog_id;
104         const char *acpi_subsystem_id;
105         unsigned char cal_binaryname[TASDEVICE_MAX_CHANNELS][64];
106         unsigned char crc8_lkp_tbl[CRC8_TABLE_SIZE];
107         unsigned char coef_binaryname[64];
108         unsigned char rca_binaryname[64];
109         unsigned char dev_name[32];
110         unsigned char ndev;
111         unsigned int magic_num;
112         unsigned int chip_id;
113         unsigned int sysclk;
114
115         int cur_prog;
116         int cur_conf;
117         int fw_state;
118         int index;
119         void *client;
120         void *codec;
121         bool force_fwload_status;
122         bool playback_started;
123         bool isacpi;
124         int (*fw_parse_variable_header)(struct tasdevice_priv *tas_priv,
125                 const struct firmware *fmw, int offset);
126         int (*fw_parse_program_data)(struct tasdevice_priv *tas_priv,
127                 struct tasdevice_fw *tas_fmw,
128                 const struct firmware *fmw, int offset);
129         int (*fw_parse_configuration_data)(struct tasdevice_priv *tas_priv,
130                 struct tasdevice_fw *tas_fmw,
131                 const struct firmware *fmw, int offset);
132         int (*tasdevice_load_block)(struct tasdevice_priv *tas_priv,
133                 struct tasdev_blk *block);
134 };
135
136 void tas2781_reset(struct tasdevice_priv *tas_dev);
137 int tascodec_init(struct tasdevice_priv *tas_priv, void *codec,
138         void (*cont)(const struct firmware *fw, void *context));
139 struct tasdevice_priv *tasdevice_kzalloc(struct i2c_client *i2c);
140 int tasdevice_init(struct tasdevice_priv *tas_priv);
141 void tasdevice_remove(struct tasdevice_priv *tas_priv);
142 int tasdevice_dev_read(struct tasdevice_priv *tas_priv,
143         unsigned short chn, unsigned int reg, unsigned int *value);
144 int tasdevice_dev_write(struct tasdevice_priv *tas_priv,
145         unsigned short chn, unsigned int reg, unsigned int value);
146 int tasdevice_dev_bulk_write(
147         struct tasdevice_priv *tas_priv, unsigned short chn,
148         unsigned int reg, unsigned char *p_data, unsigned int n_length);
149 int tasdevice_dev_bulk_read(struct tasdevice_priv *tas_priv,
150         unsigned short chn, unsigned int reg, unsigned char *p_data,
151         unsigned int n_length);
152 int tasdevice_dev_update_bits(
153         struct tasdevice_priv *tasdevice, unsigned short chn,
154         unsigned int reg, unsigned int mask, unsigned int value);
155 int tasdevice_amp_putvol(struct tasdevice_priv *tas_priv,
156         struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
157 int tasdevice_amp_getvol(struct tasdevice_priv *tas_priv,
158         struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
159 int tasdevice_digital_putvol(struct tasdevice_priv *tas_priv,
160         struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
161 int tasdevice_digital_getvol(struct tasdevice_priv *tas_priv,
162         struct snd_ctl_elem_value *ucontrol, struct soc_mixer_control *mc);
163
164 #endif /* __TAS2781_H__ */