blob: 6c936cbc014c4f2b70bd91f32b09ea9c6ca8c33c [file] [log] [blame]
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301/* Copyright (c) 2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/module.h>
14#include <linux/init.h>
15#include <linux/io.h>
16#include <linux/platform_device.h>
17#include <linux/clk.h>
18#include <sound/soc.h>
19#include <sound/pcm.h>
20#include <sound/pcm_params.h>
21#include <sound/soc-dapm.h>
22#include <sound/tlv.h>
23#include <soc/swr-wcd.h>
24
25#include "bolero-cdc.h"
26#include "bolero-cdc-registers.h"
27#include "../msm-cdc-pinctrl.h"
28
29#define RX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
30 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
31 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000 |\
32 SNDRV_PCM_RATE_384000)
33/* Fractional Rates */
34#define RX_MACRO_FRAC_RATES (SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_88200 |\
35 SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_352800)
36
37#define RX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
38 SNDRV_PCM_FMTBIT_S24_LE |\
39 SNDRV_PCM_FMTBIT_S24_3LE | SNDRV_PCM_FMTBIT_S32_LE)
40
41#define RX_MACRO_ECHO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
42 SNDRV_PCM_RATE_48000)
43#define RX_MACRO_ECHO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
44 SNDRV_PCM_FMTBIT_S24_LE |\
45 SNDRV_PCM_FMTBIT_S24_3LE)
46
Laxminath Kasamac396d52018-09-06 12:53:26 +053047#define SAMPLING_RATE_44P1KHZ 44100
48#define SAMPLING_RATE_88P2KHZ 88200
49#define SAMPLING_RATE_176P4KHZ 176400
50#define SAMPLING_RATE_352P8KHZ 352800
51
Laxminath Kasama7ecc582018-06-15 16:55:02 +053052#define RX_MACRO_MAX_OFFSET 0x1000
53
54#define RX_MACRO_MAX_DMA_CH_PER_PORT 2
55#define RX_SWR_STRING_LEN 80
56#define RX_MACRO_CHILD_DEVICES_MAX 3
57
58#define RX_MACRO_INTERP_MUX_NUM_INPUTS 3
59#define RX_MACRO_SIDETONE_IIR_COEFF_MAX 5
60
61#define STRING(name) #name
62#define RX_MACRO_DAPM_ENUM(name, reg, offset, text) \
63static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
64static const struct snd_kcontrol_new name##_mux = \
65 SOC_DAPM_ENUM(STRING(name), name##_enum)
66
67#define RX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \
68static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
69static const struct snd_kcontrol_new name##_mux = \
70 SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname)
71
72#define RX_MACRO_DAPM_MUX(name, shift, kctl) \
73 SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux)
74
75#define RX_MACRO_RX_PATH_OFFSET 0x80
76#define RX_MACRO_COMP_OFFSET 0x40
77
Laxminath Kasam497a6512018-09-17 16:11:52 +053078#define MAX_IMPED_PARAMS 6
79
80struct wcd_imped_val {
81 u32 imped_val;
82 u8 index;
83};
84
85static const struct wcd_imped_val imped_index[] = {
86 {4, 0},
87 {5, 1},
88 {6, 2},
89 {7, 3},
90 {8, 4},
91 {9, 5},
92 {10, 6},
93 {11, 7},
94 {12, 8},
95 {13, 9},
96};
97
98struct rx_macro_reg_mask_val {
99 u16 reg;
100 u8 mask;
101 u8 val;
102};
103
104static const struct rx_macro_reg_mask_val imped_table[][MAX_IMPED_PARAMS] = {
105 {
106 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf2},
107 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf2},
108 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
109 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf2},
110 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf2},
111 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
112 },
113 {
114 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf4},
115 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf4},
116 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
117 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf4},
118 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf4},
119 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
120 },
121 {
122 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf7},
123 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf7},
124 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x01},
125 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf7},
126 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf7},
127 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x01},
128 },
129 {
130 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xf9},
131 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xf9},
132 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
133 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xf9},
134 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xf9},
135 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
136 },
137 {
138 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfa},
139 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfa},
140 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
141 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfa},
142 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfa},
143 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
144 },
145 {
146 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfb},
147 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfb},
148 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
149 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfb},
150 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfb},
151 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
152 },
153 {
154 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfc},
155 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfc},
156 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
157 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfc},
158 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfc},
159 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
160 },
161 {
162 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfd},
163 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfd},
164 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x00},
165 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfd},
166 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd},
167 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x00},
168 },
169 {
170 {BOLERO_CDC_RX_RX0_RX_VOL_CTL, 0xff, 0xfd},
171 {BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0xff, 0xfd},
172 {BOLERO_CDC_RX_RX0_RX_PATH_SEC1, 0x01, 0x01},
173 {BOLERO_CDC_RX_RX1_RX_VOL_CTL, 0xff, 0xfd},
174 {BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0xff, 0xfd},
175 {BOLERO_CDC_RX_RX1_RX_PATH_SEC1, 0x01, 0x01},
176 },
177};
178
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530179enum {
180 INTERP_HPHL,
181 INTERP_HPHR,
182 INTERP_AUX,
183 INTERP_MAX
184};
185
186enum {
187 RX_MACRO_RX0,
188 RX_MACRO_RX1,
189 RX_MACRO_RX2,
190 RX_MACRO_RX3,
191 RX_MACRO_RX4,
192 RX_MACRO_RX5,
193 RX_MACRO_PORTS_MAX
194};
195
196enum {
197 RX_MACRO_COMP1, /* HPH_L */
198 RX_MACRO_COMP2, /* HPH_R */
199 RX_MACRO_COMP_MAX
200};
201
202enum {
203 INTn_1_INP_SEL_ZERO = 0,
204 INTn_1_INP_SEL_DEC0,
205 INTn_1_INP_SEL_DEC1,
206 INTn_1_INP_SEL_IIR0,
207 INTn_1_INP_SEL_IIR1,
208 INTn_1_INP_SEL_RX0,
209 INTn_1_INP_SEL_RX1,
210 INTn_1_INP_SEL_RX2,
211 INTn_1_INP_SEL_RX3,
212 INTn_1_INP_SEL_RX4,
213 INTn_1_INP_SEL_RX5,
214};
215
216enum {
217 INTn_2_INP_SEL_ZERO = 0,
218 INTn_2_INP_SEL_RX0,
219 INTn_2_INP_SEL_RX1,
220 INTn_2_INP_SEL_RX2,
221 INTn_2_INP_SEL_RX3,
222 INTn_2_INP_SEL_RX4,
223 INTn_2_INP_SEL_RX5,
224};
225
226enum {
227 INTERP_MAIN_PATH,
228 INTERP_MIX_PATH,
229};
230
231/* Codec supports 2 IIR filters */
232enum {
233 IIR0 = 0,
234 IIR1,
235 IIR_MAX,
236};
237
238/* Each IIR has 5 Filter Stages */
239enum {
240 BAND1 = 0,
241 BAND2,
242 BAND3,
243 BAND4,
244 BAND5,
245 BAND_MAX,
246};
247
248struct rx_macro_idle_detect_config {
249 u8 hph_idle_thr;
250 u8 hph_idle_detect_en;
251};
252
253struct interp_sample_rate {
254 int sample_rate;
255 int rate_val;
256};
257
258static struct interp_sample_rate sr_val_tbl[] = {
259 {8000, 0x0}, {16000, 0x1}, {32000, 0x3}, {48000, 0x4}, {96000, 0x5},
260 {192000, 0x6}, {384000, 0x7}, {44100, 0x9}, {88200, 0xA},
261 {176400, 0xB}, {352800, 0xC},
262};
263
Aditya Bavanari4f3d5642018-09-18 22:19:10 +0530264struct rx_macro_bcl_pmic_params {
265 u8 id;
266 u8 sid;
267 u8 ppid;
268};
269
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530270static int rx_macro_hw_params(struct snd_pcm_substream *substream,
271 struct snd_pcm_hw_params *params,
272 struct snd_soc_dai *dai);
273static int rx_macro_get_channel_map(struct snd_soc_dai *dai,
274 unsigned int *tx_num, unsigned int *tx_slot,
275 unsigned int *rx_num, unsigned int *rx_slot);
276static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol,
277 struct snd_ctl_elem_value *ucontrol);
278static int rx_macro_mux_get(struct snd_kcontrol *kcontrol,
279 struct snd_ctl_elem_value *ucontrol);
280static int rx_macro_mux_put(struct snd_kcontrol *kcontrol,
281 struct snd_ctl_elem_value *ucontrol);
282static int rx_macro_enable_interp_clk(struct snd_soc_codec *codec,
283 int event, int interp_idx);
284
285/* Hold instance to soundwire platform device */
286struct rx_swr_ctrl_data {
287 struct platform_device *rx_swr_pdev;
288};
289
290struct rx_swr_ctrl_platform_data {
291 void *handle; /* holds codec private data */
292 int (*read)(void *handle, int reg);
293 int (*write)(void *handle, int reg, int val);
294 int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
295 int (*clk)(void *handle, bool enable);
296 int (*handle_irq)(void *handle,
297 irqreturn_t (*swrm_irq_handler)(int irq,
298 void *data),
299 void *swrm_handle,
300 int action);
301};
302
303enum {
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +0530304 RX_MACRO_AIF_INVALID = 0,
305 RX_MACRO_AIF1_PB,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530306 RX_MACRO_AIF2_PB,
307 RX_MACRO_AIF3_PB,
308 RX_MACRO_AIF4_PB,
309 RX_MACRO_MAX_DAIS,
310};
311
312enum {
313 RX_MACRO_AIF1_CAP = 0,
314 RX_MACRO_AIF2_CAP,
315 RX_MACRO_AIF3_CAP,
316 RX_MACRO_MAX_AIF_CAP_DAIS
317};
318/*
319 * @dev: rx macro device pointer
320 * @comp_enabled: compander enable mixer value set
321 * @prim_int_users: Users of interpolator
322 * @rx_mclk_users: RX MCLK users count
323 * @vi_feed_value: VI sense mask
324 * @swr_clk_lock: to lock swr master clock operations
325 * @swr_ctrl_data: SoundWire data structure
326 * @swr_plat_data: Soundwire platform data
327 * @rx_macro_add_child_devices_work: work for adding child devices
328 * @rx_swr_gpio_p: used by pinctrl API
329 * @rx_core_clk: MCLK for rx macro
330 * @rx_npl_clk: NPL clock for RX soundwire
331 * @codec: codec handle
332 */
333struct rx_macro_priv {
334 struct device *dev;
335 int comp_enabled[RX_MACRO_COMP_MAX];
336 /* Main path clock users count */
337 int main_clk_users[INTERP_MAX];
338 int rx_port_value[RX_MACRO_PORTS_MAX];
339 u16 prim_int_users[INTERP_MAX];
340 int rx_mclk_users;
341 int swr_clk_users;
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +0530342 int clsh_users;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530343 int rx_mclk_cnt;
Laxminath Kasambee08192018-07-01 14:38:55 +0530344 bool is_native_on;
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +0530345 bool is_ear_mode_on;
Laxminath Kasambee08192018-07-01 14:38:55 +0530346 u16 mclk_mux;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530347 struct mutex mclk_lock;
348 struct mutex swr_clk_lock;
349 struct rx_swr_ctrl_data *swr_ctrl_data;
350 struct rx_swr_ctrl_platform_data swr_plat_data;
351 struct work_struct rx_macro_add_child_devices_work;
352 struct device_node *rx_swr_gpio_p;
353 struct clk *rx_core_clk;
354 struct clk *rx_npl_clk;
355 struct snd_soc_codec *codec;
356 unsigned long active_ch_mask[RX_MACRO_MAX_DAIS];
357 unsigned long active_ch_cnt[RX_MACRO_MAX_DAIS];
358 u16 bit_width[RX_MACRO_MAX_DAIS];
359 char __iomem *rx_io_base;
360 char __iomem *rx_mclk_mode_muxsel;
361 struct rx_macro_idle_detect_config idle_det_cfg;
362 u8 sidetone_coeff_array[IIR_MAX][BAND_MAX]
363 [RX_MACRO_SIDETONE_IIR_COEFF_MAX * 4];
364
365 struct platform_device *pdev_child_devices
366 [RX_MACRO_CHILD_DEVICES_MAX];
367 int child_count;
Aditya Bavanari4f3d5642018-09-18 22:19:10 +0530368 int is_softclip_on;
369 int softclip_clk_users;
370 struct rx_macro_bcl_pmic_params bcl_pmic_params;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530371};
372
373static struct snd_soc_dai_driver rx_macro_dai[];
374static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
375
376static const char * const rx_int_mix_mux_text[] = {
377 "ZERO", "RX0", "RX1", "RX2", "RX3", "RX4", "RX5"
378};
379
380static const char * const rx_prim_mix_text[] = {
381 "ZERO", "DEC0", "DEC1", "IIR0", "IIR1", "RX0", "RX1", "RX2",
382 "RX3", "RX4", "RX5"
383};
384
385static const char * const rx_sidetone_mix_text[] = {
386 "ZERO", "SRC0", "SRC1", "SRC_SUM"
387};
388
389static const char * const rx_echo_mux_text[] = {
390 "ZERO", "RX_MIX0", "RX_MIX1", "RX_MIX2"
391};
392
393static const char * const iir_inp_mux_text[] = {
394 "ZERO", "DEC0", "DEC1", "DEC2", "DEC3",
395 "RX0", "RX1", "RX2", "RX3", "RX4", "RX5"
396};
397
398static const char * const rx_int_dem_inp_mux_text[] = {
399 "NORMAL_DSM_OUT", "CLSH_DSM_OUT",
400};
401
402static const char * const rx_int0_1_interp_mux_text[] = {
403 "ZERO", "RX INT0_1 MIX1",
404};
405
406static const char * const rx_int1_1_interp_mux_text[] = {
407 "ZERO", "RX INT1_1 MIX1",
408};
409
410static const char * const rx_int2_1_interp_mux_text[] = {
411 "ZERO", "RX INT2_1 MIX1",
412};
413
414static const char * const rx_int0_2_interp_mux_text[] = {
415 "ZERO", "RX INT0_2 MUX",
416};
417
418static const char * const rx_int1_2_interp_mux_text[] = {
419 "ZERO", "RX INT1_2 MUX",
420};
421
422static const char * const rx_int2_2_interp_mux_text[] = {
423 "ZERO", "RX INT2_2 MUX",
424};
425
426static const char *const rx_macro_mux_text[] = {
427 "ZERO", "AIF1_PB", "AIF2_PB", "AIF3_PB", "AIF4_PB"
428};
429
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +0530430static const char *const rx_macro_ear_mode_text[] = {"OFF", "ON"};
431static const struct soc_enum rx_macro_ear_mode_enum =
432 SOC_ENUM_SINGLE_EXT(2, rx_macro_ear_mode_text);
433
Aditya Bavanari4f3d5642018-09-18 22:19:10 +0530434static const char * const rx_macro_vbat_bcl_gsm_mode_text[] = {"OFF", "ON"};
435static const struct soc_enum rx_macro_vbat_bcl_gsm_mode_enum =
436 SOC_ENUM_SINGLE_EXT(2, rx_macro_vbat_bcl_gsm_mode_text);
437
438static const struct snd_kcontrol_new rx_int2_1_vbat_mix_switch[] = {
439 SOC_DAPM_SINGLE("RX AUX VBAT Enable", SND_SOC_NOPM, 0, 1, 0)
440};
441
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530442RX_MACRO_DAPM_ENUM(rx_int0_2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 0,
443 rx_int_mix_mux_text);
444RX_MACRO_DAPM_ENUM(rx_int1_2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 0,
445 rx_int_mix_mux_text);
446RX_MACRO_DAPM_ENUM(rx_int2_2, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 0,
447 rx_int_mix_mux_text);
448
449
450RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 0,
451 rx_prim_mix_text);
452RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0, 4,
453 rx_prim_mix_text);
454RX_MACRO_DAPM_ENUM(rx_int0_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1, 4,
455 rx_prim_mix_text);
456RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 0,
457 rx_prim_mix_text);
458RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0, 4,
459 rx_prim_mix_text);
460RX_MACRO_DAPM_ENUM(rx_int1_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG1, 4,
461 rx_prim_mix_text);
462RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp0, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 0,
463 rx_prim_mix_text);
464RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp1, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG0, 4,
465 rx_prim_mix_text);
466RX_MACRO_DAPM_ENUM(rx_int2_1_mix_inp2, BOLERO_CDC_RX_INP_MUX_RX_INT2_CFG1, 4,
467 rx_prim_mix_text);
468
469RX_MACRO_DAPM_ENUM(rx_int0_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 2,
470 rx_sidetone_mix_text);
471RX_MACRO_DAPM_ENUM(rx_int1_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 4,
472 rx_sidetone_mix_text);
473RX_MACRO_DAPM_ENUM(rx_int2_mix2_inp, BOLERO_CDC_RX_INP_MUX_SIDETONE_SRC_CFG0, 6,
474 rx_sidetone_mix_text);
475
476RX_MACRO_DAPM_ENUM(rx_mix_tx0, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 4,
477 rx_echo_mux_text);
478RX_MACRO_DAPM_ENUM(rx_mix_tx1, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 0,
479 rx_echo_mux_text);
480RX_MACRO_DAPM_ENUM(rx_mix_tx2, BOLERO_CDC_RX_INP_MUX_RX_MIX_CFG4, 0,
481 rx_echo_mux_text);
482
483RX_MACRO_DAPM_ENUM(iir0_inp0, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG0, 0,
484 iir_inp_mux_text);
485RX_MACRO_DAPM_ENUM(iir0_inp1, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG1, 0,
486 iir_inp_mux_text);
487RX_MACRO_DAPM_ENUM(iir0_inp2, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG2, 0,
488 iir_inp_mux_text);
489RX_MACRO_DAPM_ENUM(iir0_inp3, BOLERO_CDC_RX_IIR_INP_MUX_IIR0_MIX_CFG3, 0,
490 iir_inp_mux_text);
491RX_MACRO_DAPM_ENUM(iir1_inp0, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG0, 0,
492 iir_inp_mux_text);
493RX_MACRO_DAPM_ENUM(iir1_inp1, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG1, 0,
494 iir_inp_mux_text);
495RX_MACRO_DAPM_ENUM(iir1_inp2, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG2, 0,
496 iir_inp_mux_text);
497RX_MACRO_DAPM_ENUM(iir1_inp3, BOLERO_CDC_RX_IIR_INP_MUX_IIR1_MIX_CFG3, 0,
498 iir_inp_mux_text);
499
500RX_MACRO_DAPM_ENUM(rx_int0_1_interp, SND_SOC_NOPM, 0,
501 rx_int0_1_interp_mux_text);
502RX_MACRO_DAPM_ENUM(rx_int1_1_interp, SND_SOC_NOPM, 0,
503 rx_int1_1_interp_mux_text);
504RX_MACRO_DAPM_ENUM(rx_int2_1_interp, SND_SOC_NOPM, 0,
505 rx_int2_1_interp_mux_text);
506
507RX_MACRO_DAPM_ENUM(rx_int0_2_interp, SND_SOC_NOPM, 0,
508 rx_int0_2_interp_mux_text);
509RX_MACRO_DAPM_ENUM(rx_int1_2_interp, SND_SOC_NOPM, 0,
510 rx_int1_2_interp_mux_text);
511RX_MACRO_DAPM_ENUM(rx_int2_2_interp, SND_SOC_NOPM, 0,
512 rx_int2_2_interp_mux_text);
513
514RX_MACRO_DAPM_ENUM_EXT(rx_int0_dem_inp, BOLERO_CDC_RX_RX0_RX_PATH_CFG1, 0,
515 rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double,
516 rx_macro_int_dem_inp_mux_put);
517RX_MACRO_DAPM_ENUM_EXT(rx_int1_dem_inp, BOLERO_CDC_RX_RX1_RX_PATH_CFG1, 0,
518 rx_int_dem_inp_mux_text, snd_soc_dapm_get_enum_double,
519 rx_macro_int_dem_inp_mux_put);
520
521RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx0, SND_SOC_NOPM, 0, rx_macro_mux_text,
522 rx_macro_mux_get, rx_macro_mux_put);
523RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx1, SND_SOC_NOPM, 0, rx_macro_mux_text,
524 rx_macro_mux_get, rx_macro_mux_put);
525RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx2, SND_SOC_NOPM, 0, rx_macro_mux_text,
526 rx_macro_mux_get, rx_macro_mux_put);
527RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx3, SND_SOC_NOPM, 0, rx_macro_mux_text,
528 rx_macro_mux_get, rx_macro_mux_put);
529RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx4, SND_SOC_NOPM, 0, rx_macro_mux_text,
530 rx_macro_mux_get, rx_macro_mux_put);
531RX_MACRO_DAPM_ENUM_EXT(rx_macro_rx5, SND_SOC_NOPM, 0, rx_macro_mux_text,
532 rx_macro_mux_get, rx_macro_mux_put);
533
534static struct snd_soc_dai_ops rx_macro_dai_ops = {
535 .hw_params = rx_macro_hw_params,
536 .get_channel_map = rx_macro_get_channel_map,
537};
538
539static struct snd_soc_dai_driver rx_macro_dai[] = {
540 {
541 .name = "rx_macro_rx1",
542 .id = RX_MACRO_AIF1_PB,
543 .playback = {
544 .stream_name = "RX_MACRO_AIF1 Playback",
545 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
546 .formats = RX_MACRO_FORMATS,
547 .rate_max = 384000,
548 .rate_min = 8000,
549 .channels_min = 1,
550 .channels_max = 2,
551 },
552 .ops = &rx_macro_dai_ops,
553 },
554 {
555 .name = "rx_macro_rx2",
556 .id = RX_MACRO_AIF2_PB,
557 .playback = {
558 .stream_name = "RX_MACRO_AIF2 Playback",
559 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
560 .formats = RX_MACRO_FORMATS,
561 .rate_max = 384000,
562 .rate_min = 8000,
563 .channels_min = 1,
564 .channels_max = 2,
565 },
566 .ops = &rx_macro_dai_ops,
567 },
568 {
569 .name = "rx_macro_rx3",
570 .id = RX_MACRO_AIF3_PB,
571 .playback = {
572 .stream_name = "RX_MACRO_AIF3 Playback",
573 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
574 .formats = RX_MACRO_FORMATS,
575 .rate_max = 384000,
576 .rate_min = 8000,
577 .channels_min = 1,
578 .channels_max = 2,
579 },
580 .ops = &rx_macro_dai_ops,
581 },
582 {
583 .name = "rx_macro_rx4",
584 .id = RX_MACRO_AIF4_PB,
585 .playback = {
586 .stream_name = "RX_MACRO_AIF4 Playback",
587 .rates = RX_MACRO_RATES | RX_MACRO_FRAC_RATES,
588 .formats = RX_MACRO_FORMATS,
589 .rate_max = 384000,
590 .rate_min = 8000,
591 .channels_min = 1,
592 .channels_max = 2,
593 },
594 .ops = &rx_macro_dai_ops,
595 },
596};
597
Laxminath Kasam497a6512018-09-17 16:11:52 +0530598static int get_impedance_index(int imped)
599{
600 int i = 0;
601
602 if (imped < imped_index[i].imped_val) {
603 pr_debug("%s, detected impedance is less than %d Ohm\n",
604 __func__, imped_index[i].imped_val);
605 i = 0;
606 goto ret;
607 }
608 if (imped >= imped_index[ARRAY_SIZE(imped_index) - 1].imped_val) {
609 pr_debug("%s, detected impedance is greater than %d Ohm\n",
610 __func__,
611 imped_index[ARRAY_SIZE(imped_index) - 1].imped_val);
612 i = ARRAY_SIZE(imped_index) - 1;
613 goto ret;
614 }
615 for (i = 0; i < ARRAY_SIZE(imped_index) - 1; i++) {
616 if (imped >= imped_index[i].imped_val &&
617 imped < imped_index[i + 1].imped_val)
618 break;
619 }
620ret:
621 pr_debug("%s: selected impedance index = %d\n",
622 __func__, imped_index[i].index);
623 return imped_index[i].index;
624}
625
626/*
627 * rx_macro_wcd_clsh_imped_config -
628 * This function updates HPHL and HPHR gain settings
629 * according to the impedance value.
630 *
631 * @codec: codec pointer handle
632 * @imped: impedance value of HPHL/R
633 * @reset: bool variable to reset registers when teardown
634 */
635static void rx_macro_wcd_clsh_imped_config(struct snd_soc_codec *codec,
636 int imped, bool reset)
637{
638 int i;
639 int index = 0;
640 int table_size;
641
642 static const struct rx_macro_reg_mask_val
643 (*imped_table_ptr)[MAX_IMPED_PARAMS];
644
645 table_size = ARRAY_SIZE(imped_table);
646 imped_table_ptr = imped_table;
647 /* reset = 1, which means request is to reset the register values */
648 if (reset) {
649 for (i = 0; i < MAX_IMPED_PARAMS; i++)
650 snd_soc_update_bits(codec,
651 imped_table_ptr[index][i].reg,
652 imped_table_ptr[index][i].mask, 0);
653 return;
654 }
655 index = get_impedance_index(imped);
656 if (index >= (ARRAY_SIZE(imped_index) - 1)) {
657 pr_debug("%s, impedance not in range = %d\n", __func__, imped);
658 return;
659 }
660 if (index >= table_size) {
661 pr_debug("%s, impedance index not in range = %d\n", __func__,
662 index);
663 return;
664 }
665 for (i = 0; i < MAX_IMPED_PARAMS; i++)
666 snd_soc_update_bits(codec,
667 imped_table_ptr[index][i].reg,
668 imped_table_ptr[index][i].mask,
669 imped_table_ptr[index][i].val);
670}
671
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530672static bool rx_macro_get_data(struct snd_soc_codec *codec,
673 struct device **rx_dev,
674 struct rx_macro_priv **rx_priv,
675 const char *func_name)
676{
677 *rx_dev = bolero_get_device_ptr(codec->dev, RX_MACRO);
678
679 if (!(*rx_dev)) {
680 dev_err(codec->dev,
681 "%s: null device for macro!\n", func_name);
682 return false;
683 }
684
685 *rx_priv = dev_get_drvdata((*rx_dev));
686 if (!(*rx_priv)) {
687 dev_err(codec->dev,
688 "%s: priv is null for macro!\n", func_name);
689 return false;
690 }
691
692 if (!(*rx_priv)->codec) {
693 dev_err(codec->dev,
694 "%s: tx_priv codec is not initialized!\n", func_name);
695 return false;
696 }
697
698 return true;
699}
700
701static int rx_macro_int_dem_inp_mux_put(struct snd_kcontrol *kcontrol,
702 struct snd_ctl_elem_value *ucontrol)
703{
704 struct snd_soc_dapm_widget *widget =
705 snd_soc_dapm_kcontrol_widget(kcontrol);
706 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
707 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
708 unsigned int val = 0;
709 unsigned short look_ahead_dly_reg =
710 BOLERO_CDC_RX_RX0_RX_PATH_CFG0;
711
712 val = ucontrol->value.enumerated.item[0];
713 if (val >= e->items)
714 return -EINVAL;
715
716 dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__,
717 widget->name, val);
718
719 if (e->reg == BOLERO_CDC_RX_RX0_RX_PATH_CFG1)
720 look_ahead_dly_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0;
721 else if (e->reg == BOLERO_CDC_RX_RX1_RX_PATH_CFG1)
722 look_ahead_dly_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0;
723
724 /* Set Look Ahead Delay */
725 snd_soc_update_bits(codec, look_ahead_dly_reg,
726 0x08, (val ? 0x08 : 0x00));
727 /* Set DEM INP Select */
728 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
729}
730
731static int rx_macro_set_prim_interpolator_rate(struct snd_soc_dai *dai,
732 u8 rate_reg_val,
733 u32 sample_rate)
734{
735 u8 int_1_mix1_inp = 0;
736 u32 j = 0, port = 0;
737 u16 int_mux_cfg0 = 0, int_mux_cfg1 = 0;
738 u16 int_fs_reg = 0;
739 u8 int_mux_cfg0_val = 0, int_mux_cfg1_val = 0;
740 u8 inp0_sel = 0, inp1_sel = 0, inp2_sel = 0;
741 struct snd_soc_codec *codec = dai->codec;
742 struct device *rx_dev = NULL;
743 struct rx_macro_priv *rx_priv = NULL;
744
745 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
746 return -EINVAL;
747
748 for_each_set_bit(port, &rx_priv->active_ch_mask[dai->id],
749 RX_MACRO_PORTS_MAX) {
750 int_1_mix1_inp = port;
751 if ((int_1_mix1_inp < RX_MACRO_RX0) ||
752 (int_1_mix1_inp > RX_MACRO_PORTS_MAX)) {
753 pr_err("%s: Invalid RX port, Dai ID is %d\n",
754 __func__, dai->id);
755 return -EINVAL;
756 }
757
758 int_mux_cfg0 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG0;
759
760 /*
761 * Loop through all interpolator MUX inputs and find out
762 * to which interpolator input, the rx port
763 * is connected
764 */
765 for (j = 0; j < INTERP_MAX; j++) {
766 int_mux_cfg1 = int_mux_cfg0 + 4;
767
768 int_mux_cfg0_val = snd_soc_read(codec, int_mux_cfg0);
769 int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1);
770 inp0_sel = int_mux_cfg0_val & 0x07;
771 inp1_sel = (int_mux_cfg0_val >> 4) & 0x038;
772 inp2_sel = (int_mux_cfg1_val >> 4) & 0x038;
773 if ((inp0_sel == int_1_mix1_inp) ||
774 (inp1_sel == int_1_mix1_inp) ||
775 (inp2_sel == int_1_mix1_inp)) {
776 int_fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL +
777 0x80 * j;
778 pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_1\n",
779 __func__, dai->id, j);
780 pr_debug("%s: set INT%u_1 sample rate to %u\n",
781 __func__, j, sample_rate);
782 /* sample_rate is in Hz */
783 snd_soc_update_bits(codec, int_fs_reg,
784 0x0F, rate_reg_val);
785 }
786 int_mux_cfg0 += 8;
787 }
788 }
789
790 return 0;
791}
792
793static int rx_macro_set_mix_interpolator_rate(struct snd_soc_dai *dai,
794 u8 rate_reg_val,
795 u32 sample_rate)
796{
797 u8 int_2_inp = 0;
798 u32 j = 0, port = 0;
799 u16 int_mux_cfg1 = 0, int_fs_reg = 0;
800 u8 int_mux_cfg1_val = 0;
801 struct snd_soc_codec *codec = dai->codec;
802 struct device *rx_dev = NULL;
803 struct rx_macro_priv *rx_priv = NULL;
804
805 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
806 return -EINVAL;
807
808 for_each_set_bit(port, &rx_priv->active_ch_mask[dai->id],
809 RX_MACRO_PORTS_MAX) {
810 int_2_inp = port;
811 if ((int_2_inp < RX_MACRO_RX0) ||
812 (int_2_inp > RX_MACRO_PORTS_MAX)) {
813 pr_err("%s: Invalid RX port, Dai ID is %d\n",
814 __func__, dai->id);
815 return -EINVAL;
816 }
817
818 int_mux_cfg1 = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1;
819 for (j = 0; j < INTERP_MAX; j++) {
820 int_mux_cfg1_val = snd_soc_read(codec, int_mux_cfg1) &
821 0x07;
822 if (int_mux_cfg1_val == int_2_inp) {
823 int_fs_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL +
824 0x80 * j;
825 pr_debug("%s: AIF_PB DAI(%d) connected to INT%u_2\n",
826 __func__, dai->id, j);
827 pr_debug("%s: set INT%u_2 sample rate to %u\n",
828 __func__, j, sample_rate);
829 snd_soc_update_bits(codec, int_fs_reg,
830 0x0F, rate_reg_val);
831 }
832 int_mux_cfg1 += 8;
833 }
834 }
835 return 0;
836}
837
Laxminath Kasamac396d52018-09-06 12:53:26 +0530838static bool rx_macro_is_fractional_sample_rate(u32 sample_rate)
839{
840 switch (sample_rate) {
841 case SAMPLING_RATE_44P1KHZ:
842 case SAMPLING_RATE_88P2KHZ:
843 case SAMPLING_RATE_176P4KHZ:
844 case SAMPLING_RATE_352P8KHZ:
845 return true;
846 default:
847 return false;
848 }
849 return false;
850}
851
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530852static int rx_macro_set_interpolator_rate(struct snd_soc_dai *dai,
853 u32 sample_rate)
854{
855 struct snd_soc_codec *codec = dai->codec;
856 int rate_val = 0;
857 int i = 0, ret = 0;
Laxminath Kasamac396d52018-09-06 12:53:26 +0530858 struct device *rx_dev = NULL;
859 struct rx_macro_priv *rx_priv = NULL;
860
861 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
862 return -EINVAL;
863
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530864
865 for (i = 0; i < ARRAY_SIZE(sr_val_tbl); i++) {
866 if (sample_rate == sr_val_tbl[i].sample_rate) {
867 rate_val = sr_val_tbl[i].rate_val;
Laxminath Kasamac396d52018-09-06 12:53:26 +0530868 if (rx_macro_is_fractional_sample_rate(sample_rate))
869 rx_priv->is_native_on = true;
870 else
871 rx_priv->is_native_on = false;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530872 break;
873 }
874 }
875 if ((i == ARRAY_SIZE(sr_val_tbl)) || (rate_val < 0)) {
876 dev_err(codec->dev, "%s: Unsupported sample rate: %d\n",
877 __func__, sample_rate);
878 return -EINVAL;
879 }
880
881 ret = rx_macro_set_prim_interpolator_rate(dai, (u8)rate_val, sample_rate);
882 if (ret)
883 return ret;
884 ret = rx_macro_set_mix_interpolator_rate(dai, (u8)rate_val, sample_rate);
885 if (ret)
886 return ret;
887
888 return ret;
889}
890
891static int rx_macro_hw_params(struct snd_pcm_substream *substream,
892 struct snd_pcm_hw_params *params,
893 struct snd_soc_dai *dai)
894{
895 struct snd_soc_codec *codec = dai->codec;
896 int ret = 0;
897 struct device *rx_dev = NULL;
898 struct rx_macro_priv *rx_priv = NULL;
899
900 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
901 return -EINVAL;
902
903 dev_dbg(codec->dev,
904 "%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
905 dai->name, dai->id, params_rate(params),
906 params_channels(params));
907
908 switch (substream->stream) {
909 case SNDRV_PCM_STREAM_PLAYBACK:
910 ret = rx_macro_set_interpolator_rate(dai, params_rate(params));
911 if (ret) {
912 pr_err("%s: cannot set sample rate: %u\n",
913 __func__, params_rate(params));
914 return ret;
915 }
916 rx_priv->bit_width[dai->id] = params_width(params);
917 break;
918 case SNDRV_PCM_STREAM_CAPTURE:
919 default:
920 break;
921 }
922 return 0;
923}
924
925static int rx_macro_get_channel_map(struct snd_soc_dai *dai,
926 unsigned int *tx_num, unsigned int *tx_slot,
927 unsigned int *rx_num, unsigned int *rx_slot)
928{
929 struct snd_soc_codec *codec = dai->codec;
930 struct device *rx_dev = NULL;
931 struct rx_macro_priv *rx_priv = NULL;
932 unsigned int temp = 0, ch_mask = 0;
933 u16 i = 0;
934
935 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
936 return -EINVAL;
937
938 switch (dai->id) {
939 case RX_MACRO_AIF1_PB:
940 case RX_MACRO_AIF2_PB:
941 case RX_MACRO_AIF3_PB:
942 case RX_MACRO_AIF4_PB:
943 for_each_set_bit(temp, &rx_priv->active_ch_mask[dai->id],
944 RX_MACRO_PORTS_MAX) {
945 ch_mask |= (1 << i);
946 if (++i == RX_MACRO_MAX_DMA_CH_PER_PORT)
947 break;
948 }
949 *rx_slot = ch_mask;
950 *rx_num = rx_priv->active_ch_cnt[dai->id];
951 break;
952 default:
953 dev_err(rx_dev, "%s: Invalid AIF\n", __func__);
954 break;
955 }
956 return 0;
957}
958
959static int rx_macro_mclk_enable(struct rx_macro_priv *rx_priv,
960 bool mclk_enable, bool dapm)
961{
962 struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL);
Laxminath Kasambee08192018-07-01 14:38:55 +0530963 int ret = 0, mclk_mux = MCLK_MUX0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530964
Tanya Dixit8530fb92018-09-14 16:01:25 +0530965 if (regmap == NULL) {
966 dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__);
967 return -EINVAL;
968 }
969
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530970 dev_dbg(rx_priv->dev, "%s: mclk_enable = %u, dapm = %d clk_users= %d\n",
971 __func__, mclk_enable, dapm, rx_priv->rx_mclk_users);
972
Laxminath Kasamac396d52018-09-06 12:53:26 +0530973 if (rx_priv->is_native_on)
Laxminath Kasambee08192018-07-01 14:38:55 +0530974 mclk_mux = MCLK_MUX1;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530975 mutex_lock(&rx_priv->mclk_lock);
976 if (mclk_enable) {
977 if (rx_priv->rx_mclk_users == 0) {
978 ret = bolero_request_clock(rx_priv->dev,
Laxminath Kasambee08192018-07-01 14:38:55 +0530979 RX_MACRO, mclk_mux, true);
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530980 if (ret < 0) {
981 dev_err(rx_priv->dev,
982 "%s: rx request clock enable failed\n",
983 __func__);
984 goto exit;
985 }
Laxminath Kasambee08192018-07-01 14:38:55 +0530986 rx_priv->mclk_mux = mclk_mux;
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530987 regcache_mark_dirty(regmap);
988 regcache_sync_region(regmap,
989 RX_START_OFFSET,
990 RX_MAX_OFFSET);
991 regmap_update_bits(regmap,
992 BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
993 0x01, 0x01);
994 regmap_update_bits(regmap,
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +0530995 BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
996 0x02, 0x02);
997 regmap_update_bits(regmap,
Laxminath Kasama7ecc582018-06-15 16:55:02 +0530998 BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
999 0x01, 0x01);
1000 }
1001 rx_priv->rx_mclk_users++;
1002 } else {
1003 if (rx_priv->rx_mclk_users <= 0) {
1004 dev_err(rx_priv->dev, "%s: clock already disabled\n",
1005 __func__);
1006 rx_priv->rx_mclk_users = 0;
1007 goto exit;
1008 }
1009 rx_priv->rx_mclk_users--;
1010 if (rx_priv->rx_mclk_users == 0) {
1011 regmap_update_bits(regmap,
1012 BOLERO_CDC_RX_CLK_RST_CTRL_FS_CNT_CONTROL,
1013 0x01, 0x00);
1014 regmap_update_bits(regmap,
1015 BOLERO_CDC_RX_CLK_RST_CTRL_MCLK_CONTROL,
1016 0x01, 0x00);
1017 bolero_request_clock(rx_priv->dev,
Laxminath Kasambee08192018-07-01 14:38:55 +05301018 RX_MACRO, mclk_mux, false);
1019 rx_priv->mclk_mux = MCLK_MUX0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301020 }
1021 }
1022exit:
1023 mutex_unlock(&rx_priv->mclk_lock);
1024 return ret;
1025}
1026
1027static int rx_macro_mclk_event(struct snd_soc_dapm_widget *w,
1028 struct snd_kcontrol *kcontrol, int event)
1029{
1030 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1031 int ret = 0;
1032 struct device *rx_dev = NULL;
1033 struct rx_macro_priv *rx_priv = NULL;
Laxminath Kasamac396d52018-09-06 12:53:26 +05301034 int mclk_freq = MCLK_FREQ;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301035
1036 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1037 return -EINVAL;
1038
1039 dev_dbg(rx_dev, "%s: event = %d\n", __func__, event);
1040 switch (event) {
1041 case SND_SOC_DAPM_PRE_PMU:
Laxminath Kasambee08192018-07-01 14:38:55 +05301042 /* if swr_clk_users > 0, call device down */
1043 if (rx_priv->swr_clk_users > 0) {
1044 if ((rx_priv->mclk_mux == MCLK_MUX0 &&
1045 rx_priv->is_native_on) ||
Laxminath Kasamac396d52018-09-06 12:53:26 +05301046 (rx_priv->mclk_mux == MCLK_MUX1 &&
Laxminath Kasambee08192018-07-01 14:38:55 +05301047 !rx_priv->is_native_on)) {
1048 swrm_wcd_notify(
1049 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
1050 SWR_DEVICE_DOWN, NULL);
1051 }
1052 }
Laxminath Kasamac396d52018-09-06 12:53:26 +05301053 if (rx_priv->is_native_on)
1054 mclk_freq = MCLK_FREQ_NATIVE;
1055 swrm_wcd_notify(
1056 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
1057 SWR_CLK_FREQ, &mclk_freq);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301058 ret = rx_macro_mclk_enable(rx_priv, 1, true);
1059 break;
1060 case SND_SOC_DAPM_POST_PMD:
1061 ret = rx_macro_mclk_enable(rx_priv, 0, true);
1062 break;
1063 default:
1064 dev_err(rx_priv->dev,
1065 "%s: invalid DAPM event %d\n", __func__, event);
1066 ret = -EINVAL;
1067 }
1068 return ret;
1069}
1070
1071static int rx_macro_mclk_ctrl(struct device *dev, bool enable)
1072{
1073 struct rx_macro_priv *rx_priv = dev_get_drvdata(dev);
1074 int ret = 0;
1075
1076 if (enable) {
1077 ret = clk_prepare_enable(rx_priv->rx_core_clk);
1078 if (ret < 0) {
1079 dev_err(dev, "%s:rx mclk enable failed\n", __func__);
1080 return ret;
1081 }
1082 ret = clk_prepare_enable(rx_priv->rx_npl_clk);
1083 if (ret < 0) {
1084 clk_disable_unprepare(rx_priv->rx_core_clk);
1085 dev_err(dev, "%s:rx npl_clk enable failed\n",
1086 __func__);
1087 return ret;
1088 }
1089 if (rx_priv->rx_mclk_cnt++ == 0)
1090 iowrite32(0x1, rx_priv->rx_mclk_mode_muxsel);
1091 } else {
1092 if (rx_priv->rx_mclk_cnt <= 0) {
1093 dev_dbg(dev, "%s:rx mclk already disabled\n", __func__);
1094 rx_priv->rx_mclk_cnt = 0;
1095 return 0;
1096 }
1097 if (--rx_priv->rx_mclk_cnt == 0)
1098 iowrite32(0x0, rx_priv->rx_mclk_mode_muxsel);
1099 clk_disable_unprepare(rx_priv->rx_npl_clk);
1100 clk_disable_unprepare(rx_priv->rx_core_clk);
1101 }
1102
1103 return 0;
1104}
1105
Laxminath Kasam497a6512018-09-17 16:11:52 +05301106static int rx_macro_event_handler(struct snd_soc_codec *codec, u16 event,
1107 u32 data)
1108{
1109 u16 reg = 0, reg_mix = 0, rx_idx = 0, mute = 0x0;
1110 struct device *rx_dev = NULL;
1111 struct rx_macro_priv *rx_priv = NULL;
1112
1113 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1114 return -EINVAL;
1115
1116 switch (event) {
1117 case BOLERO_MACRO_EVT_RX_MUTE:
1118 rx_idx = data >> 0x10;
1119 mute = data & 0xffff;
1120 reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (rx_idx *
1121 RX_MACRO_RX_PATH_OFFSET);
1122 reg_mix = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL + (rx_idx *
1123 RX_MACRO_RX_PATH_OFFSET);
1124 snd_soc_update_bits(codec, reg, 0x10, mute << 0x10);
1125 snd_soc_update_bits(codec, reg_mix, 0x10, mute << 0x10);
1126 break;
1127 case BOLERO_MACRO_EVT_IMPED_TRUE:
1128 rx_macro_wcd_clsh_imped_config(codec, data, true);
1129 break;
1130 case BOLERO_MACRO_EVT_IMPED_FALSE:
1131 rx_macro_wcd_clsh_imped_config(codec, data, false);
1132 break;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05301133 case BOLERO_MACRO_EVT_SSR_DOWN:
1134 swrm_wcd_notify(
1135 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
1136 SWR_DEVICE_SSR_DOWN, NULL);
1137 swrm_wcd_notify(
1138 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
1139 SWR_DEVICE_DOWN, NULL);
1140 break;
1141 case BOLERO_MACRO_EVT_SSR_UP:
1142 swrm_wcd_notify(
1143 rx_priv->swr_ctrl_data[0].rx_swr_pdev,
1144 SWR_DEVICE_SSR_UP, NULL);
1145 break;
Laxminath Kasam497a6512018-09-17 16:11:52 +05301146 }
1147 return 0;
1148}
1149
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301150static int rx_macro_find_playback_dai_id_for_port(int port_id,
1151 struct rx_macro_priv *rx_priv)
1152{
1153 int i = 0;
1154
1155 for (i = RX_MACRO_AIF1_PB; i < RX_MACRO_MAX_DAIS; i++) {
1156 if (test_bit(port_id, &rx_priv->active_ch_mask[i]))
1157 return i;
1158 }
1159
1160 return -EINVAL;
1161}
1162
1163static int rx_macro_set_idle_detect_thr(struct snd_soc_codec *codec,
1164 struct rx_macro_priv *rx_priv,
1165 int interp, int path_type)
1166{
1167 int port_id[4] = { 0, 0, 0, 0 };
Laxminath Kasamb7f823c2018-08-02 13:23:11 +05301168 int *port_ptr = NULL;
1169 int num_ports = 0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301170 int bit_width = 0, i = 0;
1171 int mux_reg = 0, mux_reg_val = 0;
1172 int dai_id = 0, idle_thr = 0;
1173
1174 if ((interp != INTERP_HPHL) && (interp != INTERP_HPHR))
1175 return 0;
1176
1177 if (!rx_priv->idle_det_cfg.hph_idle_detect_en)
1178 return 0;
1179
1180 port_ptr = &port_id[0];
1181 num_ports = 0;
1182
1183 /*
1184 * Read interpolator MUX input registers and find
1185 * which cdc_dma port is connected and store the port
1186 * numbers in port_id array.
1187 */
1188 if (path_type == INTERP_MIX_PATH) {
1189 mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1 +
1190 2 * interp;
1191 mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f;
1192
1193 if ((mux_reg_val >= INTn_2_INP_SEL_RX0) &&
1194 (mux_reg_val <= INTn_2_INP_SEL_RX5)) {
1195 *port_ptr++ = mux_reg_val - 1;
1196 num_ports++;
1197 }
1198 }
1199
1200 if (path_type == INTERP_MAIN_PATH) {
1201 mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0 +
1202 2 * (interp - 1);
1203 mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f;
1204 i = RX_MACRO_INTERP_MUX_NUM_INPUTS;
1205
1206 while (i) {
1207 if ((mux_reg_val >= INTn_1_INP_SEL_RX0) &&
1208 (mux_reg_val <= INTn_1_INP_SEL_RX5)) {
1209 *port_ptr++ = mux_reg_val -
1210 INTn_1_INP_SEL_RX0;
1211 num_ports++;
1212 }
1213 mux_reg_val = (snd_soc_read(codec, mux_reg) &
1214 0xf0) >> 4;
1215 mux_reg += 1;
1216 i--;
1217 }
1218 }
1219
1220 dev_dbg(codec->dev, "%s: num_ports: %d, ports[%d %d %d %d]\n",
1221 __func__, num_ports, port_id[0], port_id[1],
1222 port_id[2], port_id[3]);
1223
1224 i = 0;
1225 while (num_ports) {
1226 dai_id = rx_macro_find_playback_dai_id_for_port(port_id[i++],
1227 rx_priv);
1228
1229 if ((dai_id >= 0) && (dai_id < RX_MACRO_MAX_DAIS)) {
1230 dev_dbg(codec->dev, "%s: dai_id: %d bit_width: %d\n",
1231 __func__, dai_id,
1232 rx_priv->bit_width[dai_id]);
1233
1234 if (rx_priv->bit_width[dai_id] > bit_width)
1235 bit_width = rx_priv->bit_width[dai_id];
1236 }
1237 num_ports--;
1238 }
1239
1240 switch (bit_width) {
1241 case 16:
1242 idle_thr = 0xff; /* F16 */
1243 break;
1244 case 24:
1245 case 32:
1246 idle_thr = 0x03; /* F22 */
1247 break;
1248 default:
1249 idle_thr = 0x00;
1250 break;
1251 }
1252
1253 dev_dbg(codec->dev, "%s: (new) idle_thr: %d, (cur) idle_thr: %d\n",
1254 __func__, idle_thr, rx_priv->idle_det_cfg.hph_idle_thr);
1255
1256 if ((rx_priv->idle_det_cfg.hph_idle_thr == 0) ||
1257 (idle_thr < rx_priv->idle_det_cfg.hph_idle_thr)) {
1258 snd_soc_write(codec, BOLERO_CDC_RX_IDLE_DETECT_CFG3, idle_thr);
1259 rx_priv->idle_det_cfg.hph_idle_thr = idle_thr;
1260 }
1261
1262 return 0;
1263}
1264
1265static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w,
1266 struct snd_kcontrol *kcontrol, int event)
1267{
1268 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1269 u16 gain_reg = 0, mix_reg = 0;
1270 struct device *rx_dev = NULL;
1271 struct rx_macro_priv *rx_priv = NULL;
1272
1273 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1274 return -EINVAL;
1275
1276 if (w->shift >= INTERP_MAX) {
1277 dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n",
1278 __func__, w->shift, w->name);
1279 return -EINVAL;
1280 }
1281
1282 gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL +
1283 (w->shift * RX_MACRO_RX_PATH_OFFSET);
1284 mix_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL +
1285 (w->shift * RX_MACRO_RX_PATH_OFFSET);
1286
1287 dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name);
1288
1289 switch (event) {
1290 case SND_SOC_DAPM_PRE_PMU:
1291 rx_macro_set_idle_detect_thr(codec, rx_priv, w->shift,
1292 INTERP_MIX_PATH);
1293 rx_macro_enable_interp_clk(codec, event, w->shift);
1294 /* Clk enable */
1295 snd_soc_update_bits(codec, mix_reg, 0x20, 0x20);
1296 break;
1297 case SND_SOC_DAPM_POST_PMU:
1298 snd_soc_write(codec, gain_reg,
1299 snd_soc_read(codec, gain_reg));
1300 break;
1301 case SND_SOC_DAPM_POST_PMD:
1302 /* Clk Disable */
1303 snd_soc_update_bits(codec, mix_reg, 0x20, 0x00);
1304 rx_macro_enable_interp_clk(codec, event, w->shift);
1305 /* Reset enable and disable */
1306 snd_soc_update_bits(codec, mix_reg, 0x40, 0x40);
1307 snd_soc_update_bits(codec, mix_reg, 0x40, 0x00);
1308 break;
1309 }
1310
1311 return 0;
1312}
1313
1314static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w,
1315 struct snd_kcontrol *kcontrol,
1316 int event)
1317{
1318 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1319 u16 gain_reg = 0;
1320 u16 reg = 0;
1321 struct device *rx_dev = NULL;
1322 struct rx_macro_priv *rx_priv = NULL;
1323
1324 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1325 return -EINVAL;
1326
1327 dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name);
1328
1329 if (w->shift >= INTERP_MAX) {
1330 dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n",
1331 __func__, w->shift, w->name);
1332 return -EINVAL;
1333 }
1334
1335 reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (w->shift *
1336 RX_MACRO_RX_PATH_OFFSET);
1337 gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_CTL + (w->shift *
1338 RX_MACRO_RX_PATH_OFFSET);
1339
1340 switch (event) {
1341 case SND_SOC_DAPM_PRE_PMU:
1342 rx_macro_set_idle_detect_thr(codec, rx_priv, w->shift,
1343 INTERP_MAIN_PATH);
1344 rx_macro_enable_interp_clk(codec, event, w->shift);
1345 break;
1346 case SND_SOC_DAPM_POST_PMU:
1347 snd_soc_write(codec, gain_reg,
1348 snd_soc_read(codec, gain_reg));
1349 break;
1350 case SND_SOC_DAPM_POST_PMD:
1351 rx_macro_enable_interp_clk(codec, event, w->shift);
1352 break;
1353 }
1354
1355 return 0;
1356}
1357
1358static int rx_macro_config_compander(struct snd_soc_codec *codec,
1359 struct rx_macro_priv *rx_priv,
1360 int interp_n, int event)
1361{
1362 int comp = 0;
1363 u16 comp_ctl0_reg = 0, rx_path_cfg0_reg = 0;
1364
1365 /* AUX does not have compander */
1366 if (interp_n == INTERP_AUX)
1367 return 0;
1368
1369 comp = interp_n;
1370 dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n",
1371 __func__, event, comp + 1, rx_priv->comp_enabled[comp]);
1372
1373 if (!rx_priv->comp_enabled[comp])
1374 return 0;
1375
1376 comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 +
1377 (comp * RX_MACRO_COMP_OFFSET);
1378 rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 +
1379 (comp * RX_MACRO_RX_PATH_OFFSET);
1380
1381 if (SND_SOC_DAPM_EVENT_ON(event)) {
1382 /* Enable Compander Clock */
1383 snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01);
1384 snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02);
1385 snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00);
1386 snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02);
1387 }
1388
1389 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1390 snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04);
1391 snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00);
1392 snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02);
1393 snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00);
1394 snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00);
1395 snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00);
1396 }
1397
1398 return 0;
1399}
1400
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301401static void rx_macro_enable_softclip_clk(struct snd_soc_codec *codec,
1402 struct rx_macro_priv *rx_priv,
1403 bool enable)
1404{
1405 if (enable) {
1406 if (rx_priv->softclip_clk_users == 0)
1407 snd_soc_update_bits(codec,
1408 BOLERO_CDC_RX_SOFTCLIP_CRC,
1409 0x01, 0x01);
1410 rx_priv->softclip_clk_users++;
1411 } else {
1412 rx_priv->softclip_clk_users--;
1413 if (rx_priv->softclip_clk_users == 0)
1414 snd_soc_update_bits(codec,
1415 BOLERO_CDC_RX_SOFTCLIP_CRC,
1416 0x01, 0x00);
1417 }
1418}
1419
1420static int rx_macro_config_softclip(struct snd_soc_codec *codec,
1421 struct rx_macro_priv *rx_priv,
1422 int event)
1423{
1424 dev_dbg(codec->dev, "%s: event %d, enabled %d\n",
1425 __func__, event, rx_priv->is_softclip_on);
1426
1427 if (!rx_priv->is_softclip_on)
1428 return 0;
1429
1430 if (SND_SOC_DAPM_EVENT_ON(event)) {
1431 /* Enable Softclip clock */
1432 rx_macro_enable_softclip_clk(codec, rx_priv, true);
1433 /* Enable Softclip control */
1434 snd_soc_update_bits(codec,
1435 BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x01);
1436 }
1437
1438 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1439 snd_soc_update_bits(codec,
1440 BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x00);
1441 rx_macro_enable_softclip_clk(codec, rx_priv, false);
1442 }
1443
1444 return 0;
1445}
1446
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301447static inline void
1448rx_macro_enable_clsh_block(struct rx_macro_priv *rx_priv, bool enable)
1449{
1450 if ((enable && ++rx_priv->clsh_users == 1) ||
1451 (!enable && --rx_priv->clsh_users == 0))
1452 snd_soc_update_bits(rx_priv->codec,
1453 BOLERO_CDC_RX_CLSH_CRC, 0x01,
1454 (u8) enable);
1455 if (rx_priv->clsh_users < 0)
1456 rx_priv->clsh_users = 0;
1457 dev_dbg(rx_priv->dev, "%s: clsh_users %d, enable %d", __func__,
1458 rx_priv->clsh_users, enable);
1459}
1460
1461static int rx_macro_config_classh(struct snd_soc_codec *codec,
1462 struct rx_macro_priv *rx_priv,
1463 int interp_n, int event)
1464{
1465 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1466 rx_macro_enable_clsh_block(rx_priv, false);
1467 return 0;
1468 }
1469
1470 if (!SND_SOC_DAPM_EVENT_ON(event))
1471 return 0;
1472
1473 rx_macro_enable_clsh_block(rx_priv, true);
1474 if (interp_n == INTERP_HPHL ||
1475 interp_n == INTERP_HPHR) {
1476 /*
1477 * These K1 values depend on the Headphone Impedance
1478 * For now it is assumed to be 16 ohm
1479 */
1480 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_K1_LSB,
1481 0xFF, 0xC0);
1482 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_K1_MSB,
1483 0x0F, 0x00);
1484 }
1485 switch (interp_n) {
1486 case INTERP_HPHL:
1487 if (rx_priv->is_ear_mode_on)
1488 snd_soc_update_bits(codec,
1489 BOLERO_CDC_RX_CLSH_HPH_V_PA,
1490 0x3F, 0x39);
1491 else
1492 snd_soc_update_bits(codec,
1493 BOLERO_CDC_RX_CLSH_HPH_V_PA,
1494 0x3F, 0x1C);
1495 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_DECAY_CTRL,
1496 0x07, 0x00);
1497 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG0,
1498 0x40, 0x40);
1499 break;
1500 case INTERP_HPHR:
1501 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_HPH_V_PA,
1502 0x3F, 0x1C);
1503 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_DECAY_CTRL,
1504 0x07, 0x00);
1505 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG0,
1506 0x40, 0x40);
1507 break;
1508 case INTERP_AUX:
1509 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG0,
1510 0x10, 0x10);
1511 break;
1512 }
1513
1514 return 0;
1515}
1516
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301517static void rx_macro_hd2_control(struct snd_soc_codec *codec,
1518 u16 interp_idx, int event)
1519{
1520 u16 hd2_scale_reg = 0;
1521 u16 hd2_enable_reg = 0;
1522
1523 switch (interp_idx) {
1524 case INTERP_HPHL:
1525 hd2_scale_reg = BOLERO_CDC_RX_RX1_RX_PATH_SEC3;
1526 hd2_enable_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0;
1527 break;
1528 case INTERP_HPHR:
1529 hd2_scale_reg = BOLERO_CDC_RX_RX2_RX_PATH_SEC3;
1530 hd2_enable_reg = BOLERO_CDC_RX_RX2_RX_PATH_CFG0;
1531 break;
1532 }
1533
1534 if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {
1535 snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x14);
1536 snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04);
1537 }
1538
1539 if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
1540 snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00);
1541 snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00);
1542 }
1543}
1544
1545static int rx_macro_get_compander(struct snd_kcontrol *kcontrol,
1546 struct snd_ctl_elem_value *ucontrol)
1547{
1548 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1549 int comp = ((struct soc_multi_mixer_control *)
1550 kcontrol->private_value)->shift;
1551 struct device *rx_dev = NULL;
1552 struct rx_macro_priv *rx_priv = NULL;
1553
1554 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1555 return -EINVAL;
1556
1557 ucontrol->value.integer.value[0] = rx_priv->comp_enabled[comp];
1558 return 0;
1559}
1560
1561static int rx_macro_set_compander(struct snd_kcontrol *kcontrol,
1562 struct snd_ctl_elem_value *ucontrol)
1563{
1564 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1565 int comp = ((struct soc_multi_mixer_control *)
1566 kcontrol->private_value)->shift;
1567 int value = ucontrol->value.integer.value[0];
1568 struct device *rx_dev = NULL;
1569 struct rx_macro_priv *rx_priv = NULL;
1570
1571 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1572 return -EINVAL;
1573
1574 dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n",
1575 __func__, comp + 1, rx_priv->comp_enabled[comp], value);
1576 rx_priv->comp_enabled[comp] = value;
1577
1578 return 0;
1579}
1580
1581static int rx_macro_mux_get(struct snd_kcontrol *kcontrol,
1582 struct snd_ctl_elem_value *ucontrol)
1583{
1584 struct snd_soc_dapm_widget *widget =
1585 snd_soc_dapm_kcontrol_widget(kcontrol);
1586 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
1587 struct device *rx_dev = NULL;
1588 struct rx_macro_priv *rx_priv = NULL;
1589
1590 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1591 return -EINVAL;
1592
1593 ucontrol->value.integer.value[0] =
1594 rx_priv->rx_port_value[widget->shift];
1595 return 0;
1596}
1597
1598static int rx_macro_mux_put(struct snd_kcontrol *kcontrol,
1599 struct snd_ctl_elem_value *ucontrol)
1600{
1601 struct snd_soc_dapm_widget *widget =
1602 snd_soc_dapm_kcontrol_widget(kcontrol);
1603 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
1604 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1605 struct snd_soc_dapm_update *update = NULL;
1606 u32 rx_port_value = ucontrol->value.integer.value[0];
1607 u32 aif_rst = 0;
1608 struct device *rx_dev = NULL;
1609 struct rx_macro_priv *rx_priv = NULL;
1610
1611 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1612 return -EINVAL;
1613
1614 aif_rst = rx_priv->rx_port_value[widget->shift];
1615 if (!rx_port_value) {
1616 if (aif_rst == 0) {
1617 dev_err(rx_dev, "%s:AIF reset already\n", __func__);
1618 return 0;
1619 }
1620 }
1621 rx_priv->rx_port_value[widget->shift] = rx_port_value;
1622
1623 switch (rx_port_value) {
1624 case 0:
1625 clear_bit(widget->shift,
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +05301626 &rx_priv->active_ch_mask[aif_rst]);
1627 rx_priv->active_ch_cnt[aif_rst]--;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301628 break;
1629 case 1:
1630 case 2:
1631 case 3:
1632 case 4:
1633 set_bit(widget->shift,
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +05301634 &rx_priv->active_ch_mask[rx_port_value]);
1635 rx_priv->active_ch_cnt[rx_port_value]++;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301636 break;
1637 default:
1638 dev_err(codec->dev,
1639 "%s:Invalid AIF_ID for RX_MACRO MUX\n", __func__);
1640 goto err;
1641 }
1642
1643 snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,
1644 rx_port_value, e, update);
1645 return 0;
1646err:
1647 return -EINVAL;
1648}
1649
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301650static int rx_macro_get_ear_mode(struct snd_kcontrol *kcontrol,
1651 struct snd_ctl_elem_value *ucontrol)
1652{
1653 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1654 struct device *rx_dev = NULL;
1655 struct rx_macro_priv *rx_priv = NULL;
1656
1657 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1658 return -EINVAL;
1659
1660 ucontrol->value.integer.value[0] = rx_priv->is_ear_mode_on;
1661 return 0;
1662}
1663
1664static int rx_macro_put_ear_mode(struct snd_kcontrol *kcontrol,
1665 struct snd_ctl_elem_value *ucontrol)
1666{
1667 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1668 struct device *rx_dev = NULL;
1669 struct rx_macro_priv *rx_priv = NULL;
1670
1671 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1672 return -EINVAL;
1673
1674 rx_priv->is_ear_mode_on =
1675 (!ucontrol->value.integer.value[0] ? false : true);
1676 return 0;
1677}
1678
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301679static int rx_macro_vbat_bcl_gsm_mode_func_get(struct snd_kcontrol *kcontrol,
1680 struct snd_ctl_elem_value *ucontrol)
1681{
1682 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1683
1684 ucontrol->value.integer.value[0] =
1685 ((snd_soc_read(codec, BOLERO_CDC_RX_BCL_VBAT_CFG) & 0x04) ?
1686 1 : 0);
1687
1688 dev_dbg(codec->dev, "%s: value: %lu\n", __func__,
1689 ucontrol->value.integer.value[0]);
1690
1691 return 0;
1692}
1693
1694static int rx_macro_vbat_bcl_gsm_mode_func_put(struct snd_kcontrol *kcontrol,
1695 struct snd_ctl_elem_value *ucontrol)
1696{
1697 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1698
1699 dev_dbg(codec->dev, "%s: value: %lu\n", __func__,
1700 ucontrol->value.integer.value[0]);
1701
1702 /* Set Vbat register configuration for GSM mode bit based on value */
1703 if (ucontrol->value.integer.value[0])
1704 snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG,
1705 0x04, 0x04);
1706 else
1707 snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG,
1708 0x04, 0x00);
1709
1710 return 0;
1711}
1712
1713static int rx_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol,
1714 struct snd_ctl_elem_value *ucontrol)
1715{
1716 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1717 struct device *rx_dev = NULL;
1718 struct rx_macro_priv *rx_priv = NULL;
1719
1720 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1721 return -EINVAL;
1722
1723 ucontrol->value.integer.value[0] = rx_priv->is_softclip_on;
1724
1725 dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
1726 __func__, ucontrol->value.integer.value[0]);
1727
1728 return 0;
1729}
1730
1731static int rx_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol,
1732 struct snd_ctl_elem_value *ucontrol)
1733{
1734 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1735 struct device *rx_dev = NULL;
1736 struct rx_macro_priv *rx_priv = NULL;
1737
1738 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1739 return -EINVAL;
1740
1741 rx_priv->is_softclip_on = ucontrol->value.integer.value[0];
1742
1743 dev_dbg(codec->dev, "%s: soft clip enable = %d\n", __func__,
1744 rx_priv->is_softclip_on);
1745
1746 return 0;
1747}
1748
1749static int rx_macro_enable_vbat(struct snd_soc_dapm_widget *w,
1750 struct snd_kcontrol *kcontrol,
1751 int event)
1752{
1753 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1754 struct device *rx_dev = NULL;
1755 struct rx_macro_priv *rx_priv = NULL;
1756
1757 dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event);
1758 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1759 return -EINVAL;
1760
1761 switch (event) {
1762 case SND_SOC_DAPM_PRE_PMU:
1763 /* Enable clock for VBAT block */
1764 snd_soc_update_bits(codec,
1765 BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x10);
1766 /* Enable VBAT block */
1767 snd_soc_update_bits(codec,
1768 BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x01);
1769 /* Update interpolator with 384K path */
1770 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1771 0x80, 0x80);
1772 /* Update DSM FS rate */
1773 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7,
1774 0x02, 0x02);
1775 /* Use attenuation mode */
1776 snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG,
1777 0x02, 0x00);
1778 /* BCL block needs softclip clock to be enabled */
1779 rx_macro_enable_softclip_clk(codec, rx_priv, true);
1780 /* Enable VBAT at channel level */
1781 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1782 0x02, 0x02);
1783 /* Set the ATTK1 gain */
1784 snd_soc_update_bits(codec,
1785 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1,
1786 0xFF, 0xFF);
1787 snd_soc_update_bits(codec,
1788 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2,
1789 0xFF, 0x03);
1790 snd_soc_update_bits(codec,
1791 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3,
1792 0xFF, 0x00);
1793 /* Set the ATTK2 gain */
1794 snd_soc_update_bits(codec,
1795 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4,
1796 0xFF, 0xFF);
1797 snd_soc_update_bits(codec,
1798 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5,
1799 0xFF, 0x03);
1800 snd_soc_update_bits(codec,
1801 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6,
1802 0xFF, 0x00);
1803 /* Set the ATTK3 gain */
1804 snd_soc_update_bits(codec,
1805 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7,
1806 0xFF, 0xFF);
1807 snd_soc_update_bits(codec,
1808 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8,
1809 0xFF, 0x03);
1810 snd_soc_update_bits(codec,
1811 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9,
1812 0xFF, 0x00);
1813 break;
1814
1815 case SND_SOC_DAPM_POST_PMD:
1816 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1817 0x80, 0x00);
1818 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7,
1819 0x02, 0x00);
1820 snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG,
1821 0x02, 0x02);
1822 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1823 0x02, 0x00);
1824 snd_soc_update_bits(codec,
1825 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1,
1826 0xFF, 0x00);
1827 snd_soc_update_bits(codec,
1828 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2,
1829 0xFF, 0x00);
1830 snd_soc_update_bits(codec,
1831 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3,
1832 0xFF, 0x00);
1833 snd_soc_update_bits(codec,
1834 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4,
1835 0xFF, 0x00);
1836 snd_soc_update_bits(codec,
1837 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5,
1838 0xFF, 0x00);
1839 snd_soc_update_bits(codec,
1840 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6,
1841 0xFF, 0x00);
1842 snd_soc_update_bits(codec,
1843 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7,
1844 0xFF, 0x00);
1845 snd_soc_update_bits(codec,
1846 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8,
1847 0xFF, 0x00);
1848 snd_soc_update_bits(codec,
1849 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9,
1850 0xFF, 0x00);
1851 rx_macro_enable_softclip_clk(codec, rx_priv, false);
1852 snd_soc_update_bits(codec,
1853 BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x00);
1854 snd_soc_update_bits(codec,
1855 BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x00);
1856 break;
1857 default:
1858 dev_err(rx_dev, "%s: Invalid event %d\n", __func__, event);
1859 break;
1860 }
1861 return 0;
1862}
1863
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301864static void rx_macro_idle_detect_control(struct snd_soc_codec *codec,
1865 struct rx_macro_priv *rx_priv,
1866 int interp, int event)
1867{
1868 int reg = 0, mask = 0, val = 0;
1869
1870 if (!rx_priv->idle_det_cfg.hph_idle_detect_en)
1871 return;
1872
1873 if (interp == INTERP_HPHL) {
1874 reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL;
1875 mask = 0x01;
1876 val = 0x01;
1877 }
1878 if (interp == INTERP_HPHR) {
1879 reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL;
1880 mask = 0x02;
1881 val = 0x02;
1882 }
1883
1884 if (reg && SND_SOC_DAPM_EVENT_ON(event))
1885 snd_soc_update_bits(codec, reg, mask, val);
1886
1887 if (reg && SND_SOC_DAPM_EVENT_OFF(event)) {
1888 snd_soc_update_bits(codec, reg, mask, 0x00);
1889 rx_priv->idle_det_cfg.hph_idle_thr = 0;
1890 snd_soc_write(codec, BOLERO_CDC_RX_IDLE_DETECT_CFG3, 0x0);
1891 }
1892}
1893
1894static void rx_macro_hphdelay_lutbypass(struct snd_soc_codec *codec,
1895 struct rx_macro_priv *rx_priv,
1896 u16 interp_idx, int event)
1897{
1898 u8 hph_dly_mask = 0;
1899 u16 hph_lut_bypass_reg = 0;
1900 u16 hph_comp_ctrl7 = 0;
1901
1902 switch (interp_idx) {
1903 case INTERP_HPHL:
1904 hph_dly_mask = 1;
1905 hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHL_COMP_LUT;
1906 hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER0_CTL7;
1907 break;
1908 case INTERP_HPHR:
1909 hph_dly_mask = 2;
1910 hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHR_COMP_LUT;
1911 hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER1_CTL7;
1912 break;
1913 default:
1914 break;
1915 }
1916
1917 if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) {
1918 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_TEST0,
1919 hph_dly_mask, 0x0);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301920 if (interp_idx == INTERP_HPHL) {
1921 if (rx_priv->is_ear_mode_on)
1922 snd_soc_update_bits(codec,
1923 BOLERO_CDC_RX_RX0_RX_PATH_CFG1,
1924 0x02, 0x02);
1925 else
1926 snd_soc_update_bits(codec,
1927 hph_lut_bypass_reg,
1928 0x80, 0x80);
1929 } else {
1930 snd_soc_update_bits(codec,
1931 hph_lut_bypass_reg,
1932 0x80, 0x80);
1933 }
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301934 }
1935
1936 if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
1937 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_TEST0,
1938 hph_dly_mask, hph_dly_mask);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301939 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG1,
1940 0x02, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301941 snd_soc_update_bits(codec, hph_lut_bypass_reg, 0x80, 0x00);
1942 snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x0);
1943 }
1944}
1945
1946static int rx_macro_enable_interp_clk(struct snd_soc_codec *codec,
1947 int event, int interp_idx)
1948{
1949 u16 main_reg = 0;
1950 struct device *rx_dev = NULL;
1951 struct rx_macro_priv *rx_priv = NULL;
1952
1953 if (!codec) {
1954 pr_err("%s: codec is NULL\n", __func__);
1955 return -EINVAL;
1956 }
1957
1958 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1959 return -EINVAL;
1960
1961 main_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL +
1962 (interp_idx * RX_MACRO_RX_PATH_OFFSET);
1963
1964 if (SND_SOC_DAPM_EVENT_ON(event)) {
1965 if (rx_priv->main_clk_users[interp_idx] == 0) {
1966 /* Main path PGA mute enable */
1967 snd_soc_update_bits(codec, main_reg, 0x10, 0x10);
1968 /* Clk enable */
1969 snd_soc_update_bits(codec, main_reg, 0x20, 0x20);
1970 rx_macro_idle_detect_control(codec, rx_priv,
1971 interp_idx, event);
1972 rx_macro_hd2_control(codec, interp_idx, event);
1973 rx_macro_hphdelay_lutbypass(codec, rx_priv, interp_idx,
1974 event);
1975 rx_macro_config_compander(codec, rx_priv,
1976 interp_idx, event);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301977 if (interp_idx == INTERP_AUX)
1978 rx_macro_config_softclip(codec, rx_priv,
1979 event);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301980 rx_macro_config_classh(codec, rx_priv,
1981 interp_idx, event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301982 }
1983 rx_priv->main_clk_users[interp_idx]++;
1984 }
1985
1986 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1987 rx_priv->main_clk_users[interp_idx]--;
1988 if (rx_priv->main_clk_users[interp_idx] <= 0) {
1989 rx_priv->main_clk_users[interp_idx] = 0;
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301990 rx_macro_config_classh(codec, rx_priv,
1991 interp_idx, event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301992 rx_macro_config_compander(codec, rx_priv,
1993 interp_idx, event);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301994 if (interp_idx == INTERP_AUX)
1995 rx_macro_config_softclip(codec, rx_priv,
1996 event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301997 rx_macro_hphdelay_lutbypass(codec, rx_priv, interp_idx,
1998 event);
1999 rx_macro_hd2_control(codec, interp_idx, event);
2000 rx_macro_idle_detect_control(codec, rx_priv,
2001 interp_idx, event);
2002 /* Clk Disable */
2003 snd_soc_update_bits(codec, main_reg, 0x20, 0x00);
2004 /* Reset enable and disable */
2005 snd_soc_update_bits(codec, main_reg, 0x40, 0x40);
2006 snd_soc_update_bits(codec, main_reg, 0x40, 0x00);
2007 /* Reset rate to 48K*/
2008 snd_soc_update_bits(codec, main_reg, 0x0F, 0x04);
2009 }
2010 }
2011
2012 dev_dbg(codec->dev, "%s event %d main_clk_users %d\n",
2013 __func__, event, rx_priv->main_clk_users[interp_idx]);
2014
2015 return rx_priv->main_clk_users[interp_idx];
2016}
2017
2018static int rx_macro_enable_rx_path_clk(struct snd_soc_dapm_widget *w,
2019 struct snd_kcontrol *kcontrol, int event)
2020{
2021 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2022 u16 sidetone_reg = 0;
2023
2024 dev_dbg(codec->dev, "%s %d %d\n", __func__, event, w->shift);
2025 sidetone_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG1 +
2026 RX_MACRO_RX_PATH_OFFSET * (w->shift);
2027
2028 switch (event) {
2029 case SND_SOC_DAPM_PRE_PMU:
2030 rx_macro_enable_interp_clk(codec, event, w->shift);
2031 snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x10);
2032 break;
2033 case SND_SOC_DAPM_POST_PMD:
2034 snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x00);
2035 rx_macro_enable_interp_clk(codec, event, w->shift);
2036 break;
2037 default:
2038 break;
2039 };
2040 return 0;
2041}
2042
2043static void rx_macro_restore_iir_coeff(struct rx_macro_priv *rx_priv, int iir_idx,
2044 int band_idx)
2045{
2046 u16 reg_add = 0, coeff_idx = 0, idx = 0;
2047 struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL);
2048
Tanya Dixit8530fb92018-09-14 16:01:25 +05302049 if (regmap == NULL) {
2050 dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__);
2051 return;
2052 }
2053
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302054 regmap_write(regmap,
2055 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2056 (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F);
2057
2058 reg_add = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx;
2059
2060 /* 5 coefficients per band and 4 writes per coefficient */
2061 for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX;
2062 coeff_idx++) {
2063 /* Four 8 bit values(one 32 bit) per coefficient */
2064 regmap_write(regmap, reg_add,
2065 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2066 regmap_write(regmap, reg_add,
2067 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2068 regmap_write(regmap, reg_add,
2069 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2070 regmap_write(regmap, reg_add,
2071 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2072 }
2073}
2074
2075static int rx_macro_iir_enable_audio_mixer_get(struct snd_kcontrol *kcontrol,
2076 struct snd_ctl_elem_value *ucontrol)
2077{
2078 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
2079 int iir_idx = ((struct soc_multi_mixer_control *)
2080 kcontrol->private_value)->reg;
2081 int band_idx = ((struct soc_multi_mixer_control *)
2082 kcontrol->private_value)->shift;
2083 /* IIR filter band registers are at integer multiples of 0x80 */
2084 u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx;
2085
2086 ucontrol->value.integer.value[0] = (snd_soc_read(codec, iir_reg) &
2087 (1 << band_idx)) != 0;
2088
2089 dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__,
2090 iir_idx, band_idx,
2091 (uint32_t)ucontrol->value.integer.value[0]);
2092 return 0;
2093}
2094
2095static int rx_macro_iir_enable_audio_mixer_put(struct snd_kcontrol *kcontrol,
2096 struct snd_ctl_elem_value *ucontrol)
2097{
2098 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
2099 int iir_idx = ((struct soc_multi_mixer_control *)
2100 kcontrol->private_value)->reg;
2101 int band_idx = ((struct soc_multi_mixer_control *)
2102 kcontrol->private_value)->shift;
2103 bool iir_band_en_status = 0;
2104 int value = ucontrol->value.integer.value[0];
2105 u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx;
2106 struct device *rx_dev = NULL;
2107 struct rx_macro_priv *rx_priv = NULL;
2108
2109 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
2110 return -EINVAL;
2111
2112 rx_macro_restore_iir_coeff(rx_priv, iir_idx, band_idx);
2113
2114 /* Mask first 5 bits, 6-8 are reserved */
2115 snd_soc_update_bits(codec, iir_reg, (1 << band_idx),
2116 (value << band_idx));
2117
2118 iir_band_en_status = ((snd_soc_read(codec, iir_reg) &
2119 (1 << band_idx)) != 0);
2120 dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__,
2121 iir_idx, band_idx, iir_band_en_status);
2122 return 0;
2123}
2124
2125static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec,
2126 int iir_idx, int band_idx,
2127 int coeff_idx)
2128{
2129 uint32_t value = 0;
2130
2131 /* Address does not automatically update if reading */
2132 snd_soc_write(codec,
2133 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2134 ((band_idx * BAND_MAX + coeff_idx)
2135 * sizeof(uint32_t)) & 0x7F);
2136
2137 value |= snd_soc_read(codec,
2138 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx));
2139
2140 snd_soc_write(codec,
2141 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2142 ((band_idx * BAND_MAX + coeff_idx)
2143 * sizeof(uint32_t) + 1) & 0x7F);
2144
2145 value |= (snd_soc_read(codec,
2146 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2147 0x80 * iir_idx)) << 8);
2148
2149 snd_soc_write(codec,
2150 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2151 ((band_idx * BAND_MAX + coeff_idx)
2152 * sizeof(uint32_t) + 2) & 0x7F);
2153
2154 value |= (snd_soc_read(codec,
2155 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2156 0x80 * iir_idx)) << 16);
2157
2158 snd_soc_write(codec,
2159 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2160 ((band_idx * BAND_MAX + coeff_idx)
2161 * sizeof(uint32_t) + 3) & 0x7F);
2162
2163 /* Mask bits top 2 bits since they are reserved */
2164 value |= ((snd_soc_read(codec,
2165 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2166 16 * iir_idx)) & 0x3F) << 24);
2167
2168 return value;
2169}
2170
2171static int rx_macro_iir_band_audio_mixer_get(struct snd_kcontrol *kcontrol,
2172 struct snd_ctl_elem_value *ucontrol)
2173{
2174 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
2175 int iir_idx = ((struct soc_multi_mixer_control *)
2176 kcontrol->private_value)->reg;
2177 int band_idx = ((struct soc_multi_mixer_control *)
2178 kcontrol->private_value)->shift;
2179
2180 ucontrol->value.integer.value[0] =
2181 get_iir_band_coeff(codec, iir_idx, band_idx, 0);
2182 ucontrol->value.integer.value[1] =
2183 get_iir_band_coeff(codec, iir_idx, band_idx, 1);
2184 ucontrol->value.integer.value[2] =
2185 get_iir_band_coeff(codec, iir_idx, band_idx, 2);
2186 ucontrol->value.integer.value[3] =
2187 get_iir_band_coeff(codec, iir_idx, band_idx, 3);
2188 ucontrol->value.integer.value[4] =
2189 get_iir_band_coeff(codec, iir_idx, band_idx, 4);
2190
2191 dev_dbg(codec->dev, "%s: IIR #%d band #%d b0 = 0x%x\n"
2192 "%s: IIR #%d band #%d b1 = 0x%x\n"
2193 "%s: IIR #%d band #%d b2 = 0x%x\n"
2194 "%s: IIR #%d band #%d a1 = 0x%x\n"
2195 "%s: IIR #%d band #%d a2 = 0x%x\n",
2196 __func__, iir_idx, band_idx,
2197 (uint32_t)ucontrol->value.integer.value[0],
2198 __func__, iir_idx, band_idx,
2199 (uint32_t)ucontrol->value.integer.value[1],
2200 __func__, iir_idx, band_idx,
2201 (uint32_t)ucontrol->value.integer.value[2],
2202 __func__, iir_idx, band_idx,
2203 (uint32_t)ucontrol->value.integer.value[3],
2204 __func__, iir_idx, band_idx,
2205 (uint32_t)ucontrol->value.integer.value[4]);
2206 return 0;
2207}
2208
2209static void set_iir_band_coeff(struct snd_soc_codec *codec,
2210 int iir_idx, int band_idx,
2211 uint32_t value)
2212{
2213 snd_soc_write(codec,
2214 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2215 (value & 0xFF));
2216
2217 snd_soc_write(codec,
2218 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2219 (value >> 8) & 0xFF);
2220
2221 snd_soc_write(codec,
2222 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2223 (value >> 16) & 0xFF);
2224
2225 /* Mask top 2 bits, 7-8 are reserved */
2226 snd_soc_write(codec,
2227 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2228 (value >> 24) & 0x3F);
2229}
2230
2231static int rx_macro_iir_band_audio_mixer_put(struct snd_kcontrol *kcontrol,
2232 struct snd_ctl_elem_value *ucontrol)
2233{
2234 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
2235 int iir_idx = ((struct soc_multi_mixer_control *)
2236 kcontrol->private_value)->reg;
2237 int band_idx = ((struct soc_multi_mixer_control *)
2238 kcontrol->private_value)->shift;
2239 int coeff_idx, idx = 0;
2240 struct device *rx_dev = NULL;
2241 struct rx_macro_priv *rx_priv = NULL;
2242
2243 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
2244 return -EINVAL;
2245
2246 /*
2247 * Mask top bit it is reserved
2248 * Updates addr automatically for each B2 write
2249 */
2250 snd_soc_write(codec,
2251 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx),
2252 (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F);
2253
2254 /* Store the coefficients in sidetone coeff array */
2255 for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX;
2256 coeff_idx++) {
2257 uint32_t value = ucontrol->value.integer.value[coeff_idx];
2258
2259 set_iir_band_coeff(codec, iir_idx, band_idx, value);
2260
2261 /* Four 8 bit values(one 32 bit) per coefficient */
2262 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2263 (value & 0xFF);
2264 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2265 (value >> 8) & 0xFF;
2266 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2267 (value >> 16) & 0xFF;
2268 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2269 (value >> 24) & 0xFF;
2270 }
2271
2272 pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n"
2273 "%s: IIR #%d band #%d b1 = 0x%x\n"
2274 "%s: IIR #%d band #%d b2 = 0x%x\n"
2275 "%s: IIR #%d band #%d a1 = 0x%x\n"
2276 "%s: IIR #%d band #%d a2 = 0x%x\n",
2277 __func__, iir_idx, band_idx,
2278 get_iir_band_coeff(codec, iir_idx, band_idx, 0),
2279 __func__, iir_idx, band_idx,
2280 get_iir_band_coeff(codec, iir_idx, band_idx, 1),
2281 __func__, iir_idx, band_idx,
2282 get_iir_band_coeff(codec, iir_idx, band_idx, 2),
2283 __func__, iir_idx, band_idx,
2284 get_iir_band_coeff(codec, iir_idx, band_idx, 3),
2285 __func__, iir_idx, band_idx,
2286 get_iir_band_coeff(codec, iir_idx, band_idx, 4));
2287 return 0;
2288}
2289
2290static int rx_macro_set_iir_gain(struct snd_soc_dapm_widget *w,
2291 struct snd_kcontrol *kcontrol, int event)
2292{
2293 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2294
2295 dev_dbg(codec->dev, "%s: event = %d\n", __func__, event);
2296
2297 switch (event) {
2298 case SND_SOC_DAPM_POST_PMU: /* fall through */
2299 case SND_SOC_DAPM_PRE_PMD:
2300 if (strnstr(w->name, "IIR0", sizeof("IIR0"))) {
2301 snd_soc_write(codec,
2302 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL,
2303 snd_soc_read(codec,
2304 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL));
2305 snd_soc_write(codec,
2306 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL,
2307 snd_soc_read(codec,
2308 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL));
2309 snd_soc_write(codec,
2310 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL,
2311 snd_soc_read(codec,
2312 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL));
2313 snd_soc_write(codec,
2314 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL,
2315 snd_soc_read(codec,
2316 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL));
2317 } else {
2318 snd_soc_write(codec,
2319 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL,
2320 snd_soc_read(codec,
2321 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL));
2322 snd_soc_write(codec,
2323 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL,
2324 snd_soc_read(codec,
2325 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL));
2326 snd_soc_write(codec,
2327 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL,
2328 snd_soc_read(codec,
2329 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL));
2330 snd_soc_write(codec,
2331 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL,
2332 snd_soc_read(codec,
2333 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL));
2334 }
2335 break;
2336 }
2337 return 0;
2338}
2339
2340static const struct snd_kcontrol_new rx_macro_snd_controls[] = {
2341 SOC_SINGLE_SX_TLV("RX_RX0 Digital Volume",
2342 BOLERO_CDC_RX_RX0_RX_VOL_CTL,
2343 0, -84, 40, digital_gain),
2344 SOC_SINGLE_SX_TLV("RX_RX1 Digital Volume",
2345 BOLERO_CDC_RX_RX1_RX_VOL_CTL,
2346 0, -84, 40, digital_gain),
2347 SOC_SINGLE_SX_TLV("RX_RX2 Digital Volume",
2348 BOLERO_CDC_RX_RX2_RX_VOL_CTL,
2349 0, -84, 40, digital_gain),
2350 SOC_SINGLE_SX_TLV("RX_RX0 Mix Digital Volume",
2351 BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2352 SOC_SINGLE_SX_TLV("RX_RX1 Mix Digital Volume",
2353 BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2354 SOC_SINGLE_SX_TLV("RX_RX2 Mix Digital Volume",
2355 BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2356
2357 SOC_SINGLE_EXT("RX_COMP1 Switch", SND_SOC_NOPM, RX_MACRO_COMP1, 1, 0,
2358 rx_macro_get_compander, rx_macro_set_compander),
2359 SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0,
2360 rx_macro_get_compander, rx_macro_set_compander),
2361
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302362 SOC_ENUM_EXT("RX_EAR Mode", rx_macro_ear_mode_enum,
2363 rx_macro_get_ear_mode, rx_macro_put_ear_mode),
2364
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302365 SOC_ENUM_EXT("RX_GSM mode Enable", rx_macro_vbat_bcl_gsm_mode_enum,
2366 rx_macro_vbat_bcl_gsm_mode_func_get,
2367 rx_macro_vbat_bcl_gsm_mode_func_put),
2368 SOC_SINGLE_EXT("RX_Softclip Enable", SND_SOC_NOPM, 0, 1, 0,
2369 rx_macro_soft_clip_enable_get,
2370 rx_macro_soft_clip_enable_put),
2371
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302372 SOC_SINGLE_SX_TLV("IIR0 INP0 Volume",
2373 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, 40,
2374 digital_gain),
2375 SOC_SINGLE_SX_TLV("IIR0 INP1 Volume",
2376 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, 40,
2377 digital_gain),
2378 SOC_SINGLE_SX_TLV("IIR0 INP2 Volume",
2379 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, 40,
2380 digital_gain),
2381 SOC_SINGLE_SX_TLV("IIR0 INP3 Volume",
2382 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, 40,
2383 digital_gain),
2384 SOC_SINGLE_SX_TLV("IIR1 INP0 Volume",
2385 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0, -84, 40,
2386 digital_gain),
2387 SOC_SINGLE_SX_TLV("IIR1 INP1 Volume",
2388 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0, -84, 40,
2389 digital_gain),
2390 SOC_SINGLE_SX_TLV("IIR1 INP2 Volume",
2391 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0, -84, 40,
2392 digital_gain),
2393 SOC_SINGLE_SX_TLV("IIR1 INP3 Volume",
2394 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0, -84, 40,
2395 digital_gain),
2396
2397 SOC_SINGLE_EXT("IIR0 Enable Band1", IIR0, BAND1, 1, 0,
2398 rx_macro_iir_enable_audio_mixer_get,
2399 rx_macro_iir_enable_audio_mixer_put),
2400 SOC_SINGLE_EXT("IIR0 Enable Band2", IIR0, BAND2, 1, 0,
2401 rx_macro_iir_enable_audio_mixer_get,
2402 rx_macro_iir_enable_audio_mixer_put),
2403 SOC_SINGLE_EXT("IIR0 Enable Band3", IIR0, BAND3, 1, 0,
2404 rx_macro_iir_enable_audio_mixer_get,
2405 rx_macro_iir_enable_audio_mixer_put),
2406 SOC_SINGLE_EXT("IIR0 Enable Band4", IIR0, BAND4, 1, 0,
2407 rx_macro_iir_enable_audio_mixer_get,
2408 rx_macro_iir_enable_audio_mixer_put),
2409 SOC_SINGLE_EXT("IIR0 Enable Band5", IIR0, BAND5, 1, 0,
2410 rx_macro_iir_enable_audio_mixer_get,
2411 rx_macro_iir_enable_audio_mixer_put),
2412 SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0,
2413 rx_macro_iir_enable_audio_mixer_get,
2414 rx_macro_iir_enable_audio_mixer_put),
2415 SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0,
2416 rx_macro_iir_enable_audio_mixer_get,
2417 rx_macro_iir_enable_audio_mixer_put),
2418 SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0,
2419 rx_macro_iir_enable_audio_mixer_get,
2420 rx_macro_iir_enable_audio_mixer_put),
2421 SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0,
2422 rx_macro_iir_enable_audio_mixer_get,
2423 rx_macro_iir_enable_audio_mixer_put),
2424 SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0,
2425 rx_macro_iir_enable_audio_mixer_get,
2426 rx_macro_iir_enable_audio_mixer_put),
2427
2428 SOC_SINGLE_MULTI_EXT("IIR0 Band1", IIR0, BAND1, 255, 0, 5,
2429 rx_macro_iir_band_audio_mixer_get,
2430 rx_macro_iir_band_audio_mixer_put),
2431 SOC_SINGLE_MULTI_EXT("IIR0 Band2", IIR0, BAND2, 255, 0, 5,
2432 rx_macro_iir_band_audio_mixer_get,
2433 rx_macro_iir_band_audio_mixer_put),
2434 SOC_SINGLE_MULTI_EXT("IIR0 Band3", IIR0, BAND3, 255, 0, 5,
2435 rx_macro_iir_band_audio_mixer_get,
2436 rx_macro_iir_band_audio_mixer_put),
2437 SOC_SINGLE_MULTI_EXT("IIR0 Band4", IIR0, BAND4, 255, 0, 5,
2438 rx_macro_iir_band_audio_mixer_get,
2439 rx_macro_iir_band_audio_mixer_put),
2440 SOC_SINGLE_MULTI_EXT("IIR0 Band5", IIR0, BAND5, 255, 0, 5,
2441 rx_macro_iir_band_audio_mixer_get,
2442 rx_macro_iir_band_audio_mixer_put),
2443 SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5,
2444 rx_macro_iir_band_audio_mixer_get,
2445 rx_macro_iir_band_audio_mixer_put),
2446 SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5,
2447 rx_macro_iir_band_audio_mixer_get,
2448 rx_macro_iir_band_audio_mixer_put),
2449 SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5,
2450 rx_macro_iir_band_audio_mixer_get,
2451 rx_macro_iir_band_audio_mixer_put),
2452 SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5,
2453 rx_macro_iir_band_audio_mixer_get,
2454 rx_macro_iir_band_audio_mixer_put),
2455 SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5,
2456 rx_macro_iir_band_audio_mixer_get,
2457 rx_macro_iir_band_audio_mixer_put),
2458};
2459
2460static const struct snd_soc_dapm_widget rx_macro_dapm_widgets[] = {
2461 SND_SOC_DAPM_AIF_IN("RX AIF1 PB", "RX_MACRO_AIF1 Playback", 0,
2462 SND_SOC_NOPM, 0, 0),
2463
2464 SND_SOC_DAPM_AIF_IN("RX AIF2 PB", "RX_MACRO_AIF2 Playback", 0,
2465 SND_SOC_NOPM, 0, 0),
2466
2467 SND_SOC_DAPM_AIF_IN("RX AIF3 PB", "RX_MACRO_AIF3 Playback", 0,
2468 SND_SOC_NOPM, 0, 0),
2469
2470 SND_SOC_DAPM_AIF_IN("RX AIF4 PB", "RX_MACRO_AIF4 Playback", 0,
2471 SND_SOC_NOPM, 0, 0),
2472
2473 RX_MACRO_DAPM_MUX("RX_MACRO RX0 MUX", RX_MACRO_RX0, rx_macro_rx0),
2474 RX_MACRO_DAPM_MUX("RX_MACRO RX1 MUX", RX_MACRO_RX1, rx_macro_rx1),
2475 RX_MACRO_DAPM_MUX("RX_MACRO RX2 MUX", RX_MACRO_RX2, rx_macro_rx2),
2476 RX_MACRO_DAPM_MUX("RX_MACRO RX3 MUX", RX_MACRO_RX3, rx_macro_rx3),
2477 RX_MACRO_DAPM_MUX("RX_MACRO RX4 MUX", RX_MACRO_RX4, rx_macro_rx4),
2478 RX_MACRO_DAPM_MUX("RX_MACRO RX5 MUX", RX_MACRO_RX5, rx_macro_rx5),
2479
2480 SND_SOC_DAPM_MIXER("RX_RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
2481 SND_SOC_DAPM_MIXER("RX_RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2482 SND_SOC_DAPM_MIXER("RX_RX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2483 SND_SOC_DAPM_MIXER("RX_RX3", SND_SOC_NOPM, 0, 0, NULL, 0),
2484 SND_SOC_DAPM_MIXER("RX_RX4", SND_SOC_NOPM, 0, 0, NULL, 0),
2485 SND_SOC_DAPM_MIXER("RX_RX5", SND_SOC_NOPM, 0, 0, NULL, 0),
2486
2487 RX_MACRO_DAPM_MUX("IIR0 INP0 MUX", 0, iir0_inp0),
2488 RX_MACRO_DAPM_MUX("IIR0 INP1 MUX", 0, iir0_inp1),
2489 RX_MACRO_DAPM_MUX("IIR0 INP2 MUX", 0, iir0_inp2),
2490 RX_MACRO_DAPM_MUX("IIR0 INP3 MUX", 0, iir0_inp3),
2491 RX_MACRO_DAPM_MUX("IIR1 INP0 MUX", 0, iir1_inp0),
2492 RX_MACRO_DAPM_MUX("IIR1 INP1 MUX", 0, iir1_inp1),
2493 RX_MACRO_DAPM_MUX("IIR1 INP2 MUX", 0, iir1_inp2),
2494 RX_MACRO_DAPM_MUX("IIR1 INP3 MUX", 0, iir1_inp3),
2495
2496 SND_SOC_DAPM_MIXER_E("IIR0", BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL,
2497 4, 0, NULL, 0, rx_macro_set_iir_gain,
2498 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2499 SND_SOC_DAPM_MIXER_E("IIR1", BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL,
2500 4, 0, NULL, 0, rx_macro_set_iir_gain,
2501 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2502 SND_SOC_DAPM_MIXER("SRC0", BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL,
2503 4, 0, NULL, 0),
2504 SND_SOC_DAPM_MIXER("SRC1", BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL,
2505 4, 0, NULL, 0),
2506
2507 RX_MACRO_DAPM_MUX("RX MIX TX0 MUX", 0, rx_mix_tx0),
2508 RX_MACRO_DAPM_MUX("RX MIX TX1 MUX", 0, rx_mix_tx1),
2509 RX_MACRO_DAPM_MUX("RX MIX TX2 MUX", 0, rx_mix_tx2),
2510 RX_MACRO_DAPM_MUX("RX INT0 DEM MUX", 0, rx_int0_dem_inp),
2511 RX_MACRO_DAPM_MUX("RX INT1 DEM MUX", 0, rx_int1_dem_inp),
2512
2513 SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0,
2514 &rx_int0_2_mux, rx_macro_enable_mix_path,
2515 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2516 SND_SOC_DAPM_POST_PMD),
2517 SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0,
2518 &rx_int1_2_mux, rx_macro_enable_mix_path,
2519 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2520 SND_SOC_DAPM_POST_PMD),
2521 SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_AUX, 0,
2522 &rx_int2_2_mux, rx_macro_enable_mix_path,
2523 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2524 SND_SOC_DAPM_POST_PMD),
2525
2526 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP0", 0, rx_int0_1_mix_inp0),
2527 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP1", 0, rx_int0_1_mix_inp1),
2528 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP2", 0, rx_int0_1_mix_inp2),
2529 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP0", 0, rx_int1_1_mix_inp0),
2530 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP1", 0, rx_int1_1_mix_inp1),
2531 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP2", 0, rx_int1_1_mix_inp2),
2532 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP0", 0, rx_int2_1_mix_inp0),
2533 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP1", 0, rx_int2_1_mix_inp1),
2534 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP2", 0, rx_int2_1_mix_inp2),
2535
2536 SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0,
2537 &rx_int0_1_interp_mux, rx_macro_enable_main_path,
2538 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2539 SND_SOC_DAPM_POST_PMD),
2540 SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0,
2541 &rx_int1_1_interp_mux, rx_macro_enable_main_path,
2542 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2543 SND_SOC_DAPM_POST_PMD),
2544 SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_AUX, 0,
2545 &rx_int2_1_interp_mux, rx_macro_enable_main_path,
2546 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2547 SND_SOC_DAPM_POST_PMD),
2548
2549 RX_MACRO_DAPM_MUX("RX INT0_2 INTERP", 0, rx_int0_2_interp),
2550 RX_MACRO_DAPM_MUX("RX INT1_2 INTERP", 0, rx_int1_2_interp),
2551 RX_MACRO_DAPM_MUX("RX INT2_2 INTERP", 0, rx_int2_2_interp),
2552
2553 SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2554 SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2555 SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2556 SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2557 SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2558 SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2559
2560 SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_HPHL,
2561 0, &rx_int0_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2562 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2563 SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", SND_SOC_NOPM, INTERP_HPHR,
2564 0, &rx_int1_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2565 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2566 SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", SND_SOC_NOPM, INTERP_AUX,
2567 0, &rx_int2_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2568 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2569
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302570 SND_SOC_DAPM_MIXER_E("RX INT2_1 VBAT", SND_SOC_NOPM,
2571 0, 0, rx_int2_1_vbat_mix_switch,
2572 ARRAY_SIZE(rx_int2_1_vbat_mix_switch),
2573 rx_macro_enable_vbat,
2574 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2575
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302576 SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2577 SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2578 SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2579
2580 SND_SOC_DAPM_OUTPUT("HPHL_OUT"),
2581 SND_SOC_DAPM_OUTPUT("HPHR_OUT"),
2582 SND_SOC_DAPM_OUTPUT("AUX_OUT"),
2583
2584 SND_SOC_DAPM_INPUT("RX_TX DEC0_INP"),
2585 SND_SOC_DAPM_INPUT("RX_TX DEC1_INP"),
2586 SND_SOC_DAPM_INPUT("RX_TX DEC2_INP"),
2587 SND_SOC_DAPM_INPUT("RX_TX DEC3_INP"),
2588
2589 SND_SOC_DAPM_SUPPLY_S("RX_MCLK", 0, SND_SOC_NOPM, 0, 0,
2590 rx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2591};
2592
2593static const struct snd_soc_dapm_route rx_audio_map[] = {
2594 {"RX AIF1 PB", NULL, "RX_MCLK"},
2595 {"RX AIF2 PB", NULL, "RX_MCLK"},
2596 {"RX AIF3 PB", NULL, "RX_MCLK"},
2597 {"RX AIF4 PB", NULL, "RX_MCLK"},
2598
2599 {"RX_MACRO RX0 MUX", "AIF1_PB", "RX AIF1 PB"},
2600 {"RX_MACRO RX1 MUX", "AIF1_PB", "RX AIF1 PB"},
2601 {"RX_MACRO RX2 MUX", "AIF1_PB", "RX AIF1 PB"},
2602 {"RX_MACRO RX3 MUX", "AIF1_PB", "RX AIF1 PB"},
2603 {"RX_MACRO RX4 MUX", "AIF1_PB", "RX AIF1 PB"},
2604 {"RX_MACRO RX5 MUX", "AIF1_PB", "RX AIF1 PB"},
2605
2606 {"RX_MACRO RX0 MUX", "AIF2_PB", "RX AIF2 PB"},
2607 {"RX_MACRO RX1 MUX", "AIF2_PB", "RX AIF2 PB"},
2608 {"RX_MACRO RX2 MUX", "AIF2_PB", "RX AIF2 PB"},
2609 {"RX_MACRO RX3 MUX", "AIF2_PB", "RX AIF2 PB"},
2610 {"RX_MACRO RX4 MUX", "AIF2_PB", "RX AIF2 PB"},
2611 {"RX_MACRO RX5 MUX", "AIF2_PB", "RX AIF2 PB"},
2612
2613 {"RX_MACRO RX0 MUX", "AIF3_PB", "RX AIF3 PB"},
2614 {"RX_MACRO RX1 MUX", "AIF3_PB", "RX AIF3 PB"},
2615 {"RX_MACRO RX2 MUX", "AIF3_PB", "RX AIF3 PB"},
2616 {"RX_MACRO RX3 MUX", "AIF3_PB", "RX AIF3 PB"},
2617 {"RX_MACRO RX4 MUX", "AIF3_PB", "RX AIF3 PB"},
2618 {"RX_MACRO RX5 MUX", "AIF3_PB", "RX AIF3 PB"},
2619
2620 {"RX_MACRO RX0 MUX", "AIF4_PB", "RX AIF4 PB"},
2621 {"RX_MACRO RX1 MUX", "AIF4_PB", "RX AIF4 PB"},
2622 {"RX_MACRO RX2 MUX", "AIF4_PB", "RX AIF4 PB"},
2623 {"RX_MACRO RX3 MUX", "AIF4_PB", "RX AIF4 PB"},
2624 {"RX_MACRO RX4 MUX", "AIF4_PB", "RX AIF4 PB"},
2625 {"RX_MACRO RX5 MUX", "AIF4_PB", "RX AIF4 PB"},
2626
2627 {"RX_RX0", NULL, "RX_MACRO RX0 MUX"},
2628 {"RX_RX1", NULL, "RX_MACRO RX1 MUX"},
2629 {"RX_RX2", NULL, "RX_MACRO RX2 MUX"},
2630 {"RX_RX3", NULL, "RX_MACRO RX3 MUX"},
2631 {"RX_RX4", NULL, "RX_MACRO RX4 MUX"},
2632 {"RX_RX5", NULL, "RX_MACRO RX5 MUX"},
2633
2634 {"RX INT0_1 MIX1 INP0", "RX0", "RX_RX0"},
2635 {"RX INT0_1 MIX1 INP0", "RX1", "RX_RX1"},
2636 {"RX INT0_1 MIX1 INP0", "RX2", "RX_RX2"},
2637 {"RX INT0_1 MIX1 INP0", "RX3", "RX_RX3"},
2638 {"RX INT0_1 MIX1 INP0", "RX4", "RX_RX4"},
2639 {"RX INT0_1 MIX1 INP0", "RX5", "RX_RX5"},
2640 {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"},
2641 {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"},
2642 {"RX INT0_1 MIX1 INP1", "RX0", "RX_RX0"},
2643 {"RX INT0_1 MIX1 INP1", "RX1", "RX_RX1"},
2644 {"RX INT0_1 MIX1 INP1", "RX2", "RX_RX2"},
2645 {"RX INT0_1 MIX1 INP1", "RX3", "RX_RX3"},
2646 {"RX INT0_1 MIX1 INP1", "RX4", "RX_RX4"},
2647 {"RX INT0_1 MIX1 INP1", "RX5", "RX_RX5"},
2648 {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"},
2649 {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"},
2650 {"RX INT0_1 MIX1 INP2", "RX0", "RX_RX0"},
2651 {"RX INT0_1 MIX1 INP2", "RX1", "RX_RX1"},
2652 {"RX INT0_1 MIX1 INP2", "RX2", "RX_RX2"},
2653 {"RX INT0_1 MIX1 INP2", "RX3", "RX_RX3"},
2654 {"RX INT0_1 MIX1 INP2", "RX4", "RX_RX4"},
2655 {"RX INT0_1 MIX1 INP2", "RX5", "RX_RX5"},
2656 {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"},
2657 {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"},
2658
2659 {"RX INT1_1 MIX1 INP0", "RX0", "RX_RX0"},
2660 {"RX INT1_1 MIX1 INP0", "RX1", "RX_RX1"},
2661 {"RX INT1_1 MIX1 INP0", "RX2", "RX_RX2"},
2662 {"RX INT1_1 MIX1 INP0", "RX3", "RX_RX3"},
2663 {"RX INT1_1 MIX1 INP0", "RX4", "RX_RX4"},
2664 {"RX INT1_1 MIX1 INP0", "RX5", "RX_RX5"},
2665 {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"},
2666 {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"},
2667 {"RX INT1_1 MIX1 INP1", "RX0", "RX_RX0"},
2668 {"RX INT1_1 MIX1 INP1", "RX1", "RX_RX1"},
2669 {"RX INT1_1 MIX1 INP1", "RX2", "RX_RX2"},
2670 {"RX INT1_1 MIX1 INP1", "RX3", "RX_RX3"},
2671 {"RX INT1_1 MIX1 INP1", "RX4", "RX_RX4"},
2672 {"RX INT1_1 MIX1 INP1", "RX5", "RX_RX5"},
2673 {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"},
2674 {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"},
2675 {"RX INT1_1 MIX1 INP2", "RX0", "RX_RX0"},
2676 {"RX INT1_1 MIX1 INP2", "RX1", "RX_RX1"},
2677 {"RX INT1_1 MIX1 INP2", "RX2", "RX_RX2"},
2678 {"RX INT1_1 MIX1 INP2", "RX3", "RX_RX3"},
2679 {"RX INT1_1 MIX1 INP2", "RX4", "RX_RX4"},
2680 {"RX INT1_1 MIX1 INP2", "RX5", "RX_RX5"},
2681 {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"},
2682 {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"},
2683
2684 {"RX INT2_1 MIX1 INP0", "RX0", "RX_RX0"},
2685 {"RX INT2_1 MIX1 INP0", "RX1", "RX_RX1"},
2686 {"RX INT2_1 MIX1 INP0", "RX2", "RX_RX2"},
2687 {"RX INT2_1 MIX1 INP0", "RX3", "RX_RX3"},
2688 {"RX INT2_1 MIX1 INP0", "RX4", "RX_RX4"},
2689 {"RX INT2_1 MIX1 INP0", "RX5", "RX_RX5"},
2690 {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"},
2691 {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"},
2692 {"RX INT2_1 MIX1 INP1", "RX0", "RX_RX0"},
2693 {"RX INT2_1 MIX1 INP1", "RX1", "RX_RX1"},
2694 {"RX INT2_1 MIX1 INP1", "RX2", "RX_RX2"},
2695 {"RX INT2_1 MIX1 INP1", "RX3", "RX_RX3"},
2696 {"RX INT2_1 MIX1 INP1", "RX4", "RX_RX4"},
2697 {"RX INT2_1 MIX1 INP1", "RX5", "RX_RX5"},
2698 {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"},
2699 {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"},
2700 {"RX INT2_1 MIX1 INP2", "RX0", "RX_RX0"},
2701 {"RX INT2_1 MIX1 INP2", "RX1", "RX_RX1"},
2702 {"RX INT2_1 MIX1 INP2", "RX2", "RX_RX2"},
2703 {"RX INT2_1 MIX1 INP2", "RX3", "RX_RX3"},
2704 {"RX INT2_1 MIX1 INP2", "RX4", "RX_RX4"},
2705 {"RX INT2_1 MIX1 INP2", "RX5", "RX_RX5"},
2706 {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"},
2707 {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"},
2708
2709 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"},
2710 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"},
2711 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"},
2712 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"},
2713 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"},
2714 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"},
2715 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"},
2716 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"},
2717 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"},
2718
2719 /* Mixing path INT0 */
2720 {"RX INT0_2 MUX", "RX0", "RX_RX0"},
2721 {"RX INT0_2 MUX", "RX1", "RX_RX1"},
2722 {"RX INT0_2 MUX", "RX2", "RX_RX2"},
2723 {"RX INT0_2 MUX", "RX3", "RX_RX3"},
2724 {"RX INT0_2 MUX", "RX4", "RX_RX4"},
2725 {"RX INT0_2 MUX", "RX5", "RX_RX5"},
2726 {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"},
2727 {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"},
2728
2729 /* Mixing path INT1 */
2730 {"RX INT1_2 MUX", "RX0", "RX_RX0"},
2731 {"RX INT1_2 MUX", "RX1", "RX_RX1"},
2732 {"RX INT1_2 MUX", "RX2", "RX_RX2"},
2733 {"RX INT1_2 MUX", "RX3", "RX_RX3"},
2734 {"RX INT1_2 MUX", "RX4", "RX_RX4"},
2735 {"RX INT1_2 MUX", "RX5", "RX_RX5"},
2736 {"RX INT1_2 INTERP", NULL, "RX INT1_2 MUX"},
2737 {"RX INT1 SEC MIX", NULL, "RX INT1_2 INTERP"},
2738
2739 /* Mixing path INT2 */
2740 {"RX INT2_2 MUX", "RX0", "RX_RX0"},
2741 {"RX INT2_2 MUX", "RX1", "RX_RX1"},
2742 {"RX INT2_2 MUX", "RX2", "RX_RX2"},
2743 {"RX INT2_2 MUX", "RX3", "RX_RX3"},
2744 {"RX INT2_2 MUX", "RX4", "RX_RX4"},
2745 {"RX INT2_2 MUX", "RX5", "RX_RX5"},
2746 {"RX INT2_2 INTERP", NULL, "RX INT2_2 MUX"},
2747 {"RX INT2 SEC MIX", NULL, "RX INT2_2 INTERP"},
2748
2749 {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"},
2750 {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"},
2751 {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"},
2752 {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"},
2753 {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"},
2754 {"HPHL_OUT", NULL, "RX INT0 DEM MUX"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302755 {"HPHL_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302756
2757 {"RX INT1_1 INTERP", NULL, "RX INT1_1 MIX1"},
2758 {"RX INT1 SEC MIX", NULL, "RX INT1_1 INTERP"},
2759 {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"},
2760 {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"},
2761 {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX2"},
2762 {"HPHR_OUT", NULL, "RX INT1 DEM MUX"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302763 {"HPHR_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302764
2765 {"RX INT2_1 INTERP", NULL, "RX INT2_1 MIX1"},
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302766
2767 {"RX INT2_1 VBAT", "RX AUX VBAT Enable", "RX INT2_1 INTERP"},
2768 {"RX INT2 SEC MIX", NULL, "RX INT2_1 VBAT"},
2769
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302770 {"RX INT2 SEC MIX", NULL, "RX INT2_1 INTERP"},
2771 {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"},
2772 {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"},
2773 {"AUX_OUT", NULL, "RX INT2 MIX2"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302774 {"AUX_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302775
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302776 {"IIR0", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302777 {"IIR0", NULL, "IIR0 INP0 MUX"},
2778 {"IIR0 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},
2779 {"IIR0 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},
2780 {"IIR0 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},
2781 {"IIR0 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},
2782 {"IIR0 INP0 MUX", "RX0", "RX_RX0"},
2783 {"IIR0 INP0 MUX", "RX1", "RX_RX1"},
2784 {"IIR0 INP0 MUX", "RX2", "RX_RX2"},
2785 {"IIR0 INP0 MUX", "RX3", "RX_RX3"},
2786 {"IIR0 INP0 MUX", "RX4", "RX_RX4"},
2787 {"IIR0 INP0 MUX", "RX5", "RX_RX5"},
2788 {"IIR0", NULL, "IIR0 INP1 MUX"},
2789 {"IIR0 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},
2790 {"IIR0 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},
2791 {"IIR0 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},
2792 {"IIR0 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},
2793 {"IIR0 INP1 MUX", "RX0", "RX_RX0"},
2794 {"IIR0 INP1 MUX", "RX1", "RX_RX1"},
2795 {"IIR0 INP1 MUX", "RX2", "RX_RX2"},
2796 {"IIR0 INP1 MUX", "RX3", "RX_RX3"},
2797 {"IIR0 INP1 MUX", "RX4", "RX_RX4"},
2798 {"IIR0 INP1 MUX", "RX5", "RX_RX5"},
2799 {"IIR0", NULL, "IIR0 INP2 MUX"},
2800 {"IIR0 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},
2801 {"IIR0 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},
2802 {"IIR0 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},
2803 {"IIR0 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},
2804 {"IIR0 INP2 MUX", "RX0", "RX_RX0"},
2805 {"IIR0 INP2 MUX", "RX1", "RX_RX1"},
2806 {"IIR0 INP2 MUX", "RX2", "RX_RX2"},
2807 {"IIR0 INP2 MUX", "RX3", "RX_RX3"},
2808 {"IIR0 INP2 MUX", "RX4", "RX_RX4"},
2809 {"IIR0 INP2 MUX", "RX5", "RX_RX5"},
2810 {"IIR0", NULL, "IIR0 INP3 MUX"},
2811 {"IIR0 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},
2812 {"IIR0 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},
2813 {"IIR0 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},
2814 {"IIR0 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},
2815 {"IIR0 INP3 MUX", "RX0", "RX_RX0"},
2816 {"IIR0 INP3 MUX", "RX1", "RX_RX1"},
2817 {"IIR0 INP3 MUX", "RX2", "RX_RX2"},
2818 {"IIR0 INP3 MUX", "RX3", "RX_RX3"},
2819 {"IIR0 INP3 MUX", "RX4", "RX_RX4"},
2820 {"IIR0 INP3 MUX", "RX5", "RX_RX5"},
2821
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302822 {"IIR1", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302823 {"IIR1", NULL, "IIR1 INP0 MUX"},
2824 {"IIR1 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},
2825 {"IIR1 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},
2826 {"IIR1 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},
2827 {"IIR1 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},
2828 {"IIR1 INP0 MUX", "RX0", "RX_RX0"},
2829 {"IIR1 INP0 MUX", "RX1", "RX_RX1"},
2830 {"IIR1 INP0 MUX", "RX2", "RX_RX2"},
2831 {"IIR1 INP0 MUX", "RX3", "RX_RX3"},
2832 {"IIR1 INP0 MUX", "RX4", "RX_RX4"},
2833 {"IIR1 INP0 MUX", "RX5", "RX_RX5"},
2834 {"IIR1", NULL, "IIR1 INP1 MUX"},
2835 {"IIR1 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},
2836 {"IIR1 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},
2837 {"IIR1 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},
2838 {"IIR1 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},
2839 {"IIR1 INP1 MUX", "RX0", "RX_RX0"},
2840 {"IIR1 INP1 MUX", "RX1", "RX_RX1"},
2841 {"IIR1 INP1 MUX", "RX2", "RX_RX2"},
2842 {"IIR1 INP1 MUX", "RX3", "RX_RX3"},
2843 {"IIR1 INP1 MUX", "RX4", "RX_RX4"},
2844 {"IIR1 INP1 MUX", "RX5", "RX_RX5"},
2845 {"IIR1", NULL, "IIR1 INP2 MUX"},
2846 {"IIR1 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},
2847 {"IIR1 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},
2848 {"IIR1 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},
2849 {"IIR1 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},
2850 {"IIR1 INP2 MUX", "RX0", "RX_RX0"},
2851 {"IIR1 INP2 MUX", "RX1", "RX_RX1"},
2852 {"IIR1 INP2 MUX", "RX2", "RX_RX2"},
2853 {"IIR1 INP2 MUX", "RX3", "RX_RX3"},
2854 {"IIR1 INP2 MUX", "RX4", "RX_RX4"},
2855 {"IIR1 INP2 MUX", "RX5", "RX_RX5"},
2856 {"IIR1", NULL, "IIR1 INP3 MUX"},
2857 {"IIR1 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},
2858 {"IIR1 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},
2859 {"IIR1 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},
2860 {"IIR1 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},
2861 {"IIR1 INP3 MUX", "RX0", "RX_RX0"},
2862 {"IIR1 INP3 MUX", "RX1", "RX_RX1"},
2863 {"IIR1 INP3 MUX", "RX2", "RX_RX2"},
2864 {"IIR1 INP3 MUX", "RX3", "RX_RX3"},
2865 {"IIR1 INP3 MUX", "RX4", "RX_RX4"},
2866 {"IIR1 INP3 MUX", "RX5", "RX_RX5"},
2867
2868 {"SRC0", NULL, "IIR0"},
2869 {"SRC1", NULL, "IIR1"},
2870 {"RX INT0 MIX2 INP", "SRC0", "SRC0"},
2871 {"RX INT0 MIX2 INP", "SRC1", "SRC1"},
2872 {"RX INT1 MIX2 INP", "SRC0", "SRC0"},
2873 {"RX INT1 MIX2 INP", "SRC1", "SRC1"},
2874 {"RX INT2 MIX2 INP", "SRC0", "SRC0"},
2875 {"RX INT2 MIX2 INP", "SRC1", "SRC1"},
2876};
2877
2878static int rx_swrm_clock(void *handle, bool enable)
2879{
2880 struct rx_macro_priv *rx_priv = (struct rx_macro_priv *) handle;
2881 struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL);
2882 int ret = 0;
2883
Tanya Dixit8530fb92018-09-14 16:01:25 +05302884 if (regmap == NULL) {
2885 dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__);
2886 return -EINVAL;
2887 }
2888
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302889 mutex_lock(&rx_priv->swr_clk_lock);
2890
2891 dev_dbg(rx_priv->dev, "%s: swrm clock %s\n",
2892 __func__, (enable ? "enable" : "disable"));
2893 if (enable) {
2894 if (rx_priv->swr_clk_users == 0) {
2895 ret = rx_macro_mclk_enable(rx_priv, 1, true);
2896 if (ret < 0) {
2897 dev_err(rx_priv->dev,
2898 "%s: rx request clock enable failed\n",
2899 __func__);
2900 goto exit;
2901 }
2902 regmap_update_bits(regmap,
2903 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +05302904 0x02, 0x02);
2905 regmap_update_bits(regmap,
2906 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302907 0x01, 0x01);
2908 regmap_update_bits(regmap,
2909 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +05302910 0x02, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302911 msm_cdc_pinctrl_select_active_state(
2912 rx_priv->rx_swr_gpio_p);
2913 }
2914 rx_priv->swr_clk_users++;
2915 } else {
2916 if (rx_priv->swr_clk_users <= 0) {
2917 dev_err(rx_priv->dev,
2918 "%s: rx swrm clock users already reset\n",
2919 __func__);
2920 rx_priv->swr_clk_users = 0;
2921 goto exit;
2922 }
2923 rx_priv->swr_clk_users--;
2924 if (rx_priv->swr_clk_users == 0) {
2925 regmap_update_bits(regmap,
2926 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
2927 0x01, 0x00);
2928 msm_cdc_pinctrl_select_sleep_state(
2929 rx_priv->rx_swr_gpio_p);
2930 rx_macro_mclk_enable(rx_priv, 0, true);
2931 }
2932 }
2933 dev_dbg(rx_priv->dev, "%s: swrm clock users %d\n",
2934 __func__, rx_priv->swr_clk_users);
2935exit:
2936 mutex_unlock(&rx_priv->swr_clk_lock);
2937 return ret;
2938}
2939
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302940static void rx_macro_init_bcl_pmic_reg(struct snd_soc_codec *codec)
2941{
2942 struct device *rx_dev = NULL;
2943 struct rx_macro_priv *rx_priv = NULL;
2944
2945 if (!codec) {
2946 pr_err("%s: NULL codec pointer!\n", __func__);
2947 return;
2948 }
2949
2950 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
2951 return;
2952
2953 switch (rx_priv->bcl_pmic_params.id) {
2954 case 0:
2955 /* Enable ID0 to listen to respective PMIC group interrupts */
2956 snd_soc_update_bits(codec,
2957 BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x02, 0x02);
2958 /* Update MC_SID0 */
2959 snd_soc_update_bits(codec,
2960 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0x0F,
2961 rx_priv->bcl_pmic_params.sid);
2962 /* Update MC_PPID0 */
2963 snd_soc_update_bits(codec,
2964 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2, 0xFF,
2965 rx_priv->bcl_pmic_params.ppid);
2966 break;
2967 case 1:
2968 /* Enable ID1 to listen to respective PMIC group interrupts */
2969 snd_soc_update_bits(codec,
2970 BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x01, 0x01);
2971 /* Update MC_SID1 */
2972 snd_soc_update_bits(codec,
2973 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3, 0x0F,
2974 rx_priv->bcl_pmic_params.sid);
2975 /* Update MC_PPID1 */
2976 snd_soc_update_bits(codec,
2977 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0xFF,
2978 rx_priv->bcl_pmic_params.ppid);
2979 break;
2980 default:
2981 dev_err(rx_dev, "%s: PMIC ID is invalid\n",
2982 __func__, rx_priv->bcl_pmic_params.id);
2983 break;
2984 }
2985}
2986
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302987static int rx_macro_init(struct snd_soc_codec *codec)
2988{
2989 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
2990 int ret = 0;
2991 struct device *rx_dev = NULL;
2992 struct rx_macro_priv *rx_priv = NULL;
2993
2994 rx_dev = bolero_get_device_ptr(codec->dev, RX_MACRO);
2995 if (!rx_dev) {
2996 dev_err(codec->dev,
2997 "%s: null device for macro!\n", __func__);
2998 return -EINVAL;
2999 }
3000 rx_priv = dev_get_drvdata(rx_dev);
3001 if (!rx_priv) {
3002 dev_err(codec->dev,
3003 "%s: priv is null for macro!\n", __func__);
3004 return -EINVAL;
3005 }
3006
3007 ret = snd_soc_dapm_new_controls(dapm, rx_macro_dapm_widgets,
3008 ARRAY_SIZE(rx_macro_dapm_widgets));
3009 if (ret < 0) {
3010 dev_err(rx_dev, "%s: failed to add controls\n", __func__);
3011 return ret;
3012 }
3013 ret = snd_soc_dapm_add_routes(dapm, rx_audio_map,
3014 ARRAY_SIZE(rx_audio_map));
3015 if (ret < 0) {
3016 dev_err(rx_dev, "%s: failed to add routes\n", __func__);
3017 return ret;
3018 }
3019 ret = snd_soc_dapm_new_widgets(dapm->card);
3020 if (ret < 0) {
3021 dev_err(rx_dev, "%s: failed to add widgets\n", __func__);
3022 return ret;
3023 }
3024 ret = snd_soc_add_codec_controls(codec, rx_macro_snd_controls,
3025 ARRAY_SIZE(rx_macro_snd_controls));
3026 if (ret < 0) {
3027 dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__);
3028 return ret;
3029 }
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +05303030 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL, 0x01, 0x01);
3031 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL, 0x01, 0x01);
3032 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL, 0x01, 0x01);
3033 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_SEC7, 0x07, 0x02);
3034 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_SEC7, 0x07, 0x02);
3035 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x07, 0x02);
3036 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG3, 0x03, 0x02);
3037 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG3, 0x03, 0x02);
3038 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG3, 0x03, 0x02);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303039 rx_macro_init_bcl_pmic_reg(codec);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303040
3041 rx_priv->codec = codec;
3042
3043 return 0;
3044}
3045
3046static int rx_macro_deinit(struct snd_soc_codec *codec)
3047{
3048 struct device *rx_dev = NULL;
3049 struct rx_macro_priv *rx_priv = NULL;
3050
3051 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
3052 return -EINVAL;
3053
3054 rx_priv->codec = NULL;
3055
3056 return 0;
3057}
3058
3059static void rx_macro_add_child_devices(struct work_struct *work)
3060{
3061 struct rx_macro_priv *rx_priv = NULL;
3062 struct platform_device *pdev = NULL;
3063 struct device_node *node = NULL;
3064 struct rx_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
3065 int ret = 0;
3066 u16 count = 0, ctrl_num = 0;
3067 struct rx_swr_ctrl_platform_data *platdata = NULL;
3068 char plat_dev_name[RX_SWR_STRING_LEN] = "";
3069 bool rx_swr_master_node = false;
3070
3071 rx_priv = container_of(work, struct rx_macro_priv,
3072 rx_macro_add_child_devices_work);
3073 if (!rx_priv) {
3074 pr_err("%s: Memory for rx_priv does not exist\n",
3075 __func__);
3076 return;
3077 }
3078
3079 if (!rx_priv->dev) {
3080 pr_err("%s: RX device does not exist\n", __func__);
3081 return;
3082 }
3083
3084 if(!rx_priv->dev->of_node) {
3085 dev_err(rx_priv->dev,
3086 "%s: DT node for RX dev does not exist\n", __func__);
3087 return;
3088 }
3089
3090 platdata = &rx_priv->swr_plat_data;
3091 rx_priv->child_count = 0;
3092
3093 for_each_available_child_of_node(rx_priv->dev->of_node, node) {
3094 rx_swr_master_node = false;
3095 if (strnstr(node->name, "rx_swr_master",
3096 strlen("rx_swr_master")) != NULL)
3097 rx_swr_master_node = true;
3098
3099 if(rx_swr_master_node)
3100 strlcpy(plat_dev_name, "rx_swr_ctrl",
3101 (RX_SWR_STRING_LEN - 1));
3102 else
3103 strlcpy(plat_dev_name, node->name,
3104 (RX_SWR_STRING_LEN - 1));
3105
3106 pdev = platform_device_alloc(plat_dev_name, -1);
3107 if (!pdev) {
3108 dev_err(rx_priv->dev, "%s: pdev memory alloc failed\n",
3109 __func__);
3110 ret = -ENOMEM;
3111 goto err;
3112 }
3113 pdev->dev.parent = rx_priv->dev;
3114 pdev->dev.of_node = node;
3115
3116 if (rx_swr_master_node) {
3117 ret = platform_device_add_data(pdev, platdata,
3118 sizeof(*platdata));
3119 if (ret) {
3120 dev_err(&pdev->dev,
3121 "%s: cannot add plat data ctrl:%d\n",
3122 __func__, ctrl_num);
3123 goto fail_pdev_add;
3124 }
3125 }
3126
3127 ret = platform_device_add(pdev);
3128 if (ret) {
3129 dev_err(&pdev->dev,
3130 "%s: Cannot add platform device\n",
3131 __func__);
3132 goto fail_pdev_add;
3133 }
3134
3135 if (rx_swr_master_node) {
3136 temp = krealloc(swr_ctrl_data,
3137 (ctrl_num + 1) * sizeof(
3138 struct rx_swr_ctrl_data),
3139 GFP_KERNEL);
3140 if (!temp) {
3141 ret = -ENOMEM;
3142 goto fail_pdev_add;
3143 }
3144 swr_ctrl_data = temp;
3145 swr_ctrl_data[ctrl_num].rx_swr_pdev = pdev;
3146 ctrl_num++;
3147 dev_dbg(&pdev->dev,
3148 "%s: Added soundwire ctrl device(s)\n",
3149 __func__);
3150 rx_priv->swr_ctrl_data = swr_ctrl_data;
3151 }
3152 if (rx_priv->child_count < RX_MACRO_CHILD_DEVICES_MAX)
3153 rx_priv->pdev_child_devices[
3154 rx_priv->child_count++] = pdev;
3155 else
3156 goto err;
3157 }
3158 return;
3159fail_pdev_add:
3160 for (count = 0; count < rx_priv->child_count; count++)
3161 platform_device_put(rx_priv->pdev_child_devices[count]);
3162err:
3163 return;
3164}
3165
3166static void rx_macro_init_ops(struct macro_ops *ops, char __iomem *rx_io_base)
3167{
3168 memset(ops, 0, sizeof(struct macro_ops));
3169 ops->init = rx_macro_init;
3170 ops->exit = rx_macro_deinit;
3171 ops->io_base = rx_io_base;
3172 ops->dai_ptr = rx_macro_dai;
3173 ops->num_dais = ARRAY_SIZE(rx_macro_dai);
3174 ops->mclk_fn = rx_macro_mclk_ctrl;
Laxminath Kasam497a6512018-09-17 16:11:52 +05303175 ops->event_handler = rx_macro_event_handler;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303176}
3177
3178static int rx_macro_probe(struct platform_device *pdev)
3179{
3180 struct macro_ops ops = {0};
3181 struct rx_macro_priv *rx_priv = NULL;
3182 u32 rx_base_addr = 0, muxsel = 0;
3183 char __iomem *rx_io_base = NULL, *muxsel_io = NULL;
3184 int ret = 0;
3185 struct clk *rx_core_clk = NULL, *rx_npl_clk = NULL;
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303186 u8 bcl_pmic_params[3];
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303187
3188 rx_priv = devm_kzalloc(&pdev->dev, sizeof(struct rx_macro_priv),
3189 GFP_KERNEL);
3190 if (!rx_priv)
3191 return -ENOMEM;
3192
3193 rx_priv->dev = &pdev->dev;
3194 ret = of_property_read_u32(pdev->dev.of_node, "reg",
3195 &rx_base_addr);
3196 if (ret) {
3197 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3198 __func__, "reg");
3199 return ret;
3200 }
3201 ret = of_property_read_u32(pdev->dev.of_node, "qcom,rx_mclk_mode_muxsel",
3202 &muxsel);
3203 if (ret) {
3204 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3205 __func__, "reg");
3206 return ret;
3207 }
3208 rx_priv->rx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
3209 "qcom,rx-swr-gpios", 0);
3210 if (!rx_priv->rx_swr_gpio_p) {
3211 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
3212 __func__);
3213 return -EINVAL;
3214 }
3215 rx_io_base = devm_ioremap(&pdev->dev, rx_base_addr,
3216 RX_MACRO_MAX_OFFSET);
3217 if (!rx_io_base) {
3218 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
3219 return -ENOMEM;
3220 }
3221 rx_priv->rx_io_base = rx_io_base;
3222 muxsel_io = devm_ioremap(&pdev->dev, muxsel, 0x4);
3223 if (!muxsel_io) {
3224 dev_err(&pdev->dev, "%s: ioremap failed for muxsel\n",
3225 __func__);
3226 return -ENOMEM;
3227 }
3228 rx_priv->rx_mclk_mode_muxsel = muxsel_io;
3229 INIT_WORK(&rx_priv->rx_macro_add_child_devices_work,
3230 rx_macro_add_child_devices);
3231 rx_priv->swr_plat_data.handle = (void *) rx_priv;
3232 rx_priv->swr_plat_data.read = NULL;
3233 rx_priv->swr_plat_data.write = NULL;
3234 rx_priv->swr_plat_data.bulk_write = NULL;
3235 rx_priv->swr_plat_data.clk = rx_swrm_clock;
3236 rx_priv->swr_plat_data.handle_irq = NULL;
3237
3238 /* Register MCLK for rx macro */
3239 rx_core_clk = devm_clk_get(&pdev->dev, "rx_core_clk");
3240 if (IS_ERR(rx_core_clk)) {
3241 ret = PTR_ERR(rx_core_clk);
3242 dev_err(&pdev->dev, "%s: clk get %s failed %d\n",
3243 __func__, "rx_core_clk", ret);
3244 return ret;
3245 }
3246 rx_priv->rx_core_clk = rx_core_clk;
3247 /* Register npl clk for soundwire */
3248 rx_npl_clk = devm_clk_get(&pdev->dev, "rx_npl_clk");
3249 if (IS_ERR(rx_npl_clk)) {
3250 ret = PTR_ERR(rx_npl_clk);
3251 dev_err(&pdev->dev, "%s: clk get %s failed %d\n",
3252 __func__, "rx_npl_clk", ret);
3253 return ret;
3254 }
3255 rx_priv->rx_npl_clk = rx_npl_clk;
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303256
3257 ret = of_property_read_u8_array(pdev->dev.of_node,
3258 "qcom,rx-bcl-pmic-params", bcl_pmic_params,
3259 sizeof(bcl_pmic_params));
3260 if (ret) {
3261 dev_dbg(&pdev->dev, "%s: could not find %s entry in dt\n",
3262 __func__, "qcom,rx-bcl-pmic-params");
3263 } else {
3264 rx_priv->bcl_pmic_params.id = bcl_pmic_params[0];
3265 rx_priv->bcl_pmic_params.sid = bcl_pmic_params[1];
3266 rx_priv->bcl_pmic_params.ppid = bcl_pmic_params[2];
3267 }
3268
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303269 dev_set_drvdata(&pdev->dev, rx_priv);
3270 mutex_init(&rx_priv->mclk_lock);
3271 mutex_init(&rx_priv->swr_clk_lock);
3272 rx_macro_init_ops(&ops, rx_io_base);
3273
3274 ret = bolero_register_macro(&pdev->dev, RX_MACRO, &ops);
3275 if (ret) {
3276 dev_err(&pdev->dev,
3277 "%s: register macro failed\n", __func__);
3278 goto err_reg_macro;
3279 }
3280 schedule_work(&rx_priv->rx_macro_add_child_devices_work);
3281
3282 return 0;
3283
3284err_reg_macro:
3285 mutex_destroy(&rx_priv->mclk_lock);
3286 mutex_destroy(&rx_priv->swr_clk_lock);
3287 return ret;
3288}
3289
3290static int rx_macro_remove(struct platform_device *pdev)
3291{
3292 struct rx_macro_priv *rx_priv = NULL;
3293 u16 count = 0;
3294
3295 rx_priv = dev_get_drvdata(&pdev->dev);
3296
3297 if (!rx_priv)
3298 return -EINVAL;
3299
3300 for (count = 0; count < rx_priv->child_count &&
3301 count < RX_MACRO_CHILD_DEVICES_MAX; count++)
3302 platform_device_unregister(rx_priv->pdev_child_devices[count]);
3303
3304 bolero_unregister_macro(&pdev->dev, RX_MACRO);
3305 mutex_destroy(&rx_priv->mclk_lock);
3306 mutex_destroy(&rx_priv->swr_clk_lock);
3307 kfree(rx_priv->swr_ctrl_data);
3308 return 0;
3309}
3310
3311static const struct of_device_id rx_macro_dt_match[] = {
3312 {.compatible = "qcom,rx-macro"},
3313 {}
3314};
3315
3316static struct platform_driver rx_macro_driver = {
3317 .driver = {
3318 .name = "rx_macro",
3319 .owner = THIS_MODULE,
3320 .of_match_table = rx_macro_dt_match,
3321 },
3322 .probe = rx_macro_probe,
3323 .remove = rx_macro_remove,
3324};
3325
3326module_platform_driver(rx_macro_driver);
3327
3328MODULE_DESCRIPTION("RX macro driver");
3329MODULE_LICENSE("GPL v2");