blob: 1dd2559efa5698a1888177db183579cce1e2409d [file] [log] [blame]
Meng Wang43bbb872018-12-10 12:32:05 +08001// SPDX-License-Identifier: GPL-2.0-only
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303 */
4
5#include <linux/module.h>
6#include <linux/init.h>
7#include <linux/io.h>
8#include <linux/platform_device.h>
9#include <linux/clk.h>
10#include <sound/soc.h>
11#include <sound/pcm.h>
12#include <sound/pcm_params.h>
13#include <sound/soc-dapm.h>
14#include <sound/tlv.h>
Sudheer Papothia3e969d2018-10-27 06:22:10 +053015#include <soc/swr-common.h>
Laxminath Kasama7ecc582018-06-15 16:55:02 +053016#include <soc/swr-wcd.h>
17
Meng Wang11a25cf2018-10-31 14:11:26 +080018#include <asoc/msm-cdc-pinctrl.h>
Laxminath Kasama7ecc582018-06-15 16:55:02 +053019#include "bolero-cdc.h"
20#include "bolero-cdc-registers.h"
Laxminath Kasama7ecc582018-06-15 16:55:02 +053021
22#define RX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
23 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
24 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\
25 SNDRV_PCM_RATE_384000)
26/* Fractional Rates */
27#define RX_MACRO_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\
28 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800)
29
30#define RX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
31 SNDRV_PCM_FMTBIT_S24_LE |\
32 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
33
34#define RX_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
35 SNDRV_PCM_RATE_48000)
36#define RX_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
37 SNDRV_PCM_FMTBIT_S24_LE |\
38 SNDRV_PCM_FMTBIT_S24_3LE)
39
Laxminath Kasamac396d52018-09-06 12:53:26 +053040#define SAMPLING_RATE_44P1KHZ 44100
41#define SAMPLING_RATE_88P2KHZ 88200
42#define SAMPLING_RATE_176P4KHZ 176400
43#define SAMPLING_RATE_352P8KHZ 352800
44
Laxminath Kasama7ecc582018-06-15 16:55:02 +053045#define RX_MACRO_MAX_OFFSET 0x1000
46
47#define RX_MACRO_MAX_DMA_CH_PER_PORT 2
48#define RX_SWR_STRING_LEN 80
49#define RX_MACRO_CHILD_DEVICES_MAX 3
50
51#define RX_MACRO_INTERP_MUX_NUM_INPUTS 3
52#define RX_MACRO_SIDETONE_IIR_COEFF_MAX 5
53
54#define STRING(name) #name
55#define RX_MACRO_DAPM_ENUM(name, reg, offset, text) \
56static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
57static const struct snd_kcontrol_new name##_mux = \
58 SOC_DAPM_ENUM(STRING(name), name##_enum)
59
60#define RX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \
61static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
62static const struct snd_kcontrol_new name##_mux = \
63 SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname)
64
65#define RX_MACRO_DAPM_MUX(name, shift, kctl) \
66 SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux)
67
68#define RX_MACRO_RX_PATH_OFFSET 0x80
69#define RX_MACRO_COMP_OFFSET 0x40
70
Laxminath Kasam497a6512018-09-17 16:11:52 +053071#define MAX_IMPED_PARAMS 6
72
73struct wcd_imped_val {
74 u32 imped_val;
75 u8 index;
76};
77
78static const struct wcd_imped_val imped_index[] = {
79 {4, 0},
80 {5, 1},
81 {6, 2},
82 {7, 3},
83 {8, 4},
84 {9, 5},
85 {10, 6},
86 {11, 7},
87 {12, 8},
88 {13, 9},
89};
90
91struct rx_macro_reg_mask_val {
92 u16 reg;
93 u8 mask;
94 u8 val;
95};
96
97static const struct rx_macro_reg_mask_val imped_table[][MAX_IMPED_PARAMS] = {
98 {
99 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf2},
100 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf2},
101 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
102 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf2},
103 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf2},
104 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
105 },
106 {
107 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf4},
108 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf4},
109 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
110 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf4},
111 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf4},
112 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
113 },
114 {
115 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf7},
116 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf7},
117 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x01},
118 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf7},
119 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7},
120 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x01},
121 },
122 {
123 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf9},
124 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf9},
125 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
126 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf9},
127 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9},
128 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
129 },
130 {
131 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfa},
132 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfa},
133 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
134 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfa},
135 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa},
136 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
137 },
138 {
139 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfb},
140 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfb},
141 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
142 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfb},
143 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb},
144 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
145 },
146 {
147 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfc},
148 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfc},
149 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
150 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfc},
151 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc},
152 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
153 },
154 {
155 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfd},
156 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfd},
157 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
158 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfd},
159 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd},
160 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
161 },
162 {
163 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfd},
164 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfd},
165 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x01},
166 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfd},
167 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd},
168 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x01},
169 },
170};
171
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530172enum {
173 INTERP_HPHL,
174 INTERP_HPHR,
175 INTERP_AUX,
176 INTERP_MAX
177};
178
179enum {
180 RX_MACRO_RX0,
181 RX_MACRO_RX1,
182 RX_MACRO_RX2,
183 RX_MACRO_RX3,
184 RX_MACRO_RX4,
185 RX_MACRO_RX5,
186 RX_MACRO_PORTS_MAX
187};
188
189enum {
190 RX_MACRO_COMP1, /* HPH_L */
191 RX_MACRO_COMP2, /* HPH_R */
192 RX_MACRO_COMP_MAX
193};
194
195enum {
196 INTn_1_INP_SEL_ZERO = 0,
197 INTn_1_INP_SEL_DEC0,
198 INTn_1_INP_SEL_DEC1,
199 INTn_1_INP_SEL_IIR0,
200 INTn_1_INP_SEL_IIR1,
201 INTn_1_INP_SEL_RX0,
202 INTn_1_INP_SEL_RX1,
203 INTn_1_INP_SEL_RX2,
204 INTn_1_INP_SEL_RX3,
205 INTn_1_INP_SEL_RX4,
206 INTn_1_INP_SEL_RX5,
207};
208
209enum {
210 INTn_2_INP_SEL_ZERO = 0,
211 INTn_2_INP_SEL_RX0,
212 INTn_2_INP_SEL_RX1,
213 INTn_2_INP_SEL_RX2,
214 INTn_2_INP_SEL_RX3,
215 INTn_2_INP_SEL_RX4,
216 INTn_2_INP_SEL_RX5,
217};
218
219enum {
220 INTERP_MAIN_PATH,
221 INTERP_MIX_PATH,
222};
223
224/* Codec supports 2 IIR filters */
225enum {
226 IIR0 = 0,
227 IIR1,
228 IIR_MAX,
229};
230
231/* Each IIR has 5 Filter Stages */
232enum {
233 BAND1 = 0,
234 BAND2,
235 BAND3,
236 BAND4,
237 BAND5,
238 BAND_MAX,
239};
240
241struct rx_macro_idle_detect_config {
242 u8 hph_idle_thr;
243 u8 hph_idle_detect_en;
244};
245
246struct interp_sample_rate {
247 int sample_rate;
248 int rate_val;
249};
250
251static struct interp_sample_rate sr_val_tbl[] = {
252 {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5},
253 {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA},
254 {176400, 0xB}, {352800, 0xC},
255};
256
Aditya Bavanari4f3d5642018-09-18 22:19:10 +0530257struct rx_macro_bcl_pmic_params {
258 u8 id;
259 u8 sid;
260 u8 ppid;
261};
262
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530263static int rx_macro_hw_params(struct snd_pcm_substream *substream,
264 struct snd_pcm_hw_params *params,
265 struct snd_soc_dai *dai);
266static int rx_macro_get_channel_map(struct snd_soc_dai *dai,
267 unsigned int *tx_num, unsigned int *tx_slot,
268 unsigned int *rx_num, unsigned int *rx_slot);
269static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol,
270 struct snd_ctl_elem_value *ucontrol);
271static int rx_macro_mux_get(struct snd_kcontrol *kcontrol,
272 struct snd_ctl_elem_value *ucontrol);
273static int rx_macro_mux_put(struct snd_kcontrol *kcontrol,
274 struct snd_ctl_elem_value *ucontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800275static int rx_macro_enable_interp_clk(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530276 int event, int interp_idx);
277
278/* Hold instance to soundwire platform device */
279struct rx_swr_ctrl_data {
280 struct platform_device *rx_swr_pdev;
281};
282
283struct rx_swr_ctrl_platform_data {
284 void *handle; /* holds codec private data */
285 int (*read)(void *handle, int reg);
286 int (*write)(void *handle, int reg, int val);
287 int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
288 int (*clk)(void *handle, bool enable);
289 int (*handle_irq)(void *handle,
290 irqreturn_t (*swrm_irq_handler)(int irq,
291 void *data),
292 void *swrm_handle,
293 int action);
294};
295
296enum {
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +0530297 RX_MACRO_AIF_INVALID = 0,
298 RX_MACRO_AIF1_PB,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530299 RX_MACRO_AIF2_PB,
300 RX_MACRO_AIF3_PB,
301 RX_MACRO_AIF4_PB,
302 RX_MACRO_MAX_DAIS,
303};
304
305enum {
306 RX_MACRO_AIF1_CAP = 0,
307 RX_MACRO_AIF2_CAP,
308 RX_MACRO_AIF3_CAP,
309 RX_MACRO_MAX_AIF_CAP_DAIS
310};
311/*
312 * @dev: rx macro device pointer
313 * @comp_enabled: compander enable mixer value set
314 * @prim_int_users: Users of interpolator
315 * @rx_mclk_users: RX MCLK users count
316 * @vi_feed_value: VI sense mask
317 * @swr_clk_lock: to lock swr master clock operations
318 * @swr_ctrl_data: SoundWire data structure
319 * @swr_plat_data: Soundwire platform data
320 * @rx_macro_add_child_devices_work: work for adding child devices
321 * @rx_swr_gpio_p: used by pinctrl API
322 * @rx_core_clk: MCLK for rx macro
323 * @rx_npl_clk: NPL clock for RX soundwire
Meng Wang15c825d2018-09-06 10:49:18 +0800324 * @component: codec handle
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530325 */
326struct rx_macro_priv {
327 struct device *dev;
328 int comp_enabled[RX_MACRO_COMP_MAX];
329 /* Main path clock users count */
330 int main_clk_users[INTERP_MAX];
331 int rx_port_value[RX_MACRO_PORTS_MAX];
332 u16 prim_int_users[INTERP_MAX];
333 int rx_mclk_users;
334 int swr_clk_users;
Ramprasad Katkama4c747b2018-12-11 19:15:53 +0530335 bool reset_swr;
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +0530336 int clsh_users;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530337 int rx_mclk_cnt;
Laxminath Kasambee08192018-07-01 14:38:55 +0530338 bool is_native_on;
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +0530339 bool is_ear_mode_on;
Laxminath Kasam701e3582018-10-15 20:06:09 +0530340 bool dev_up;
Laxminath Kasamde09dfb2018-11-09 13:00:30 +0530341 bool hph_pwr_mode;
Laxminath Kasamd3ffb332018-11-14 19:59:21 +0530342 bool hph_hd2_mode;
Laxminath Kasambee08192018-07-01 14:38:55 +0530343 u16 mclk_mux;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530344 struct mutex mclk_lock;
345 struct mutex swr_clk_lock;
346 struct rx_swr_ctrl_data *swr_ctrl_data;
347 struct rx_swr_ctrl_platform_data swr_plat_data;
348 struct work_struct rx_macro_add_child_devices_work;
349 struct device_node *rx_swr_gpio_p;
350 struct clk *rx_core_clk;
351 struct clk *rx_npl_clk;
Meng Wang15c825d2018-09-06 10:49:18 +0800352 struct snd_soc_component *component;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530353 unsigned long active_ch_mask[RX_MACRO_MAX_DAIS];
354 unsigned long active_ch_cnt[RX_MACRO_MAX_DAIS];
355 u16 bit_width[RX_MACRO_MAX_DAIS];
356 char __iomem *rx_io_base;
357 char __iomem *rx_mclk_mode_muxsel;
358 struct rx_macro_idle_detect_config idle_det_cfg;
359 u8 sidetone_coeff_array[IIR_MAX][BAND_MAX]
360 [RX_MACRO_SIDETONE_IIR_COEFF_MAX * 4];
361
362 struct platform_device *pdev_child_devices
363 [RX_MACRO_CHILD_DEVICES_MAX];
364 int child_count;
Aditya Bavanari4f3d5642018-09-18 22:19:10 +0530365 int is_softclip_on;
366 int softclip_clk_users;
367 struct rx_macro_bcl_pmic_params bcl_pmic_params;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530368};
369
370static struct snd_soc_dai_driver rx_macro_dai[];
371static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
372
373static const char * const rx_int_mix_mux_text[] = {
374 "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5"
375};
376
377static const char * const rx_prim_mix_text[] = {
378 "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2",
379 "RX3", "RX4", "RX5"
380};
381
382static const char * const rx_sidetone_mix_text[] = {
383 "ZERO", "SRC0", "SRC1", "SRC_SUM"
384};
385
386static const char * const rx_echo_mux_text[] = {
387 "ZERO", "RX_MIX0", "RX_MIX1", "RX_MIX2"
388};
389
390static const char * const iir_inp_mux_text[] = {
391 "ZERO", "DEC0", "DEC1", "DEC2", "DEC3",
392 "RX0", "RX1", "RX2", "RX3", "RX4", "RX5"
393};
394
395static const char * const rx_int_dem_inp_mux_text[] = {
396 "NORMAL_DSM_OUT", "CLSH_DSM_OUT",
397};
398
399static const char * const rx_int0_1_interp_mux_text[] = {
400 "ZERO", "RX INT0_1 MIX1",
401};
402
403static const char * const rx_int1_1_interp_mux_text[] = {
404 "ZERO", "RX INT1_1 MIX1",
405};
406
407static const char * const rx_int2_1_interp_mux_text[] = {
408 "ZERO", "RX INT2_1 MIX1",
409};
410
411static const char * const rx_int0_2_interp_mux_text[] = {
412 "ZERO", "RX INT0_2 MUX",
413};
414
415static const char * const rx_int1_2_interp_mux_text[] = {
416 "ZERO", "RX INT1_2 MUX",
417};
418
419static const char * const rx_int2_2_interp_mux_text[] = {
420 "ZERO", "RX INT2_2 MUX",
421};
422
423static const char *const rx_macro_mux_text[] = {
424 "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB"
425};
426
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +0530427static const char *const rx_macro_ear_mode_text[] = {"OFF", "ON"};
428static const struct soc_enum rx_macro_ear_mode_enum =
429 SOC_ENUM_SINGLE_EXT(2, rx_macro_ear_mode_text);
430
Laxminath Kasamd3ffb332018-11-14 19:59:21 +0530431static const char *const rx_macro_hph_hd2_mode_text[] = {"OFF", "ON"};
432static const struct soc_enum rx_macro_hph_hd2_mode_enum =
433 SOC_ENUM_SINGLE_EXT(2, rx_macro_hph_hd2_mode_text);
434
Laxminath Kasamc21e98a2018-12-04 11:21:01 +0530435static const char *const rx_macro_hph_pwr_mode_text[] = {"ULP", "LOHIFI"};
Laxminath Kasamde09dfb2018-11-09 13:00:30 +0530436static const struct soc_enum rx_macro_hph_pwr_mode_enum =
437 SOC_ENUM_SINGLE_EXT(2, rx_macro_hph_pwr_mode_text);
438
Aditya Bavanari4f3d5642018-09-18 22:19:10 +0530439static const char * const rx_macro_vbat_bcl_gsm_mode_text[] = {"OFF", "ON"};
440static const struct soc_enum rx_macro_vbat_bcl_gsm_mode_enum =
441 SOC_ENUM_SINGLE_EXT(2, rx_macro_vbat_bcl_gsm_mode_text);
442
443static const struct snd_kcontrol_new rx_int2_1_vbat_mix_switch[] = {
444 SOC_DAPM_SINGLE("RX AUX VBAT Enable", SND_SOC_NOPM, 0, 1, 0)
445};
446
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530447RX_MACRO_DAPM_ENUM(rx_int0_2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0,
448 rx_int_mix_mux_text);
449RX_MACRO_DAPM_ENUM(rx_int1_2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0,
450 rx_int_mix_mux_text);
451RX_MACRO_DAPM_ENUM(rx_int2_2, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 0,
452 rx_int_mix_mux_text);
453
454
455RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 0,
456 rx_prim_mix_text);
457RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 4,
458 rx_prim_mix_text);
459RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 4,
460 rx_prim_mix_text);
461RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 0,
462 rx_prim_mix_text);
463RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 4,
464 rx_prim_mix_text);
465RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 4,
466 rx_prim_mix_text);
467RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 0,
468 rx_prim_mix_text);
469RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 4,
470 rx_prim_mix_text);
471RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 4,
472 rx_prim_mix_text);
473
474RX_MACRO_DAPM_ENUM(rx_int0_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2,
475 rx_sidetone_mix_text);
476RX_MACRO_DAPM_ENUM(rx_int1_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4,
477 rx_sidetone_mix_text);
478RX_MACRO_DAPM_ENUM(rx_int2_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6,
479 rx_sidetone_mix_text);
480
481RX_MACRO_DAPM_ENUM(rx_mix_tx0, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 4,
482 rx_echo_mux_text);
483RX_MACRO_DAPM_ENUM(rx_mix_tx1, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 0,
484 rx_echo_mux_text);
485RX_MACRO_DAPM_ENUM(rx_mix_tx2, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 0,
486 rx_echo_mux_text);
487
488RX_MACRO_DAPM_ENUM(iir0_inp0, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0,
489 iir_inp_mux_text);
490RX_MACRO_DAPM_ENUM(iir0_inp1, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0,
491 iir_inp_mux_text);
492RX_MACRO_DAPM_ENUM(iir0_inp2, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0,
493 iir_inp_mux_text);
494RX_MACRO_DAPM_ENUM(iir0_inp3, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0,
495 iir_inp_mux_text);
496RX_MACRO_DAPM_ENUM(iir1_inp0, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0,
497 iir_inp_mux_text);
498RX_MACRO_DAPM_ENUM(iir1_inp1, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0,
499 iir_inp_mux_text);
500RX_MACRO_DAPM_ENUM(iir1_inp2, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0,
501 iir_inp_mux_text);
502RX_MACRO_DAPM_ENUM(iir1_inp3, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0,
503 iir_inp_mux_text);
504
505RX_MACRO_DAPM_ENUM(rx_int0_1_interp, SND_SOC_NOPM, 0,
506 rx_int0_1_interp_mux_text);
507RX_MACRO_DAPM_ENUM(rx_int1_1_interp, SND_SOC_NOPM, 0,
508 rx_int1_1_interp_mux_text);
509RX_MACRO_DAPM_ENUM(rx_int2_1_interp, SND_SOC_NOPM, 0,
510 rx_int2_1_interp_mux_text);
511
512RX_MACRO_DAPM_ENUM(rx_int0_2_interp, SND_SOC_NOPM, 0,
513 rx_int0_2_interp_mux_text);
514RX_MACRO_DAPM_ENUM(rx_int1_2_interp, SND_SOC_NOPM, 0,
515 rx_int1_2_interp_mux_text);
516RX_MACRO_DAPM_ENUM(rx_int2_2_interp, SND_SOC_NOPM, 0,
517 rx_int2_2_interp_mux_text);
518
519RX_MACRO_DAPM_ENUM_EXT(rx_int0_dem_inp, BOLERO_CDC_RX_RX0_RX_PATH_CFG1, 0,
520 rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double,
521 rx_macro_int_dem_inp_mux_put);
522RX_MACRO_DAPM_ENUM_EXT(rx_int1_dem_inp, BOLERO_CDC_RX_RX1_RX_PATH_CFG1, 0,
523 rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double,
524 rx_macro_int_dem_inp_mux_put);
525
526RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx0, SND_SOC_NOPM, 0, rx_macro_mux_text,
527 rx_macro_mux_get, rx_macro_mux_put);
528RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx1, SND_SOC_NOPM, 0, rx_macro_mux_text,
529 rx_macro_mux_get, rx_macro_mux_put);
530RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx2, SND_SOC_NOPM, 0, rx_macro_mux_text,
531 rx_macro_mux_get, rx_macro_mux_put);
532RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx3, SND_SOC_NOPM, 0, rx_macro_mux_text,
533 rx_macro_mux_get, rx_macro_mux_put);
534RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx4, SND_SOC_NOPM, 0, rx_macro_mux_text,
535 rx_macro_mux_get, rx_macro_mux_put);
536RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx5, SND_SOC_NOPM, 0, rx_macro_mux_text,
537 rx_macro_mux_get, rx_macro_mux_put);
538
539static struct snd_soc_dai_ops rx_macro_dai_ops = {
540 .hw_params = rx_macro_hw_params,
541 .get_channel_map = rx_macro_get_channel_map,
542};
543
544static struct snd_soc_dai_driver rx_macro_dai[] = {
545 {
546 .name = "rx_macro_rx1",
547 .id = RX_MACRO_AIF1_PB,
548 .playback = {
549 .stream_name = "RX_MACRO_AIF1 Playback",
550 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
551 .formats = RX_MACRO_FORMATS,
552 .rate_max = 384000,
553 .rate_min = 8000,
554 .channels_min = 1,
555 .channels_max = 2,
556 },
557 .ops = &rx_macro_dai_ops,
558 },
559 {
560 .name = "rx_macro_rx2",
561 .id = RX_MACRO_AIF2_PB,
562 .playback = {
563 .stream_name = "RX_MACRO_AIF2 Playback",
564 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
565 .formats = RX_MACRO_FORMATS,
566 .rate_max = 384000,
567 .rate_min = 8000,
568 .channels_min = 1,
569 .channels_max = 2,
570 },
571 .ops = &rx_macro_dai_ops,
572 },
573 {
574 .name = "rx_macro_rx3",
575 .id = RX_MACRO_AIF3_PB,
576 .playback = {
577 .stream_name = "RX_MACRO_AIF3 Playback",
578 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
579 .formats = RX_MACRO_FORMATS,
580 .rate_max = 384000,
581 .rate_min = 8000,
582 .channels_min = 1,
583 .channels_max = 2,
584 },
585 .ops = &rx_macro_dai_ops,
586 },
587 {
588 .name = "rx_macro_rx4",
589 .id = RX_MACRO_AIF4_PB,
590 .playback = {
591 .stream_name = "RX_MACRO_AIF4 Playback",
592 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
593 .formats = RX_MACRO_FORMATS,
594 .rate_max = 384000,
595 .rate_min = 8000,
596 .channels_min = 1,
597 .channels_max = 2,
598 },
599 .ops = &rx_macro_dai_ops,
600 },
601};
602
Laxminath Kasam497a6512018-09-17 16:11:52 +0530603static int get_impedance_index(int imped)
604{
605 int i = 0;
606
607 if (imped < imped_index[i].imped_val) {
608 pr_debug("%s, detected impedance is less than %d Ohm\n",
609 __func__, imped_index[i].imped_val);
610 i = 0;
611 goto ret;
612 }
613 if (imped >= imped_index[ARRAY_SIZE(imped_index) - 1].imped_val) {
614 pr_debug("%s, detected impedance is greater than %d Ohm\n",
615 __func__,
616 imped_index[ARRAY_SIZE(imped_index) - 1].imped_val);
617 i = ARRAY_SIZE(imped_index) - 1;
618 goto ret;
619 }
620 for (i = 0; i < ARRAY_SIZE(imped_index) - 1; i++) {
621 if (imped >= imped_index[i].imped_val &&
622 imped < imped_index[i + 1].imped_val)
623 break;
624 }
625ret:
626 pr_debug("%s: selected impedance index = %d\n",
627 __func__, imped_index[i].index);
628 return imped_index[i].index;
629}
630
631/*
632 * rx_macro_wcd_clsh_imped_config -
633 * This function updates HPHL and HPHR gain settings
634 * according to the impedance value.
635 *
Meng Wang15c825d2018-09-06 10:49:18 +0800636 * @component: codec pointer handle
Laxminath Kasam497a6512018-09-17 16:11:52 +0530637 * @imped: impedance value of HPHL/R
638 * @reset: bool variable to reset registers when teardown
639 */
Meng Wang15c825d2018-09-06 10:49:18 +0800640static void rx_macro_wcd_clsh_imped_config(struct snd_soc_component *component,
Laxminath Kasam497a6512018-09-17 16:11:52 +0530641 int imped, bool reset)
642{
643 int i;
644 int index = 0;
645 int table_size;
646
647 static const struct rx_macro_reg_mask_val
648 (*imped_table_ptr)[MAX_IMPED_PARAMS];
649
650 table_size = ARRAY_SIZE(imped_table);
651 imped_table_ptr = imped_table;
652 /* reset = 1, which means request is to reset the register values */
653 if (reset) {
654 for (i = 0; i < MAX_IMPED_PARAMS; i++)
Meng Wang15c825d2018-09-06 10:49:18 +0800655 snd_soc_component_update_bits(component,
Laxminath Kasam497a6512018-09-17 16:11:52 +0530656 imped_table_ptr[index][i].reg,
657 imped_table_ptr[index][i].mask, 0);
658 return;
659 }
660 index = get_impedance_index(imped);
661 if (index >= (ARRAY_SIZE(imped_index) - 1)) {
662 pr_debug("%s, impedance not in range = %d\n", __func__, imped);
663 return;
664 }
665 if (index >= table_size) {
666 pr_debug("%s, impedance index not in range = %d\n", __func__,
667 index);
668 return;
669 }
670 for (i = 0; i < MAX_IMPED_PARAMS; i++)
Meng Wang15c825d2018-09-06 10:49:18 +0800671 snd_soc_component_update_bits(component,
Laxminath Kasam497a6512018-09-17 16:11:52 +0530672 imped_table_ptr[index][i].reg,
673 imped_table_ptr[index][i].mask,
674 imped_table_ptr[index][i].val);
675}
676
Meng Wang15c825d2018-09-06 10:49:18 +0800677static bool rx_macro_get_data(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530678 struct device **rx_dev,
679 struct rx_macro_priv **rx_priv,
680 const char *func_name)
681{
Meng Wang15c825d2018-09-06 10:49:18 +0800682 *rx_dev = bolero_get_device_ptr(component->dev, RX_MACRO);
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530683
684 if (!(*rx_dev)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800685 dev_err(component->dev,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530686 "%s: null device for macro!\n", func_name);
687 return false;
688 }
689
690 *rx_priv = dev_get_drvdata((*rx_dev));
691 if (!(*rx_priv)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800692 dev_err(component->dev,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530693 "%s: priv is null for macro!\n", func_name);
694 return false;
695 }
696
Meng Wang15c825d2018-09-06 10:49:18 +0800697 if (!(*rx_priv)->component) {
698 dev_err(component->dev,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530699 "%s: tx_priv codec is not initialized!\n", func_name);
700 return false;
701 }
702
703 return true;
704}
705
Sudheer Papothia3e969d2018-10-27 06:22:10 +0530706static int rx_macro_set_port_map(struct snd_soc_component *component,
707 u32 usecase, u32 size, void *data)
708{
709 struct device *rx_dev = NULL;
710 struct rx_macro_priv *rx_priv = NULL;
711 struct swrm_port_config port_cfg;
712 int ret = 0;
713
714 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
715 return -EINVAL;
716
717 memset(&port_cfg, 0, sizeof(port_cfg));
718 port_cfg.uc = usecase;
719 port_cfg.size = size;
720 port_cfg.params = data;
721
722 ret = swrm_wcd_notify(
723 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
724 SWR_SET_PORT_MAP, &port_cfg);
725
726 return ret;
727}
728
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530729static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol,
730 struct snd_ctl_elem_value *ucontrol)
731{
732 struct snd_soc_dapm_widget *widget =
733 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800734 struct snd_soc_component *component =
735 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530736 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
737 unsigned int val = 0;
738 unsigned short look_ahead_dly_reg =
739 BOLERO_CDC_RX_RX0_RX_PATH_CFG0;
740
741 val = ucontrol->value.enumerated.item[0];
742 if (val >= e->items)
743 return -EINVAL;
744
Meng Wang15c825d2018-09-06 10:49:18 +0800745 dev_dbg(component->dev, "%s: wname: %s, val: 0x%x\n", __func__,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530746 widget->name, val);
747
748 if (e->reg == BOLERO_CDC_RX_RX0_RX_PATH_CFG1)
749 look_ahead_dly_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0;
750 else if (e->reg == BOLERO_CDC_RX_RX1_RX_PATH_CFG1)
751 look_ahead_dly_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0;
752
753 /* Set Look Ahead Delay */
Meng Wang15c825d2018-09-06 10:49:18 +0800754 snd_soc_component_update_bits(component, look_ahead_dly_reg,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530755 0x08, (val ? 0x08 : 0x00));
756 /* Set DEM INP Select */
757 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
758}
759
760static int rx_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai,
761 u8 rate_reg_val,
762 u32 sample_rate)
763{
764 u8 int_1_mix1_inp = 0;
765 u32 j = 0, port = 0;
766 u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0;
767 u16 int_fs_reg = 0;
768 u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0;
769 u8 inp0_sel = 0, inp1_sel = 0, inp2_sel = 0;
Meng Wang15c825d2018-09-06 10:49:18 +0800770 struct snd_soc_component *component = dai->component;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530771 struct device *rx_dev = NULL;
772 struct rx_macro_priv *rx_priv = NULL;
773
Meng Wang15c825d2018-09-06 10:49:18 +0800774 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530775 return -EINVAL;
776
777 for_each_set_bit(port, &rx_priv->active_ch_mask[dai->id],
778 RX_MACRO_PORTS_MAX) {
779 int_1_mix1_inp = port;
780 if ((int_1_mix1_inp < RX_MACRO_RX0) ||
781 (int_1_mix1_inp > RX_MACRO_PORTS_MAX)) {
782 pr_err("%s: Invalid RX port, Dai ID is %d\n",
783 __func__, dai->id);
784 return -EINVAL;
785 }
786
787 int_mux_cfg0 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0;
788
789 /*
790 * Loop through all interpolator MUX inputs and find out
791 * to which interpolator input, the rx port
792 * is connected
793 */
794 for (j = 0; j < INTERP_MAX; j++) {
795 int_mux_cfg1 = int_mux_cfg0 + 4;
796
Meng Wang15c825d2018-09-06 10:49:18 +0800797 int_mux_cfg0_val = snd_soc_component_read32(
798 component, int_mux_cfg0);
799 int_mux_cfg1_val = snd_soc_component_read32(
800 component, int_mux_cfg1);
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530801 inp0_sel = int_mux_cfg0_val & 0x07;
802 inp1_sel = (int_mux_cfg0_val >> 4) & 0x038;
803 inp2_sel = (int_mux_cfg1_val >> 4) & 0x038;
804 if ((inp0_sel == int_1_mix1_inp) ||
805 (inp1_sel == int_1_mix1_inp) ||
806 (inp2_sel == int_1_mix1_inp)) {
807 int_fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL +
808 0x80 * j;
809 pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_1\n",
810 __func__, dai->id, j);
811 pr_debug("%s: set INT%u_1 sample rate to %u\n",
812 __func__, j, sample_rate);
813 /* sample_rate is in Hz */
Meng Wang15c825d2018-09-06 10:49:18 +0800814 snd_soc_component_update_bits(component,
815 int_fs_reg,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530816 0x0F, rate_reg_val);
817 }
818 int_mux_cfg0 += 8;
819 }
820 }
821
822 return 0;
823}
824
825static int rx_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai,
826 u8 rate_reg_val,
827 u32 sample_rate)
828{
829 u8 int_2_inp = 0;
830 u32 j = 0, port = 0;
831 u16 int_mux_cfg1 = 0, int_fs_reg = 0;
832 u8 int_mux_cfg1_val = 0;
Meng Wang15c825d2018-09-06 10:49:18 +0800833 struct snd_soc_component *component = dai->component;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530834 struct device *rx_dev = NULL;
835 struct rx_macro_priv *rx_priv = NULL;
836
Meng Wang15c825d2018-09-06 10:49:18 +0800837 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530838 return -EINVAL;
839
840 for_each_set_bit(port, &rx_priv->active_ch_mask[dai->id],
841 RX_MACRO_PORTS_MAX) {
842 int_2_inp = port;
843 if ((int_2_inp < RX_MACRO_RX0) ||
844 (int_2_inp > RX_MACRO_PORTS_MAX)) {
845 pr_err("%s: Invalid RX port, Dai ID is %d\n",
846 __func__, dai->id);
847 return -EINVAL;
848 }
849
850 int_mux_cfg1 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1;
851 for (j = 0; j < INTERP_MAX; j++) {
Meng Wang15c825d2018-09-06 10:49:18 +0800852 int_mux_cfg1_val = snd_soc_component_read32(
853 component, int_mux_cfg1) &
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530854 0x07;
855 if (int_mux_cfg1_val == int_2_inp) {
856 int_fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL +
857 0x80 * j;
858 pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_2\n",
859 __func__, dai->id, j);
860 pr_debug("%s: set INT%u_2 sample rate to %u\n",
861 __func__, j, sample_rate);
Meng Wang15c825d2018-09-06 10:49:18 +0800862 snd_soc_component_update_bits(
863 component, int_fs_reg,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530864 0x0F, rate_reg_val);
865 }
866 int_mux_cfg1 += 8;
867 }
868 }
869 return 0;
870}
871
Laxminath Kasamac396d52018-09-06 12:53:26 +0530872static bool rx_macro_is_fractional_sample_rate(u32 sample_rate)
873{
874 switch (sample_rate) {
875 case SAMPLING_RATE_44P1KHZ:
876 case SAMPLING_RATE_88P2KHZ:
877 case SAMPLING_RATE_176P4KHZ:
878 case SAMPLING_RATE_352P8KHZ:
879 return true;
880 default:
881 return false;
882 }
883 return false;
884}
885
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530886static int rx_macro_set_interpolator_rate(struct snd_soc_dai *dai,
887 u32 sample_rate)
888{
Meng Wang15c825d2018-09-06 10:49:18 +0800889 struct snd_soc_component *component = dai->component;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530890 int rate_val = 0;
891 int i = 0, ret = 0;
Laxminath Kasamac396d52018-09-06 12:53:26 +0530892 struct device *rx_dev = NULL;
893 struct rx_macro_priv *rx_priv = NULL;
894
Meng Wang15c825d2018-09-06 10:49:18 +0800895 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasamac396d52018-09-06 12:53:26 +0530896 return -EINVAL;
897
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530898
899 for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++) {
900 if (sample_rate == sr_val_tbl[i].sample_rate) {
901 rate_val = sr_val_tbl[i].rate_val;
Laxminath Kasamac396d52018-09-06 12:53:26 +0530902 if (rx_macro_is_fractional_sample_rate(sample_rate))
903 rx_priv->is_native_on = true;
904 else
905 rx_priv->is_native_on = false;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530906 break;
907 }
908 }
909 if ((i == ARRAY_SIZE(sr_val_tbl)) || (rate_val < 0)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800910 dev_err(component->dev, "%s: Unsupported sample rate: %d\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530911 __func__, sample_rate);
912 return -EINVAL;
913 }
914
915 ret = rx_macro_set_prim_interpolator_rate(dai, (u8)rate_val, sample_rate);
916 if (ret)
917 return ret;
918 ret = rx_macro_set_mix_interpolator_rate(dai, (u8)rate_val, sample_rate);
919 if (ret)
920 return ret;
921
922 return ret;
923}
924
925static int rx_macro_hw_params(struct snd_pcm_substream *substream,
926 struct snd_pcm_hw_params *params,
927 struct snd_soc_dai *dai)
928{
Meng Wang15c825d2018-09-06 10:49:18 +0800929 struct snd_soc_component *component = dai->component;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530930 int ret = 0;
931 struct device *rx_dev = NULL;
932 struct rx_macro_priv *rx_priv = NULL;
933
Meng Wang15c825d2018-09-06 10:49:18 +0800934 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530935 return -EINVAL;
936
Meng Wang15c825d2018-09-06 10:49:18 +0800937 dev_dbg(component->dev,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530938 "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
939 dai->name, dai->id, params_rate(params),
940 params_channels(params));
941
942 switch (substream->stream) {
943 case SNDRV_PCM_STREAM_PLAYBACK:
944 ret = rx_macro_set_interpolator_rate(dai, params_rate(params));
945 if (ret) {
946 pr_err("%s: cannot set sample rate: %u\n",
947 __func__, params_rate(params));
948 return ret;
949 }
950 rx_priv->bit_width[dai->id] = params_width(params);
951 break;
952 case SNDRV_PCM_STREAM_CAPTURE:
953 default:
954 break;
955 }
956 return 0;
957}
958
959static int rx_macro_get_channel_map(struct snd_soc_dai *dai,
960 unsigned int *tx_num, unsigned int *tx_slot,
961 unsigned int *rx_num, unsigned int *rx_slot)
962{
Meng Wang15c825d2018-09-06 10:49:18 +0800963 struct snd_soc_component *component = dai->component;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530964 struct device *rx_dev = NULL;
965 struct rx_macro_priv *rx_priv = NULL;
966 unsigned int temp = 0, ch_mask = 0;
967 u16 i = 0;
968
Meng Wang15c825d2018-09-06 10:49:18 +0800969 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530970 return -EINVAL;
971
972 switch (dai->id) {
973 case RX_MACRO_AIF1_PB:
974 case RX_MACRO_AIF2_PB:
975 case RX_MACRO_AIF3_PB:
976 case RX_MACRO_AIF4_PB:
977 for_each_set_bit(temp, &rx_priv->active_ch_mask[dai->id],
978 RX_MACRO_PORTS_MAX) {
Vatsal Bucha1a96a612018-11-26 13:04:56 +0530979 ch_mask |= (1 << temp);
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530980 if (++i == RX_MACRO_MAX_DMA_CH_PER_PORT)
981 break;
982 }
983 *rx_slot = ch_mask;
984 *rx_num = rx_priv->active_ch_cnt[dai->id];
985 break;
986 default:
987 dev_err(rx_dev, "%s: Invalid AIF\n", __func__);
988 break;
989 }
990 return 0;
991}
992
993static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv,
994 bool mclk_enable, bool dapm)
995{
996 struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL);
Laxminath Kasambee08192018-07-01 14:38:55 +0530997 int ret = 0, mclk_mux = MCLK_MUX0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530998
Tanya Dixit8530fb92018-09-14 16:01:25 +0530999 if (regmap == NULL) {
1000 dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__);
1001 return -EINVAL;
1002 }
1003
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301004 dev_dbg(rx_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n",
1005 __func__, mclk_enable, dapm, rx_priv->rx_mclk_users);
1006
1007 mutex_lock(&rx_priv->mclk_lock);
1008 if (mclk_enable) {
1009 if (rx_priv->rx_mclk_users == 0) {
Laxminath Kasam7b9cdb62018-09-28 16:28:54 +05301010 if (rx_priv->is_native_on)
1011 mclk_mux = MCLK_MUX1;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301012 ret = bolero_request_clock(rx_priv->dev,
Laxminath Kasambee08192018-07-01 14:38:55 +05301013 RX_MACRO, mclk_mux, true);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301014 if (ret < 0) {
1015 dev_err(rx_priv->dev,
1016 "%s: rx request clock enable failed\n",
1017 __func__);
1018 goto exit;
1019 }
Laxminath Kasambee08192018-07-01 14:38:55 +05301020 rx_priv->mclk_mux = mclk_mux;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301021 regcache_mark_dirty(regmap);
1022 regcache_sync_region(regmap,
1023 RX_START_OFFSET,
1024 RX_MAX_OFFSET);
1025 regmap_update_bits(regmap,
1026 BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
1027 0x01, 0x01);
1028 regmap_update_bits(regmap,
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +05301029 BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
1030 0x02, 0x02);
1031 regmap_update_bits(regmap,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301032 BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
1033 0x01, 0x01);
1034 }
1035 rx_priv->rx_mclk_users++;
1036 } else {
1037 if (rx_priv->rx_mclk_users <= 0) {
1038 dev_err(rx_priv->dev, "%s: clock already disabled\n",
1039 __func__);
1040 rx_priv->rx_mclk_users = 0;
1041 goto exit;
1042 }
1043 rx_priv->rx_mclk_users--;
1044 if (rx_priv->rx_mclk_users == 0) {
1045 regmap_update_bits(regmap,
1046 BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
1047 0x01, 0x00);
1048 regmap_update_bits(regmap,
1049 BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
1050 0x01, 0x00);
Laxminath Kasam7b9cdb62018-09-28 16:28:54 +05301051 mclk_mux = rx_priv->mclk_mux;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301052 bolero_request_clock(rx_priv->dev,
Laxminath Kasambee08192018-07-01 14:38:55 +05301053 RX_MACRO, mclk_mux, false);
1054 rx_priv->mclk_mux = MCLK_MUX0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301055 }
1056 }
1057exit:
1058 mutex_unlock(&rx_priv->mclk_lock);
1059 return ret;
1060}
1061
1062static int rx_macro_mclk_event(struct snd_soc_dapm_widget *w,
1063 struct snd_kcontrol *kcontrol, int event)
1064{
Meng Wang15c825d2018-09-06 10:49:18 +08001065 struct snd_soc_component *component =
1066 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301067 int ret = 0;
1068 struct device *rx_dev = NULL;
1069 struct rx_macro_priv *rx_priv = NULL;
Laxminath Kasamac396d52018-09-06 12:53:26 +05301070 int mclk_freq = MCLK_FREQ;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301071
Meng Wang15c825d2018-09-06 10:49:18 +08001072 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301073 return -EINVAL;
1074
1075 dev_dbg(rx_dev, "%s: event = %d\n", __func__, event);
1076 switch (event) {
1077 case SND_SOC_DAPM_PRE_PMU:
Laxminath Kasambee08192018-07-01 14:38:55 +05301078 /* if swr_clk_users > 0, call device down */
1079 if (rx_priv->swr_clk_users > 0) {
1080 if ((rx_priv->mclk_mux == MCLK_MUX0 &&
1081 rx_priv->is_native_on) ||
Laxminath Kasamac396d52018-09-06 12:53:26 +05301082 (rx_priv->mclk_mux == MCLK_MUX1 &&
Laxminath Kasambee08192018-07-01 14:38:55 +05301083 !rx_priv->is_native_on)) {
1084 swrm_wcd_notify(
1085 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
1086 SWR_DEVICE_DOWN, NULL);
1087 }
1088 }
Laxminath Kasamac396d52018-09-06 12:53:26 +05301089 if (rx_priv->is_native_on)
1090 mclk_freq = MCLK_FREQ_NATIVE;
1091 swrm_wcd_notify(
1092 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
1093 SWR_CLK_FREQ, &mclk_freq);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301094 ret = rx_macro_mclk_enable(rx_priv, 1, true);
1095 break;
1096 case SND_SOC_DAPM_POST_PMD:
1097 ret = rx_macro_mclk_enable(rx_priv, 0, true);
1098 break;
1099 default:
1100 dev_err(rx_priv->dev,
1101 "%s: invalid DAPM event %d\n", __func__, event);
1102 ret = -EINVAL;
1103 }
1104 return ret;
1105}
1106
1107static int rx_macro_mclk_ctrl(struct device *dev, bool enable)
1108{
1109 struct rx_macro_priv *rx_priv = dev_get_drvdata(dev);
1110 int ret = 0;
1111
1112 if (enable) {
1113 ret = clk_prepare_enable(rx_priv->rx_core_clk);
1114 if (ret < 0) {
1115 dev_err(dev, "%s:rx mclk enable failed\n", __func__);
1116 return ret;
1117 }
1118 ret = clk_prepare_enable(rx_priv->rx_npl_clk);
1119 if (ret < 0) {
1120 clk_disable_unprepare(rx_priv->rx_core_clk);
1121 dev_err(dev, "%s:rx npl_clk enable failed\n",
1122 __func__);
1123 return ret;
1124 }
Laxminath Kasam701e3582018-10-15 20:06:09 +05301125 if (rx_priv->rx_mclk_cnt++ == 0) {
1126 if (rx_priv->dev_up)
1127 iowrite32(0x1, rx_priv->rx_mclk_mode_muxsel);
1128 }
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301129 } else {
1130 if (rx_priv->rx_mclk_cnt <= 0) {
1131 dev_dbg(dev, "%s:rx mclk already disabled\n", __func__);
1132 rx_priv->rx_mclk_cnt = 0;
1133 return 0;
1134 }
Laxminath Kasam701e3582018-10-15 20:06:09 +05301135 if (--rx_priv->rx_mclk_cnt == 0) {
1136 if (rx_priv->dev_up)
1137 iowrite32(0x0, rx_priv->rx_mclk_mode_muxsel);
1138 }
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301139 clk_disable_unprepare(rx_priv->rx_npl_clk);
1140 clk_disable_unprepare(rx_priv->rx_core_clk);
1141 }
1142
1143 return 0;
1144}
1145
Meng Wang15c825d2018-09-06 10:49:18 +08001146static int rx_macro_event_handler(struct snd_soc_component *component,
1147 u16 event, u32 data)
Laxminath Kasam497a6512018-09-17 16:11:52 +05301148{
Vatsal Bucha53b4e142018-11-13 19:36:25 +05301149 u16 reg = 0, reg_mix = 0, rx_idx = 0, mute = 0x0, val = 0;
Laxminath Kasam497a6512018-09-17 16:11:52 +05301150 struct device *rx_dev = NULL;
1151 struct rx_macro_priv *rx_priv = NULL;
1152
Meng Wang15c825d2018-09-06 10:49:18 +08001153 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasam497a6512018-09-17 16:11:52 +05301154 return -EINVAL;
1155
1156 switch (event) {
1157 case BOLERO_MACRO_EVT_RX_MUTE:
1158 rx_idx = data >> 0x10;
1159 mute = data & 0xffff;
Vatsal Bucha53b4e142018-11-13 19:36:25 +05301160 val = mute ? 0x10 : 0x00;
Laxminath Kasam497a6512018-09-17 16:11:52 +05301161 reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (rx_idx *
1162 RX_MACRO_RX_PATH_OFFSET);
1163 reg_mix = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + (rx_idx *
1164 RX_MACRO_RX_PATH_OFFSET);
Meng Wang15c825d2018-09-06 10:49:18 +08001165 snd_soc_component_update_bits(component, reg,
1166 0x10, val);
1167 snd_soc_component_update_bits(component, reg_mix,
1168 0x10, val);
Laxminath Kasam497a6512018-09-17 16:11:52 +05301169 break;
1170 case BOLERO_MACRO_EVT_IMPED_TRUE:
Meng Wang15c825d2018-09-06 10:49:18 +08001171 rx_macro_wcd_clsh_imped_config(component, data, true);
Laxminath Kasam497a6512018-09-17 16:11:52 +05301172 break;
1173 case BOLERO_MACRO_EVT_IMPED_FALSE:
Meng Wang15c825d2018-09-06 10:49:18 +08001174 rx_macro_wcd_clsh_imped_config(component, data, false);
Laxminath Kasam497a6512018-09-17 16:11:52 +05301175 break;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05301176 case BOLERO_MACRO_EVT_SSR_DOWN:
Laxminath Kasam701e3582018-10-15 20:06:09 +05301177 rx_priv->dev_up = false;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05301178 swrm_wcd_notify(
1179 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
Ramprasad Katkam5ee54ae2018-12-19 18:56:00 +05301180 SWR_DEVICE_DOWN, NULL);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05301181 swrm_wcd_notify(
1182 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
Ramprasad Katkam5ee54ae2018-12-19 18:56:00 +05301183 SWR_DEVICE_SSR_DOWN, NULL);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05301184 break;
1185 case BOLERO_MACRO_EVT_SSR_UP:
Laxminath Kasam701e3582018-10-15 20:06:09 +05301186 rx_priv->dev_up = true;
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05301187 /* reset swr after ssr/pdr */
1188 rx_priv->reset_swr = true;
Laxminath Kasam701e3582018-10-15 20:06:09 +05301189 /* enable&disable MCLK_MUX1 to reset GFMUX reg */
1190 bolero_request_clock(rx_priv->dev,
1191 RX_MACRO, MCLK_MUX1, true);
1192 bolero_request_clock(rx_priv->dev,
1193 RX_MACRO, MCLK_MUX1, false);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05301194 swrm_wcd_notify(
1195 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
1196 SWR_DEVICE_SSR_UP, NULL);
1197 break;
Laxminath Kasam497a6512018-09-17 16:11:52 +05301198 }
1199 return 0;
1200}
1201
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301202static int rx_macro_find_playback_dai_id_for_port(int port_id,
1203 struct rx_macro_priv *rx_priv)
1204{
1205 int i = 0;
1206
1207 for (i = RX_MACRO_AIF1_PB; i < RX_MACRO_MAX_DAIS; i++) {
1208 if (test_bit(port_id, &rx_priv->active_ch_mask[i]))
1209 return i;
1210 }
1211
1212 return -EINVAL;
1213}
1214
Meng Wang15c825d2018-09-06 10:49:18 +08001215static int rx_macro_set_idle_detect_thr(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301216 struct rx_macro_priv *rx_priv,
1217 int interp, int path_type)
1218{
1219 int port_id[4] = { 0, 0, 0, 0 };
Laxminath Kasamb7f823c2018-08-02 13:23:11 +05301220 int *port_ptr = NULL;
1221 int num_ports = 0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301222 int bit_width = 0, i = 0;
1223 int mux_reg = 0, mux_reg_val = 0;
1224 int dai_id = 0, idle_thr = 0;
1225
1226 if ((interp != INTERP_HPHL) && (interp != INTERP_HPHR))
1227 return 0;
1228
1229 if (!rx_priv->idle_det_cfg.hph_idle_detect_en)
1230 return 0;
1231
1232 port_ptr = &port_id[0];
1233 num_ports = 0;
1234
1235 /*
1236 * Read interpolator MUX input registers and find
1237 * which cdc_dma port is connected and store the port
1238 * numbers in port_id array.
1239 */
1240 if (path_type == INTERP_MIX_PATH) {
1241 mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1 +
1242 2 * interp;
Meng Wang15c825d2018-09-06 10:49:18 +08001243 mux_reg_val = snd_soc_component_read32(component, mux_reg) &
1244 0x0f;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301245
1246 if ((mux_reg_val >= INTn_2_INP_SEL_RX0) &&
1247 (mux_reg_val <= INTn_2_INP_SEL_RX5)) {
1248 *port_ptr++ = mux_reg_val - 1;
1249 num_ports++;
1250 }
1251 }
1252
1253 if (path_type == INTERP_MAIN_PATH) {
1254 mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0 +
1255 2 * (interp - 1);
Meng Wang15c825d2018-09-06 10:49:18 +08001256 mux_reg_val = snd_soc_component_read32(component, mux_reg) &
1257 0x0f;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301258 i = RX_MACRO_INTERP_MUX_NUM_INPUTS;
1259
1260 while (i) {
1261 if ((mux_reg_val >= INTn_1_INP_SEL_RX0) &&
1262 (mux_reg_val <= INTn_1_INP_SEL_RX5)) {
1263 *port_ptr++ = mux_reg_val -
1264 INTn_1_INP_SEL_RX0;
1265 num_ports++;
1266 }
Meng Wang15c825d2018-09-06 10:49:18 +08001267 mux_reg_val =
1268 (snd_soc_component_read32(component, mux_reg) &
1269 0xf0) >> 4;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301270 mux_reg += 1;
1271 i--;
1272 }
1273 }
1274
Meng Wang15c825d2018-09-06 10:49:18 +08001275 dev_dbg(component->dev, "%s: num_ports: %d, ports[%d %d %d %d]\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301276 __func__, num_ports, port_id[0], port_id[1],
1277 port_id[2], port_id[3]);
1278
1279 i = 0;
1280 while (num_ports) {
1281 dai_id = rx_macro_find_playback_dai_id_for_port(port_id[i++],
1282 rx_priv);
1283
1284 if ((dai_id >= 0) && (dai_id < RX_MACRO_MAX_DAIS)) {
Meng Wang15c825d2018-09-06 10:49:18 +08001285 dev_dbg(component->dev, "%s: dai_id: %d bit_width: %d\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301286 __func__, dai_id,
1287 rx_priv->bit_width[dai_id]);
1288
1289 if (rx_priv->bit_width[dai_id] > bit_width)
1290 bit_width = rx_priv->bit_width[dai_id];
1291 }
1292 num_ports--;
1293 }
1294
1295 switch (bit_width) {
1296 case 16:
1297 idle_thr = 0xff; /* F16 */
1298 break;
1299 case 24:
1300 case 32:
1301 idle_thr = 0x03; /* F22 */
1302 break;
1303 default:
1304 idle_thr = 0x00;
1305 break;
1306 }
1307
Meng Wang15c825d2018-09-06 10:49:18 +08001308 dev_dbg(component->dev, "%s: (new) idle_thr: %d, (cur) idle_thr: %d\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301309 __func__, idle_thr, rx_priv->idle_det_cfg.hph_idle_thr);
1310
1311 if ((rx_priv->idle_det_cfg.hph_idle_thr == 0) ||
1312 (idle_thr < rx_priv->idle_det_cfg.hph_idle_thr)) {
Meng Wang15c825d2018-09-06 10:49:18 +08001313 snd_soc_component_write(component,
1314 BOLERO_CDC_RX_IDLE_DETECT_CFG3, idle_thr);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301315 rx_priv->idle_det_cfg.hph_idle_thr = idle_thr;
1316 }
1317
1318 return 0;
1319}
1320
1321static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w,
1322 struct snd_kcontrol *kcontrol, int event)
1323{
Meng Wang15c825d2018-09-06 10:49:18 +08001324 struct snd_soc_component *component =
1325 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301326 u16 gain_reg = 0, mix_reg = 0;
1327 struct device *rx_dev = NULL;
1328 struct rx_macro_priv *rx_priv = NULL;
1329
Meng Wang15c825d2018-09-06 10:49:18 +08001330 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301331 return -EINVAL;
1332
1333 if (w->shift >= INTERP_MAX) {
Meng Wang15c825d2018-09-06 10:49:18 +08001334 dev_err(component->dev, "%s: Invalid Interpolator value %d for name %s\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301335 __func__, w->shift, w->name);
1336 return -EINVAL;
1337 }
1338
1339 gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL +
1340 (w->shift * RX_MACRO_RX_PATH_OFFSET);
1341 mix_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL +
1342 (w->shift * RX_MACRO_RX_PATH_OFFSET);
1343
Meng Wang15c825d2018-09-06 10:49:18 +08001344 dev_dbg(component->dev, "%s %d %s\n", __func__, event, w->name);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301345
1346 switch (event) {
1347 case SND_SOC_DAPM_PRE_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +08001348 rx_macro_set_idle_detect_thr(component, rx_priv, w->shift,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301349 INTERP_MIX_PATH);
Meng Wang15c825d2018-09-06 10:49:18 +08001350 rx_macro_enable_interp_clk(component, event, w->shift);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301351 /* Clk enable */
Meng Wang15c825d2018-09-06 10:49:18 +08001352 snd_soc_component_update_bits(component, mix_reg, 0x20, 0x20);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301353 break;
1354 case SND_SOC_DAPM_POST_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +08001355 snd_soc_component_write(component, gain_reg,
1356 snd_soc_component_read32(component, gain_reg));
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301357 break;
1358 case SND_SOC_DAPM_POST_PMD:
1359 /* Clk Disable */
Meng Wang15c825d2018-09-06 10:49:18 +08001360 snd_soc_component_update_bits(component, mix_reg, 0x20, 0x00);
1361 rx_macro_enable_interp_clk(component, event, w->shift);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301362 /* Reset enable and disable */
Meng Wang15c825d2018-09-06 10:49:18 +08001363 snd_soc_component_update_bits(component, mix_reg, 0x40, 0x40);
1364 snd_soc_component_update_bits(component, mix_reg, 0x40, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301365 break;
1366 }
1367
1368 return 0;
1369}
1370
1371static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w,
1372 struct snd_kcontrol *kcontrol,
1373 int event)
1374{
Meng Wang15c825d2018-09-06 10:49:18 +08001375 struct snd_soc_component *component =
1376 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301377 u16 gain_reg = 0;
1378 u16 reg = 0;
1379 struct device *rx_dev = NULL;
1380 struct rx_macro_priv *rx_priv = NULL;
1381
Meng Wang15c825d2018-09-06 10:49:18 +08001382 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301383 return -EINVAL;
1384
Meng Wang15c825d2018-09-06 10:49:18 +08001385 dev_dbg(component->dev, "%s %d %s\n", __func__, event, w->name);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301386
1387 if (w->shift >= INTERP_MAX) {
Meng Wang15c825d2018-09-06 10:49:18 +08001388 dev_err(component->dev, "%s: Invalid Interpolator value %d for name %s\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301389 __func__, w->shift, w->name);
1390 return -EINVAL;
1391 }
1392
1393 reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (w->shift *
1394 RX_MACRO_RX_PATH_OFFSET);
1395 gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_CTL + (w->shift *
1396 RX_MACRO_RX_PATH_OFFSET);
1397
1398 switch (event) {
1399 case SND_SOC_DAPM_PRE_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +08001400 rx_macro_set_idle_detect_thr(component, rx_priv, w->shift,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301401 INTERP_MAIN_PATH);
Meng Wang15c825d2018-09-06 10:49:18 +08001402 rx_macro_enable_interp_clk(component, event, w->shift);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301403 break;
1404 case SND_SOC_DAPM_POST_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +08001405 snd_soc_component_write(component, gain_reg,
1406 snd_soc_component_read32(component, gain_reg));
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301407 break;
1408 case SND_SOC_DAPM_POST_PMD:
Meng Wang15c825d2018-09-06 10:49:18 +08001409 rx_macro_enable_interp_clk(component, event, w->shift);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301410 break;
1411 }
1412
1413 return 0;
1414}
1415
Meng Wang15c825d2018-09-06 10:49:18 +08001416static int rx_macro_config_compander(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301417 struct rx_macro_priv *rx_priv,
1418 int interp_n, int event)
1419{
1420 int comp = 0;
1421 u16 comp_ctl0_reg = 0, rx_path_cfg0_reg = 0;
1422
1423 /* AUX does not have compander */
1424 if (interp_n == INTERP_AUX)
1425 return 0;
1426
1427 comp = interp_n;
Meng Wang15c825d2018-09-06 10:49:18 +08001428 dev_dbg(component->dev, "%s: event %d compander %d, enabled %d\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301429 __func__, event, comp + 1, rx_priv->comp_enabled[comp]);
1430
1431 if (!rx_priv->comp_enabled[comp])
1432 return 0;
1433
1434 comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 +
1435 (comp * RX_MACRO_COMP_OFFSET);
1436 rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 +
1437 (comp * RX_MACRO_RX_PATH_OFFSET);
1438
1439 if (SND_SOC_DAPM_EVENT_ON(event)) {
1440 /* Enable Compander Clock */
Meng Wang15c825d2018-09-06 10:49:18 +08001441 snd_soc_component_update_bits(component, comp_ctl0_reg,
1442 0x01, 0x01);
1443 snd_soc_component_update_bits(component, comp_ctl0_reg,
1444 0x02, 0x02);
1445 snd_soc_component_update_bits(component, comp_ctl0_reg,
1446 0x02, 0x00);
1447 snd_soc_component_update_bits(component, rx_path_cfg0_reg,
1448 0x02, 0x02);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301449 }
1450
1451 if (SND_SOC_DAPM_EVENT_OFF(event)) {
Meng Wang15c825d2018-09-06 10:49:18 +08001452 snd_soc_component_update_bits(component, comp_ctl0_reg,
1453 0x04, 0x04);
1454 snd_soc_component_update_bits(component, rx_path_cfg0_reg,
1455 0x02, 0x00);
1456 snd_soc_component_update_bits(component, comp_ctl0_reg,
1457 0x01, 0x00);
1458 snd_soc_component_update_bits(component, comp_ctl0_reg,
1459 0x04, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301460 }
1461
1462 return 0;
1463}
1464
Meng Wang15c825d2018-09-06 10:49:18 +08001465static void rx_macro_enable_softclip_clk(struct snd_soc_component *component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301466 struct rx_macro_priv *rx_priv,
1467 bool enable)
1468{
1469 if (enable) {
1470 if (rx_priv->softclip_clk_users == 0)
Meng Wang15c825d2018-09-06 10:49:18 +08001471 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301472 BOLERO_CDC_RX_SOFTCLIP_CRC,
1473 0x01, 0x01);
1474 rx_priv->softclip_clk_users++;
1475 } else {
1476 rx_priv->softclip_clk_users--;
1477 if (rx_priv->softclip_clk_users == 0)
Meng Wang15c825d2018-09-06 10:49:18 +08001478 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301479 BOLERO_CDC_RX_SOFTCLIP_CRC,
1480 0x01, 0x00);
1481 }
1482}
1483
Meng Wang15c825d2018-09-06 10:49:18 +08001484static int rx_macro_config_softclip(struct snd_soc_component *component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301485 struct rx_macro_priv *rx_priv,
1486 int event)
1487{
Meng Wang15c825d2018-09-06 10:49:18 +08001488 dev_dbg(component->dev, "%s: event %d, enabled %d\n",
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301489 __func__, event, rx_priv->is_softclip_on);
1490
1491 if (!rx_priv->is_softclip_on)
1492 return 0;
1493
1494 if (SND_SOC_DAPM_EVENT_ON(event)) {
1495 /* Enable Softclip clock */
Meng Wang15c825d2018-09-06 10:49:18 +08001496 rx_macro_enable_softclip_clk(component, rx_priv, true);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301497 /* Enable Softclip control */
Meng Wang15c825d2018-09-06 10:49:18 +08001498 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301499 BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x01);
1500 }
1501
1502 if (SND_SOC_DAPM_EVENT_OFF(event)) {
Meng Wang15c825d2018-09-06 10:49:18 +08001503 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301504 BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001505 rx_macro_enable_softclip_clk(component, rx_priv, false);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301506 }
1507
1508 return 0;
1509}
1510
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301511static inline void
1512rx_macro_enable_clsh_block(struct rx_macro_priv *rx_priv, bool enable)
1513{
1514 if ((enable && ++rx_priv->clsh_users == 1) ||
1515 (!enable && --rx_priv->clsh_users == 0))
Meng Wang15c825d2018-09-06 10:49:18 +08001516 snd_soc_component_update_bits(rx_priv->component,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301517 BOLERO_CDC_RX_CLSH_CRC, 0x01,
1518 (u8) enable);
1519 if (rx_priv->clsh_users < 0)
1520 rx_priv->clsh_users = 0;
1521 dev_dbg(rx_priv->dev, "%s: clsh_users %d, enable %d", __func__,
1522 rx_priv->clsh_users, enable);
1523}
1524
Meng Wang15c825d2018-09-06 10:49:18 +08001525static int rx_macro_config_classh(struct snd_soc_component *component,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301526 struct rx_macro_priv *rx_priv,
1527 int interp_n, int event)
1528{
1529 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1530 rx_macro_enable_clsh_block(rx_priv, false);
1531 return 0;
1532 }
1533
1534 if (!SND_SOC_DAPM_EVENT_ON(event))
1535 return 0;
1536
1537 rx_macro_enable_clsh_block(rx_priv, true);
1538 if (interp_n == INTERP_HPHL ||
1539 interp_n == INTERP_HPHR) {
1540 /*
1541 * These K1 values depend on the Headphone Impedance
1542 * For now it is assumed to be 16 ohm
1543 */
Meng Wang15c825d2018-09-06 10:49:18 +08001544 snd_soc_component_update_bits(component,
1545 BOLERO_CDC_RX_CLSH_K1_LSB,
1546 0xFF, 0xC0);
1547 snd_soc_component_update_bits(component,
1548 BOLERO_CDC_RX_CLSH_K1_MSB,
1549 0x0F, 0x00);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301550 }
1551 switch (interp_n) {
1552 case INTERP_HPHL:
1553 if (rx_priv->is_ear_mode_on)
Meng Wang15c825d2018-09-06 10:49:18 +08001554 snd_soc_component_update_bits(component,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301555 BOLERO_CDC_RX_CLSH_HPH_V_PA,
1556 0x3F, 0x39);
1557 else
Meng Wang15c825d2018-09-06 10:49:18 +08001558 snd_soc_component_update_bits(component,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301559 BOLERO_CDC_RX_CLSH_HPH_V_PA,
1560 0x3F, 0x1C);
Meng Wang15c825d2018-09-06 10:49:18 +08001561 snd_soc_component_update_bits(component,
1562 BOLERO_CDC_RX_CLSH_DECAY_CTRL,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301563 0x07, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001564 snd_soc_component_update_bits(component,
1565 BOLERO_CDC_RX_RX0_RX_PATH_CFG0,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301566 0x40, 0x40);
1567 break;
1568 case INTERP_HPHR:
Meng Wang15c825d2018-09-06 10:49:18 +08001569 snd_soc_component_update_bits(component,
1570 BOLERO_CDC_RX_CLSH_HPH_V_PA,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301571 0x3F, 0x1C);
Meng Wang15c825d2018-09-06 10:49:18 +08001572 snd_soc_component_update_bits(component,
1573 BOLERO_CDC_RX_CLSH_DECAY_CTRL,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301574 0x07, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001575 snd_soc_component_update_bits(component,
1576 BOLERO_CDC_RX_RX1_RX_PATH_CFG0,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301577 0x40, 0x40);
1578 break;
1579 case INTERP_AUX:
Meng Wang15c825d2018-09-06 10:49:18 +08001580 snd_soc_component_update_bits(component,
1581 BOLERO_CDC_RX_RX2_RX_PATH_CFG0,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301582 0x10, 0x10);
1583 break;
1584 }
1585
1586 return 0;
1587}
1588
Meng Wang15c825d2018-09-06 10:49:18 +08001589static void rx_macro_hd2_control(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301590 u16 interp_idx, int event)
1591{
1592 u16 hd2_scale_reg = 0;
1593 u16 hd2_enable_reg = 0;
1594
1595 switch (interp_idx) {
1596 case INTERP_HPHL:
Laxminath Kasam7adc34e2018-11-09 11:24:38 +05301597 hd2_scale_reg = BOLERO_CDC_RX_RX0_RX_PATH_SEC3;
1598 hd2_enable_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301599 break;
1600 case INTERP_HPHR:
Laxminath Kasam7adc34e2018-11-09 11:24:38 +05301601 hd2_scale_reg = BOLERO_CDC_RX_RX1_RX_PATH_SEC3;
1602 hd2_enable_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301603 break;
1604 }
1605
1606 if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {
Meng Wang15c825d2018-09-06 10:49:18 +08001607 snd_soc_component_update_bits(component, hd2_scale_reg,
1608 0x3C, 0x14);
1609 snd_soc_component_update_bits(component, hd2_enable_reg,
1610 0x04, 0x04);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301611 }
1612
1613 if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
Meng Wang15c825d2018-09-06 10:49:18 +08001614 snd_soc_component_update_bits(component, hd2_enable_reg,
1615 0x04, 0x00);
1616 snd_soc_component_update_bits(component, hd2_scale_reg,
1617 0x3C, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301618 }
1619}
1620
1621static int rx_macro_get_compander(struct snd_kcontrol *kcontrol,
1622 struct snd_ctl_elem_value *ucontrol)
1623{
Meng Wang15c825d2018-09-06 10:49:18 +08001624 struct snd_soc_component *component =
1625 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301626 int comp = ((struct soc_multi_mixer_control *)
1627 kcontrol->private_value)->shift;
1628 struct device *rx_dev = NULL;
1629 struct rx_macro_priv *rx_priv = NULL;
1630
Meng Wang15c825d2018-09-06 10:49:18 +08001631 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301632 return -EINVAL;
1633
1634 ucontrol->value.integer.value[0] = rx_priv->comp_enabled[comp];
1635 return 0;
1636}
1637
1638static int rx_macro_set_compander(struct snd_kcontrol *kcontrol,
1639 struct snd_ctl_elem_value *ucontrol)
1640{
Meng Wang15c825d2018-09-06 10:49:18 +08001641 struct snd_soc_component *component =
1642 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301643 int comp = ((struct soc_multi_mixer_control *)
1644 kcontrol->private_value)->shift;
1645 int value = ucontrol->value.integer.value[0];
1646 struct device *rx_dev = NULL;
1647 struct rx_macro_priv *rx_priv = NULL;
1648
Meng Wang15c825d2018-09-06 10:49:18 +08001649 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301650 return -EINVAL;
1651
Meng Wang15c825d2018-09-06 10:49:18 +08001652 dev_dbg(component->dev, "%s: Compander %d enable current %d, new %d\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301653 __func__, comp + 1, rx_priv->comp_enabled[comp], value);
1654 rx_priv->comp_enabled[comp] = value;
1655
1656 return 0;
1657}
1658
1659static int rx_macro_mux_get(struct snd_kcontrol *kcontrol,
1660 struct snd_ctl_elem_value *ucontrol)
1661{
1662 struct snd_soc_dapm_widget *widget =
1663 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +08001664 struct snd_soc_component *component =
1665 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301666 struct device *rx_dev = NULL;
1667 struct rx_macro_priv *rx_priv = NULL;
1668
Meng Wang15c825d2018-09-06 10:49:18 +08001669 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301670 return -EINVAL;
1671
1672 ucontrol->value.integer.value[0] =
1673 rx_priv->rx_port_value[widget->shift];
1674 return 0;
1675}
1676
1677static int rx_macro_mux_put(struct snd_kcontrol *kcontrol,
1678 struct snd_ctl_elem_value *ucontrol)
1679{
1680 struct snd_soc_dapm_widget *widget =
1681 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +08001682 struct snd_soc_component *component =
1683 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301684 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1685 struct snd_soc_dapm_update *update = NULL;
1686 u32 rx_port_value = ucontrol->value.integer.value[0];
1687 u32 aif_rst = 0;
1688 struct device *rx_dev = NULL;
1689 struct rx_macro_priv *rx_priv = NULL;
1690
Meng Wang15c825d2018-09-06 10:49:18 +08001691 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301692 return -EINVAL;
1693
1694 aif_rst = rx_priv->rx_port_value[widget->shift];
1695 if (!rx_port_value) {
1696 if (aif_rst == 0) {
1697 dev_err(rx_dev, "%s:AIF reset already\n", __func__);
1698 return 0;
1699 }
1700 }
1701 rx_priv->rx_port_value[widget->shift] = rx_port_value;
1702
1703 switch (rx_port_value) {
1704 case 0:
1705 clear_bit(widget->shift,
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +05301706 &rx_priv->active_ch_mask[aif_rst]);
1707 rx_priv->active_ch_cnt[aif_rst]--;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301708 break;
1709 case 1:
1710 case 2:
1711 case 3:
1712 case 4:
1713 set_bit(widget->shift,
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +05301714 &rx_priv->active_ch_mask[rx_port_value]);
1715 rx_priv->active_ch_cnt[rx_port_value]++;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301716 break;
1717 default:
Meng Wang15c825d2018-09-06 10:49:18 +08001718 dev_err(component->dev,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301719 "%s:Invalid AIF_ID for RX_MACRO MUX\n", __func__);
1720 goto err;
1721 }
1722
1723 snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,
1724 rx_port_value, e, update);
1725 return 0;
1726err:
1727 return -EINVAL;
1728}
1729
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301730static int rx_macro_get_ear_mode(struct snd_kcontrol *kcontrol,
1731 struct snd_ctl_elem_value *ucontrol)
1732{
Meng Wang15c825d2018-09-06 10:49:18 +08001733 struct snd_soc_component *component =
1734 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301735 struct device *rx_dev = NULL;
1736 struct rx_macro_priv *rx_priv = NULL;
1737
Meng Wang15c825d2018-09-06 10:49:18 +08001738 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301739 return -EINVAL;
1740
1741 ucontrol->value.integer.value[0] = rx_priv->is_ear_mode_on;
1742 return 0;
1743}
1744
1745static int rx_macro_put_ear_mode(struct snd_kcontrol *kcontrol,
1746 struct snd_ctl_elem_value *ucontrol)
1747{
Meng Wang15c825d2018-09-06 10:49:18 +08001748 struct snd_soc_component *component =
1749 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301750 struct device *rx_dev = NULL;
1751 struct rx_macro_priv *rx_priv = NULL;
1752
Meng Wang15c825d2018-09-06 10:49:18 +08001753 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301754 return -EINVAL;
1755
1756 rx_priv->is_ear_mode_on =
1757 (!ucontrol->value.integer.value[0] ? false : true);
1758 return 0;
1759}
1760
Laxminath Kasamd3ffb332018-11-14 19:59:21 +05301761static int rx_macro_get_hph_hd2_mode(struct snd_kcontrol *kcontrol,
1762 struct snd_ctl_elem_value *ucontrol)
1763{
Meng Wang15c825d2018-09-06 10:49:18 +08001764 struct snd_soc_component *component =
1765 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasamd3ffb332018-11-14 19:59:21 +05301766 struct device *rx_dev = NULL;
1767 struct rx_macro_priv *rx_priv = NULL;
1768
Meng Wang15c825d2018-09-06 10:49:18 +08001769 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasamd3ffb332018-11-14 19:59:21 +05301770 return -EINVAL;
1771
1772 ucontrol->value.integer.value[0] = rx_priv->hph_hd2_mode;
1773 return 0;
1774}
1775
1776static int rx_macro_put_hph_hd2_mode(struct snd_kcontrol *kcontrol,
1777 struct snd_ctl_elem_value *ucontrol)
1778{
Meng Wang15c825d2018-09-06 10:49:18 +08001779 struct snd_soc_component *component =
1780 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasamd3ffb332018-11-14 19:59:21 +05301781 struct device *rx_dev = NULL;
1782 struct rx_macro_priv *rx_priv = NULL;
1783
Meng Wang15c825d2018-09-06 10:49:18 +08001784 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasamd3ffb332018-11-14 19:59:21 +05301785 return -EINVAL;
1786
1787 rx_priv->hph_hd2_mode = ucontrol->value.integer.value[0];
1788 return 0;
1789}
1790
Laxminath Kasamde09dfb2018-11-09 13:00:30 +05301791static int rx_macro_get_hph_pwr_mode(struct snd_kcontrol *kcontrol,
1792 struct snd_ctl_elem_value *ucontrol)
1793{
Meng Wang15c825d2018-09-06 10:49:18 +08001794 struct snd_soc_component *component =
1795 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasamde09dfb2018-11-09 13:00:30 +05301796 struct device *rx_dev = NULL;
1797 struct rx_macro_priv *rx_priv = NULL;
1798
Meng Wang15c825d2018-09-06 10:49:18 +08001799 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasamde09dfb2018-11-09 13:00:30 +05301800 return -EINVAL;
1801
1802 ucontrol->value.integer.value[0] = rx_priv->hph_pwr_mode;
1803 return 0;
1804}
1805
1806static int rx_macro_put_hph_pwr_mode(struct snd_kcontrol *kcontrol,
1807 struct snd_ctl_elem_value *ucontrol)
1808{
Meng Wang15c825d2018-09-06 10:49:18 +08001809 struct snd_soc_component *component =
1810 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasamde09dfb2018-11-09 13:00:30 +05301811 struct device *rx_dev = NULL;
1812 struct rx_macro_priv *rx_priv = NULL;
1813
Meng Wang15c825d2018-09-06 10:49:18 +08001814 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasamde09dfb2018-11-09 13:00:30 +05301815 return -EINVAL;
1816
1817 rx_priv->hph_pwr_mode = ucontrol->value.integer.value[0];
1818 return 0;
1819}
1820
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301821static int rx_macro_vbat_bcl_gsm_mode_func_get(struct snd_kcontrol *kcontrol,
1822 struct snd_ctl_elem_value *ucontrol)
1823{
Meng Wang15c825d2018-09-06 10:49:18 +08001824 struct snd_soc_component *component =
1825 snd_soc_kcontrol_component(kcontrol);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301826
1827 ucontrol->value.integer.value[0] =
Meng Wang15c825d2018-09-06 10:49:18 +08001828 ((snd_soc_component_read32(
1829 component, BOLERO_CDC_RX_BCL_VBAT_CFG) & 0x04) ?
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301830 1 : 0);
1831
Meng Wang15c825d2018-09-06 10:49:18 +08001832 dev_dbg(component->dev, "%s: value: %lu\n", __func__,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301833 ucontrol->value.integer.value[0]);
1834
1835 return 0;
1836}
1837
1838static int rx_macro_vbat_bcl_gsm_mode_func_put(struct snd_kcontrol *kcontrol,
1839 struct snd_ctl_elem_value *ucontrol)
1840{
Meng Wang15c825d2018-09-06 10:49:18 +08001841 struct snd_soc_component *component =
1842 snd_soc_kcontrol_component(kcontrol);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301843
Meng Wang15c825d2018-09-06 10:49:18 +08001844 dev_dbg(component->dev, "%s: value: %lu\n", __func__,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301845 ucontrol->value.integer.value[0]);
1846
1847 /* Set Vbat register configuration for GSM mode bit based on value */
1848 if (ucontrol->value.integer.value[0])
Meng Wang15c825d2018-09-06 10:49:18 +08001849 snd_soc_component_update_bits(component,
1850 BOLERO_CDC_RX_BCL_VBAT_CFG,
1851 0x04, 0x04);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301852 else
Meng Wang15c825d2018-09-06 10:49:18 +08001853 snd_soc_component_update_bits(component,
1854 BOLERO_CDC_RX_BCL_VBAT_CFG,
1855 0x04, 0x00);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301856
1857 return 0;
1858}
1859
1860static int rx_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol,
1861 struct snd_ctl_elem_value *ucontrol)
1862{
Meng Wang15c825d2018-09-06 10:49:18 +08001863 struct snd_soc_component *component =
1864 snd_soc_kcontrol_component(kcontrol);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301865 struct device *rx_dev = NULL;
1866 struct rx_macro_priv *rx_priv = NULL;
1867
Meng Wang15c825d2018-09-06 10:49:18 +08001868 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301869 return -EINVAL;
1870
1871 ucontrol->value.integer.value[0] = rx_priv->is_softclip_on;
1872
Meng Wang15c825d2018-09-06 10:49:18 +08001873 dev_dbg(component->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301874 __func__, ucontrol->value.integer.value[0]);
1875
1876 return 0;
1877}
1878
1879static int rx_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol,
1880 struct snd_ctl_elem_value *ucontrol)
1881{
Meng Wang15c825d2018-09-06 10:49:18 +08001882 struct snd_soc_component *component =
1883 snd_soc_kcontrol_component(kcontrol);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301884 struct device *rx_dev = NULL;
1885 struct rx_macro_priv *rx_priv = NULL;
1886
Meng Wang15c825d2018-09-06 10:49:18 +08001887 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301888 return -EINVAL;
1889
Meng Wang15c825d2018-09-06 10:49:18 +08001890 rx_priv->is_softclip_on = ucontrol->value.integer.value[0];
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301891
Meng Wang15c825d2018-09-06 10:49:18 +08001892 dev_dbg(component->dev, "%s: soft clip enable = %d\n", __func__,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301893 rx_priv->is_softclip_on);
1894
1895 return 0;
1896}
1897
1898static int rx_macro_enable_vbat(struct snd_soc_dapm_widget *w,
1899 struct snd_kcontrol *kcontrol,
1900 int event)
1901{
Meng Wang15c825d2018-09-06 10:49:18 +08001902 struct snd_soc_component *component =
1903 snd_soc_dapm_to_component(w->dapm);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301904 struct device *rx_dev = NULL;
1905 struct rx_macro_priv *rx_priv = NULL;
1906
Meng Wang15c825d2018-09-06 10:49:18 +08001907 dev_dbg(component->dev, "%s %s %d\n", __func__, w->name, event);
1908 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301909 return -EINVAL;
1910
1911 switch (event) {
1912 case SND_SOC_DAPM_PRE_PMU:
1913 /* Enable clock for VBAT block */
Meng Wang15c825d2018-09-06 10:49:18 +08001914 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301915 BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x10);
1916 /* Enable VBAT block */
Meng Wang15c825d2018-09-06 10:49:18 +08001917 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301918 BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x01);
1919 /* Update interpolator with 384K path */
Meng Wang15c825d2018-09-06 10:49:18 +08001920 snd_soc_component_update_bits(component,
1921 BOLERO_CDC_RX_RX2_RX_PATH_CFG1, 0x80, 0x80);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301922 /* Update DSM FS rate */
Meng Wang15c825d2018-09-06 10:49:18 +08001923 snd_soc_component_update_bits(component,
1924 BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x02, 0x02);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301925 /* Use attenuation mode */
Meng Wang15c825d2018-09-06 10:49:18 +08001926 snd_soc_component_update_bits(component,
1927 BOLERO_CDC_RX_BCL_VBAT_CFG, 0x02, 0x00);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301928 /* BCL block needs softclip clock to be enabled */
Meng Wang15c825d2018-09-06 10:49:18 +08001929 rx_macro_enable_softclip_clk(component, rx_priv, true);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301930 /* Enable VBAT at channel level */
Meng Wang15c825d2018-09-06 10:49:18 +08001931 snd_soc_component_update_bits(component,
1932 BOLERO_CDC_RX_RX2_RX_PATH_CFG1, 0x02, 0x02);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301933 /* Set the ATTK1 gain */
Meng Wang15c825d2018-09-06 10:49:18 +08001934 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301935 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1,
1936 0xFF, 0xFF);
Meng Wang15c825d2018-09-06 10:49:18 +08001937 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301938 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2,
1939 0xFF, 0x03);
Meng Wang15c825d2018-09-06 10:49:18 +08001940 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301941 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3,
1942 0xFF, 0x00);
1943 /* Set the ATTK2 gain */
Meng Wang15c825d2018-09-06 10:49:18 +08001944 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301945 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4,
1946 0xFF, 0xFF);
Meng Wang15c825d2018-09-06 10:49:18 +08001947 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301948 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5,
1949 0xFF, 0x03);
Meng Wang15c825d2018-09-06 10:49:18 +08001950 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301951 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6,
1952 0xFF, 0x00);
1953 /* Set the ATTK3 gain */
Meng Wang15c825d2018-09-06 10:49:18 +08001954 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301955 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7,
1956 0xFF, 0xFF);
Meng Wang15c825d2018-09-06 10:49:18 +08001957 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301958 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8,
1959 0xFF, 0x03);
Meng Wang15c825d2018-09-06 10:49:18 +08001960 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301961 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9,
1962 0xFF, 0x00);
1963 break;
1964
1965 case SND_SOC_DAPM_POST_PMD:
Meng Wang15c825d2018-09-06 10:49:18 +08001966 snd_soc_component_update_bits(component,
1967 BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1968 0x80, 0x00);
1969 snd_soc_component_update_bits(component,
1970 BOLERO_CDC_RX_RX2_RX_PATH_SEC7,
1971 0x02, 0x00);
1972 snd_soc_component_update_bits(component,
1973 BOLERO_CDC_RX_BCL_VBAT_CFG,
1974 0x02, 0x02);
1975 snd_soc_component_update_bits(component,
1976 BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1977 0x02, 0x00);
1978 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301979 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1,
1980 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001981 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301982 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2,
1983 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001984 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301985 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3,
1986 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001987 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301988 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4,
1989 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001990 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301991 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5,
1992 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001993 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301994 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6,
1995 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001996 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301997 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7,
1998 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001999 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302000 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8,
2001 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08002002 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302003 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9,
2004 0xFF, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08002005 rx_macro_enable_softclip_clk(component, rx_priv, false);
2006 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302007 BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08002008 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302009 BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x00);
2010 break;
2011 default:
2012 dev_err(rx_dev, "%s: Invalid event %d\n", __func__, event);
2013 break;
2014 }
2015 return 0;
2016}
2017
Meng Wang15c825d2018-09-06 10:49:18 +08002018static void rx_macro_idle_detect_control(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302019 struct rx_macro_priv *rx_priv,
2020 int interp, int event)
2021{
2022 int reg = 0, mask = 0, val = 0;
2023
2024 if (!rx_priv->idle_det_cfg.hph_idle_detect_en)
2025 return;
2026
2027 if (interp == INTERP_HPHL) {
2028 reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL;
2029 mask = 0x01;
2030 val = 0x01;
2031 }
2032 if (interp == INTERP_HPHR) {
2033 reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL;
2034 mask = 0x02;
2035 val = 0x02;
2036 }
2037
2038 if (reg && SND_SOC_DAPM_EVENT_ON(event))
Meng Wang15c825d2018-09-06 10:49:18 +08002039 snd_soc_component_update_bits(component, reg, mask, val);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302040
2041 if (reg && SND_SOC_DAPM_EVENT_OFF(event)) {
Meng Wang15c825d2018-09-06 10:49:18 +08002042 snd_soc_component_update_bits(component, reg, mask, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302043 rx_priv->idle_det_cfg.hph_idle_thr = 0;
Meng Wang15c825d2018-09-06 10:49:18 +08002044 snd_soc_component_write(component,
2045 BOLERO_CDC_RX_IDLE_DETECT_CFG3, 0x0);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302046 }
2047}
2048
Meng Wang15c825d2018-09-06 10:49:18 +08002049static void rx_macro_hphdelay_lutbypass(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302050 struct rx_macro_priv *rx_priv,
2051 u16 interp_idx, int event)
2052{
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302053 u16 hph_lut_bypass_reg = 0;
2054 u16 hph_comp_ctrl7 = 0;
2055
2056 switch (interp_idx) {
2057 case INTERP_HPHL:
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302058 hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHL_COMP_LUT;
2059 hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER0_CTL7;
2060 break;
2061 case INTERP_HPHR:
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302062 hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHR_COMP_LUT;
2063 hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER1_CTL7;
2064 break;
2065 default:
2066 break;
2067 }
2068
2069 if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) {
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302070 if (interp_idx == INTERP_HPHL) {
2071 if (rx_priv->is_ear_mode_on)
Meng Wang15c825d2018-09-06 10:49:18 +08002072 snd_soc_component_update_bits(component,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302073 BOLERO_CDC_RX_RX0_RX_PATH_CFG1,
2074 0x02, 0x02);
2075 else
Meng Wang15c825d2018-09-06 10:49:18 +08002076 snd_soc_component_update_bits(component,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302077 hph_lut_bypass_reg,
2078 0x80, 0x80);
2079 } else {
Meng Wang15c825d2018-09-06 10:49:18 +08002080 snd_soc_component_update_bits(component,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302081 hph_lut_bypass_reg,
2082 0x80, 0x80);
2083 }
Laxminath Kasamde09dfb2018-11-09 13:00:30 +05302084 if (rx_priv->hph_pwr_mode)
Meng Wang15c825d2018-09-06 10:49:18 +08002085 snd_soc_component_update_bits(component,
2086 hph_comp_ctrl7,
2087 0x20, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302088 }
2089
2090 if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
Meng Wang15c825d2018-09-06 10:49:18 +08002091 snd_soc_component_update_bits(component,
2092 BOLERO_CDC_RX_RX0_RX_PATH_CFG1,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302093 0x02, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08002094 snd_soc_component_update_bits(component, hph_lut_bypass_reg,
2095 0x80, 0x00);
2096 snd_soc_component_update_bits(component, hph_comp_ctrl7,
2097 0x20, 0x0);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302098 }
2099}
2100
Meng Wang15c825d2018-09-06 10:49:18 +08002101static int rx_macro_enable_interp_clk(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302102 int event, int interp_idx)
2103{
Laxminath Kasam35849cc2018-11-14 20:36:08 +05302104 u16 main_reg = 0, dsm_reg = 0, rx_cfg2_reg = 0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302105 struct device *rx_dev = NULL;
2106 struct rx_macro_priv *rx_priv = NULL;
2107
Meng Wang15c825d2018-09-06 10:49:18 +08002108 if (!component) {
2109 pr_err("%s: component is NULL\n", __func__);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302110 return -EINVAL;
2111 }
2112
Meng Wang15c825d2018-09-06 10:49:18 +08002113 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302114 return -EINVAL;
2115
2116 main_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL +
2117 (interp_idx * RX_MACRO_RX_PATH_OFFSET);
Laxminath Kasam35849cc2018-11-14 20:36:08 +05302118 dsm_reg = BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL +
2119 (interp_idx * RX_MACRO_RX_PATH_OFFSET);
2120 rx_cfg2_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG2 +
2121 (interp_idx * RX_MACRO_RX_PATH_OFFSET);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302122
2123 if (SND_SOC_DAPM_EVENT_ON(event)) {
2124 if (rx_priv->main_clk_users[interp_idx] == 0) {
Meng Wang15c825d2018-09-06 10:49:18 +08002125 snd_soc_component_update_bits(component, dsm_reg,
2126 0x01, 0x01);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302127 /* Main path PGA mute enable */
Meng Wang15c825d2018-09-06 10:49:18 +08002128 snd_soc_component_update_bits(component, main_reg,
2129 0x10, 0x10);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302130 /* Clk enable */
Meng Wang15c825d2018-09-06 10:49:18 +08002131 snd_soc_component_update_bits(component, main_reg,
2132 0x20, 0x20);
2133 snd_soc_component_update_bits(component, rx_cfg2_reg,
2134 0x03, 0x03);
2135 rx_macro_idle_detect_control(component, rx_priv,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302136 interp_idx, event);
Laxminath Kasamd3ffb332018-11-14 19:59:21 +05302137 if (rx_priv->hph_hd2_mode)
Meng Wang15c825d2018-09-06 10:49:18 +08002138 rx_macro_hd2_control(
2139 component, interp_idx, event);
2140 rx_macro_hphdelay_lutbypass(component, rx_priv,
2141 interp_idx, event);
2142 rx_macro_config_compander(component, rx_priv,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302143 interp_idx, event);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302144 if (interp_idx == INTERP_AUX)
Meng Wang15c825d2018-09-06 10:49:18 +08002145 rx_macro_config_softclip(component, rx_priv,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302146 event);
Meng Wang15c825d2018-09-06 10:49:18 +08002147 rx_macro_config_classh(component, rx_priv,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302148 interp_idx, event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302149 }
2150 rx_priv->main_clk_users[interp_idx]++;
2151 }
2152
2153 if (SND_SOC_DAPM_EVENT_OFF(event)) {
2154 rx_priv->main_clk_users[interp_idx]--;
2155 if (rx_priv->main_clk_users[interp_idx] <= 0) {
2156 rx_priv->main_clk_users[interp_idx] = 0;
Laxminath Kasam35849cc2018-11-14 20:36:08 +05302157 /* Clk Disable */
Meng Wang15c825d2018-09-06 10:49:18 +08002158 snd_soc_component_update_bits(component, dsm_reg,
2159 0x01, 0x00);
2160 snd_soc_component_update_bits(component, main_reg,
2161 0x20, 0x00);
Laxminath Kasam35849cc2018-11-14 20:36:08 +05302162 /* Reset enable and disable */
Meng Wang15c825d2018-09-06 10:49:18 +08002163 snd_soc_component_update_bits(component, main_reg,
2164 0x40, 0x40);
2165 snd_soc_component_update_bits(component, main_reg,
2166 0x40, 0x00);
Laxminath Kasam35849cc2018-11-14 20:36:08 +05302167 /* Reset rate to 48K*/
Meng Wang15c825d2018-09-06 10:49:18 +08002168 snd_soc_component_update_bits(component, main_reg,
2169 0x0F, 0x04);
2170 snd_soc_component_update_bits(component, rx_cfg2_reg,
2171 0x03, 0x00);
2172 rx_macro_config_classh(component, rx_priv,
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302173 interp_idx, event);
Meng Wang15c825d2018-09-06 10:49:18 +08002174 rx_macro_config_compander(component, rx_priv,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302175 interp_idx, event);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302176 if (interp_idx == INTERP_AUX)
Meng Wang15c825d2018-09-06 10:49:18 +08002177 rx_macro_config_softclip(component, rx_priv,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302178 event);
Meng Wang15c825d2018-09-06 10:49:18 +08002179 rx_macro_hphdelay_lutbypass(component, rx_priv,
2180 interp_idx, event);
Laxminath Kasamd3ffb332018-11-14 19:59:21 +05302181 if (rx_priv->hph_hd2_mode)
Meng Wang15c825d2018-09-06 10:49:18 +08002182 rx_macro_hd2_control(component, interp_idx,
2183 event);
2184 rx_macro_idle_detect_control(component, rx_priv,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302185 interp_idx, event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302186 }
2187 }
2188
Meng Wang15c825d2018-09-06 10:49:18 +08002189 dev_dbg(component->dev, "%s event %d main_clk_users %d\n",
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302190 __func__, event, rx_priv->main_clk_users[interp_idx]);
2191
2192 return rx_priv->main_clk_users[interp_idx];
2193}
2194
2195static int rx_macro_enable_rx_path_clk(struct snd_soc_dapm_widget *w,
2196 struct snd_kcontrol *kcontrol, int event)
2197{
Meng Wang15c825d2018-09-06 10:49:18 +08002198 struct snd_soc_component *component =
2199 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302200 u16 sidetone_reg = 0;
2201
Meng Wang15c825d2018-09-06 10:49:18 +08002202 dev_dbg(component->dev, "%s %d %d\n", __func__, event, w->shift);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302203 sidetone_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG1 +
2204 RX_MACRO_RX_PATH_OFFSET * (w->shift);
2205
2206 switch (event) {
2207 case SND_SOC_DAPM_PRE_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +08002208 rx_macro_enable_interp_clk(component, event, w->shift);
2209 snd_soc_component_update_bits(component, sidetone_reg,
2210 0x10, 0x10);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302211 break;
2212 case SND_SOC_DAPM_POST_PMD:
Meng Wang15c825d2018-09-06 10:49:18 +08002213 snd_soc_component_update_bits(component, sidetone_reg,
2214 0x10, 0x00);
2215 rx_macro_enable_interp_clk(component, event, w->shift);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302216 break;
2217 default:
2218 break;
2219 };
2220 return 0;
2221}
2222
2223static void rx_macro_restore_iir_coeff(struct rx_macro_priv *rx_priv, int iir_idx,
2224 int band_idx)
2225{
2226 u16 reg_add = 0, coeff_idx = 0, idx = 0;
2227 struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL);
2228
Tanya Dixit8530fb92018-09-14 16:01:25 +05302229 if (regmap == NULL) {
2230 dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__);
2231 return;
2232 }
2233
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302234 regmap_write(regmap,
2235 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2236 (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F);
2237
2238 reg_add = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx;
2239
2240 /* 5 coefficients per band and 4 writes per coefficient */
2241 for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX;
2242 coeff_idx++) {
2243 /* Four 8 bit values(one 32 bit) per coefficient */
2244 regmap_write(regmap, reg_add,
2245 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2246 regmap_write(regmap, reg_add,
2247 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2248 regmap_write(regmap, reg_add,
2249 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2250 regmap_write(regmap, reg_add,
2251 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2252 }
2253}
2254
2255static int rx_macro_iir_enable_audio_mixer_get(struct snd_kcontrol *kcontrol,
2256 struct snd_ctl_elem_value *ucontrol)
2257{
Meng Wang15c825d2018-09-06 10:49:18 +08002258 struct snd_soc_component *component =
2259 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302260 int iir_idx = ((struct soc_multi_mixer_control *)
2261 kcontrol->private_value)->reg;
2262 int band_idx = ((struct soc_multi_mixer_control *)
2263 kcontrol->private_value)->shift;
2264 /* IIR filter band registers are at integer multiples of 0x80 */
2265 u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx;
2266
Meng Wang15c825d2018-09-06 10:49:18 +08002267 ucontrol->value.integer.value[0] = (
2268 snd_soc_component_read32(component, iir_reg) &
2269 (1 << band_idx)) != 0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302270
Meng Wang15c825d2018-09-06 10:49:18 +08002271 dev_dbg(component->dev, "%s: IIR #%d band #%d enable %d\n", __func__,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302272 iir_idx, band_idx,
2273 (uint32_t)ucontrol->value.integer.value[0]);
2274 return 0;
2275}
2276
2277static int rx_macro_iir_enable_audio_mixer_put(struct snd_kcontrol *kcontrol,
2278 struct snd_ctl_elem_value *ucontrol)
2279{
Meng Wang15c825d2018-09-06 10:49:18 +08002280 struct snd_soc_component *component =
2281 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302282 int iir_idx = ((struct soc_multi_mixer_control *)
2283 kcontrol->private_value)->reg;
2284 int band_idx = ((struct soc_multi_mixer_control *)
2285 kcontrol->private_value)->shift;
2286 bool iir_band_en_status = 0;
2287 int value = ucontrol->value.integer.value[0];
2288 u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx;
2289 struct device *rx_dev = NULL;
2290 struct rx_macro_priv *rx_priv = NULL;
2291
Meng Wang15c825d2018-09-06 10:49:18 +08002292 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302293 return -EINVAL;
2294
2295 rx_macro_restore_iir_coeff(rx_priv, iir_idx, band_idx);
2296
2297 /* Mask first 5 bits, 6-8 are reserved */
Meng Wang15c825d2018-09-06 10:49:18 +08002298 snd_soc_component_update_bits(component, iir_reg, (1 << band_idx),
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302299 (value << band_idx));
2300
Meng Wang15c825d2018-09-06 10:49:18 +08002301 iir_band_en_status = ((snd_soc_component_read32(component, iir_reg) &
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302302 (1 << band_idx)) != 0);
Meng Wang15c825d2018-09-06 10:49:18 +08002303 dev_dbg(component->dev, "%s: IIR #%d band #%d enable %d\n", __func__,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302304 iir_idx, band_idx, iir_band_en_status);
2305 return 0;
2306}
2307
Meng Wang15c825d2018-09-06 10:49:18 +08002308static uint32_t get_iir_band_coeff(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302309 int iir_idx, int band_idx,
2310 int coeff_idx)
2311{
2312 uint32_t value = 0;
2313
2314 /* Address does not automatically update if reading */
Meng Wang15c825d2018-09-06 10:49:18 +08002315 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302316 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2317 ((band_idx * BAND_MAX + coeff_idx)
2318 * sizeof(uint32_t)) & 0x7F);
2319
Meng Wang15c825d2018-09-06 10:49:18 +08002320 value |= snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302321 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx));
2322
Meng Wang15c825d2018-09-06 10:49:18 +08002323 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302324 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2325 ((band_idx * BAND_MAX + coeff_idx)
2326 * sizeof(uint32_t) + 1) & 0x7F);
2327
Meng Wang15c825d2018-09-06 10:49:18 +08002328 value |= (snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302329 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2330 0x80 * iir_idx)) << 8);
2331
Meng Wang15c825d2018-09-06 10:49:18 +08002332 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302333 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2334 ((band_idx * BAND_MAX + coeff_idx)
2335 * sizeof(uint32_t) + 2) & 0x7F);
2336
Meng Wang15c825d2018-09-06 10:49:18 +08002337 value |= (snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302338 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2339 0x80 * iir_idx)) << 16);
2340
Meng Wang15c825d2018-09-06 10:49:18 +08002341 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302342 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2343 ((band_idx * BAND_MAX + coeff_idx)
2344 * sizeof(uint32_t) + 3) & 0x7F);
2345
2346 /* Mask bits top 2 bits since they are reserved */
Meng Wang15c825d2018-09-06 10:49:18 +08002347 value |= ((snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302348 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2349 16 * iir_idx)) & 0x3F) << 24);
2350
2351 return value;
2352}
2353
2354static int rx_macro_iir_band_audio_mixer_get(struct snd_kcontrol *kcontrol,
2355 struct snd_ctl_elem_value *ucontrol)
2356{
Meng Wang15c825d2018-09-06 10:49:18 +08002357 struct snd_soc_component *component =
2358 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302359 int iir_idx = ((struct soc_multi_mixer_control *)
2360 kcontrol->private_value)->reg;
2361 int band_idx = ((struct soc_multi_mixer_control *)
2362 kcontrol->private_value)->shift;
2363
2364 ucontrol->value.integer.value[0] =
Meng Wang15c825d2018-09-06 10:49:18 +08002365 get_iir_band_coeff(component, iir_idx, band_idx, 0);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302366 ucontrol->value.integer.value[1] =
Meng Wang15c825d2018-09-06 10:49:18 +08002367 get_iir_band_coeff(component, iir_idx, band_idx, 1);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302368 ucontrol->value.integer.value[2] =
Meng Wang15c825d2018-09-06 10:49:18 +08002369 get_iir_band_coeff(component, iir_idx, band_idx, 2);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302370 ucontrol->value.integer.value[3] =
Meng Wang15c825d2018-09-06 10:49:18 +08002371 get_iir_band_coeff(component, iir_idx, band_idx, 3);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302372 ucontrol->value.integer.value[4] =
Meng Wang15c825d2018-09-06 10:49:18 +08002373 get_iir_band_coeff(component, iir_idx, band_idx, 4);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302374
Meng Wang15c825d2018-09-06 10:49:18 +08002375 dev_dbg(component->dev, "%s: IIR #%d band #%d b0 = 0x%x\n"
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302376 "%s: IIR #%d band #%d b1 = 0x%x\n"
2377 "%s: IIR #%d band #%d b2 = 0x%x\n"
2378 "%s: IIR #%d band #%d a1 = 0x%x\n"
2379 "%s: IIR #%d band #%d a2 = 0x%x\n",
2380 __func__, iir_idx, band_idx,
2381 (uint32_t)ucontrol->value.integer.value[0],
2382 __func__, iir_idx, band_idx,
2383 (uint32_t)ucontrol->value.integer.value[1],
2384 __func__, iir_idx, band_idx,
2385 (uint32_t)ucontrol->value.integer.value[2],
2386 __func__, iir_idx, band_idx,
2387 (uint32_t)ucontrol->value.integer.value[3],
2388 __func__, iir_idx, band_idx,
2389 (uint32_t)ucontrol->value.integer.value[4]);
2390 return 0;
2391}
2392
Meng Wang15c825d2018-09-06 10:49:18 +08002393static void set_iir_band_coeff(struct snd_soc_component *component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302394 int iir_idx, int band_idx,
2395 uint32_t value)
2396{
Meng Wang15c825d2018-09-06 10:49:18 +08002397 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302398 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2399 (value & 0xFF));
2400
Meng Wang15c825d2018-09-06 10:49:18 +08002401 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302402 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2403 (value >> 8) & 0xFF);
2404
Meng Wang15c825d2018-09-06 10:49:18 +08002405 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302406 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2407 (value >> 16) & 0xFF);
2408
2409 /* Mask top 2 bits, 7-8 are reserved */
Meng Wang15c825d2018-09-06 10:49:18 +08002410 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302411 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2412 (value >> 24) & 0x3F);
2413}
2414
2415static int rx_macro_iir_band_audio_mixer_put(struct snd_kcontrol *kcontrol,
2416 struct snd_ctl_elem_value *ucontrol)
2417{
Meng Wang15c825d2018-09-06 10:49:18 +08002418 struct snd_soc_component *component =
2419 snd_soc_kcontrol_component(kcontrol);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302420 int iir_idx = ((struct soc_multi_mixer_control *)
2421 kcontrol->private_value)->reg;
2422 int band_idx = ((struct soc_multi_mixer_control *)
2423 kcontrol->private_value)->shift;
2424 int coeff_idx, idx = 0;
2425 struct device *rx_dev = NULL;
2426 struct rx_macro_priv *rx_priv = NULL;
2427
Meng Wang15c825d2018-09-06 10:49:18 +08002428 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302429 return -EINVAL;
2430
2431 /*
2432 * Mask top bit it is reserved
2433 * Updates addr automatically for each B2 write
2434 */
Meng Wang15c825d2018-09-06 10:49:18 +08002435 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302436 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx),
2437 (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F);
2438
2439 /* Store the coefficients in sidetone coeff array */
2440 for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX;
2441 coeff_idx++) {
2442 uint32_t value = ucontrol->value.integer.value[coeff_idx];
2443
Meng Wang15c825d2018-09-06 10:49:18 +08002444 set_iir_band_coeff(component, iir_idx, band_idx, value);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302445
2446 /* Four 8 bit values(one 32 bit) per coefficient */
2447 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2448 (value & 0xFF);
2449 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2450 (value >> 8) & 0xFF;
2451 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2452 (value >> 16) & 0xFF;
2453 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2454 (value >> 24) & 0xFF;
2455 }
2456
2457 pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n"
2458 "%s: IIR #%d band #%d b1 = 0x%x\n"
2459 "%s: IIR #%d band #%d b2 = 0x%x\n"
2460 "%s: IIR #%d band #%d a1 = 0x%x\n"
2461 "%s: IIR #%d band #%d a2 = 0x%x\n",
2462 __func__, iir_idx, band_idx,
Meng Wang15c825d2018-09-06 10:49:18 +08002463 get_iir_band_coeff(component, iir_idx, band_idx, 0),
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302464 __func__, iir_idx, band_idx,
Meng Wang15c825d2018-09-06 10:49:18 +08002465 get_iir_band_coeff(component, iir_idx, band_idx, 1),
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302466 __func__, iir_idx, band_idx,
Meng Wang15c825d2018-09-06 10:49:18 +08002467 get_iir_band_coeff(component, iir_idx, band_idx, 2),
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302468 __func__, iir_idx, band_idx,
Meng Wang15c825d2018-09-06 10:49:18 +08002469 get_iir_band_coeff(component, iir_idx, band_idx, 3),
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302470 __func__, iir_idx, band_idx,
Meng Wang15c825d2018-09-06 10:49:18 +08002471 get_iir_band_coeff(component, iir_idx, band_idx, 4));
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302472 return 0;
2473}
2474
2475static int rx_macro_set_iir_gain(struct snd_soc_dapm_widget *w,
2476 struct snd_kcontrol *kcontrol, int event)
2477{
Meng Wang15c825d2018-09-06 10:49:18 +08002478 struct snd_soc_component *component =
2479 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302480
Meng Wang15c825d2018-09-06 10:49:18 +08002481 dev_dbg(component->dev, "%s: event = %d\n", __func__, event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302482
2483 switch (event) {
2484 case SND_SOC_DAPM_POST_PMU: /* fall through */
2485 case SND_SOC_DAPM_PRE_PMD:
2486 if (strnstr(w->name, "IIR0", sizeof("IIR0"))) {
Meng Wang15c825d2018-09-06 10:49:18 +08002487 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302488 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL,
Meng Wang15c825d2018-09-06 10:49:18 +08002489 snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302490 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL));
Meng Wang15c825d2018-09-06 10:49:18 +08002491 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302492 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL,
Meng Wang15c825d2018-09-06 10:49:18 +08002493 snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302494 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL));
Meng Wang15c825d2018-09-06 10:49:18 +08002495 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302496 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL,
Meng Wang15c825d2018-09-06 10:49:18 +08002497 snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302498 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL));
Meng Wang15c825d2018-09-06 10:49:18 +08002499 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302500 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL,
Meng Wang15c825d2018-09-06 10:49:18 +08002501 snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302502 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL));
2503 } else {
Meng Wang15c825d2018-09-06 10:49:18 +08002504 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302505 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL,
Meng Wang15c825d2018-09-06 10:49:18 +08002506 snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302507 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL));
Meng Wang15c825d2018-09-06 10:49:18 +08002508 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302509 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL,
Meng Wang15c825d2018-09-06 10:49:18 +08002510 snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302511 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL));
Meng Wang15c825d2018-09-06 10:49:18 +08002512 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302513 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL,
Meng Wang15c825d2018-09-06 10:49:18 +08002514 snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302515 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL));
Meng Wang15c825d2018-09-06 10:49:18 +08002516 snd_soc_component_write(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302517 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL,
Meng Wang15c825d2018-09-06 10:49:18 +08002518 snd_soc_component_read32(component,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302519 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL));
2520 }
2521 break;
2522 }
2523 return 0;
2524}
2525
2526static const struct snd_kcontrol_new rx_macro_snd_controls[] = {
2527 SOC_SINGLE_SX_TLV("RX_RX0 Digital Volume",
2528 BOLERO_CDC_RX_RX0_RX_VOL_CTL,
2529 0, -84, 40, digital_gain),
2530 SOC_SINGLE_SX_TLV("RX_RX1 Digital Volume",
2531 BOLERO_CDC_RX_RX1_RX_VOL_CTL,
2532 0, -84, 40, digital_gain),
2533 SOC_SINGLE_SX_TLV("RX_RX2 Digital Volume",
2534 BOLERO_CDC_RX_RX2_RX_VOL_CTL,
2535 0, -84, 40, digital_gain),
2536 SOC_SINGLE_SX_TLV("RX_RX0 Mix Digital Volume",
2537 BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2538 SOC_SINGLE_SX_TLV("RX_RX1 Mix Digital Volume",
2539 BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2540 SOC_SINGLE_SX_TLV("RX_RX2 Mix Digital Volume",
2541 BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2542
2543 SOC_SINGLE_EXT("RX_COMP1 Switch", SND_SOC_NOPM, RX_MACRO_COMP1, 1, 0,
2544 rx_macro_get_compander, rx_macro_set_compander),
2545 SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0,
2546 rx_macro_get_compander, rx_macro_set_compander),
2547
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302548 SOC_ENUM_EXT("RX_EAR Mode", rx_macro_ear_mode_enum,
2549 rx_macro_get_ear_mode, rx_macro_put_ear_mode),
2550
Laxminath Kasamd3ffb332018-11-14 19:59:21 +05302551 SOC_ENUM_EXT("RX_HPH HD2 Mode", rx_macro_hph_hd2_mode_enum,
2552 rx_macro_get_hph_hd2_mode, rx_macro_put_hph_hd2_mode),
2553
Laxminath Kasamde09dfb2018-11-09 13:00:30 +05302554 SOC_ENUM_EXT("RX_HPH_PWR_MODE", rx_macro_hph_pwr_mode_enum,
2555 rx_macro_get_hph_pwr_mode, rx_macro_put_hph_pwr_mode),
2556
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302557 SOC_ENUM_EXT("RX_GSM mode Enable", rx_macro_vbat_bcl_gsm_mode_enum,
2558 rx_macro_vbat_bcl_gsm_mode_func_get,
2559 rx_macro_vbat_bcl_gsm_mode_func_put),
2560 SOC_SINGLE_EXT("RX_Softclip Enable", SND_SOC_NOPM, 0, 1, 0,
2561 rx_macro_soft_clip_enable_get,
2562 rx_macro_soft_clip_enable_put),
2563
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302564 SOC_SINGLE_SX_TLV("IIR0 INP0 Volume",
2565 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, 40,
2566 digital_gain),
2567 SOC_SINGLE_SX_TLV("IIR0 INP1 Volume",
2568 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, 40,
2569 digital_gain),
2570 SOC_SINGLE_SX_TLV("IIR0 INP2 Volume",
2571 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, 40,
2572 digital_gain),
2573 SOC_SINGLE_SX_TLV("IIR0 INP3 Volume",
2574 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, 40,
2575 digital_gain),
2576 SOC_SINGLE_SX_TLV("IIR1 INP0 Volume",
2577 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0, -84, 40,
2578 digital_gain),
2579 SOC_SINGLE_SX_TLV("IIR1 INP1 Volume",
2580 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0, -84, 40,
2581 digital_gain),
2582 SOC_SINGLE_SX_TLV("IIR1 INP2 Volume",
2583 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0, -84, 40,
2584 digital_gain),
2585 SOC_SINGLE_SX_TLV("IIR1 INP3 Volume",
2586 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0, -84, 40,
2587 digital_gain),
2588
2589 SOC_SINGLE_EXT("IIR0 Enable Band1", IIR0, BAND1, 1, 0,
2590 rx_macro_iir_enable_audio_mixer_get,
2591 rx_macro_iir_enable_audio_mixer_put),
2592 SOC_SINGLE_EXT("IIR0 Enable Band2", IIR0, BAND2, 1, 0,
2593 rx_macro_iir_enable_audio_mixer_get,
2594 rx_macro_iir_enable_audio_mixer_put),
2595 SOC_SINGLE_EXT("IIR0 Enable Band3", IIR0, BAND3, 1, 0,
2596 rx_macro_iir_enable_audio_mixer_get,
2597 rx_macro_iir_enable_audio_mixer_put),
2598 SOC_SINGLE_EXT("IIR0 Enable Band4", IIR0, BAND4, 1, 0,
2599 rx_macro_iir_enable_audio_mixer_get,
2600 rx_macro_iir_enable_audio_mixer_put),
2601 SOC_SINGLE_EXT("IIR0 Enable Band5", IIR0, BAND5, 1, 0,
2602 rx_macro_iir_enable_audio_mixer_get,
2603 rx_macro_iir_enable_audio_mixer_put),
2604 SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0,
2605 rx_macro_iir_enable_audio_mixer_get,
2606 rx_macro_iir_enable_audio_mixer_put),
2607 SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0,
2608 rx_macro_iir_enable_audio_mixer_get,
2609 rx_macro_iir_enable_audio_mixer_put),
2610 SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0,
2611 rx_macro_iir_enable_audio_mixer_get,
2612 rx_macro_iir_enable_audio_mixer_put),
2613 SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0,
2614 rx_macro_iir_enable_audio_mixer_get,
2615 rx_macro_iir_enable_audio_mixer_put),
2616 SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0,
2617 rx_macro_iir_enable_audio_mixer_get,
2618 rx_macro_iir_enable_audio_mixer_put),
2619
2620 SOC_SINGLE_MULTI_EXT("IIR0 Band1", IIR0, BAND1, 255, 0, 5,
2621 rx_macro_iir_band_audio_mixer_get,
2622 rx_macro_iir_band_audio_mixer_put),
2623 SOC_SINGLE_MULTI_EXT("IIR0 Band2", IIR0, BAND2, 255, 0, 5,
2624 rx_macro_iir_band_audio_mixer_get,
2625 rx_macro_iir_band_audio_mixer_put),
2626 SOC_SINGLE_MULTI_EXT("IIR0 Band3", IIR0, BAND3, 255, 0, 5,
2627 rx_macro_iir_band_audio_mixer_get,
2628 rx_macro_iir_band_audio_mixer_put),
2629 SOC_SINGLE_MULTI_EXT("IIR0 Band4", IIR0, BAND4, 255, 0, 5,
2630 rx_macro_iir_band_audio_mixer_get,
2631 rx_macro_iir_band_audio_mixer_put),
2632 SOC_SINGLE_MULTI_EXT("IIR0 Band5", IIR0, BAND5, 255, 0, 5,
2633 rx_macro_iir_band_audio_mixer_get,
2634 rx_macro_iir_band_audio_mixer_put),
2635 SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5,
2636 rx_macro_iir_band_audio_mixer_get,
2637 rx_macro_iir_band_audio_mixer_put),
2638 SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5,
2639 rx_macro_iir_band_audio_mixer_get,
2640 rx_macro_iir_band_audio_mixer_put),
2641 SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5,
2642 rx_macro_iir_band_audio_mixer_get,
2643 rx_macro_iir_band_audio_mixer_put),
2644 SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5,
2645 rx_macro_iir_band_audio_mixer_get,
2646 rx_macro_iir_band_audio_mixer_put),
2647 SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5,
2648 rx_macro_iir_band_audio_mixer_get,
2649 rx_macro_iir_band_audio_mixer_put),
2650};
2651
2652static const struct snd_soc_dapm_widget rx_macro_dapm_widgets[] = {
2653 SND_SOC_DAPM_AIF_IN("RX AIF1 PB", "RX_MACRO_AIF1 Playback", 0,
2654 SND_SOC_NOPM, 0, 0),
2655
2656 SND_SOC_DAPM_AIF_IN("RX AIF2 PB", "RX_MACRO_AIF2 Playback", 0,
2657 SND_SOC_NOPM, 0, 0),
2658
2659 SND_SOC_DAPM_AIF_IN("RX AIF3 PB", "RX_MACRO_AIF3 Playback", 0,
2660 SND_SOC_NOPM, 0, 0),
2661
2662 SND_SOC_DAPM_AIF_IN("RX AIF4 PB", "RX_MACRO_AIF4 Playback", 0,
2663 SND_SOC_NOPM, 0, 0),
2664
2665 RX_MACRO_DAPM_MUX("RX_MACRO RX0 MUX", RX_MACRO_RX0, rx_macro_rx0),
2666 RX_MACRO_DAPM_MUX("RX_MACRO RX1 MUX", RX_MACRO_RX1, rx_macro_rx1),
2667 RX_MACRO_DAPM_MUX("RX_MACRO RX2 MUX", RX_MACRO_RX2, rx_macro_rx2),
2668 RX_MACRO_DAPM_MUX("RX_MACRO RX3 MUX", RX_MACRO_RX3, rx_macro_rx3),
2669 RX_MACRO_DAPM_MUX("RX_MACRO RX4 MUX", RX_MACRO_RX4, rx_macro_rx4),
2670 RX_MACRO_DAPM_MUX("RX_MACRO RX5 MUX", RX_MACRO_RX5, rx_macro_rx5),
2671
2672 SND_SOC_DAPM_MIXER("RX_RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
2673 SND_SOC_DAPM_MIXER("RX_RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2674 SND_SOC_DAPM_MIXER("RX_RX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2675 SND_SOC_DAPM_MIXER("RX_RX3", SND_SOC_NOPM, 0, 0, NULL, 0),
2676 SND_SOC_DAPM_MIXER("RX_RX4", SND_SOC_NOPM, 0, 0, NULL, 0),
2677 SND_SOC_DAPM_MIXER("RX_RX5", SND_SOC_NOPM, 0, 0, NULL, 0),
2678
2679 RX_MACRO_DAPM_MUX("IIR0 INP0 MUX", 0, iir0_inp0),
2680 RX_MACRO_DAPM_MUX("IIR0 INP1 MUX", 0, iir0_inp1),
2681 RX_MACRO_DAPM_MUX("IIR0 INP2 MUX", 0, iir0_inp2),
2682 RX_MACRO_DAPM_MUX("IIR0 INP3 MUX", 0, iir0_inp3),
2683 RX_MACRO_DAPM_MUX("IIR1 INP0 MUX", 0, iir1_inp0),
2684 RX_MACRO_DAPM_MUX("IIR1 INP1 MUX", 0, iir1_inp1),
2685 RX_MACRO_DAPM_MUX("IIR1 INP2 MUX", 0, iir1_inp2),
2686 RX_MACRO_DAPM_MUX("IIR1 INP3 MUX", 0, iir1_inp3),
2687
2688 SND_SOC_DAPM_MIXER_E("IIR0", BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL,
2689 4, 0, NULL, 0, rx_macro_set_iir_gain,
2690 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2691 SND_SOC_DAPM_MIXER_E("IIR1", BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL,
2692 4, 0, NULL, 0, rx_macro_set_iir_gain,
2693 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2694 SND_SOC_DAPM_MIXER("SRC0", BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL,
2695 4, 0, NULL, 0),
2696 SND_SOC_DAPM_MIXER("SRC1", BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL,
2697 4, 0, NULL, 0),
2698
2699 RX_MACRO_DAPM_MUX("RX MIX TX0 MUX", 0, rx_mix_tx0),
2700 RX_MACRO_DAPM_MUX("RX MIX TX1 MUX", 0, rx_mix_tx1),
2701 RX_MACRO_DAPM_MUX("RX MIX TX2 MUX", 0, rx_mix_tx2),
2702 RX_MACRO_DAPM_MUX("RX INT0 DEM MUX", 0, rx_int0_dem_inp),
2703 RX_MACRO_DAPM_MUX("RX INT1 DEM MUX", 0, rx_int1_dem_inp),
2704
2705 SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0,
2706 &rx_int0_2_mux, rx_macro_enable_mix_path,
2707 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2708 SND_SOC_DAPM_POST_PMD),
2709 SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0,
2710 &rx_int1_2_mux, rx_macro_enable_mix_path,
2711 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2712 SND_SOC_DAPM_POST_PMD),
2713 SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_AUX, 0,
2714 &rx_int2_2_mux, rx_macro_enable_mix_path,
2715 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2716 SND_SOC_DAPM_POST_PMD),
2717
2718 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP0", 0, rx_int0_1_mix_inp0),
2719 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP1", 0, rx_int0_1_mix_inp1),
2720 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP2", 0, rx_int0_1_mix_inp2),
2721 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP0", 0, rx_int1_1_mix_inp0),
2722 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP1", 0, rx_int1_1_mix_inp1),
2723 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP2", 0, rx_int1_1_mix_inp2),
2724 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP0", 0, rx_int2_1_mix_inp0),
2725 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP1", 0, rx_int2_1_mix_inp1),
2726 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP2", 0, rx_int2_1_mix_inp2),
2727
2728 SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0,
2729 &rx_int0_1_interp_mux, rx_macro_enable_main_path,
2730 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2731 SND_SOC_DAPM_POST_PMD),
2732 SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0,
2733 &rx_int1_1_interp_mux, rx_macro_enable_main_path,
2734 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2735 SND_SOC_DAPM_POST_PMD),
2736 SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_AUX, 0,
2737 &rx_int2_1_interp_mux, rx_macro_enable_main_path,
2738 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2739 SND_SOC_DAPM_POST_PMD),
2740
2741 RX_MACRO_DAPM_MUX("RX INT0_2 INTERP", 0, rx_int0_2_interp),
2742 RX_MACRO_DAPM_MUX("RX INT1_2 INTERP", 0, rx_int1_2_interp),
2743 RX_MACRO_DAPM_MUX("RX INT2_2 INTERP", 0, rx_int2_2_interp),
2744
2745 SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2746 SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2747 SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2748 SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2749 SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2750 SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2751
2752 SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_HPHL,
2753 0, &rx_int0_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2754 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2755 SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", SND_SOC_NOPM, INTERP_HPHR,
2756 0, &rx_int1_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2757 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2758 SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", SND_SOC_NOPM, INTERP_AUX,
2759 0, &rx_int2_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2760 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2761
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302762 SND_SOC_DAPM_MIXER_E("RX INT2_1 VBAT", SND_SOC_NOPM,
2763 0, 0, rx_int2_1_vbat_mix_switch,
2764 ARRAY_SIZE(rx_int2_1_vbat_mix_switch),
2765 rx_macro_enable_vbat,
2766 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2767
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302768 SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2769 SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2770 SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2771
2772 SND_SOC_DAPM_OUTPUT("HPHL_OUT"),
2773 SND_SOC_DAPM_OUTPUT("HPHR_OUT"),
2774 SND_SOC_DAPM_OUTPUT("AUX_OUT"),
2775
2776 SND_SOC_DAPM_INPUT("RX_TX DEC0_INP"),
2777 SND_SOC_DAPM_INPUT("RX_TX DEC1_INP"),
2778 SND_SOC_DAPM_INPUT("RX_TX DEC2_INP"),
2779 SND_SOC_DAPM_INPUT("RX_TX DEC3_INP"),
2780
2781 SND_SOC_DAPM_SUPPLY_S("RX_MCLK", 0, SND_SOC_NOPM, 0, 0,
2782 rx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2783};
2784
2785static const struct snd_soc_dapm_route rx_audio_map[] = {
2786 {"RX AIF1 PB", NULL, "RX_MCLK"},
2787 {"RX AIF2 PB", NULL, "RX_MCLK"},
2788 {"RX AIF3 PB", NULL, "RX_MCLK"},
2789 {"RX AIF4 PB", NULL, "RX_MCLK"},
2790
2791 {"RX_MACRO RX0 MUX", "AIF1_PB", "RX AIF1 PB"},
2792 {"RX_MACRO RX1 MUX", "AIF1_PB", "RX AIF1 PB"},
2793 {"RX_MACRO RX2 MUX", "AIF1_PB", "RX AIF1 PB"},
2794 {"RX_MACRO RX3 MUX", "AIF1_PB", "RX AIF1 PB"},
2795 {"RX_MACRO RX4 MUX", "AIF1_PB", "RX AIF1 PB"},
2796 {"RX_MACRO RX5 MUX", "AIF1_PB", "RX AIF1 PB"},
2797
2798 {"RX_MACRO RX0 MUX", "AIF2_PB", "RX AIF2 PB"},
2799 {"RX_MACRO RX1 MUX", "AIF2_PB", "RX AIF2 PB"},
2800 {"RX_MACRO RX2 MUX", "AIF2_PB", "RX AIF2 PB"},
2801 {"RX_MACRO RX3 MUX", "AIF2_PB", "RX AIF2 PB"},
2802 {"RX_MACRO RX4 MUX", "AIF2_PB", "RX AIF2 PB"},
2803 {"RX_MACRO RX5 MUX", "AIF2_PB", "RX AIF2 PB"},
2804
2805 {"RX_MACRO RX0 MUX", "AIF3_PB", "RX AIF3 PB"},
2806 {"RX_MACRO RX1 MUX", "AIF3_PB", "RX AIF3 PB"},
2807 {"RX_MACRO RX2 MUX", "AIF3_PB", "RX AIF3 PB"},
2808 {"RX_MACRO RX3 MUX", "AIF3_PB", "RX AIF3 PB"},
2809 {"RX_MACRO RX4 MUX", "AIF3_PB", "RX AIF3 PB"},
2810 {"RX_MACRO RX5 MUX", "AIF3_PB", "RX AIF3 PB"},
2811
2812 {"RX_MACRO RX0 MUX", "AIF4_PB", "RX AIF4 PB"},
2813 {"RX_MACRO RX1 MUX", "AIF4_PB", "RX AIF4 PB"},
2814 {"RX_MACRO RX2 MUX", "AIF4_PB", "RX AIF4 PB"},
2815 {"RX_MACRO RX3 MUX", "AIF4_PB", "RX AIF4 PB"},
2816 {"RX_MACRO RX4 MUX", "AIF4_PB", "RX AIF4 PB"},
2817 {"RX_MACRO RX5 MUX", "AIF4_PB", "RX AIF4 PB"},
2818
2819 {"RX_RX0", NULL, "RX_MACRO RX0 MUX"},
2820 {"RX_RX1", NULL, "RX_MACRO RX1 MUX"},
2821 {"RX_RX2", NULL, "RX_MACRO RX2 MUX"},
2822 {"RX_RX3", NULL, "RX_MACRO RX3 MUX"},
2823 {"RX_RX4", NULL, "RX_MACRO RX4 MUX"},
2824 {"RX_RX5", NULL, "RX_MACRO RX5 MUX"},
2825
2826 {"RX INT0_1 MIX1 INP0", "RX0", "RX_RX0"},
2827 {"RX INT0_1 MIX1 INP0", "RX1", "RX_RX1"},
2828 {"RX INT0_1 MIX1 INP0", "RX2", "RX_RX2"},
2829 {"RX INT0_1 MIX1 INP0", "RX3", "RX_RX3"},
2830 {"RX INT0_1 MIX1 INP0", "RX4", "RX_RX4"},
2831 {"RX INT0_1 MIX1 INP0", "RX5", "RX_RX5"},
2832 {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"},
2833 {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"},
2834 {"RX INT0_1 MIX1 INP1", "RX0", "RX_RX0"},
2835 {"RX INT0_1 MIX1 INP1", "RX1", "RX_RX1"},
2836 {"RX INT0_1 MIX1 INP1", "RX2", "RX_RX2"},
2837 {"RX INT0_1 MIX1 INP1", "RX3", "RX_RX3"},
2838 {"RX INT0_1 MIX1 INP1", "RX4", "RX_RX4"},
2839 {"RX INT0_1 MIX1 INP1", "RX5", "RX_RX5"},
2840 {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"},
2841 {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"},
2842 {"RX INT0_1 MIX1 INP2", "RX0", "RX_RX0"},
2843 {"RX INT0_1 MIX1 INP2", "RX1", "RX_RX1"},
2844 {"RX INT0_1 MIX1 INP2", "RX2", "RX_RX2"},
2845 {"RX INT0_1 MIX1 INP2", "RX3", "RX_RX3"},
2846 {"RX INT0_1 MIX1 INP2", "RX4", "RX_RX4"},
2847 {"RX INT0_1 MIX1 INP2", "RX5", "RX_RX5"},
2848 {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"},
2849 {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"},
2850
2851 {"RX INT1_1 MIX1 INP0", "RX0", "RX_RX0"},
2852 {"RX INT1_1 MIX1 INP0", "RX1", "RX_RX1"},
2853 {"RX INT1_1 MIX1 INP0", "RX2", "RX_RX2"},
2854 {"RX INT1_1 MIX1 INP0", "RX3", "RX_RX3"},
2855 {"RX INT1_1 MIX1 INP0", "RX4", "RX_RX4"},
2856 {"RX INT1_1 MIX1 INP0", "RX5", "RX_RX5"},
2857 {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"},
2858 {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"},
2859 {"RX INT1_1 MIX1 INP1", "RX0", "RX_RX0"},
2860 {"RX INT1_1 MIX1 INP1", "RX1", "RX_RX1"},
2861 {"RX INT1_1 MIX1 INP1", "RX2", "RX_RX2"},
2862 {"RX INT1_1 MIX1 INP1", "RX3", "RX_RX3"},
2863 {"RX INT1_1 MIX1 INP1", "RX4", "RX_RX4"},
2864 {"RX INT1_1 MIX1 INP1", "RX5", "RX_RX5"},
2865 {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"},
2866 {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"},
2867 {"RX INT1_1 MIX1 INP2", "RX0", "RX_RX0"},
2868 {"RX INT1_1 MIX1 INP2", "RX1", "RX_RX1"},
2869 {"RX INT1_1 MIX1 INP2", "RX2", "RX_RX2"},
2870 {"RX INT1_1 MIX1 INP2", "RX3", "RX_RX3"},
2871 {"RX INT1_1 MIX1 INP2", "RX4", "RX_RX4"},
2872 {"RX INT1_1 MIX1 INP2", "RX5", "RX_RX5"},
2873 {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"},
2874 {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"},
2875
2876 {"RX INT2_1 MIX1 INP0", "RX0", "RX_RX0"},
2877 {"RX INT2_1 MIX1 INP0", "RX1", "RX_RX1"},
2878 {"RX INT2_1 MIX1 INP0", "RX2", "RX_RX2"},
2879 {"RX INT2_1 MIX1 INP0", "RX3", "RX_RX3"},
2880 {"RX INT2_1 MIX1 INP0", "RX4", "RX_RX4"},
2881 {"RX INT2_1 MIX1 INP0", "RX5", "RX_RX5"},
2882 {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"},
2883 {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"},
2884 {"RX INT2_1 MIX1 INP1", "RX0", "RX_RX0"},
2885 {"RX INT2_1 MIX1 INP1", "RX1", "RX_RX1"},
2886 {"RX INT2_1 MIX1 INP1", "RX2", "RX_RX2"},
2887 {"RX INT2_1 MIX1 INP1", "RX3", "RX_RX3"},
2888 {"RX INT2_1 MIX1 INP1", "RX4", "RX_RX4"},
2889 {"RX INT2_1 MIX1 INP1", "RX5", "RX_RX5"},
2890 {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"},
2891 {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"},
2892 {"RX INT2_1 MIX1 INP2", "RX0", "RX_RX0"},
2893 {"RX INT2_1 MIX1 INP2", "RX1", "RX_RX1"},
2894 {"RX INT2_1 MIX1 INP2", "RX2", "RX_RX2"},
2895 {"RX INT2_1 MIX1 INP2", "RX3", "RX_RX3"},
2896 {"RX INT2_1 MIX1 INP2", "RX4", "RX_RX4"},
2897 {"RX INT2_1 MIX1 INP2", "RX5", "RX_RX5"},
2898 {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"},
2899 {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"},
2900
2901 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"},
2902 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"},
2903 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"},
2904 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"},
2905 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"},
2906 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"},
2907 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"},
2908 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"},
2909 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"},
2910
2911 /* Mixing path INT0 */
2912 {"RX INT0_2 MUX", "RX0", "RX_RX0"},
2913 {"RX INT0_2 MUX", "RX1", "RX_RX1"},
2914 {"RX INT0_2 MUX", "RX2", "RX_RX2"},
2915 {"RX INT0_2 MUX", "RX3", "RX_RX3"},
2916 {"RX INT0_2 MUX", "RX4", "RX_RX4"},
2917 {"RX INT0_2 MUX", "RX5", "RX_RX5"},
2918 {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"},
2919 {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"},
2920
2921 /* Mixing path INT1 */
2922 {"RX INT1_2 MUX", "RX0", "RX_RX0"},
2923 {"RX INT1_2 MUX", "RX1", "RX_RX1"},
2924 {"RX INT1_2 MUX", "RX2", "RX_RX2"},
2925 {"RX INT1_2 MUX", "RX3", "RX_RX3"},
2926 {"RX INT1_2 MUX", "RX4", "RX_RX4"},
2927 {"RX INT1_2 MUX", "RX5", "RX_RX5"},
2928 {"RX INT1_2 INTERP", NULL, "RX INT1_2 MUX"},
2929 {"RX INT1 SEC MIX", NULL, "RX INT1_2 INTERP"},
2930
2931 /* Mixing path INT2 */
2932 {"RX INT2_2 MUX", "RX0", "RX_RX0"},
2933 {"RX INT2_2 MUX", "RX1", "RX_RX1"},
2934 {"RX INT2_2 MUX", "RX2", "RX_RX2"},
2935 {"RX INT2_2 MUX", "RX3", "RX_RX3"},
2936 {"RX INT2_2 MUX", "RX4", "RX_RX4"},
2937 {"RX INT2_2 MUX", "RX5", "RX_RX5"},
2938 {"RX INT2_2 INTERP", NULL, "RX INT2_2 MUX"},
2939 {"RX INT2 SEC MIX", NULL, "RX INT2_2 INTERP"},
2940
2941 {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"},
2942 {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"},
2943 {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"},
2944 {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"},
2945 {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"},
2946 {"HPHL_OUT", NULL, "RX INT0 DEM MUX"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302947 {"HPHL_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302948
2949 {"RX INT1_1 INTERP", NULL, "RX INT1_1 MIX1"},
2950 {"RX INT1 SEC MIX", NULL, "RX INT1_1 INTERP"},
2951 {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"},
2952 {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"},
2953 {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX2"},
2954 {"HPHR_OUT", NULL, "RX INT1 DEM MUX"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302955 {"HPHR_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302956
2957 {"RX INT2_1 INTERP", NULL, "RX INT2_1 MIX1"},
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302958
2959 {"RX INT2_1 VBAT", "RX AUX VBAT Enable", "RX INT2_1 INTERP"},
2960 {"RX INT2 SEC MIX", NULL, "RX INT2_1 VBAT"},
2961
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302962 {"RX INT2 SEC MIX", NULL, "RX INT2_1 INTERP"},
2963 {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"},
2964 {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"},
2965 {"AUX_OUT", NULL, "RX INT2 MIX2"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302966 {"AUX_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302967
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302968 {"IIR0", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302969 {"IIR0", NULL, "IIR0 INP0 MUX"},
2970 {"IIR0 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},
2971 {"IIR0 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},
2972 {"IIR0 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},
2973 {"IIR0 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},
2974 {"IIR0 INP0 MUX", "RX0", "RX_RX0"},
2975 {"IIR0 INP0 MUX", "RX1", "RX_RX1"},
2976 {"IIR0 INP0 MUX", "RX2", "RX_RX2"},
2977 {"IIR0 INP0 MUX", "RX3", "RX_RX3"},
2978 {"IIR0 INP0 MUX", "RX4", "RX_RX4"},
2979 {"IIR0 INP0 MUX", "RX5", "RX_RX5"},
2980 {"IIR0", NULL, "IIR0 INP1 MUX"},
2981 {"IIR0 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},
2982 {"IIR0 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},
2983 {"IIR0 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},
2984 {"IIR0 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},
2985 {"IIR0 INP1 MUX", "RX0", "RX_RX0"},
2986 {"IIR0 INP1 MUX", "RX1", "RX_RX1"},
2987 {"IIR0 INP1 MUX", "RX2", "RX_RX2"},
2988 {"IIR0 INP1 MUX", "RX3", "RX_RX3"},
2989 {"IIR0 INP1 MUX", "RX4", "RX_RX4"},
2990 {"IIR0 INP1 MUX", "RX5", "RX_RX5"},
2991 {"IIR0", NULL, "IIR0 INP2 MUX"},
2992 {"IIR0 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},
2993 {"IIR0 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},
2994 {"IIR0 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},
2995 {"IIR0 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},
2996 {"IIR0 INP2 MUX", "RX0", "RX_RX0"},
2997 {"IIR0 INP2 MUX", "RX1", "RX_RX1"},
2998 {"IIR0 INP2 MUX", "RX2", "RX_RX2"},
2999 {"IIR0 INP2 MUX", "RX3", "RX_RX3"},
3000 {"IIR0 INP2 MUX", "RX4", "RX_RX4"},
3001 {"IIR0 INP2 MUX", "RX5", "RX_RX5"},
3002 {"IIR0", NULL, "IIR0 INP3 MUX"},
3003 {"IIR0 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},
3004 {"IIR0 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},
3005 {"IIR0 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},
3006 {"IIR0 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},
3007 {"IIR0 INP3 MUX", "RX0", "RX_RX0"},
3008 {"IIR0 INP3 MUX", "RX1", "RX_RX1"},
3009 {"IIR0 INP3 MUX", "RX2", "RX_RX2"},
3010 {"IIR0 INP3 MUX", "RX3", "RX_RX3"},
3011 {"IIR0 INP3 MUX", "RX4", "RX_RX4"},
3012 {"IIR0 INP3 MUX", "RX5", "RX_RX5"},
3013
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05303014 {"IIR1", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303015 {"IIR1", NULL, "IIR1 INP0 MUX"},
3016 {"IIR1 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},
3017 {"IIR1 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},
3018 {"IIR1 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},
3019 {"IIR1 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},
3020 {"IIR1 INP0 MUX", "RX0", "RX_RX0"},
3021 {"IIR1 INP0 MUX", "RX1", "RX_RX1"},
3022 {"IIR1 INP0 MUX", "RX2", "RX_RX2"},
3023 {"IIR1 INP0 MUX", "RX3", "RX_RX3"},
3024 {"IIR1 INP0 MUX", "RX4", "RX_RX4"},
3025 {"IIR1 INP0 MUX", "RX5", "RX_RX5"},
3026 {"IIR1", NULL, "IIR1 INP1 MUX"},
3027 {"IIR1 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},
3028 {"IIR1 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},
3029 {"IIR1 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},
3030 {"IIR1 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},
3031 {"IIR1 INP1 MUX", "RX0", "RX_RX0"},
3032 {"IIR1 INP1 MUX", "RX1", "RX_RX1"},
3033 {"IIR1 INP1 MUX", "RX2", "RX_RX2"},
3034 {"IIR1 INP1 MUX", "RX3", "RX_RX3"},
3035 {"IIR1 INP1 MUX", "RX4", "RX_RX4"},
3036 {"IIR1 INP1 MUX", "RX5", "RX_RX5"},
3037 {"IIR1", NULL, "IIR1 INP2 MUX"},
3038 {"IIR1 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},
3039 {"IIR1 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},
3040 {"IIR1 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},
3041 {"IIR1 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},
3042 {"IIR1 INP2 MUX", "RX0", "RX_RX0"},
3043 {"IIR1 INP2 MUX", "RX1", "RX_RX1"},
3044 {"IIR1 INP2 MUX", "RX2", "RX_RX2"},
3045 {"IIR1 INP2 MUX", "RX3", "RX_RX3"},
3046 {"IIR1 INP2 MUX", "RX4", "RX_RX4"},
3047 {"IIR1 INP2 MUX", "RX5", "RX_RX5"},
3048 {"IIR1", NULL, "IIR1 INP3 MUX"},
3049 {"IIR1 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},
3050 {"IIR1 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},
3051 {"IIR1 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},
3052 {"IIR1 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},
3053 {"IIR1 INP3 MUX", "RX0", "RX_RX0"},
3054 {"IIR1 INP3 MUX", "RX1", "RX_RX1"},
3055 {"IIR1 INP3 MUX", "RX2", "RX_RX2"},
3056 {"IIR1 INP3 MUX", "RX3", "RX_RX3"},
3057 {"IIR1 INP3 MUX", "RX4", "RX_RX4"},
3058 {"IIR1 INP3 MUX", "RX5", "RX_RX5"},
3059
3060 {"SRC0", NULL, "IIR0"},
3061 {"SRC1", NULL, "IIR1"},
3062 {"RX INT0 MIX2 INP", "SRC0", "SRC0"},
3063 {"RX INT0 MIX2 INP", "SRC1", "SRC1"},
3064 {"RX INT1 MIX2 INP", "SRC0", "SRC0"},
3065 {"RX INT1 MIX2 INP", "SRC1", "SRC1"},
3066 {"RX INT2 MIX2 INP", "SRC0", "SRC0"},
3067 {"RX INT2 MIX2 INP", "SRC1", "SRC1"},
3068};
3069
3070static int rx_swrm_clock(void *handle, bool enable)
3071{
3072 struct rx_macro_priv *rx_priv = (struct rx_macro_priv *) handle;
3073 struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL);
3074 int ret = 0;
3075
Tanya Dixit8530fb92018-09-14 16:01:25 +05303076 if (regmap == NULL) {
3077 dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__);
3078 return -EINVAL;
3079 }
3080
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303081 mutex_lock(&rx_priv->swr_clk_lock);
3082
3083 dev_dbg(rx_priv->dev, "%s: swrm clock %s\n",
3084 __func__, (enable ? "enable" : "disable"));
3085 if (enable) {
3086 if (rx_priv->swr_clk_users == 0) {
3087 ret = rx_macro_mclk_enable(rx_priv, 1, true);
3088 if (ret < 0) {
3089 dev_err(rx_priv->dev,
3090 "%s: rx request clock enable failed\n",
3091 __func__);
3092 goto exit;
3093 }
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05303094 if (rx_priv->reset_swr)
3095 regmap_update_bits(regmap,
3096 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
3097 0x02, 0x02);
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +05303098 regmap_update_bits(regmap,
3099 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303100 0x01, 0x01);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05303101 if (rx_priv->reset_swr)
3102 regmap_update_bits(regmap,
3103 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
3104 0x02, 0x00);
3105 rx_priv->reset_swr = false;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303106 msm_cdc_pinctrl_select_active_state(
3107 rx_priv->rx_swr_gpio_p);
3108 }
3109 rx_priv->swr_clk_users++;
3110 } else {
3111 if (rx_priv->swr_clk_users <= 0) {
3112 dev_err(rx_priv->dev,
3113 "%s: rx swrm clock users already reset\n",
3114 __func__);
3115 rx_priv->swr_clk_users = 0;
3116 goto exit;
3117 }
3118 rx_priv->swr_clk_users--;
3119 if (rx_priv->swr_clk_users == 0) {
3120 regmap_update_bits(regmap,
3121 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
3122 0x01, 0x00);
3123 msm_cdc_pinctrl_select_sleep_state(
3124 rx_priv->rx_swr_gpio_p);
3125 rx_macro_mclk_enable(rx_priv, 0, true);
3126 }
3127 }
3128 dev_dbg(rx_priv->dev, "%s: swrm clock users %d\n",
3129 __func__, rx_priv->swr_clk_users);
3130exit:
3131 mutex_unlock(&rx_priv->swr_clk_lock);
3132 return ret;
3133}
3134
Meng Wang15c825d2018-09-06 10:49:18 +08003135static void rx_macro_init_bcl_pmic_reg(struct snd_soc_component *component)
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303136{
3137 struct device *rx_dev = NULL;
3138 struct rx_macro_priv *rx_priv = NULL;
3139
Meng Wang15c825d2018-09-06 10:49:18 +08003140 if (!component) {
3141 pr_err("%s: NULL component pointer!\n", __func__);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303142 return;
3143 }
3144
Meng Wang15c825d2018-09-06 10:49:18 +08003145 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303146 return;
3147
3148 switch (rx_priv->bcl_pmic_params.id) {
3149 case 0:
3150 /* Enable ID0 to listen to respective PMIC group interrupts */
Meng Wang15c825d2018-09-06 10:49:18 +08003151 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303152 BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x02, 0x02);
3153 /* Update MC_SID0 */
Meng Wang15c825d2018-09-06 10:49:18 +08003154 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303155 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0x0F,
3156 rx_priv->bcl_pmic_params.sid);
3157 /* Update MC_PPID0 */
Meng Wang15c825d2018-09-06 10:49:18 +08003158 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303159 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2, 0xFF,
3160 rx_priv->bcl_pmic_params.ppid);
3161 break;
3162 case 1:
3163 /* Enable ID1 to listen to respective PMIC group interrupts */
Meng Wang15c825d2018-09-06 10:49:18 +08003164 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303165 BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x01, 0x01);
3166 /* Update MC_SID1 */
Meng Wang15c825d2018-09-06 10:49:18 +08003167 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303168 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3, 0x0F,
3169 rx_priv->bcl_pmic_params.sid);
3170 /* Update MC_PPID1 */
Meng Wang15c825d2018-09-06 10:49:18 +08003171 snd_soc_component_update_bits(component,
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303172 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0xFF,
3173 rx_priv->bcl_pmic_params.ppid);
3174 break;
3175 default:
Md Mansoor Ahmed26d8bdd2018-11-20 10:56:01 +05303176 dev_err(rx_dev, "%s: PMIC ID is invalid %d\n",
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303177 __func__, rx_priv->bcl_pmic_params.id);
3178 break;
3179 }
3180}
3181
Meng Wang15c825d2018-09-06 10:49:18 +08003182static int rx_macro_init(struct snd_soc_component *component)
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303183{
Meng Wang15c825d2018-09-06 10:49:18 +08003184 struct snd_soc_dapm_context *dapm =
3185 snd_soc_component_get_dapm(component);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303186 int ret = 0;
3187 struct device *rx_dev = NULL;
3188 struct rx_macro_priv *rx_priv = NULL;
3189
Meng Wang15c825d2018-09-06 10:49:18 +08003190 rx_dev = bolero_get_device_ptr(component->dev, RX_MACRO);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303191 if (!rx_dev) {
Meng Wang15c825d2018-09-06 10:49:18 +08003192 dev_err(component->dev,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303193 "%s: null device for macro!\n", __func__);
3194 return -EINVAL;
3195 }
3196 rx_priv = dev_get_drvdata(rx_dev);
3197 if (!rx_priv) {
Meng Wang15c825d2018-09-06 10:49:18 +08003198 dev_err(component->dev,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303199 "%s: priv is null for macro!\n", __func__);
3200 return -EINVAL;
3201 }
3202
3203 ret = snd_soc_dapm_new_controls(dapm, rx_macro_dapm_widgets,
3204 ARRAY_SIZE(rx_macro_dapm_widgets));
3205 if (ret < 0) {
3206 dev_err(rx_dev, "%s: failed to add controls\n", __func__);
3207 return ret;
3208 }
3209 ret = snd_soc_dapm_add_routes(dapm, rx_audio_map,
3210 ARRAY_SIZE(rx_audio_map));
3211 if (ret < 0) {
3212 dev_err(rx_dev, "%s: failed to add routes\n", __func__);
3213 return ret;
3214 }
3215 ret = snd_soc_dapm_new_widgets(dapm->card);
3216 if (ret < 0) {
3217 dev_err(rx_dev, "%s: failed to add widgets\n", __func__);
3218 return ret;
3219 }
Meng Wang15c825d2018-09-06 10:49:18 +08003220 ret = snd_soc_add_component_controls(component, rx_macro_snd_controls,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303221 ARRAY_SIZE(rx_macro_snd_controls));
3222 if (ret < 0) {
3223 dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__);
3224 return ret;
3225 }
Laxminath Kasam701e3582018-10-15 20:06:09 +05303226 rx_priv->dev_up = true;
Laxminath Kasam638b5602018-09-24 13:19:52 +05303227 snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF1 Playback");
3228 snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF2 Playback");
3229 snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF3 Playback");
3230 snd_soc_dapm_ignore_suspend(dapm, "RX_MACRO_AIF4 Playback");
3231 snd_soc_dapm_ignore_suspend(dapm, "HPHL_OUT");
3232 snd_soc_dapm_ignore_suspend(dapm, "HPHR_OUT");
3233 snd_soc_dapm_ignore_suspend(dapm, "AUX_OUT");
3234 snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC0_INP");
3235 snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC1_INP");
3236 snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC2_INP");
3237 snd_soc_dapm_ignore_suspend(dapm, "RX_TX DEC3_INP");
3238 snd_soc_dapm_sync(dapm);
3239
Meng Wang15c825d2018-09-06 10:49:18 +08003240 snd_soc_component_update_bits(component,
3241 BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL,
3242 0x01, 0x01);
3243 snd_soc_component_update_bits(component,
3244 BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL,
3245 0x01, 0x01);
3246 snd_soc_component_update_bits(component,
3247 BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL,
3248 0x01, 0x01);
3249 snd_soc_component_update_bits(component, BOLERO_CDC_RX_RX0_RX_PATH_SEC7,
3250 0x07, 0x02);
3251 snd_soc_component_update_bits(component, BOLERO_CDC_RX_RX1_RX_PATH_SEC7,
3252 0x07, 0x02);
3253 snd_soc_component_update_bits(component, BOLERO_CDC_RX_RX2_RX_PATH_SEC7,
3254 0x07, 0x02);
3255 snd_soc_component_update_bits(component, BOLERO_CDC_RX_RX0_RX_PATH_CFG3,
3256 0x03, 0x02);
3257 snd_soc_component_update_bits(component, BOLERO_CDC_RX_RX1_RX_PATH_CFG3,
3258 0x03, 0x02);
3259 snd_soc_component_update_bits(component, BOLERO_CDC_RX_RX2_RX_PATH_CFG3,
3260 0x03, 0x02);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303261
Meng Wang15c825d2018-09-06 10:49:18 +08003262 rx_macro_init_bcl_pmic_reg(component);
3263
3264 rx_priv->component = component;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303265
3266 return 0;
3267}
3268
Meng Wang15c825d2018-09-06 10:49:18 +08003269static int rx_macro_deinit(struct snd_soc_component *component)
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303270{
3271 struct device *rx_dev = NULL;
3272 struct rx_macro_priv *rx_priv = NULL;
3273
Meng Wang15c825d2018-09-06 10:49:18 +08003274 if (!rx_macro_get_data(component, &rx_dev, &rx_priv, __func__))
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303275 return -EINVAL;
3276
Meng Wang15c825d2018-09-06 10:49:18 +08003277 rx_priv->component = NULL;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303278
3279 return 0;
3280}
3281
3282static void rx_macro_add_child_devices(struct work_struct *work)
3283{
3284 struct rx_macro_priv *rx_priv = NULL;
3285 struct platform_device *pdev = NULL;
3286 struct device_node *node = NULL;
3287 struct rx_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
3288 int ret = 0;
3289 u16 count = 0, ctrl_num = 0;
3290 struct rx_swr_ctrl_platform_data *platdata = NULL;
3291 char plat_dev_name[RX_SWR_STRING_LEN] = "";
3292 bool rx_swr_master_node = false;
3293
3294 rx_priv = container_of(work, struct rx_macro_priv,
3295 rx_macro_add_child_devices_work);
3296 if (!rx_priv) {
3297 pr_err("%s: Memory for rx_priv does not exist\n",
3298 __func__);
3299 return;
3300 }
3301
3302 if (!rx_priv->dev) {
3303 pr_err("%s: RX device does not exist\n", __func__);
3304 return;
3305 }
3306
3307 if(!rx_priv->dev->of_node) {
3308 dev_err(rx_priv->dev,
3309 "%s: DT node for RX dev does not exist\n", __func__);
3310 return;
3311 }
3312
3313 platdata = &rx_priv->swr_plat_data;
3314 rx_priv->child_count = 0;
3315
3316 for_each_available_child_of_node(rx_priv->dev->of_node, node) {
3317 rx_swr_master_node = false;
3318 if (strnstr(node->name, "rx_swr_master",
3319 strlen("rx_swr_master")) != NULL)
3320 rx_swr_master_node = true;
3321
3322 if(rx_swr_master_node)
3323 strlcpy(plat_dev_name, "rx_swr_ctrl",
3324 (RX_SWR_STRING_LEN - 1));
3325 else
3326 strlcpy(plat_dev_name, node->name,
3327 (RX_SWR_STRING_LEN - 1));
3328
3329 pdev = platform_device_alloc(plat_dev_name, -1);
3330 if (!pdev) {
3331 dev_err(rx_priv->dev, "%s: pdev memory alloc failed\n",
3332 __func__);
3333 ret = -ENOMEM;
3334 goto err;
3335 }
3336 pdev->dev.parent = rx_priv->dev;
3337 pdev->dev.of_node = node;
3338
3339 if (rx_swr_master_node) {
3340 ret = platform_device_add_data(pdev, platdata,
3341 sizeof(*platdata));
3342 if (ret) {
3343 dev_err(&pdev->dev,
3344 "%s: cannot add plat data ctrl:%d\n",
3345 __func__, ctrl_num);
3346 goto fail_pdev_add;
3347 }
3348 }
3349
3350 ret = platform_device_add(pdev);
3351 if (ret) {
3352 dev_err(&pdev->dev,
3353 "%s: Cannot add platform device\n",
3354 __func__);
3355 goto fail_pdev_add;
3356 }
3357
3358 if (rx_swr_master_node) {
3359 temp = krealloc(swr_ctrl_data,
3360 (ctrl_num + 1) * sizeof(
3361 struct rx_swr_ctrl_data),
3362 GFP_KERNEL);
3363 if (!temp) {
3364 ret = -ENOMEM;
3365 goto fail_pdev_add;
3366 }
3367 swr_ctrl_data = temp;
3368 swr_ctrl_data[ctrl_num].rx_swr_pdev = pdev;
3369 ctrl_num++;
3370 dev_dbg(&pdev->dev,
3371 "%s: Added soundwire ctrl device(s)\n",
3372 __func__);
3373 rx_priv->swr_ctrl_data = swr_ctrl_data;
3374 }
3375 if (rx_priv->child_count < RX_MACRO_CHILD_DEVICES_MAX)
3376 rx_priv->pdev_child_devices[
3377 rx_priv->child_count++] = pdev;
3378 else
3379 goto err;
3380 }
3381 return;
3382fail_pdev_add:
3383 for (count = 0; count < rx_priv->child_count; count++)
3384 platform_device_put(rx_priv->pdev_child_devices[count]);
3385err:
3386 return;
3387}
3388
3389static void rx_macro_init_ops(struct macro_ops *ops, char __iomem *rx_io_base)
3390{
3391 memset(ops, 0, sizeof(struct macro_ops));
3392 ops->init = rx_macro_init;
3393 ops->exit = rx_macro_deinit;
3394 ops->io_base = rx_io_base;
3395 ops->dai_ptr = rx_macro_dai;
3396 ops->num_dais = ARRAY_SIZE(rx_macro_dai);
3397 ops->mclk_fn = rx_macro_mclk_ctrl;
Laxminath Kasam497a6512018-09-17 16:11:52 +05303398 ops->event_handler = rx_macro_event_handler;
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303399 ops->set_port_map = rx_macro_set_port_map;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303400}
3401
3402static int rx_macro_probe(struct platform_device *pdev)
3403{
3404 struct macro_ops ops = {0};
3405 struct rx_macro_priv *rx_priv = NULL;
3406 u32 rx_base_addr = 0, muxsel = 0;
3407 char __iomem *rx_io_base = NULL, *muxsel_io = NULL;
3408 int ret = 0;
3409 struct clk *rx_core_clk = NULL, *rx_npl_clk = NULL;
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303410 u8 bcl_pmic_params[3];
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303411
3412 rx_priv = devm_kzalloc(&pdev->dev, sizeof(struct rx_macro_priv),
3413 GFP_KERNEL);
3414 if (!rx_priv)
3415 return -ENOMEM;
3416
3417 rx_priv->dev = &pdev->dev;
3418 ret = of_property_read_u32(pdev->dev.of_node, "reg",
3419 &rx_base_addr);
3420 if (ret) {
3421 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3422 __func__, "reg");
3423 return ret;
3424 }
3425 ret = of_property_read_u32(pdev->dev.of_node, "qcom,rx_mclk_mode_muxsel",
3426 &muxsel);
3427 if (ret) {
3428 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3429 __func__, "reg");
3430 return ret;
3431 }
3432 rx_priv->rx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
3433 "qcom,rx-swr-gpios", 0);
3434 if (!rx_priv->rx_swr_gpio_p) {
3435 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
3436 __func__);
3437 return -EINVAL;
3438 }
3439 rx_io_base = devm_ioremap(&pdev->dev, rx_base_addr,
3440 RX_MACRO_MAX_OFFSET);
3441 if (!rx_io_base) {
3442 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
3443 return -ENOMEM;
3444 }
3445 rx_priv->rx_io_base = rx_io_base;
3446 muxsel_io = devm_ioremap(&pdev->dev, muxsel, 0x4);
3447 if (!muxsel_io) {
3448 dev_err(&pdev->dev, "%s: ioremap failed for muxsel\n",
3449 __func__);
3450 return -ENOMEM;
3451 }
3452 rx_priv->rx_mclk_mode_muxsel = muxsel_io;
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05303453 rx_priv->reset_swr = true;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303454 INIT_WORK(&rx_priv->rx_macro_add_child_devices_work,
3455 rx_macro_add_child_devices);
3456 rx_priv->swr_plat_data.handle = (void *) rx_priv;
3457 rx_priv->swr_plat_data.read = NULL;
3458 rx_priv->swr_plat_data.write = NULL;
3459 rx_priv->swr_plat_data.bulk_write = NULL;
3460 rx_priv->swr_plat_data.clk = rx_swrm_clock;
3461 rx_priv->swr_plat_data.handle_irq = NULL;
3462
3463 /* Register MCLK for rx macro */
3464 rx_core_clk = devm_clk_get(&pdev->dev, "rx_core_clk");
3465 if (IS_ERR(rx_core_clk)) {
3466 ret = PTR_ERR(rx_core_clk);
3467 dev_err(&pdev->dev, "%s: clk get %s failed %d\n",
3468 __func__, "rx_core_clk", ret);
3469 return ret;
3470 }
3471 rx_priv->rx_core_clk = rx_core_clk;
3472 /* Register npl clk for soundwire */
3473 rx_npl_clk = devm_clk_get(&pdev->dev, "rx_npl_clk");
3474 if (IS_ERR(rx_npl_clk)) {
3475 ret = PTR_ERR(rx_npl_clk);
3476 dev_err(&pdev->dev, "%s: clk get %s failed %d\n",
3477 __func__, "rx_npl_clk", ret);
3478 return ret;
3479 }
3480 rx_priv->rx_npl_clk = rx_npl_clk;
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303481
3482 ret = of_property_read_u8_array(pdev->dev.of_node,
3483 "qcom,rx-bcl-pmic-params", bcl_pmic_params,
3484 sizeof(bcl_pmic_params));
3485 if (ret) {
3486 dev_dbg(&pdev->dev, "%s: could not find %s entry in dt\n",
3487 __func__, "qcom,rx-bcl-pmic-params");
3488 } else {
3489 rx_priv->bcl_pmic_params.id = bcl_pmic_params[0];
3490 rx_priv->bcl_pmic_params.sid = bcl_pmic_params[1];
3491 rx_priv->bcl_pmic_params.ppid = bcl_pmic_params[2];
3492 }
3493
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303494 dev_set_drvdata(&pdev->dev, rx_priv);
3495 mutex_init(&rx_priv->mclk_lock);
3496 mutex_init(&rx_priv->swr_clk_lock);
3497 rx_macro_init_ops(&ops, rx_io_base);
3498
3499 ret = bolero_register_macro(&pdev->dev, RX_MACRO, &ops);
3500 if (ret) {
3501 dev_err(&pdev->dev,
3502 "%s: register macro failed\n", __func__);
3503 goto err_reg_macro;
3504 }
3505 schedule_work(&rx_priv->rx_macro_add_child_devices_work);
3506
3507 return 0;
3508
3509err_reg_macro:
3510 mutex_destroy(&rx_priv->mclk_lock);
3511 mutex_destroy(&rx_priv->swr_clk_lock);
3512 return ret;
3513}
3514
3515static int rx_macro_remove(struct platform_device *pdev)
3516{
3517 struct rx_macro_priv *rx_priv = NULL;
3518 u16 count = 0;
3519
3520 rx_priv = dev_get_drvdata(&pdev->dev);
3521
3522 if (!rx_priv)
3523 return -EINVAL;
3524
3525 for (count = 0; count < rx_priv->child_count &&
3526 count < RX_MACRO_CHILD_DEVICES_MAX; count++)
3527 platform_device_unregister(rx_priv->pdev_child_devices[count]);
3528
3529 bolero_unregister_macro(&pdev->dev, RX_MACRO);
3530 mutex_destroy(&rx_priv->mclk_lock);
3531 mutex_destroy(&rx_priv->swr_clk_lock);
3532 kfree(rx_priv->swr_ctrl_data);
3533 return 0;
3534}
3535
3536static const struct of_device_id rx_macro_dt_match[] = {
3537 {.compatible = "qcom,rx-macro"},
3538 {}
3539};
3540
3541static struct platform_driver rx_macro_driver = {
3542 .driver = {
3543 .name = "rx_macro",
3544 .owner = THIS_MODULE,
3545 .of_match_table = rx_macro_dt_match,
3546 },
3547 .probe = rx_macro_probe,
3548 .remove = rx_macro_remove,
3549};
3550
3551module_platform_driver(rx_macro_driver);
3552
3553MODULE_DESCRIPTION("RX macro driver");
3554MODULE_LICENSE("GPL v2");