blob: a0e189b5d5df6893dabc2f547ad4a66b1166f5cc [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;
1133 }
1134 return 0;
1135}
1136
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301137static int rx_macro_find_playback_dai_id_for_port(int port_id,
1138 struct rx_macro_priv *rx_priv)
1139{
1140 int i = 0;
1141
1142 for (i = RX_MACRO_AIF1_PB; i < RX_MACRO_MAX_DAIS; i++) {
1143 if (test_bit(port_id, &rx_priv->active_ch_mask[i]))
1144 return i;
1145 }
1146
1147 return -EINVAL;
1148}
1149
1150static int rx_macro_set_idle_detect_thr(struct snd_soc_codec *codec,
1151 struct rx_macro_priv *rx_priv,
1152 int interp, int path_type)
1153{
1154 int port_id[4] = { 0, 0, 0, 0 };
Laxminath Kasamb7f823c2018-08-02 13:23:11 +05301155 int *port_ptr = NULL;
1156 int num_ports = 0;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301157 int bit_width = 0, i = 0;
1158 int mux_reg = 0, mux_reg_val = 0;
1159 int dai_id = 0, idle_thr = 0;
1160
1161 if ((interp != INTERP_HPHL) && (interp != INTERP_HPHR))
1162 return 0;
1163
1164 if (!rx_priv->idle_det_cfg.hph_idle_detect_en)
1165 return 0;
1166
1167 port_ptr = &port_id[0];
1168 num_ports = 0;
1169
1170 /*
1171 * Read interpolator MUX input registers and find
1172 * which cdc_dma port is connected and store the port
1173 * numbers in port_id array.
1174 */
1175 if (path_type == INTERP_MIX_PATH) {
1176 mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT0_CFG1 +
1177 2 * interp;
1178 mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f;
1179
1180 if ((mux_reg_val >= INTn_2_INP_SEL_RX0) &&
1181 (mux_reg_val <= INTn_2_INP_SEL_RX5)) {
1182 *port_ptr++ = mux_reg_val - 1;
1183 num_ports++;
1184 }
1185 }
1186
1187 if (path_type == INTERP_MAIN_PATH) {
1188 mux_reg = BOLERO_CDC_RX_INP_MUX_RX_INT1_CFG0 +
1189 2 * (interp - 1);
1190 mux_reg_val = snd_soc_read(codec, mux_reg) & 0x0f;
1191 i = RX_MACRO_INTERP_MUX_NUM_INPUTS;
1192
1193 while (i) {
1194 if ((mux_reg_val >= INTn_1_INP_SEL_RX0) &&
1195 (mux_reg_val <= INTn_1_INP_SEL_RX5)) {
1196 *port_ptr++ = mux_reg_val -
1197 INTn_1_INP_SEL_RX0;
1198 num_ports++;
1199 }
1200 mux_reg_val = (snd_soc_read(codec, mux_reg) &
1201 0xf0) >> 4;
1202 mux_reg += 1;
1203 i--;
1204 }
1205 }
1206
1207 dev_dbg(codec->dev, "%s: num_ports: %d, ports[%d %d %d %d]\n",
1208 __func__, num_ports, port_id[0], port_id[1],
1209 port_id[2], port_id[3]);
1210
1211 i = 0;
1212 while (num_ports) {
1213 dai_id = rx_macro_find_playback_dai_id_for_port(port_id[i++],
1214 rx_priv);
1215
1216 if ((dai_id >= 0) && (dai_id < RX_MACRO_MAX_DAIS)) {
1217 dev_dbg(codec->dev, "%s: dai_id: %d bit_width: %d\n",
1218 __func__, dai_id,
1219 rx_priv->bit_width[dai_id]);
1220
1221 if (rx_priv->bit_width[dai_id] > bit_width)
1222 bit_width = rx_priv->bit_width[dai_id];
1223 }
1224 num_ports--;
1225 }
1226
1227 switch (bit_width) {
1228 case 16:
1229 idle_thr = 0xff; /* F16 */
1230 break;
1231 case 24:
1232 case 32:
1233 idle_thr = 0x03; /* F22 */
1234 break;
1235 default:
1236 idle_thr = 0x00;
1237 break;
1238 }
1239
1240 dev_dbg(codec->dev, "%s: (new) idle_thr: %d, (cur) idle_thr: %d\n",
1241 __func__, idle_thr, rx_priv->idle_det_cfg.hph_idle_thr);
1242
1243 if ((rx_priv->idle_det_cfg.hph_idle_thr == 0) ||
1244 (idle_thr < rx_priv->idle_det_cfg.hph_idle_thr)) {
1245 snd_soc_write(codec, BOLERO_CDC_RX_IDLE_DETECT_CFG3, idle_thr);
1246 rx_priv->idle_det_cfg.hph_idle_thr = idle_thr;
1247 }
1248
1249 return 0;
1250}
1251
1252static int rx_macro_enable_mix_path(struct snd_soc_dapm_widget *w,
1253 struct snd_kcontrol *kcontrol, int event)
1254{
1255 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1256 u16 gain_reg = 0, mix_reg = 0;
1257 struct device *rx_dev = NULL;
1258 struct rx_macro_priv *rx_priv = NULL;
1259
1260 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1261 return -EINVAL;
1262
1263 if (w->shift >= INTERP_MAX) {
1264 dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n",
1265 __func__, w->shift, w->name);
1266 return -EINVAL;
1267 }
1268
1269 gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL +
1270 (w->shift * RX_MACRO_RX_PATH_OFFSET);
1271 mix_reg = BOLERO_CDC_RX_RX0_RX_PATH_MIX_CTL +
1272 (w->shift * RX_MACRO_RX_PATH_OFFSET);
1273
1274 dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name);
1275
1276 switch (event) {
1277 case SND_SOC_DAPM_PRE_PMU:
1278 rx_macro_set_idle_detect_thr(codec, rx_priv, w->shift,
1279 INTERP_MIX_PATH);
1280 rx_macro_enable_interp_clk(codec, event, w->shift);
1281 /* Clk enable */
1282 snd_soc_update_bits(codec, mix_reg, 0x20, 0x20);
1283 break;
1284 case SND_SOC_DAPM_POST_PMU:
1285 snd_soc_write(codec, gain_reg,
1286 snd_soc_read(codec, gain_reg));
1287 break;
1288 case SND_SOC_DAPM_POST_PMD:
1289 /* Clk Disable */
1290 snd_soc_update_bits(codec, mix_reg, 0x20, 0x00);
1291 rx_macro_enable_interp_clk(codec, event, w->shift);
1292 /* Reset enable and disable */
1293 snd_soc_update_bits(codec, mix_reg, 0x40, 0x40);
1294 snd_soc_update_bits(codec, mix_reg, 0x40, 0x00);
1295 break;
1296 }
1297
1298 return 0;
1299}
1300
1301static int rx_macro_enable_main_path(struct snd_soc_dapm_widget *w,
1302 struct snd_kcontrol *kcontrol,
1303 int event)
1304{
1305 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1306 u16 gain_reg = 0;
1307 u16 reg = 0;
1308 struct device *rx_dev = NULL;
1309 struct rx_macro_priv *rx_priv = NULL;
1310
1311 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1312 return -EINVAL;
1313
1314 dev_dbg(codec->dev, "%s %d %s\n", __func__, event, w->name);
1315
1316 if (w->shift >= INTERP_MAX) {
1317 dev_err(codec->dev, "%s: Invalid Interpolator value %d for name %s\n",
1318 __func__, w->shift, w->name);
1319 return -EINVAL;
1320 }
1321
1322 reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL + (w->shift *
1323 RX_MACRO_RX_PATH_OFFSET);
1324 gain_reg = BOLERO_CDC_RX_RX0_RX_VOL_CTL + (w->shift *
1325 RX_MACRO_RX_PATH_OFFSET);
1326
1327 switch (event) {
1328 case SND_SOC_DAPM_PRE_PMU:
1329 rx_macro_set_idle_detect_thr(codec, rx_priv, w->shift,
1330 INTERP_MAIN_PATH);
1331 rx_macro_enable_interp_clk(codec, event, w->shift);
1332 break;
1333 case SND_SOC_DAPM_POST_PMU:
1334 snd_soc_write(codec, gain_reg,
1335 snd_soc_read(codec, gain_reg));
1336 break;
1337 case SND_SOC_DAPM_POST_PMD:
1338 rx_macro_enable_interp_clk(codec, event, w->shift);
1339 break;
1340 }
1341
1342 return 0;
1343}
1344
1345static int rx_macro_config_compander(struct snd_soc_codec *codec,
1346 struct rx_macro_priv *rx_priv,
1347 int interp_n, int event)
1348{
1349 int comp = 0;
1350 u16 comp_ctl0_reg = 0, rx_path_cfg0_reg = 0;
1351
1352 /* AUX does not have compander */
1353 if (interp_n == INTERP_AUX)
1354 return 0;
1355
1356 comp = interp_n;
1357 dev_dbg(codec->dev, "%s: event %d compander %d, enabled %d\n",
1358 __func__, event, comp + 1, rx_priv->comp_enabled[comp]);
1359
1360 if (!rx_priv->comp_enabled[comp])
1361 return 0;
1362
1363 comp_ctl0_reg = BOLERO_CDC_RX_COMPANDER0_CTL0 +
1364 (comp * RX_MACRO_COMP_OFFSET);
1365 rx_path_cfg0_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG0 +
1366 (comp * RX_MACRO_RX_PATH_OFFSET);
1367
1368 if (SND_SOC_DAPM_EVENT_ON(event)) {
1369 /* Enable Compander Clock */
1370 snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x01);
1371 snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02);
1372 snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00);
1373 snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x02);
1374 }
1375
1376 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1377 snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x04);
1378 snd_soc_update_bits(codec, rx_path_cfg0_reg, 0x02, 0x00);
1379 snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x02);
1380 snd_soc_update_bits(codec, comp_ctl0_reg, 0x02, 0x00);
1381 snd_soc_update_bits(codec, comp_ctl0_reg, 0x01, 0x00);
1382 snd_soc_update_bits(codec, comp_ctl0_reg, 0x04, 0x00);
1383 }
1384
1385 return 0;
1386}
1387
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301388static void rx_macro_enable_softclip_clk(struct snd_soc_codec *codec,
1389 struct rx_macro_priv *rx_priv,
1390 bool enable)
1391{
1392 if (enable) {
1393 if (rx_priv->softclip_clk_users == 0)
1394 snd_soc_update_bits(codec,
1395 BOLERO_CDC_RX_SOFTCLIP_CRC,
1396 0x01, 0x01);
1397 rx_priv->softclip_clk_users++;
1398 } else {
1399 rx_priv->softclip_clk_users--;
1400 if (rx_priv->softclip_clk_users == 0)
1401 snd_soc_update_bits(codec,
1402 BOLERO_CDC_RX_SOFTCLIP_CRC,
1403 0x01, 0x00);
1404 }
1405}
1406
1407static int rx_macro_config_softclip(struct snd_soc_codec *codec,
1408 struct rx_macro_priv *rx_priv,
1409 int event)
1410{
1411 dev_dbg(codec->dev, "%s: event %d, enabled %d\n",
1412 __func__, event, rx_priv->is_softclip_on);
1413
1414 if (!rx_priv->is_softclip_on)
1415 return 0;
1416
1417 if (SND_SOC_DAPM_EVENT_ON(event)) {
1418 /* Enable Softclip clock */
1419 rx_macro_enable_softclip_clk(codec, rx_priv, true);
1420 /* Enable Softclip control */
1421 snd_soc_update_bits(codec,
1422 BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x01);
1423 }
1424
1425 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1426 snd_soc_update_bits(codec,
1427 BOLERO_CDC_RX_SOFTCLIP_SOFTCLIP_CTRL, 0x01, 0x00);
1428 rx_macro_enable_softclip_clk(codec, rx_priv, false);
1429 }
1430
1431 return 0;
1432}
1433
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301434static inline void
1435rx_macro_enable_clsh_block(struct rx_macro_priv *rx_priv, bool enable)
1436{
1437 if ((enable && ++rx_priv->clsh_users == 1) ||
1438 (!enable && --rx_priv->clsh_users == 0))
1439 snd_soc_update_bits(rx_priv->codec,
1440 BOLERO_CDC_RX_CLSH_CRC, 0x01,
1441 (u8) enable);
1442 if (rx_priv->clsh_users < 0)
1443 rx_priv->clsh_users = 0;
1444 dev_dbg(rx_priv->dev, "%s: clsh_users %d, enable %d", __func__,
1445 rx_priv->clsh_users, enable);
1446}
1447
1448static int rx_macro_config_classh(struct snd_soc_codec *codec,
1449 struct rx_macro_priv *rx_priv,
1450 int interp_n, int event)
1451{
1452 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1453 rx_macro_enable_clsh_block(rx_priv, false);
1454 return 0;
1455 }
1456
1457 if (!SND_SOC_DAPM_EVENT_ON(event))
1458 return 0;
1459
1460 rx_macro_enable_clsh_block(rx_priv, true);
1461 if (interp_n == INTERP_HPHL ||
1462 interp_n == INTERP_HPHR) {
1463 /*
1464 * These K1 values depend on the Headphone Impedance
1465 * For now it is assumed to be 16 ohm
1466 */
1467 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_K1_LSB,
1468 0xFF, 0xC0);
1469 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_K1_MSB,
1470 0x0F, 0x00);
1471 }
1472 switch (interp_n) {
1473 case INTERP_HPHL:
1474 if (rx_priv->is_ear_mode_on)
1475 snd_soc_update_bits(codec,
1476 BOLERO_CDC_RX_CLSH_HPH_V_PA,
1477 0x3F, 0x39);
1478 else
1479 snd_soc_update_bits(codec,
1480 BOLERO_CDC_RX_CLSH_HPH_V_PA,
1481 0x3F, 0x1C);
1482 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_DECAY_CTRL,
1483 0x07, 0x00);
1484 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG0,
1485 0x40, 0x40);
1486 break;
1487 case INTERP_HPHR:
1488 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_HPH_V_PA,
1489 0x3F, 0x1C);
1490 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_DECAY_CTRL,
1491 0x07, 0x00);
1492 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG0,
1493 0x40, 0x40);
1494 break;
1495 case INTERP_AUX:
1496 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG0,
1497 0x10, 0x10);
1498 break;
1499 }
1500
1501 return 0;
1502}
1503
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301504static void rx_macro_hd2_control(struct snd_soc_codec *codec,
1505 u16 interp_idx, int event)
1506{
1507 u16 hd2_scale_reg = 0;
1508 u16 hd2_enable_reg = 0;
1509
1510 switch (interp_idx) {
1511 case INTERP_HPHL:
1512 hd2_scale_reg = BOLERO_CDC_RX_RX1_RX_PATH_SEC3;
1513 hd2_enable_reg = BOLERO_CDC_RX_RX1_RX_PATH_CFG0;
1514 break;
1515 case INTERP_HPHR:
1516 hd2_scale_reg = BOLERO_CDC_RX_RX2_RX_PATH_SEC3;
1517 hd2_enable_reg = BOLERO_CDC_RX_RX2_RX_PATH_CFG0;
1518 break;
1519 }
1520
1521 if (hd2_enable_reg && SND_SOC_DAPM_EVENT_ON(event)) {
1522 snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x14);
1523 snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x04);
1524 }
1525
1526 if (hd2_enable_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
1527 snd_soc_update_bits(codec, hd2_enable_reg, 0x04, 0x00);
1528 snd_soc_update_bits(codec, hd2_scale_reg, 0x3C, 0x00);
1529 }
1530}
1531
1532static int rx_macro_get_compander(struct snd_kcontrol *kcontrol,
1533 struct snd_ctl_elem_value *ucontrol)
1534{
1535 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1536 int comp = ((struct soc_multi_mixer_control *)
1537 kcontrol->private_value)->shift;
1538 struct device *rx_dev = NULL;
1539 struct rx_macro_priv *rx_priv = NULL;
1540
1541 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1542 return -EINVAL;
1543
1544 ucontrol->value.integer.value[0] = rx_priv->comp_enabled[comp];
1545 return 0;
1546}
1547
1548static int rx_macro_set_compander(struct snd_kcontrol *kcontrol,
1549 struct snd_ctl_elem_value *ucontrol)
1550{
1551 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1552 int comp = ((struct soc_multi_mixer_control *)
1553 kcontrol->private_value)->shift;
1554 int value = ucontrol->value.integer.value[0];
1555 struct device *rx_dev = NULL;
1556 struct rx_macro_priv *rx_priv = NULL;
1557
1558 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1559 return -EINVAL;
1560
1561 dev_dbg(codec->dev, "%s: Compander %d enable current %d, new %d\n",
1562 __func__, comp + 1, rx_priv->comp_enabled[comp], value);
1563 rx_priv->comp_enabled[comp] = value;
1564
1565 return 0;
1566}
1567
1568static int rx_macro_mux_get(struct snd_kcontrol *kcontrol,
1569 struct snd_ctl_elem_value *ucontrol)
1570{
1571 struct snd_soc_dapm_widget *widget =
1572 snd_soc_dapm_kcontrol_widget(kcontrol);
1573 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
1574 struct device *rx_dev = NULL;
1575 struct rx_macro_priv *rx_priv = NULL;
1576
1577 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1578 return -EINVAL;
1579
1580 ucontrol->value.integer.value[0] =
1581 rx_priv->rx_port_value[widget->shift];
1582 return 0;
1583}
1584
1585static int rx_macro_mux_put(struct snd_kcontrol *kcontrol,
1586 struct snd_ctl_elem_value *ucontrol)
1587{
1588 struct snd_soc_dapm_widget *widget =
1589 snd_soc_dapm_kcontrol_widget(kcontrol);
1590 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
1591 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
1592 struct snd_soc_dapm_update *update = NULL;
1593 u32 rx_port_value = ucontrol->value.integer.value[0];
1594 u32 aif_rst = 0;
1595 struct device *rx_dev = NULL;
1596 struct rx_macro_priv *rx_priv = NULL;
1597
1598 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1599 return -EINVAL;
1600
1601 aif_rst = rx_priv->rx_port_value[widget->shift];
1602 if (!rx_port_value) {
1603 if (aif_rst == 0) {
1604 dev_err(rx_dev, "%s:AIF reset already\n", __func__);
1605 return 0;
1606 }
1607 }
1608 rx_priv->rx_port_value[widget->shift] = rx_port_value;
1609
1610 switch (rx_port_value) {
1611 case 0:
1612 clear_bit(widget->shift,
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +05301613 &rx_priv->active_ch_mask[aif_rst]);
1614 rx_priv->active_ch_cnt[aif_rst]--;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301615 break;
1616 case 1:
1617 case 2:
1618 case 3:
1619 case 4:
1620 set_bit(widget->shift,
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +05301621 &rx_priv->active_ch_mask[rx_port_value]);
1622 rx_priv->active_ch_cnt[rx_port_value]++;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301623 break;
1624 default:
1625 dev_err(codec->dev,
1626 "%s:Invalid AIF_ID for RX_MACRO MUX\n", __func__);
1627 goto err;
1628 }
1629
1630 snd_soc_dapm_mux_update_power(widget->dapm, kcontrol,
1631 rx_port_value, e, update);
1632 return 0;
1633err:
1634 return -EINVAL;
1635}
1636
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301637static int rx_macro_get_ear_mode(struct snd_kcontrol *kcontrol,
1638 struct snd_ctl_elem_value *ucontrol)
1639{
1640 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1641 struct device *rx_dev = NULL;
1642 struct rx_macro_priv *rx_priv = NULL;
1643
1644 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1645 return -EINVAL;
1646
1647 ucontrol->value.integer.value[0] = rx_priv->is_ear_mode_on;
1648 return 0;
1649}
1650
1651static int rx_macro_put_ear_mode(struct snd_kcontrol *kcontrol,
1652 struct snd_ctl_elem_value *ucontrol)
1653{
1654 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1655 struct device *rx_dev = NULL;
1656 struct rx_macro_priv *rx_priv = NULL;
1657
1658 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1659 return -EINVAL;
1660
1661 rx_priv->is_ear_mode_on =
1662 (!ucontrol->value.integer.value[0] ? false : true);
1663 return 0;
1664}
1665
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301666static int rx_macro_vbat_bcl_gsm_mode_func_get(struct snd_kcontrol *kcontrol,
1667 struct snd_ctl_elem_value *ucontrol)
1668{
1669 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1670
1671 ucontrol->value.integer.value[0] =
1672 ((snd_soc_read(codec, BOLERO_CDC_RX_BCL_VBAT_CFG) & 0x04) ?
1673 1 : 0);
1674
1675 dev_dbg(codec->dev, "%s: value: %lu\n", __func__,
1676 ucontrol->value.integer.value[0]);
1677
1678 return 0;
1679}
1680
1681static int rx_macro_vbat_bcl_gsm_mode_func_put(struct snd_kcontrol *kcontrol,
1682 struct snd_ctl_elem_value *ucontrol)
1683{
1684 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1685
1686 dev_dbg(codec->dev, "%s: value: %lu\n", __func__,
1687 ucontrol->value.integer.value[0]);
1688
1689 /* Set Vbat register configuration for GSM mode bit based on value */
1690 if (ucontrol->value.integer.value[0])
1691 snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG,
1692 0x04, 0x04);
1693 else
1694 snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG,
1695 0x04, 0x00);
1696
1697 return 0;
1698}
1699
1700static int rx_macro_soft_clip_enable_get(struct snd_kcontrol *kcontrol,
1701 struct snd_ctl_elem_value *ucontrol)
1702{
1703 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1704 struct device *rx_dev = NULL;
1705 struct rx_macro_priv *rx_priv = NULL;
1706
1707 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1708 return -EINVAL;
1709
1710 ucontrol->value.integer.value[0] = rx_priv->is_softclip_on;
1711
1712 dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
1713 __func__, ucontrol->value.integer.value[0]);
1714
1715 return 0;
1716}
1717
1718static int rx_macro_soft_clip_enable_put(struct snd_kcontrol *kcontrol,
1719 struct snd_ctl_elem_value *ucontrol)
1720{
1721 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
1722 struct device *rx_dev = NULL;
1723 struct rx_macro_priv *rx_priv = NULL;
1724
1725 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1726 return -EINVAL;
1727
1728 rx_priv->is_softclip_on = ucontrol->value.integer.value[0];
1729
1730 dev_dbg(codec->dev, "%s: soft clip enable = %d\n", __func__,
1731 rx_priv->is_softclip_on);
1732
1733 return 0;
1734}
1735
1736static int rx_macro_enable_vbat(struct snd_soc_dapm_widget *w,
1737 struct snd_kcontrol *kcontrol,
1738 int event)
1739{
1740 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
1741 struct device *rx_dev = NULL;
1742 struct rx_macro_priv *rx_priv = NULL;
1743
1744 dev_dbg(codec->dev, "%s %s %d\n", __func__, w->name, event);
1745 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1746 return -EINVAL;
1747
1748 switch (event) {
1749 case SND_SOC_DAPM_PRE_PMU:
1750 /* Enable clock for VBAT block */
1751 snd_soc_update_bits(codec,
1752 BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x10);
1753 /* Enable VBAT block */
1754 snd_soc_update_bits(codec,
1755 BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x01);
1756 /* Update interpolator with 384K path */
1757 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1758 0x80, 0x80);
1759 /* Update DSM FS rate */
1760 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7,
1761 0x02, 0x02);
1762 /* Use attenuation mode */
1763 snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG,
1764 0x02, 0x00);
1765 /* BCL block needs softclip clock to be enabled */
1766 rx_macro_enable_softclip_clk(codec, rx_priv, true);
1767 /* Enable VBAT at channel level */
1768 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1769 0x02, 0x02);
1770 /* Set the ATTK1 gain */
1771 snd_soc_update_bits(codec,
1772 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1,
1773 0xFF, 0xFF);
1774 snd_soc_update_bits(codec,
1775 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2,
1776 0xFF, 0x03);
1777 snd_soc_update_bits(codec,
1778 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3,
1779 0xFF, 0x00);
1780 /* Set the ATTK2 gain */
1781 snd_soc_update_bits(codec,
1782 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4,
1783 0xFF, 0xFF);
1784 snd_soc_update_bits(codec,
1785 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5,
1786 0xFF, 0x03);
1787 snd_soc_update_bits(codec,
1788 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6,
1789 0xFF, 0x00);
1790 /* Set the ATTK3 gain */
1791 snd_soc_update_bits(codec,
1792 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7,
1793 0xFF, 0xFF);
1794 snd_soc_update_bits(codec,
1795 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8,
1796 0xFF, 0x03);
1797 snd_soc_update_bits(codec,
1798 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9,
1799 0xFF, 0x00);
1800 break;
1801
1802 case SND_SOC_DAPM_POST_PMD:
1803 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1804 0x80, 0x00);
1805 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7,
1806 0x02, 0x00);
1807 snd_soc_update_bits(codec, BOLERO_CDC_RX_BCL_VBAT_CFG,
1808 0x02, 0x02);
1809 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG1,
1810 0x02, 0x00);
1811 snd_soc_update_bits(codec,
1812 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD1,
1813 0xFF, 0x00);
1814 snd_soc_update_bits(codec,
1815 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD2,
1816 0xFF, 0x00);
1817 snd_soc_update_bits(codec,
1818 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD3,
1819 0xFF, 0x00);
1820 snd_soc_update_bits(codec,
1821 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD4,
1822 0xFF, 0x00);
1823 snd_soc_update_bits(codec,
1824 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD5,
1825 0xFF, 0x00);
1826 snd_soc_update_bits(codec,
1827 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD6,
1828 0xFF, 0x00);
1829 snd_soc_update_bits(codec,
1830 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD7,
1831 0xFF, 0x00);
1832 snd_soc_update_bits(codec,
1833 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD8,
1834 0xFF, 0x00);
1835 snd_soc_update_bits(codec,
1836 BOLERO_CDC_RX_BCL_VBAT_BCL_GAIN_UPD9,
1837 0xFF, 0x00);
1838 rx_macro_enable_softclip_clk(codec, rx_priv, false);
1839 snd_soc_update_bits(codec,
1840 BOLERO_CDC_RX_BCL_VBAT_CFG, 0x01, 0x00);
1841 snd_soc_update_bits(codec,
1842 BOLERO_CDC_RX_BCL_VBAT_PATH_CTL, 0x10, 0x00);
1843 break;
1844 default:
1845 dev_err(rx_dev, "%s: Invalid event %d\n", __func__, event);
1846 break;
1847 }
1848 return 0;
1849}
1850
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301851static void rx_macro_idle_detect_control(struct snd_soc_codec *codec,
1852 struct rx_macro_priv *rx_priv,
1853 int interp, int event)
1854{
1855 int reg = 0, mask = 0, val = 0;
1856
1857 if (!rx_priv->idle_det_cfg.hph_idle_detect_en)
1858 return;
1859
1860 if (interp == INTERP_HPHL) {
1861 reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL;
1862 mask = 0x01;
1863 val = 0x01;
1864 }
1865 if (interp == INTERP_HPHR) {
1866 reg = BOLERO_CDC_RX_IDLE_DETECT_PATH_CTL;
1867 mask = 0x02;
1868 val = 0x02;
1869 }
1870
1871 if (reg && SND_SOC_DAPM_EVENT_ON(event))
1872 snd_soc_update_bits(codec, reg, mask, val);
1873
1874 if (reg && SND_SOC_DAPM_EVENT_OFF(event)) {
1875 snd_soc_update_bits(codec, reg, mask, 0x00);
1876 rx_priv->idle_det_cfg.hph_idle_thr = 0;
1877 snd_soc_write(codec, BOLERO_CDC_RX_IDLE_DETECT_CFG3, 0x0);
1878 }
1879}
1880
1881static void rx_macro_hphdelay_lutbypass(struct snd_soc_codec *codec,
1882 struct rx_macro_priv *rx_priv,
1883 u16 interp_idx, int event)
1884{
1885 u8 hph_dly_mask = 0;
1886 u16 hph_lut_bypass_reg = 0;
1887 u16 hph_comp_ctrl7 = 0;
1888
1889 switch (interp_idx) {
1890 case INTERP_HPHL:
1891 hph_dly_mask = 1;
1892 hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHL_COMP_LUT;
1893 hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER0_CTL7;
1894 break;
1895 case INTERP_HPHR:
1896 hph_dly_mask = 2;
1897 hph_lut_bypass_reg = BOLERO_CDC_RX_TOP_HPHR_COMP_LUT;
1898 hph_comp_ctrl7 = BOLERO_CDC_RX_COMPANDER1_CTL7;
1899 break;
1900 default:
1901 break;
1902 }
1903
1904 if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_ON(event)) {
1905 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_TEST0,
1906 hph_dly_mask, 0x0);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301907 if (interp_idx == INTERP_HPHL) {
1908 if (rx_priv->is_ear_mode_on)
1909 snd_soc_update_bits(codec,
1910 BOLERO_CDC_RX_RX0_RX_PATH_CFG1,
1911 0x02, 0x02);
1912 else
1913 snd_soc_update_bits(codec,
1914 hph_lut_bypass_reg,
1915 0x80, 0x80);
1916 } else {
1917 snd_soc_update_bits(codec,
1918 hph_lut_bypass_reg,
1919 0x80, 0x80);
1920 }
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301921 }
1922
1923 if (hph_lut_bypass_reg && SND_SOC_DAPM_EVENT_OFF(event)) {
1924 snd_soc_update_bits(codec, BOLERO_CDC_RX_CLSH_TEST0,
1925 hph_dly_mask, hph_dly_mask);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301926 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG1,
1927 0x02, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301928 snd_soc_update_bits(codec, hph_lut_bypass_reg, 0x80, 0x00);
1929 snd_soc_update_bits(codec, hph_comp_ctrl7, 0x20, 0x0);
1930 }
1931}
1932
1933static int rx_macro_enable_interp_clk(struct snd_soc_codec *codec,
1934 int event, int interp_idx)
1935{
1936 u16 main_reg = 0;
1937 struct device *rx_dev = NULL;
1938 struct rx_macro_priv *rx_priv = NULL;
1939
1940 if (!codec) {
1941 pr_err("%s: codec is NULL\n", __func__);
1942 return -EINVAL;
1943 }
1944
1945 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
1946 return -EINVAL;
1947
1948 main_reg = BOLERO_CDC_RX_RX0_RX_PATH_CTL +
1949 (interp_idx * RX_MACRO_RX_PATH_OFFSET);
1950
1951 if (SND_SOC_DAPM_EVENT_ON(event)) {
1952 if (rx_priv->main_clk_users[interp_idx] == 0) {
1953 /* Main path PGA mute enable */
1954 snd_soc_update_bits(codec, main_reg, 0x10, 0x10);
1955 /* Clk enable */
1956 snd_soc_update_bits(codec, main_reg, 0x20, 0x20);
1957 rx_macro_idle_detect_control(codec, rx_priv,
1958 interp_idx, event);
1959 rx_macro_hd2_control(codec, interp_idx, event);
1960 rx_macro_hphdelay_lutbypass(codec, rx_priv, interp_idx,
1961 event);
1962 rx_macro_config_compander(codec, rx_priv,
1963 interp_idx, event);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301964 if (interp_idx == INTERP_AUX)
1965 rx_macro_config_softclip(codec, rx_priv,
1966 event);
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301967 rx_macro_config_classh(codec, rx_priv,
1968 interp_idx, event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301969 }
1970 rx_priv->main_clk_users[interp_idx]++;
1971 }
1972
1973 if (SND_SOC_DAPM_EVENT_OFF(event)) {
1974 rx_priv->main_clk_users[interp_idx]--;
1975 if (rx_priv->main_clk_users[interp_idx] <= 0) {
1976 rx_priv->main_clk_users[interp_idx] = 0;
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05301977 rx_macro_config_classh(codec, rx_priv,
1978 interp_idx, event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301979 rx_macro_config_compander(codec, rx_priv,
1980 interp_idx, event);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05301981 if (interp_idx == INTERP_AUX)
1982 rx_macro_config_softclip(codec, rx_priv,
1983 event);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05301984 rx_macro_hphdelay_lutbypass(codec, rx_priv, interp_idx,
1985 event);
1986 rx_macro_hd2_control(codec, interp_idx, event);
1987 rx_macro_idle_detect_control(codec, rx_priv,
1988 interp_idx, event);
1989 /* Clk Disable */
1990 snd_soc_update_bits(codec, main_reg, 0x20, 0x00);
1991 /* Reset enable and disable */
1992 snd_soc_update_bits(codec, main_reg, 0x40, 0x40);
1993 snd_soc_update_bits(codec, main_reg, 0x40, 0x00);
1994 /* Reset rate to 48K*/
1995 snd_soc_update_bits(codec, main_reg, 0x0F, 0x04);
1996 }
1997 }
1998
1999 dev_dbg(codec->dev, "%s event %d main_clk_users %d\n",
2000 __func__, event, rx_priv->main_clk_users[interp_idx]);
2001
2002 return rx_priv->main_clk_users[interp_idx];
2003}
2004
2005static int rx_macro_enable_rx_path_clk(struct snd_soc_dapm_widget *w,
2006 struct snd_kcontrol *kcontrol, int event)
2007{
2008 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2009 u16 sidetone_reg = 0;
2010
2011 dev_dbg(codec->dev, "%s %d %d\n", __func__, event, w->shift);
2012 sidetone_reg = BOLERO_CDC_RX_RX0_RX_PATH_CFG1 +
2013 RX_MACRO_RX_PATH_OFFSET * (w->shift);
2014
2015 switch (event) {
2016 case SND_SOC_DAPM_PRE_PMU:
2017 rx_macro_enable_interp_clk(codec, event, w->shift);
2018 snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x10);
2019 break;
2020 case SND_SOC_DAPM_POST_PMD:
2021 snd_soc_update_bits(codec, sidetone_reg, 0x10, 0x00);
2022 rx_macro_enable_interp_clk(codec, event, w->shift);
2023 break;
2024 default:
2025 break;
2026 };
2027 return 0;
2028}
2029
2030static void rx_macro_restore_iir_coeff(struct rx_macro_priv *rx_priv, int iir_idx,
2031 int band_idx)
2032{
2033 u16 reg_add = 0, coeff_idx = 0, idx = 0;
2034 struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL);
2035
Tanya Dixit8530fb92018-09-14 16:01:25 +05302036 if (regmap == NULL) {
2037 dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__);
2038 return;
2039 }
2040
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302041 regmap_write(regmap,
2042 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2043 (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F);
2044
2045 reg_add = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx;
2046
2047 /* 5 coefficients per band and 4 writes per coefficient */
2048 for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX;
2049 coeff_idx++) {
2050 /* Four 8 bit values(one 32 bit) per coefficient */
2051 regmap_write(regmap, reg_add,
2052 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2053 regmap_write(regmap, reg_add,
2054 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2055 regmap_write(regmap, reg_add,
2056 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2057 regmap_write(regmap, reg_add,
2058 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++]);
2059 }
2060}
2061
2062static int rx_macro_iir_enable_audio_mixer_get(struct snd_kcontrol *kcontrol,
2063 struct snd_ctl_elem_value *ucontrol)
2064{
2065 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
2066 int iir_idx = ((struct soc_multi_mixer_control *)
2067 kcontrol->private_value)->reg;
2068 int band_idx = ((struct soc_multi_mixer_control *)
2069 kcontrol->private_value)->shift;
2070 /* IIR filter band registers are at integer multiples of 0x80 */
2071 u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx;
2072
2073 ucontrol->value.integer.value[0] = (snd_soc_read(codec, iir_reg) &
2074 (1 << band_idx)) != 0;
2075
2076 dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__,
2077 iir_idx, band_idx,
2078 (uint32_t)ucontrol->value.integer.value[0]);
2079 return 0;
2080}
2081
2082static int rx_macro_iir_enable_audio_mixer_put(struct snd_kcontrol *kcontrol,
2083 struct snd_ctl_elem_value *ucontrol)
2084{
2085 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
2086 int iir_idx = ((struct soc_multi_mixer_control *)
2087 kcontrol->private_value)->reg;
2088 int band_idx = ((struct soc_multi_mixer_control *)
2089 kcontrol->private_value)->shift;
2090 bool iir_band_en_status = 0;
2091 int value = ucontrol->value.integer.value[0];
2092 u16 iir_reg = BOLERO_CDC_RX_SIDETONE_IIR0_IIR_CTL + 0x80 * iir_idx;
2093 struct device *rx_dev = NULL;
2094 struct rx_macro_priv *rx_priv = NULL;
2095
2096 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
2097 return -EINVAL;
2098
2099 rx_macro_restore_iir_coeff(rx_priv, iir_idx, band_idx);
2100
2101 /* Mask first 5 bits, 6-8 are reserved */
2102 snd_soc_update_bits(codec, iir_reg, (1 << band_idx),
2103 (value << band_idx));
2104
2105 iir_band_en_status = ((snd_soc_read(codec, iir_reg) &
2106 (1 << band_idx)) != 0);
2107 dev_dbg(codec->dev, "%s: IIR #%d band #%d enable %d\n", __func__,
2108 iir_idx, band_idx, iir_band_en_status);
2109 return 0;
2110}
2111
2112static uint32_t get_iir_band_coeff(struct snd_soc_codec *codec,
2113 int iir_idx, int band_idx,
2114 int coeff_idx)
2115{
2116 uint32_t value = 0;
2117
2118 /* Address does not automatically update if reading */
2119 snd_soc_write(codec,
2120 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2121 ((band_idx * BAND_MAX + coeff_idx)
2122 * sizeof(uint32_t)) & 0x7F);
2123
2124 value |= snd_soc_read(codec,
2125 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx));
2126
2127 snd_soc_write(codec,
2128 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2129 ((band_idx * BAND_MAX + coeff_idx)
2130 * sizeof(uint32_t) + 1) & 0x7F);
2131
2132 value |= (snd_soc_read(codec,
2133 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2134 0x80 * iir_idx)) << 8);
2135
2136 snd_soc_write(codec,
2137 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2138 ((band_idx * BAND_MAX + coeff_idx)
2139 * sizeof(uint32_t) + 2) & 0x7F);
2140
2141 value |= (snd_soc_read(codec,
2142 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2143 0x80 * iir_idx)) << 16);
2144
2145 snd_soc_write(codec,
2146 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 0x80 * iir_idx),
2147 ((band_idx * BAND_MAX + coeff_idx)
2148 * sizeof(uint32_t) + 3) & 0x7F);
2149
2150 /* Mask bits top 2 bits since they are reserved */
2151 value |= ((snd_soc_read(codec,
2152 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL +
2153 16 * iir_idx)) & 0x3F) << 24);
2154
2155 return value;
2156}
2157
2158static int rx_macro_iir_band_audio_mixer_get(struct snd_kcontrol *kcontrol,
2159 struct snd_ctl_elem_value *ucontrol)
2160{
2161 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
2162 int iir_idx = ((struct soc_multi_mixer_control *)
2163 kcontrol->private_value)->reg;
2164 int band_idx = ((struct soc_multi_mixer_control *)
2165 kcontrol->private_value)->shift;
2166
2167 ucontrol->value.integer.value[0] =
2168 get_iir_band_coeff(codec, iir_idx, band_idx, 0);
2169 ucontrol->value.integer.value[1] =
2170 get_iir_band_coeff(codec, iir_idx, band_idx, 1);
2171 ucontrol->value.integer.value[2] =
2172 get_iir_band_coeff(codec, iir_idx, band_idx, 2);
2173 ucontrol->value.integer.value[3] =
2174 get_iir_band_coeff(codec, iir_idx, band_idx, 3);
2175 ucontrol->value.integer.value[4] =
2176 get_iir_band_coeff(codec, iir_idx, band_idx, 4);
2177
2178 dev_dbg(codec->dev, "%s: IIR #%d band #%d b0 = 0x%x\n"
2179 "%s: IIR #%d band #%d b1 = 0x%x\n"
2180 "%s: IIR #%d band #%d b2 = 0x%x\n"
2181 "%s: IIR #%d band #%d a1 = 0x%x\n"
2182 "%s: IIR #%d band #%d a2 = 0x%x\n",
2183 __func__, iir_idx, band_idx,
2184 (uint32_t)ucontrol->value.integer.value[0],
2185 __func__, iir_idx, band_idx,
2186 (uint32_t)ucontrol->value.integer.value[1],
2187 __func__, iir_idx, band_idx,
2188 (uint32_t)ucontrol->value.integer.value[2],
2189 __func__, iir_idx, band_idx,
2190 (uint32_t)ucontrol->value.integer.value[3],
2191 __func__, iir_idx, band_idx,
2192 (uint32_t)ucontrol->value.integer.value[4]);
2193 return 0;
2194}
2195
2196static void set_iir_band_coeff(struct snd_soc_codec *codec,
2197 int iir_idx, int band_idx,
2198 uint32_t value)
2199{
2200 snd_soc_write(codec,
2201 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2202 (value & 0xFF));
2203
2204 snd_soc_write(codec,
2205 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2206 (value >> 8) & 0xFF);
2207
2208 snd_soc_write(codec,
2209 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2210 (value >> 16) & 0xFF);
2211
2212 /* Mask top 2 bits, 7-8 are reserved */
2213 snd_soc_write(codec,
2214 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B2_CTL + 0x80 * iir_idx),
2215 (value >> 24) & 0x3F);
2216}
2217
2218static int rx_macro_iir_band_audio_mixer_put(struct snd_kcontrol *kcontrol,
2219 struct snd_ctl_elem_value *ucontrol)
2220{
2221 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
2222 int iir_idx = ((struct soc_multi_mixer_control *)
2223 kcontrol->private_value)->reg;
2224 int band_idx = ((struct soc_multi_mixer_control *)
2225 kcontrol->private_value)->shift;
2226 int coeff_idx, idx = 0;
2227 struct device *rx_dev = NULL;
2228 struct rx_macro_priv *rx_priv = NULL;
2229
2230 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
2231 return -EINVAL;
2232
2233 /*
2234 * Mask top bit it is reserved
2235 * Updates addr automatically for each B2 write
2236 */
2237 snd_soc_write(codec,
2238 (BOLERO_CDC_RX_SIDETONE_IIR0_IIR_COEF_B1_CTL + 16 * iir_idx),
2239 (band_idx * BAND_MAX * sizeof(uint32_t)) & 0x7F);
2240
2241 /* Store the coefficients in sidetone coeff array */
2242 for (coeff_idx = 0; coeff_idx < RX_MACRO_SIDETONE_IIR_COEFF_MAX;
2243 coeff_idx++) {
2244 uint32_t value = ucontrol->value.integer.value[coeff_idx];
2245
2246 set_iir_band_coeff(codec, iir_idx, band_idx, value);
2247
2248 /* Four 8 bit values(one 32 bit) per coefficient */
2249 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2250 (value & 0xFF);
2251 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2252 (value >> 8) & 0xFF;
2253 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2254 (value >> 16) & 0xFF;
2255 rx_priv->sidetone_coeff_array[iir_idx][band_idx][idx++] =
2256 (value >> 24) & 0xFF;
2257 }
2258
2259 pr_debug("%s: IIR #%d band #%d b0 = 0x%x\n"
2260 "%s: IIR #%d band #%d b1 = 0x%x\n"
2261 "%s: IIR #%d band #%d b2 = 0x%x\n"
2262 "%s: IIR #%d band #%d a1 = 0x%x\n"
2263 "%s: IIR #%d band #%d a2 = 0x%x\n",
2264 __func__, iir_idx, band_idx,
2265 get_iir_band_coeff(codec, iir_idx, band_idx, 0),
2266 __func__, iir_idx, band_idx,
2267 get_iir_band_coeff(codec, iir_idx, band_idx, 1),
2268 __func__, iir_idx, band_idx,
2269 get_iir_band_coeff(codec, iir_idx, band_idx, 2),
2270 __func__, iir_idx, band_idx,
2271 get_iir_band_coeff(codec, iir_idx, band_idx, 3),
2272 __func__, iir_idx, band_idx,
2273 get_iir_band_coeff(codec, iir_idx, band_idx, 4));
2274 return 0;
2275}
2276
2277static int rx_macro_set_iir_gain(struct snd_soc_dapm_widget *w,
2278 struct snd_kcontrol *kcontrol, int event)
2279{
2280 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
2281
2282 dev_dbg(codec->dev, "%s: event = %d\n", __func__, event);
2283
2284 switch (event) {
2285 case SND_SOC_DAPM_POST_PMU: /* fall through */
2286 case SND_SOC_DAPM_PRE_PMD:
2287 if (strnstr(w->name, "IIR0", sizeof("IIR0"))) {
2288 snd_soc_write(codec,
2289 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL,
2290 snd_soc_read(codec,
2291 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL));
2292 snd_soc_write(codec,
2293 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL,
2294 snd_soc_read(codec,
2295 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL));
2296 snd_soc_write(codec,
2297 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL,
2298 snd_soc_read(codec,
2299 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL));
2300 snd_soc_write(codec,
2301 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL,
2302 snd_soc_read(codec,
2303 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL));
2304 } else {
2305 snd_soc_write(codec,
2306 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL,
2307 snd_soc_read(codec,
2308 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL));
2309 snd_soc_write(codec,
2310 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL,
2311 snd_soc_read(codec,
2312 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL));
2313 snd_soc_write(codec,
2314 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL,
2315 snd_soc_read(codec,
2316 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL));
2317 snd_soc_write(codec,
2318 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL,
2319 snd_soc_read(codec,
2320 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL));
2321 }
2322 break;
2323 }
2324 return 0;
2325}
2326
2327static const struct snd_kcontrol_new rx_macro_snd_controls[] = {
2328 SOC_SINGLE_SX_TLV("RX_RX0 Digital Volume",
2329 BOLERO_CDC_RX_RX0_RX_VOL_CTL,
2330 0, -84, 40, digital_gain),
2331 SOC_SINGLE_SX_TLV("RX_RX1 Digital Volume",
2332 BOLERO_CDC_RX_RX1_RX_VOL_CTL,
2333 0, -84, 40, digital_gain),
2334 SOC_SINGLE_SX_TLV("RX_RX2 Digital Volume",
2335 BOLERO_CDC_RX_RX2_RX_VOL_CTL,
2336 0, -84, 40, digital_gain),
2337 SOC_SINGLE_SX_TLV("RX_RX0 Mix Digital Volume",
2338 BOLERO_CDC_RX_RX0_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2339 SOC_SINGLE_SX_TLV("RX_RX1 Mix Digital Volume",
2340 BOLERO_CDC_RX_RX1_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2341 SOC_SINGLE_SX_TLV("RX_RX2 Mix Digital Volume",
2342 BOLERO_CDC_RX_RX2_RX_VOL_MIX_CTL, 0, -84, 40, digital_gain),
2343
2344 SOC_SINGLE_EXT("RX_COMP1 Switch", SND_SOC_NOPM, RX_MACRO_COMP1, 1, 0,
2345 rx_macro_get_compander, rx_macro_set_compander),
2346 SOC_SINGLE_EXT("RX_COMP2 Switch", SND_SOC_NOPM, RX_MACRO_COMP2, 1, 0,
2347 rx_macro_get_compander, rx_macro_set_compander),
2348
Laxminath Kasamd2d8d9f2018-08-06 18:10:14 +05302349 SOC_ENUM_EXT("RX_EAR Mode", rx_macro_ear_mode_enum,
2350 rx_macro_get_ear_mode, rx_macro_put_ear_mode),
2351
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302352 SOC_ENUM_EXT("RX_GSM mode Enable", rx_macro_vbat_bcl_gsm_mode_enum,
2353 rx_macro_vbat_bcl_gsm_mode_func_get,
2354 rx_macro_vbat_bcl_gsm_mode_func_put),
2355 SOC_SINGLE_EXT("RX_Softclip Enable", SND_SOC_NOPM, 0, 1, 0,
2356 rx_macro_soft_clip_enable_get,
2357 rx_macro_soft_clip_enable_put),
2358
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302359 SOC_SINGLE_SX_TLV("IIR0 INP0 Volume",
2360 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B1_CTL, 0, -84, 40,
2361 digital_gain),
2362 SOC_SINGLE_SX_TLV("IIR0 INP1 Volume",
2363 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B2_CTL, 0, -84, 40,
2364 digital_gain),
2365 SOC_SINGLE_SX_TLV("IIR0 INP2 Volume",
2366 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B3_CTL, 0, -84, 40,
2367 digital_gain),
2368 SOC_SINGLE_SX_TLV("IIR0 INP3 Volume",
2369 BOLERO_CDC_RX_SIDETONE_IIR0_IIR_GAIN_B4_CTL, 0, -84, 40,
2370 digital_gain),
2371 SOC_SINGLE_SX_TLV("IIR1 INP0 Volume",
2372 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B1_CTL, 0, -84, 40,
2373 digital_gain),
2374 SOC_SINGLE_SX_TLV("IIR1 INP1 Volume",
2375 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B2_CTL, 0, -84, 40,
2376 digital_gain),
2377 SOC_SINGLE_SX_TLV("IIR1 INP2 Volume",
2378 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B3_CTL, 0, -84, 40,
2379 digital_gain),
2380 SOC_SINGLE_SX_TLV("IIR1 INP3 Volume",
2381 BOLERO_CDC_RX_SIDETONE_IIR1_IIR_GAIN_B4_CTL, 0, -84, 40,
2382 digital_gain),
2383
2384 SOC_SINGLE_EXT("IIR0 Enable Band1", IIR0, BAND1, 1, 0,
2385 rx_macro_iir_enable_audio_mixer_get,
2386 rx_macro_iir_enable_audio_mixer_put),
2387 SOC_SINGLE_EXT("IIR0 Enable Band2", IIR0, BAND2, 1, 0,
2388 rx_macro_iir_enable_audio_mixer_get,
2389 rx_macro_iir_enable_audio_mixer_put),
2390 SOC_SINGLE_EXT("IIR0 Enable Band3", IIR0, BAND3, 1, 0,
2391 rx_macro_iir_enable_audio_mixer_get,
2392 rx_macro_iir_enable_audio_mixer_put),
2393 SOC_SINGLE_EXT("IIR0 Enable Band4", IIR0, BAND4, 1, 0,
2394 rx_macro_iir_enable_audio_mixer_get,
2395 rx_macro_iir_enable_audio_mixer_put),
2396 SOC_SINGLE_EXT("IIR0 Enable Band5", IIR0, BAND5, 1, 0,
2397 rx_macro_iir_enable_audio_mixer_get,
2398 rx_macro_iir_enable_audio_mixer_put),
2399 SOC_SINGLE_EXT("IIR1 Enable Band1", IIR1, BAND1, 1, 0,
2400 rx_macro_iir_enable_audio_mixer_get,
2401 rx_macro_iir_enable_audio_mixer_put),
2402 SOC_SINGLE_EXT("IIR1 Enable Band2", IIR1, BAND2, 1, 0,
2403 rx_macro_iir_enable_audio_mixer_get,
2404 rx_macro_iir_enable_audio_mixer_put),
2405 SOC_SINGLE_EXT("IIR1 Enable Band3", IIR1, BAND3, 1, 0,
2406 rx_macro_iir_enable_audio_mixer_get,
2407 rx_macro_iir_enable_audio_mixer_put),
2408 SOC_SINGLE_EXT("IIR1 Enable Band4", IIR1, BAND4, 1, 0,
2409 rx_macro_iir_enable_audio_mixer_get,
2410 rx_macro_iir_enable_audio_mixer_put),
2411 SOC_SINGLE_EXT("IIR1 Enable Band5", IIR1, BAND5, 1, 0,
2412 rx_macro_iir_enable_audio_mixer_get,
2413 rx_macro_iir_enable_audio_mixer_put),
2414
2415 SOC_SINGLE_MULTI_EXT("IIR0 Band1", IIR0, BAND1, 255, 0, 5,
2416 rx_macro_iir_band_audio_mixer_get,
2417 rx_macro_iir_band_audio_mixer_put),
2418 SOC_SINGLE_MULTI_EXT("IIR0 Band2", IIR0, BAND2, 255, 0, 5,
2419 rx_macro_iir_band_audio_mixer_get,
2420 rx_macro_iir_band_audio_mixer_put),
2421 SOC_SINGLE_MULTI_EXT("IIR0 Band3", IIR0, BAND3, 255, 0, 5,
2422 rx_macro_iir_band_audio_mixer_get,
2423 rx_macro_iir_band_audio_mixer_put),
2424 SOC_SINGLE_MULTI_EXT("IIR0 Band4", IIR0, BAND4, 255, 0, 5,
2425 rx_macro_iir_band_audio_mixer_get,
2426 rx_macro_iir_band_audio_mixer_put),
2427 SOC_SINGLE_MULTI_EXT("IIR0 Band5", IIR0, BAND5, 255, 0, 5,
2428 rx_macro_iir_band_audio_mixer_get,
2429 rx_macro_iir_band_audio_mixer_put),
2430 SOC_SINGLE_MULTI_EXT("IIR1 Band1", IIR1, BAND1, 255, 0, 5,
2431 rx_macro_iir_band_audio_mixer_get,
2432 rx_macro_iir_band_audio_mixer_put),
2433 SOC_SINGLE_MULTI_EXT("IIR1 Band2", IIR1, BAND2, 255, 0, 5,
2434 rx_macro_iir_band_audio_mixer_get,
2435 rx_macro_iir_band_audio_mixer_put),
2436 SOC_SINGLE_MULTI_EXT("IIR1 Band3", IIR1, BAND3, 255, 0, 5,
2437 rx_macro_iir_band_audio_mixer_get,
2438 rx_macro_iir_band_audio_mixer_put),
2439 SOC_SINGLE_MULTI_EXT("IIR1 Band4", IIR1, BAND4, 255, 0, 5,
2440 rx_macro_iir_band_audio_mixer_get,
2441 rx_macro_iir_band_audio_mixer_put),
2442 SOC_SINGLE_MULTI_EXT("IIR1 Band5", IIR1, BAND5, 255, 0, 5,
2443 rx_macro_iir_band_audio_mixer_get,
2444 rx_macro_iir_band_audio_mixer_put),
2445};
2446
2447static const struct snd_soc_dapm_widget rx_macro_dapm_widgets[] = {
2448 SND_SOC_DAPM_AIF_IN("RX AIF1 PB", "RX_MACRO_AIF1 Playback", 0,
2449 SND_SOC_NOPM, 0, 0),
2450
2451 SND_SOC_DAPM_AIF_IN("RX AIF2 PB", "RX_MACRO_AIF2 Playback", 0,
2452 SND_SOC_NOPM, 0, 0),
2453
2454 SND_SOC_DAPM_AIF_IN("RX AIF3 PB", "RX_MACRO_AIF3 Playback", 0,
2455 SND_SOC_NOPM, 0, 0),
2456
2457 SND_SOC_DAPM_AIF_IN("RX AIF4 PB", "RX_MACRO_AIF4 Playback", 0,
2458 SND_SOC_NOPM, 0, 0),
2459
2460 RX_MACRO_DAPM_MUX("RX_MACRO RX0 MUX", RX_MACRO_RX0, rx_macro_rx0),
2461 RX_MACRO_DAPM_MUX("RX_MACRO RX1 MUX", RX_MACRO_RX1, rx_macro_rx1),
2462 RX_MACRO_DAPM_MUX("RX_MACRO RX2 MUX", RX_MACRO_RX2, rx_macro_rx2),
2463 RX_MACRO_DAPM_MUX("RX_MACRO RX3 MUX", RX_MACRO_RX3, rx_macro_rx3),
2464 RX_MACRO_DAPM_MUX("RX_MACRO RX4 MUX", RX_MACRO_RX4, rx_macro_rx4),
2465 RX_MACRO_DAPM_MUX("RX_MACRO RX5 MUX", RX_MACRO_RX5, rx_macro_rx5),
2466
2467 SND_SOC_DAPM_MIXER("RX_RX0", SND_SOC_NOPM, 0, 0, NULL, 0),
2468 SND_SOC_DAPM_MIXER("RX_RX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2469 SND_SOC_DAPM_MIXER("RX_RX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2470 SND_SOC_DAPM_MIXER("RX_RX3", SND_SOC_NOPM, 0, 0, NULL, 0),
2471 SND_SOC_DAPM_MIXER("RX_RX4", SND_SOC_NOPM, 0, 0, NULL, 0),
2472 SND_SOC_DAPM_MIXER("RX_RX5", SND_SOC_NOPM, 0, 0, NULL, 0),
2473
2474 RX_MACRO_DAPM_MUX("IIR0 INP0 MUX", 0, iir0_inp0),
2475 RX_MACRO_DAPM_MUX("IIR0 INP1 MUX", 0, iir0_inp1),
2476 RX_MACRO_DAPM_MUX("IIR0 INP2 MUX", 0, iir0_inp2),
2477 RX_MACRO_DAPM_MUX("IIR0 INP3 MUX", 0, iir0_inp3),
2478 RX_MACRO_DAPM_MUX("IIR1 INP0 MUX", 0, iir1_inp0),
2479 RX_MACRO_DAPM_MUX("IIR1 INP1 MUX", 0, iir1_inp1),
2480 RX_MACRO_DAPM_MUX("IIR1 INP2 MUX", 0, iir1_inp2),
2481 RX_MACRO_DAPM_MUX("IIR1 INP3 MUX", 0, iir1_inp3),
2482
2483 SND_SOC_DAPM_MIXER_E("IIR0", BOLERO_CDC_RX_SIDETONE_IIR0_IIR_PATH_CTL,
2484 4, 0, NULL, 0, rx_macro_set_iir_gain,
2485 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2486 SND_SOC_DAPM_MIXER_E("IIR1", BOLERO_CDC_RX_SIDETONE_IIR1_IIR_PATH_CTL,
2487 4, 0, NULL, 0, rx_macro_set_iir_gain,
2488 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD),
2489 SND_SOC_DAPM_MIXER("SRC0", BOLERO_CDC_RX_SIDETONE_SRC0_ST_SRC_PATH_CTL,
2490 4, 0, NULL, 0),
2491 SND_SOC_DAPM_MIXER("SRC1", BOLERO_CDC_RX_SIDETONE_SRC1_ST_SRC_PATH_CTL,
2492 4, 0, NULL, 0),
2493
2494 RX_MACRO_DAPM_MUX("RX MIX TX0 MUX", 0, rx_mix_tx0),
2495 RX_MACRO_DAPM_MUX("RX MIX TX1 MUX", 0, rx_mix_tx1),
2496 RX_MACRO_DAPM_MUX("RX MIX TX2 MUX", 0, rx_mix_tx2),
2497 RX_MACRO_DAPM_MUX("RX INT0 DEM MUX", 0, rx_int0_dem_inp),
2498 RX_MACRO_DAPM_MUX("RX INT1 DEM MUX", 0, rx_int1_dem_inp),
2499
2500 SND_SOC_DAPM_MUX_E("RX INT0_2 MUX", SND_SOC_NOPM, INTERP_HPHL, 0,
2501 &rx_int0_2_mux, rx_macro_enable_mix_path,
2502 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2503 SND_SOC_DAPM_POST_PMD),
2504 SND_SOC_DAPM_MUX_E("RX INT1_2 MUX", SND_SOC_NOPM, INTERP_HPHR, 0,
2505 &rx_int1_2_mux, rx_macro_enable_mix_path,
2506 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2507 SND_SOC_DAPM_POST_PMD),
2508 SND_SOC_DAPM_MUX_E("RX INT2_2 MUX", SND_SOC_NOPM, INTERP_AUX, 0,
2509 &rx_int2_2_mux, rx_macro_enable_mix_path,
2510 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2511 SND_SOC_DAPM_POST_PMD),
2512
2513 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP0", 0, rx_int0_1_mix_inp0),
2514 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP1", 0, rx_int0_1_mix_inp1),
2515 RX_MACRO_DAPM_MUX("RX INT0_1 MIX1 INP2", 0, rx_int0_1_mix_inp2),
2516 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP0", 0, rx_int1_1_mix_inp0),
2517 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP1", 0, rx_int1_1_mix_inp1),
2518 RX_MACRO_DAPM_MUX("RX INT1_1 MIX1 INP2", 0, rx_int1_1_mix_inp2),
2519 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP0", 0, rx_int2_1_mix_inp0),
2520 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP1", 0, rx_int2_1_mix_inp1),
2521 RX_MACRO_DAPM_MUX("RX INT2_1 MIX1 INP2", 0, rx_int2_1_mix_inp2),
2522
2523 SND_SOC_DAPM_MUX_E("RX INT0_1 INTERP", SND_SOC_NOPM, INTERP_HPHL, 0,
2524 &rx_int0_1_interp_mux, rx_macro_enable_main_path,
2525 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2526 SND_SOC_DAPM_POST_PMD),
2527 SND_SOC_DAPM_MUX_E("RX INT1_1 INTERP", SND_SOC_NOPM, INTERP_HPHR, 0,
2528 &rx_int1_1_interp_mux, rx_macro_enable_main_path,
2529 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2530 SND_SOC_DAPM_POST_PMD),
2531 SND_SOC_DAPM_MUX_E("RX INT2_1 INTERP", SND_SOC_NOPM, INTERP_AUX, 0,
2532 &rx_int2_1_interp_mux, rx_macro_enable_main_path,
2533 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
2534 SND_SOC_DAPM_POST_PMD),
2535
2536 RX_MACRO_DAPM_MUX("RX INT0_2 INTERP", 0, rx_int0_2_interp),
2537 RX_MACRO_DAPM_MUX("RX INT1_2 INTERP", 0, rx_int1_2_interp),
2538 RX_MACRO_DAPM_MUX("RX INT2_2 INTERP", 0, rx_int2_2_interp),
2539
2540 SND_SOC_DAPM_MIXER("RX INT0_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2541 SND_SOC_DAPM_MIXER("RX INT0 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2542 SND_SOC_DAPM_MIXER("RX INT1_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2543 SND_SOC_DAPM_MIXER("RX INT1 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2544 SND_SOC_DAPM_MIXER("RX INT2_1 MIX1", SND_SOC_NOPM, 0, 0, NULL, 0),
2545 SND_SOC_DAPM_MIXER("RX INT2 SEC MIX", SND_SOC_NOPM, 0, 0, NULL, 0),
2546
2547 SND_SOC_DAPM_MUX_E("RX INT0 MIX2 INP", SND_SOC_NOPM, INTERP_HPHL,
2548 0, &rx_int0_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2549 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2550 SND_SOC_DAPM_MUX_E("RX INT1 MIX2 INP", SND_SOC_NOPM, INTERP_HPHR,
2551 0, &rx_int1_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2552 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2553 SND_SOC_DAPM_MUX_E("RX INT2 MIX2 INP", SND_SOC_NOPM, INTERP_AUX,
2554 0, &rx_int2_mix2_inp_mux, rx_macro_enable_rx_path_clk,
2555 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2556
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302557 SND_SOC_DAPM_MIXER_E("RX INT2_1 VBAT", SND_SOC_NOPM,
2558 0, 0, rx_int2_1_vbat_mix_switch,
2559 ARRAY_SIZE(rx_int2_1_vbat_mix_switch),
2560 rx_macro_enable_vbat,
2561 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2562
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302563 SND_SOC_DAPM_MIXER("RX INT0 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2564 SND_SOC_DAPM_MIXER("RX INT1 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2565 SND_SOC_DAPM_MIXER("RX INT2 MIX2", SND_SOC_NOPM, 0, 0, NULL, 0),
2566
2567 SND_SOC_DAPM_OUTPUT("HPHL_OUT"),
2568 SND_SOC_DAPM_OUTPUT("HPHR_OUT"),
2569 SND_SOC_DAPM_OUTPUT("AUX_OUT"),
2570
2571 SND_SOC_DAPM_INPUT("RX_TX DEC0_INP"),
2572 SND_SOC_DAPM_INPUT("RX_TX DEC1_INP"),
2573 SND_SOC_DAPM_INPUT("RX_TX DEC2_INP"),
2574 SND_SOC_DAPM_INPUT("RX_TX DEC3_INP"),
2575
2576 SND_SOC_DAPM_SUPPLY_S("RX_MCLK", 0, SND_SOC_NOPM, 0, 0,
2577 rx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
2578};
2579
2580static const struct snd_soc_dapm_route rx_audio_map[] = {
2581 {"RX AIF1 PB", NULL, "RX_MCLK"},
2582 {"RX AIF2 PB", NULL, "RX_MCLK"},
2583 {"RX AIF3 PB", NULL, "RX_MCLK"},
2584 {"RX AIF4 PB", NULL, "RX_MCLK"},
2585
2586 {"RX_MACRO RX0 MUX", "AIF1_PB", "RX AIF1 PB"},
2587 {"RX_MACRO RX1 MUX", "AIF1_PB", "RX AIF1 PB"},
2588 {"RX_MACRO RX2 MUX", "AIF1_PB", "RX AIF1 PB"},
2589 {"RX_MACRO RX3 MUX", "AIF1_PB", "RX AIF1 PB"},
2590 {"RX_MACRO RX4 MUX", "AIF1_PB", "RX AIF1 PB"},
2591 {"RX_MACRO RX5 MUX", "AIF1_PB", "RX AIF1 PB"},
2592
2593 {"RX_MACRO RX0 MUX", "AIF2_PB", "RX AIF2 PB"},
2594 {"RX_MACRO RX1 MUX", "AIF2_PB", "RX AIF2 PB"},
2595 {"RX_MACRO RX2 MUX", "AIF2_PB", "RX AIF2 PB"},
2596 {"RX_MACRO RX3 MUX", "AIF2_PB", "RX AIF2 PB"},
2597 {"RX_MACRO RX4 MUX", "AIF2_PB", "RX AIF2 PB"},
2598 {"RX_MACRO RX5 MUX", "AIF2_PB", "RX AIF2 PB"},
2599
2600 {"RX_MACRO RX0 MUX", "AIF3_PB", "RX AIF3 PB"},
2601 {"RX_MACRO RX1 MUX", "AIF3_PB", "RX AIF3 PB"},
2602 {"RX_MACRO RX2 MUX", "AIF3_PB", "RX AIF3 PB"},
2603 {"RX_MACRO RX3 MUX", "AIF3_PB", "RX AIF3 PB"},
2604 {"RX_MACRO RX4 MUX", "AIF3_PB", "RX AIF3 PB"},
2605 {"RX_MACRO RX5 MUX", "AIF3_PB", "RX AIF3 PB"},
2606
2607 {"RX_MACRO RX0 MUX", "AIF4_PB", "RX AIF4 PB"},
2608 {"RX_MACRO RX1 MUX", "AIF4_PB", "RX AIF4 PB"},
2609 {"RX_MACRO RX2 MUX", "AIF4_PB", "RX AIF4 PB"},
2610 {"RX_MACRO RX3 MUX", "AIF4_PB", "RX AIF4 PB"},
2611 {"RX_MACRO RX4 MUX", "AIF4_PB", "RX AIF4 PB"},
2612 {"RX_MACRO RX5 MUX", "AIF4_PB", "RX AIF4 PB"},
2613
2614 {"RX_RX0", NULL, "RX_MACRO RX0 MUX"},
2615 {"RX_RX1", NULL, "RX_MACRO RX1 MUX"},
2616 {"RX_RX2", NULL, "RX_MACRO RX2 MUX"},
2617 {"RX_RX3", NULL, "RX_MACRO RX3 MUX"},
2618 {"RX_RX4", NULL, "RX_MACRO RX4 MUX"},
2619 {"RX_RX5", NULL, "RX_MACRO RX5 MUX"},
2620
2621 {"RX INT0_1 MIX1 INP0", "RX0", "RX_RX0"},
2622 {"RX INT0_1 MIX1 INP0", "RX1", "RX_RX1"},
2623 {"RX INT0_1 MIX1 INP0", "RX2", "RX_RX2"},
2624 {"RX INT0_1 MIX1 INP0", "RX3", "RX_RX3"},
2625 {"RX INT0_1 MIX1 INP0", "RX4", "RX_RX4"},
2626 {"RX INT0_1 MIX1 INP0", "RX5", "RX_RX5"},
2627 {"RX INT0_1 MIX1 INP0", "IIR0", "IIR0"},
2628 {"RX INT0_1 MIX1 INP0", "IIR1", "IIR1"},
2629 {"RX INT0_1 MIX1 INP1", "RX0", "RX_RX0"},
2630 {"RX INT0_1 MIX1 INP1", "RX1", "RX_RX1"},
2631 {"RX INT0_1 MIX1 INP1", "RX2", "RX_RX2"},
2632 {"RX INT0_1 MIX1 INP1", "RX3", "RX_RX3"},
2633 {"RX INT0_1 MIX1 INP1", "RX4", "RX_RX4"},
2634 {"RX INT0_1 MIX1 INP1", "RX5", "RX_RX5"},
2635 {"RX INT0_1 MIX1 INP1", "IIR0", "IIR0"},
2636 {"RX INT0_1 MIX1 INP1", "IIR1", "IIR1"},
2637 {"RX INT0_1 MIX1 INP2", "RX0", "RX_RX0"},
2638 {"RX INT0_1 MIX1 INP2", "RX1", "RX_RX1"},
2639 {"RX INT0_1 MIX1 INP2", "RX2", "RX_RX2"},
2640 {"RX INT0_1 MIX1 INP2", "RX3", "RX_RX3"},
2641 {"RX INT0_1 MIX1 INP2", "RX4", "RX_RX4"},
2642 {"RX INT0_1 MIX1 INP2", "RX5", "RX_RX5"},
2643 {"RX INT0_1 MIX1 INP2", "IIR0", "IIR0"},
2644 {"RX INT0_1 MIX1 INP2", "IIR1", "IIR1"},
2645
2646 {"RX INT1_1 MIX1 INP0", "RX0", "RX_RX0"},
2647 {"RX INT1_1 MIX1 INP0", "RX1", "RX_RX1"},
2648 {"RX INT1_1 MIX1 INP0", "RX2", "RX_RX2"},
2649 {"RX INT1_1 MIX1 INP0", "RX3", "RX_RX3"},
2650 {"RX INT1_1 MIX1 INP0", "RX4", "RX_RX4"},
2651 {"RX INT1_1 MIX1 INP0", "RX5", "RX_RX5"},
2652 {"RX INT1_1 MIX1 INP0", "IIR0", "IIR0"},
2653 {"RX INT1_1 MIX1 INP0", "IIR1", "IIR1"},
2654 {"RX INT1_1 MIX1 INP1", "RX0", "RX_RX0"},
2655 {"RX INT1_1 MIX1 INP1", "RX1", "RX_RX1"},
2656 {"RX INT1_1 MIX1 INP1", "RX2", "RX_RX2"},
2657 {"RX INT1_1 MIX1 INP1", "RX3", "RX_RX3"},
2658 {"RX INT1_1 MIX1 INP1", "RX4", "RX_RX4"},
2659 {"RX INT1_1 MIX1 INP1", "RX5", "RX_RX5"},
2660 {"RX INT1_1 MIX1 INP1", "IIR0", "IIR0"},
2661 {"RX INT1_1 MIX1 INP1", "IIR1", "IIR1"},
2662 {"RX INT1_1 MIX1 INP2", "RX0", "RX_RX0"},
2663 {"RX INT1_1 MIX1 INP2", "RX1", "RX_RX1"},
2664 {"RX INT1_1 MIX1 INP2", "RX2", "RX_RX2"},
2665 {"RX INT1_1 MIX1 INP2", "RX3", "RX_RX3"},
2666 {"RX INT1_1 MIX1 INP2", "RX4", "RX_RX4"},
2667 {"RX INT1_1 MIX1 INP2", "RX5", "RX_RX5"},
2668 {"RX INT1_1 MIX1 INP2", "IIR0", "IIR0"},
2669 {"RX INT1_1 MIX1 INP2", "IIR1", "IIR1"},
2670
2671 {"RX INT2_1 MIX1 INP0", "RX0", "RX_RX0"},
2672 {"RX INT2_1 MIX1 INP0", "RX1", "RX_RX1"},
2673 {"RX INT2_1 MIX1 INP0", "RX2", "RX_RX2"},
2674 {"RX INT2_1 MIX1 INP0", "RX3", "RX_RX3"},
2675 {"RX INT2_1 MIX1 INP0", "RX4", "RX_RX4"},
2676 {"RX INT2_1 MIX1 INP0", "RX5", "RX_RX5"},
2677 {"RX INT2_1 MIX1 INP0", "IIR0", "IIR0"},
2678 {"RX INT2_1 MIX1 INP0", "IIR1", "IIR1"},
2679 {"RX INT2_1 MIX1 INP1", "RX0", "RX_RX0"},
2680 {"RX INT2_1 MIX1 INP1", "RX1", "RX_RX1"},
2681 {"RX INT2_1 MIX1 INP1", "RX2", "RX_RX2"},
2682 {"RX INT2_1 MIX1 INP1", "RX3", "RX_RX3"},
2683 {"RX INT2_1 MIX1 INP1", "RX4", "RX_RX4"},
2684 {"RX INT2_1 MIX1 INP1", "RX5", "RX_RX5"},
2685 {"RX INT2_1 MIX1 INP1", "IIR0", "IIR0"},
2686 {"RX INT2_1 MIX1 INP1", "IIR1", "IIR1"},
2687 {"RX INT2_1 MIX1 INP2", "RX0", "RX_RX0"},
2688 {"RX INT2_1 MIX1 INP2", "RX1", "RX_RX1"},
2689 {"RX INT2_1 MIX1 INP2", "RX2", "RX_RX2"},
2690 {"RX INT2_1 MIX1 INP2", "RX3", "RX_RX3"},
2691 {"RX INT2_1 MIX1 INP2", "RX4", "RX_RX4"},
2692 {"RX INT2_1 MIX1 INP2", "RX5", "RX_RX5"},
2693 {"RX INT2_1 MIX1 INP2", "IIR0", "IIR0"},
2694 {"RX INT2_1 MIX1 INP2", "IIR1", "IIR1"},
2695
2696 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP0"},
2697 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP1"},
2698 {"RX INT0_1 MIX1", NULL, "RX INT0_1 MIX1 INP2"},
2699 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP0"},
2700 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP1"},
2701 {"RX INT1_1 MIX1", NULL, "RX INT1_1 MIX1 INP2"},
2702 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP0"},
2703 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP1"},
2704 {"RX INT2_1 MIX1", NULL, "RX INT2_1 MIX1 INP2"},
2705
2706 /* Mixing path INT0 */
2707 {"RX INT0_2 MUX", "RX0", "RX_RX0"},
2708 {"RX INT0_2 MUX", "RX1", "RX_RX1"},
2709 {"RX INT0_2 MUX", "RX2", "RX_RX2"},
2710 {"RX INT0_2 MUX", "RX3", "RX_RX3"},
2711 {"RX INT0_2 MUX", "RX4", "RX_RX4"},
2712 {"RX INT0_2 MUX", "RX5", "RX_RX5"},
2713 {"RX INT0_2 INTERP", NULL, "RX INT0_2 MUX"},
2714 {"RX INT0 SEC MIX", NULL, "RX INT0_2 INTERP"},
2715
2716 /* Mixing path INT1 */
2717 {"RX INT1_2 MUX", "RX0", "RX_RX0"},
2718 {"RX INT1_2 MUX", "RX1", "RX_RX1"},
2719 {"RX INT1_2 MUX", "RX2", "RX_RX2"},
2720 {"RX INT1_2 MUX", "RX3", "RX_RX3"},
2721 {"RX INT1_2 MUX", "RX4", "RX_RX4"},
2722 {"RX INT1_2 MUX", "RX5", "RX_RX5"},
2723 {"RX INT1_2 INTERP", NULL, "RX INT1_2 MUX"},
2724 {"RX INT1 SEC MIX", NULL, "RX INT1_2 INTERP"},
2725
2726 /* Mixing path INT2 */
2727 {"RX INT2_2 MUX", "RX0", "RX_RX0"},
2728 {"RX INT2_2 MUX", "RX1", "RX_RX1"},
2729 {"RX INT2_2 MUX", "RX2", "RX_RX2"},
2730 {"RX INT2_2 MUX", "RX3", "RX_RX3"},
2731 {"RX INT2_2 MUX", "RX4", "RX_RX4"},
2732 {"RX INT2_2 MUX", "RX5", "RX_RX5"},
2733 {"RX INT2_2 INTERP", NULL, "RX INT2_2 MUX"},
2734 {"RX INT2 SEC MIX", NULL, "RX INT2_2 INTERP"},
2735
2736 {"RX INT0_1 INTERP", NULL, "RX INT0_1 MIX1"},
2737 {"RX INT0 SEC MIX", NULL, "RX INT0_1 INTERP"},
2738 {"RX INT0 MIX2", NULL, "RX INT0 SEC MIX"},
2739 {"RX INT0 MIX2", NULL, "RX INT0 MIX2 INP"},
2740 {"RX INT0 DEM MUX", "CLSH_DSM_OUT", "RX INT0 MIX2"},
2741 {"HPHL_OUT", NULL, "RX INT0 DEM MUX"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302742 {"HPHL_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302743
2744 {"RX INT1_1 INTERP", NULL, "RX INT1_1 MIX1"},
2745 {"RX INT1 SEC MIX", NULL, "RX INT1_1 INTERP"},
2746 {"RX INT1 MIX2", NULL, "RX INT1 SEC MIX"},
2747 {"RX INT1 MIX2", NULL, "RX INT1 MIX2 INP"},
2748 {"RX INT1 DEM MUX", "CLSH_DSM_OUT", "RX INT1 MIX2"},
2749 {"HPHR_OUT", NULL, "RX INT1 DEM MUX"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302750 {"HPHR_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302751
2752 {"RX INT2_1 INTERP", NULL, "RX INT2_1 MIX1"},
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302753
2754 {"RX INT2_1 VBAT", "RX AUX VBAT Enable", "RX INT2_1 INTERP"},
2755 {"RX INT2 SEC MIX", NULL, "RX INT2_1 VBAT"},
2756
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302757 {"RX INT2 SEC MIX", NULL, "RX INT2_1 INTERP"},
2758 {"RX INT2 MIX2", NULL, "RX INT2 SEC MIX"},
2759 {"RX INT2 MIX2", NULL, "RX INT2 MIX2 INP"},
2760 {"AUX_OUT", NULL, "RX INT2 MIX2"},
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302761 {"AUX_OUT", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302762
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302763 {"IIR0", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302764 {"IIR0", NULL, "IIR0 INP0 MUX"},
2765 {"IIR0 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},
2766 {"IIR0 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},
2767 {"IIR0 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},
2768 {"IIR0 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},
2769 {"IIR0 INP0 MUX", "RX0", "RX_RX0"},
2770 {"IIR0 INP0 MUX", "RX1", "RX_RX1"},
2771 {"IIR0 INP0 MUX", "RX2", "RX_RX2"},
2772 {"IIR0 INP0 MUX", "RX3", "RX_RX3"},
2773 {"IIR0 INP0 MUX", "RX4", "RX_RX4"},
2774 {"IIR0 INP0 MUX", "RX5", "RX_RX5"},
2775 {"IIR0", NULL, "IIR0 INP1 MUX"},
2776 {"IIR0 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},
2777 {"IIR0 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},
2778 {"IIR0 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},
2779 {"IIR0 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},
2780 {"IIR0 INP1 MUX", "RX0", "RX_RX0"},
2781 {"IIR0 INP1 MUX", "RX1", "RX_RX1"},
2782 {"IIR0 INP1 MUX", "RX2", "RX_RX2"},
2783 {"IIR0 INP1 MUX", "RX3", "RX_RX3"},
2784 {"IIR0 INP1 MUX", "RX4", "RX_RX4"},
2785 {"IIR0 INP1 MUX", "RX5", "RX_RX5"},
2786 {"IIR0", NULL, "IIR0 INP2 MUX"},
2787 {"IIR0 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},
2788 {"IIR0 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},
2789 {"IIR0 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},
2790 {"IIR0 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},
2791 {"IIR0 INP2 MUX", "RX0", "RX_RX0"},
2792 {"IIR0 INP2 MUX", "RX1", "RX_RX1"},
2793 {"IIR0 INP2 MUX", "RX2", "RX_RX2"},
2794 {"IIR0 INP2 MUX", "RX3", "RX_RX3"},
2795 {"IIR0 INP2 MUX", "RX4", "RX_RX4"},
2796 {"IIR0 INP2 MUX", "RX5", "RX_RX5"},
2797 {"IIR0", NULL, "IIR0 INP3 MUX"},
2798 {"IIR0 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},
2799 {"IIR0 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},
2800 {"IIR0 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},
2801 {"IIR0 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},
2802 {"IIR0 INP3 MUX", "RX0", "RX_RX0"},
2803 {"IIR0 INP3 MUX", "RX1", "RX_RX1"},
2804 {"IIR0 INP3 MUX", "RX2", "RX_RX2"},
2805 {"IIR0 INP3 MUX", "RX3", "RX_RX3"},
2806 {"IIR0 INP3 MUX", "RX4", "RX_RX4"},
2807 {"IIR0 INP3 MUX", "RX5", "RX_RX5"},
2808
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302809 {"IIR1", NULL, "RX_MCLK"},
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302810 {"IIR1", NULL, "IIR1 INP0 MUX"},
2811 {"IIR1 INP0 MUX", "DEC0", "RX_TX DEC0_INP"},
2812 {"IIR1 INP0 MUX", "DEC1", "RX_TX DEC1_INP"},
2813 {"IIR1 INP0 MUX", "DEC2", "RX_TX DEC2_INP"},
2814 {"IIR1 INP0 MUX", "DEC3", "RX_TX DEC3_INP"},
2815 {"IIR1 INP0 MUX", "RX0", "RX_RX0"},
2816 {"IIR1 INP0 MUX", "RX1", "RX_RX1"},
2817 {"IIR1 INP0 MUX", "RX2", "RX_RX2"},
2818 {"IIR1 INP0 MUX", "RX3", "RX_RX3"},
2819 {"IIR1 INP0 MUX", "RX4", "RX_RX4"},
2820 {"IIR1 INP0 MUX", "RX5", "RX_RX5"},
2821 {"IIR1", NULL, "IIR1 INP1 MUX"},
2822 {"IIR1 INP1 MUX", "DEC0", "RX_TX DEC0_INP"},
2823 {"IIR1 INP1 MUX", "DEC1", "RX_TX DEC1_INP"},
2824 {"IIR1 INP1 MUX", "DEC2", "RX_TX DEC2_INP"},
2825 {"IIR1 INP1 MUX", "DEC3", "RX_TX DEC3_INP"},
2826 {"IIR1 INP1 MUX", "RX0", "RX_RX0"},
2827 {"IIR1 INP1 MUX", "RX1", "RX_RX1"},
2828 {"IIR1 INP1 MUX", "RX2", "RX_RX2"},
2829 {"IIR1 INP1 MUX", "RX3", "RX_RX3"},
2830 {"IIR1 INP1 MUX", "RX4", "RX_RX4"},
2831 {"IIR1 INP1 MUX", "RX5", "RX_RX5"},
2832 {"IIR1", NULL, "IIR1 INP2 MUX"},
2833 {"IIR1 INP2 MUX", "DEC0", "RX_TX DEC0_INP"},
2834 {"IIR1 INP2 MUX", "DEC1", "RX_TX DEC1_INP"},
2835 {"IIR1 INP2 MUX", "DEC2", "RX_TX DEC2_INP"},
2836 {"IIR1 INP2 MUX", "DEC3", "RX_TX DEC3_INP"},
2837 {"IIR1 INP2 MUX", "RX0", "RX_RX0"},
2838 {"IIR1 INP2 MUX", "RX1", "RX_RX1"},
2839 {"IIR1 INP2 MUX", "RX2", "RX_RX2"},
2840 {"IIR1 INP2 MUX", "RX3", "RX_RX3"},
2841 {"IIR1 INP2 MUX", "RX4", "RX_RX4"},
2842 {"IIR1 INP2 MUX", "RX5", "RX_RX5"},
2843 {"IIR1", NULL, "IIR1 INP3 MUX"},
2844 {"IIR1 INP3 MUX", "DEC0", "RX_TX DEC0_INP"},
2845 {"IIR1 INP3 MUX", "DEC1", "RX_TX DEC1_INP"},
2846 {"IIR1 INP3 MUX", "DEC2", "RX_TX DEC2_INP"},
2847 {"IIR1 INP3 MUX", "DEC3", "RX_TX DEC3_INP"},
2848 {"IIR1 INP3 MUX", "RX0", "RX_RX0"},
2849 {"IIR1 INP3 MUX", "RX1", "RX_RX1"},
2850 {"IIR1 INP3 MUX", "RX2", "RX_RX2"},
2851 {"IIR1 INP3 MUX", "RX3", "RX_RX3"},
2852 {"IIR1 INP3 MUX", "RX4", "RX_RX4"},
2853 {"IIR1 INP3 MUX", "RX5", "RX_RX5"},
2854
2855 {"SRC0", NULL, "IIR0"},
2856 {"SRC1", NULL, "IIR1"},
2857 {"RX INT0 MIX2 INP", "SRC0", "SRC0"},
2858 {"RX INT0 MIX2 INP", "SRC1", "SRC1"},
2859 {"RX INT1 MIX2 INP", "SRC0", "SRC0"},
2860 {"RX INT1 MIX2 INP", "SRC1", "SRC1"},
2861 {"RX INT2 MIX2 INP", "SRC0", "SRC0"},
2862 {"RX INT2 MIX2 INP", "SRC1", "SRC1"},
2863};
2864
2865static int rx_swrm_clock(void *handle, bool enable)
2866{
2867 struct rx_macro_priv *rx_priv = (struct rx_macro_priv *) handle;
2868 struct regmap *regmap = dev_get_regmap(rx_priv->dev->parent, NULL);
2869 int ret = 0;
2870
Tanya Dixit8530fb92018-09-14 16:01:25 +05302871 if (regmap == NULL) {
2872 dev_err(rx_priv->dev, "%s: regmap is NULL\n", __func__);
2873 return -EINVAL;
2874 }
2875
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302876 mutex_lock(&rx_priv->swr_clk_lock);
2877
2878 dev_dbg(rx_priv->dev, "%s: swrm clock %s\n",
2879 __func__, (enable ? "enable" : "disable"));
2880 if (enable) {
2881 if (rx_priv->swr_clk_users == 0) {
2882 ret = rx_macro_mclk_enable(rx_priv, 1, true);
2883 if (ret < 0) {
2884 dev_err(rx_priv->dev,
2885 "%s: rx request clock enable failed\n",
2886 __func__);
2887 goto exit;
2888 }
2889 regmap_update_bits(regmap,
2890 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +05302891 0x02, 0x02);
2892 regmap_update_bits(regmap,
2893 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302894 0x01, 0x01);
2895 regmap_update_bits(regmap,
2896 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +05302897 0x02, 0x00);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302898 msm_cdc_pinctrl_select_active_state(
2899 rx_priv->rx_swr_gpio_p);
2900 }
2901 rx_priv->swr_clk_users++;
2902 } else {
2903 if (rx_priv->swr_clk_users <= 0) {
2904 dev_err(rx_priv->dev,
2905 "%s: rx swrm clock users already reset\n",
2906 __func__);
2907 rx_priv->swr_clk_users = 0;
2908 goto exit;
2909 }
2910 rx_priv->swr_clk_users--;
2911 if (rx_priv->swr_clk_users == 0) {
2912 regmap_update_bits(regmap,
2913 BOLERO_CDC_RX_CLK_RST_CTRL_SWR_CONTROL,
2914 0x01, 0x00);
2915 msm_cdc_pinctrl_select_sleep_state(
2916 rx_priv->rx_swr_gpio_p);
2917 rx_macro_mclk_enable(rx_priv, 0, true);
2918 }
2919 }
2920 dev_dbg(rx_priv->dev, "%s: swrm clock users %d\n",
2921 __func__, rx_priv->swr_clk_users);
2922exit:
2923 mutex_unlock(&rx_priv->swr_clk_lock);
2924 return ret;
2925}
2926
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05302927static void rx_macro_init_bcl_pmic_reg(struct snd_soc_codec *codec)
2928{
2929 struct device *rx_dev = NULL;
2930 struct rx_macro_priv *rx_priv = NULL;
2931
2932 if (!codec) {
2933 pr_err("%s: NULL codec pointer!\n", __func__);
2934 return;
2935 }
2936
2937 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
2938 return;
2939
2940 switch (rx_priv->bcl_pmic_params.id) {
2941 case 0:
2942 /* Enable ID0 to listen to respective PMIC group interrupts */
2943 snd_soc_update_bits(codec,
2944 BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x02, 0x02);
2945 /* Update MC_SID0 */
2946 snd_soc_update_bits(codec,
2947 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0x0F,
2948 rx_priv->bcl_pmic_params.sid);
2949 /* Update MC_PPID0 */
2950 snd_soc_update_bits(codec,
2951 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG2, 0xFF,
2952 rx_priv->bcl_pmic_params.ppid);
2953 break;
2954 case 1:
2955 /* Enable ID1 to listen to respective PMIC group interrupts */
2956 snd_soc_update_bits(codec,
2957 BOLERO_CDC_RX_BCL_VBAT_DECODE_CTL1, 0x01, 0x01);
2958 /* Update MC_SID1 */
2959 snd_soc_update_bits(codec,
2960 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG3, 0x0F,
2961 rx_priv->bcl_pmic_params.sid);
2962 /* Update MC_PPID1 */
2963 snd_soc_update_bits(codec,
2964 BOLERO_CDC_RX_BCL_VBAT_DECODE_CFG1, 0xFF,
2965 rx_priv->bcl_pmic_params.ppid);
2966 break;
2967 default:
2968 dev_err(rx_dev, "%s: PMIC ID is invalid\n",
2969 __func__, rx_priv->bcl_pmic_params.id);
2970 break;
2971 }
2972}
2973
Laxminath Kasama7ecc582018-06-15 16:55:02 +05302974static int rx_macro_init(struct snd_soc_codec *codec)
2975{
2976 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
2977 int ret = 0;
2978 struct device *rx_dev = NULL;
2979 struct rx_macro_priv *rx_priv = NULL;
2980
2981 rx_dev = bolero_get_device_ptr(codec->dev, RX_MACRO);
2982 if (!rx_dev) {
2983 dev_err(codec->dev,
2984 "%s: null device for macro!\n", __func__);
2985 return -EINVAL;
2986 }
2987 rx_priv = dev_get_drvdata(rx_dev);
2988 if (!rx_priv) {
2989 dev_err(codec->dev,
2990 "%s: priv is null for macro!\n", __func__);
2991 return -EINVAL;
2992 }
2993
2994 ret = snd_soc_dapm_new_controls(dapm, rx_macro_dapm_widgets,
2995 ARRAY_SIZE(rx_macro_dapm_widgets));
2996 if (ret < 0) {
2997 dev_err(rx_dev, "%s: failed to add controls\n", __func__);
2998 return ret;
2999 }
3000 ret = snd_soc_dapm_add_routes(dapm, rx_audio_map,
3001 ARRAY_SIZE(rx_audio_map));
3002 if (ret < 0) {
3003 dev_err(rx_dev, "%s: failed to add routes\n", __func__);
3004 return ret;
3005 }
3006 ret = snd_soc_dapm_new_widgets(dapm->card);
3007 if (ret < 0) {
3008 dev_err(rx_dev, "%s: failed to add widgets\n", __func__);
3009 return ret;
3010 }
3011 ret = snd_soc_add_codec_controls(codec, rx_macro_snd_controls,
3012 ARRAY_SIZE(rx_macro_snd_controls));
3013 if (ret < 0) {
3014 dev_err(rx_dev, "%s: failed to add snd_ctls\n", __func__);
3015 return ret;
3016 }
Ramprasad Katkam9c2394a2018-08-23 13:13:48 +05303017 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_DSM_CTL, 0x01, 0x01);
3018 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_DSM_CTL, 0x01, 0x01);
3019 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_DSM_CTL, 0x01, 0x01);
3020 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_SEC7, 0x07, 0x02);
3021 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_SEC7, 0x07, 0x02);
3022 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_SEC7, 0x07, 0x02);
3023 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX0_RX_PATH_CFG3, 0x03, 0x02);
3024 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX1_RX_PATH_CFG3, 0x03, 0x02);
3025 snd_soc_update_bits(codec, BOLERO_CDC_RX_RX2_RX_PATH_CFG3, 0x03, 0x02);
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303026 rx_macro_init_bcl_pmic_reg(codec);
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303027
3028 rx_priv->codec = codec;
3029
3030 return 0;
3031}
3032
3033static int rx_macro_deinit(struct snd_soc_codec *codec)
3034{
3035 struct device *rx_dev = NULL;
3036 struct rx_macro_priv *rx_priv = NULL;
3037
3038 if (!rx_macro_get_data(codec, &rx_dev, &rx_priv, __func__))
3039 return -EINVAL;
3040
3041 rx_priv->codec = NULL;
3042
3043 return 0;
3044}
3045
3046static void rx_macro_add_child_devices(struct work_struct *work)
3047{
3048 struct rx_macro_priv *rx_priv = NULL;
3049 struct platform_device *pdev = NULL;
3050 struct device_node *node = NULL;
3051 struct rx_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
3052 int ret = 0;
3053 u16 count = 0, ctrl_num = 0;
3054 struct rx_swr_ctrl_platform_data *platdata = NULL;
3055 char plat_dev_name[RX_SWR_STRING_LEN] = "";
3056 bool rx_swr_master_node = false;
3057
3058 rx_priv = container_of(work, struct rx_macro_priv,
3059 rx_macro_add_child_devices_work);
3060 if (!rx_priv) {
3061 pr_err("%s: Memory for rx_priv does not exist\n",
3062 __func__);
3063 return;
3064 }
3065
3066 if (!rx_priv->dev) {
3067 pr_err("%s: RX device does not exist\n", __func__);
3068 return;
3069 }
3070
3071 if(!rx_priv->dev->of_node) {
3072 dev_err(rx_priv->dev,
3073 "%s: DT node for RX dev does not exist\n", __func__);
3074 return;
3075 }
3076
3077 platdata = &rx_priv->swr_plat_data;
3078 rx_priv->child_count = 0;
3079
3080 for_each_available_child_of_node(rx_priv->dev->of_node, node) {
3081 rx_swr_master_node = false;
3082 if (strnstr(node->name, "rx_swr_master",
3083 strlen("rx_swr_master")) != NULL)
3084 rx_swr_master_node = true;
3085
3086 if(rx_swr_master_node)
3087 strlcpy(plat_dev_name, "rx_swr_ctrl",
3088 (RX_SWR_STRING_LEN - 1));
3089 else
3090 strlcpy(plat_dev_name, node->name,
3091 (RX_SWR_STRING_LEN - 1));
3092
3093 pdev = platform_device_alloc(plat_dev_name, -1);
3094 if (!pdev) {
3095 dev_err(rx_priv->dev, "%s: pdev memory alloc failed\n",
3096 __func__);
3097 ret = -ENOMEM;
3098 goto err;
3099 }
3100 pdev->dev.parent = rx_priv->dev;
3101 pdev->dev.of_node = node;
3102
3103 if (rx_swr_master_node) {
3104 ret = platform_device_add_data(pdev, platdata,
3105 sizeof(*platdata));
3106 if (ret) {
3107 dev_err(&pdev->dev,
3108 "%s: cannot add plat data ctrl:%d\n",
3109 __func__, ctrl_num);
3110 goto fail_pdev_add;
3111 }
3112 }
3113
3114 ret = platform_device_add(pdev);
3115 if (ret) {
3116 dev_err(&pdev->dev,
3117 "%s: Cannot add platform device\n",
3118 __func__);
3119 goto fail_pdev_add;
3120 }
3121
3122 if (rx_swr_master_node) {
3123 temp = krealloc(swr_ctrl_data,
3124 (ctrl_num + 1) * sizeof(
3125 struct rx_swr_ctrl_data),
3126 GFP_KERNEL);
3127 if (!temp) {
3128 ret = -ENOMEM;
3129 goto fail_pdev_add;
3130 }
3131 swr_ctrl_data = temp;
3132 swr_ctrl_data[ctrl_num].rx_swr_pdev = pdev;
3133 ctrl_num++;
3134 dev_dbg(&pdev->dev,
3135 "%s: Added soundwire ctrl device(s)\n",
3136 __func__);
3137 rx_priv->swr_ctrl_data = swr_ctrl_data;
3138 }
3139 if (rx_priv->child_count < RX_MACRO_CHILD_DEVICES_MAX)
3140 rx_priv->pdev_child_devices[
3141 rx_priv->child_count++] = pdev;
3142 else
3143 goto err;
3144 }
3145 return;
3146fail_pdev_add:
3147 for (count = 0; count < rx_priv->child_count; count++)
3148 platform_device_put(rx_priv->pdev_child_devices[count]);
3149err:
3150 return;
3151}
3152
3153static void rx_macro_init_ops(struct macro_ops *ops, char __iomem *rx_io_base)
3154{
3155 memset(ops, 0, sizeof(struct macro_ops));
3156 ops->init = rx_macro_init;
3157 ops->exit = rx_macro_deinit;
3158 ops->io_base = rx_io_base;
3159 ops->dai_ptr = rx_macro_dai;
3160 ops->num_dais = ARRAY_SIZE(rx_macro_dai);
3161 ops->mclk_fn = rx_macro_mclk_ctrl;
Laxminath Kasam497a6512018-09-17 16:11:52 +05303162 ops->event_handler = rx_macro_event_handler;
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303163}
3164
3165static int rx_macro_probe(struct platform_device *pdev)
3166{
3167 struct macro_ops ops = {0};
3168 struct rx_macro_priv *rx_priv = NULL;
3169 u32 rx_base_addr = 0, muxsel = 0;
3170 char __iomem *rx_io_base = NULL, *muxsel_io = NULL;
3171 int ret = 0;
3172 struct clk *rx_core_clk = NULL, *rx_npl_clk = NULL;
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303173 u8 bcl_pmic_params[3];
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303174
3175 rx_priv = devm_kzalloc(&pdev->dev, sizeof(struct rx_macro_priv),
3176 GFP_KERNEL);
3177 if (!rx_priv)
3178 return -ENOMEM;
3179
3180 rx_priv->dev = &pdev->dev;
3181 ret = of_property_read_u32(pdev->dev.of_node, "reg",
3182 &rx_base_addr);
3183 if (ret) {
3184 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3185 __func__, "reg");
3186 return ret;
3187 }
3188 ret = of_property_read_u32(pdev->dev.of_node, "qcom,rx_mclk_mode_muxsel",
3189 &muxsel);
3190 if (ret) {
3191 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3192 __func__, "reg");
3193 return ret;
3194 }
3195 rx_priv->rx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
3196 "qcom,rx-swr-gpios", 0);
3197 if (!rx_priv->rx_swr_gpio_p) {
3198 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
3199 __func__);
3200 return -EINVAL;
3201 }
3202 rx_io_base = devm_ioremap(&pdev->dev, rx_base_addr,
3203 RX_MACRO_MAX_OFFSET);
3204 if (!rx_io_base) {
3205 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
3206 return -ENOMEM;
3207 }
3208 rx_priv->rx_io_base = rx_io_base;
3209 muxsel_io = devm_ioremap(&pdev->dev, muxsel, 0x4);
3210 if (!muxsel_io) {
3211 dev_err(&pdev->dev, "%s: ioremap failed for muxsel\n",
3212 __func__);
3213 return -ENOMEM;
3214 }
3215 rx_priv->rx_mclk_mode_muxsel = muxsel_io;
3216 INIT_WORK(&rx_priv->rx_macro_add_child_devices_work,
3217 rx_macro_add_child_devices);
3218 rx_priv->swr_plat_data.handle = (void *) rx_priv;
3219 rx_priv->swr_plat_data.read = NULL;
3220 rx_priv->swr_plat_data.write = NULL;
3221 rx_priv->swr_plat_data.bulk_write = NULL;
3222 rx_priv->swr_plat_data.clk = rx_swrm_clock;
3223 rx_priv->swr_plat_data.handle_irq = NULL;
3224
3225 /* Register MCLK for rx macro */
3226 rx_core_clk = devm_clk_get(&pdev->dev, "rx_core_clk");
3227 if (IS_ERR(rx_core_clk)) {
3228 ret = PTR_ERR(rx_core_clk);
3229 dev_err(&pdev->dev, "%s: clk get %s failed %d\n",
3230 __func__, "rx_core_clk", ret);
3231 return ret;
3232 }
3233 rx_priv->rx_core_clk = rx_core_clk;
3234 /* Register npl clk for soundwire */
3235 rx_npl_clk = devm_clk_get(&pdev->dev, "rx_npl_clk");
3236 if (IS_ERR(rx_npl_clk)) {
3237 ret = PTR_ERR(rx_npl_clk);
3238 dev_err(&pdev->dev, "%s: clk get %s failed %d\n",
3239 __func__, "rx_npl_clk", ret);
3240 return ret;
3241 }
3242 rx_priv->rx_npl_clk = rx_npl_clk;
Aditya Bavanari4f3d5642018-09-18 22:19:10 +05303243
3244 ret = of_property_read_u8_array(pdev->dev.of_node,
3245 "qcom,rx-bcl-pmic-params", bcl_pmic_params,
3246 sizeof(bcl_pmic_params));
3247 if (ret) {
3248 dev_dbg(&pdev->dev, "%s: could not find %s entry in dt\n",
3249 __func__, "qcom,rx-bcl-pmic-params");
3250 } else {
3251 rx_priv->bcl_pmic_params.id = bcl_pmic_params[0];
3252 rx_priv->bcl_pmic_params.sid = bcl_pmic_params[1];
3253 rx_priv->bcl_pmic_params.ppid = bcl_pmic_params[2];
3254 }
3255
Laxminath Kasama7ecc582018-06-15 16:55:02 +05303256 dev_set_drvdata(&pdev->dev, rx_priv);
3257 mutex_init(&rx_priv->mclk_lock);
3258 mutex_init(&rx_priv->swr_clk_lock);
3259 rx_macro_init_ops(&ops, rx_io_base);
3260
3261 ret = bolero_register_macro(&pdev->dev, RX_MACRO, &ops);
3262 if (ret) {
3263 dev_err(&pdev->dev,
3264 "%s: register macro failed\n", __func__);
3265 goto err_reg_macro;
3266 }
3267 schedule_work(&rx_priv->rx_macro_add_child_devices_work);
3268
3269 return 0;
3270
3271err_reg_macro:
3272 mutex_destroy(&rx_priv->mclk_lock);
3273 mutex_destroy(&rx_priv->swr_clk_lock);
3274 return ret;
3275}
3276
3277static int rx_macro_remove(struct platform_device *pdev)
3278{
3279 struct rx_macro_priv *rx_priv = NULL;
3280 u16 count = 0;
3281
3282 rx_priv = dev_get_drvdata(&pdev->dev);
3283
3284 if (!rx_priv)
3285 return -EINVAL;
3286
3287 for (count = 0; count < rx_priv->child_count &&
3288 count < RX_MACRO_CHILD_DEVICES_MAX; count++)
3289 platform_device_unregister(rx_priv->pdev_child_devices[count]);
3290
3291 bolero_unregister_macro(&pdev->dev, RX_MACRO);
3292 mutex_destroy(&rx_priv->mclk_lock);
3293 mutex_destroy(&rx_priv->swr_clk_lock);
3294 kfree(rx_priv->swr_ctrl_data);
3295 return 0;
3296}
3297
3298static const struct of_device_id rx_macro_dt_match[] = {
3299 {.compatible = "qcom,rx-macro"},
3300 {}
3301};
3302
3303static struct platform_driver rx_macro_driver = {
3304 .driver = {
3305 .name = "rx_macro",
3306 .owner = THIS_MODULE,
3307 .of_match_table = rx_macro_dt_match,
3308 },
3309 .probe = rx_macro_probe,
3310 .remove = rx_macro_remove,
3311};
3312
3313module_platform_driver(rx_macro_driver);
3314
3315MODULE_DESCRIPTION("RX macro driver");
3316MODULE_LICENSE("GPL v2");