blob: dabc345f22b9a7a770f4ca77040846bfe4bfe838 [file] [log] [blame]
Laxminath Kasam989fccf2018-06-15 16:53:31 +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/clk.h>
16#include <linux/io.h>
17#include <linux/platform_device.h>
18#include <linux/regmap.h>
19#include <sound/soc.h>
20#include <sound/soc-dapm.h>
21#include <sound/tlv.h>
22#include "bolero-cdc.h"
23#include "bolero-cdc-registers.h"
24#include "../msm-cdc-pinctrl.h"
25
26#define TX_MACRO_MAX_OFFSET 0x1000
27
28#define NUM_DECIMATORS 8
29
30#define TX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
31 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
32 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
33#define TX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
34 SNDRV_PCM_FMTBIT_S24_LE |\
35 SNDRV_PCM_FMTBIT_S24_3LE)
36
37#define TX_HPF_CUT_OFF_FREQ_MASK 0x60
38#define CF_MIN_3DB_4HZ 0x0
39#define CF_MIN_3DB_75HZ 0x1
40#define CF_MIN_3DB_150HZ 0x2
41
42#define TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED 0
43#define TX_MACRO_MCLK_FREQ 9600000
44#define TX_MACRO_TX_PATH_OFFSET 0x80
45
46#define TX_MACRO_TX_UNMUTE_DELAY_MS 40
47
48static int tx_unmute_delay = TX_MACRO_TX_UNMUTE_DELAY_MS;
49module_param(tx_unmute_delay, int, 0664);
50MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path");
51
52static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
53
54static int tx_macro_hw_params(struct snd_pcm_substream *substream,
55 struct snd_pcm_hw_params *params,
56 struct snd_soc_dai *dai);
57static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
58 unsigned int *tx_num, unsigned int *tx_slot,
59 unsigned int *rx_num, unsigned int *rx_slot);
60
61#define TX_MACRO_SWR_STRING_LEN 80
62#define TX_MACRO_CHILD_DEVICES_MAX 3
63
64/* Hold instance to soundwire platform device */
65struct tx_macro_swr_ctrl_data {
66 struct platform_device *tx_swr_pdev;
67};
68
69struct tx_macro_swr_ctrl_platform_data {
70 void *handle; /* holds codec private data */
71 int (*read)(void *handle, int reg);
72 int (*write)(void *handle, int reg, int val);
73 int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
74 int (*clk)(void *handle, bool enable);
75 int (*handle_irq)(void *handle,
76 irqreturn_t (*swrm_irq_handler)(int irq,
77 void *data),
78 void *swrm_handle,
79 int action);
80};
81
82enum {
83 TX_MACRO_AIF1_CAP = 0,
84 TX_MACRO_AIF2_CAP,
85 TX_MACRO_MAX_DAIS
86};
87
88enum {
89 TX_MACRO_DEC0,
90 TX_MACRO_DEC1,
91 TX_MACRO_DEC2,
92 TX_MACRO_DEC3,
93 TX_MACRO_DEC4,
94 TX_MACRO_DEC5,
95 TX_MACRO_DEC6,
96 TX_MACRO_DEC7,
97 TX_MACRO_DEC_MAX,
98};
99
100enum {
101 TX_MACRO_CLK_DIV_2,
102 TX_MACRO_CLK_DIV_3,
103 TX_MACRO_CLK_DIV_4,
104 TX_MACRO_CLK_DIV_6,
105 TX_MACRO_CLK_DIV_8,
106 TX_MACRO_CLK_DIV_16,
107};
108
109struct tx_mute_work {
110 struct tx_macro_priv *tx_priv;
111 u32 decimator;
112 struct delayed_work dwork;
113};
114
115struct hpf_work {
116 struct tx_macro_priv *tx_priv;
117 u8 decimator;
118 u8 hpf_cut_off_freq;
119 struct delayed_work dwork;
120};
121
122struct tx_macro_priv {
123 struct device *dev;
124 bool dec_active[NUM_DECIMATORS];
125 int tx_mclk_users;
126 int swr_clk_users;
127 struct clk *tx_core_clk;
128 struct clk *tx_npl_clk;
129 struct mutex mclk_lock;
130 struct mutex swr_clk_lock;
131 struct snd_soc_codec *codec;
132 struct device_node *tx_swr_gpio_p;
133 struct tx_macro_swr_ctrl_data *swr_ctrl_data;
134 struct tx_macro_swr_ctrl_platform_data swr_plat_data;
135 struct work_struct tx_macro_add_child_devices_work;
136 struct hpf_work tx_hpf_work[NUM_DECIMATORS];
137 struct tx_mute_work tx_mute_dwork[NUM_DECIMATORS];
138 s32 dmic_0_1_clk_cnt;
139 s32 dmic_2_3_clk_cnt;
140 s32 dmic_4_5_clk_cnt;
141 s32 dmic_6_7_clk_cnt;
142 u16 dmic_clk_div;
143 unsigned long active_ch_mask[TX_MACRO_MAX_DAIS];
144 unsigned long active_ch_cnt[TX_MACRO_MAX_DAIS];
145 char __iomem *tx_io_base;
146 struct platform_device *pdev_child_devices
147 [TX_MACRO_CHILD_DEVICES_MAX];
148 int child_count;
149};
150
151static bool tx_macro_get_data(struct snd_soc_codec *codec,
152 struct device **tx_dev,
153 struct tx_macro_priv **tx_priv,
154 const char *func_name)
155{
156 *tx_dev = bolero_get_device_ptr(codec->dev, TX_MACRO);
157 if (!(*tx_dev)) {
158 dev_err(codec->dev,
159 "%s: null device for macro!\n", func_name);
160 return false;
161 }
162
163 *tx_priv = dev_get_drvdata((*tx_dev));
164 if (!(*tx_priv)) {
165 dev_err(codec->dev,
166 "%s: priv is null for macro!\n", func_name);
167 return false;
168 }
169
170 if (!(*tx_priv)->codec) {
171 dev_err(codec->dev,
172 "%s: tx_priv->codec not initialized!\n", func_name);
173 return false;
174 }
175
176 return true;
177}
178
179static int tx_macro_mclk_enable(struct tx_macro_priv *tx_priv,
180 bool mclk_enable)
181{
182 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
183 int ret = 0;
184
Laxminath Kasamb7f823c2018-08-02 13:23:11 +0530185 dev_dbg(tx_priv->dev, "%s: mclk_enable = %u,clk_users= %d\n",
186 __func__, mclk_enable, tx_priv->tx_mclk_users);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530187
188 mutex_lock(&tx_priv->mclk_lock);
189 if (mclk_enable) {
190 if (tx_priv->tx_mclk_users == 0) {
191 ret = bolero_request_clock(tx_priv->dev,
192 TX_MACRO, MCLK_MUX0, true);
193 if (ret < 0) {
194 dev_err(tx_priv->dev,
195 "%s: request clock enable failed\n",
196 __func__);
197 goto exit;
198 }
199 regcache_mark_dirty(regmap);
200 regcache_sync_region(regmap,
201 TX_START_OFFSET,
202 TX_MAX_OFFSET);
203 /* 9.6MHz MCLK, set value 0x00 if other frequency */
204 regmap_update_bits(regmap,
205 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, 0x01, 0x01);
206 regmap_update_bits(regmap,
207 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
208 0x01, 0x01);
209 regmap_update_bits(regmap,
210 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
211 0x01, 0x01);
212 }
213 tx_priv->tx_mclk_users++;
214 } else {
215 if (tx_priv->tx_mclk_users <= 0) {
216 dev_err(tx_priv->dev, "%s: clock already disabled\n",
217 __func__);
218 tx_priv->tx_mclk_users = 0;
219 goto exit;
220 }
221 tx_priv->tx_mclk_users--;
222 if (tx_priv->tx_mclk_users == 0) {
223 regmap_update_bits(regmap,
224 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
225 0x01, 0x00);
226 regmap_update_bits(regmap,
227 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
228 0x01, 0x00);
229 bolero_request_clock(tx_priv->dev,
230 TX_MACRO, MCLK_MUX0, false);
231 }
232 }
233exit:
234 mutex_unlock(&tx_priv->mclk_lock);
235 return ret;
236}
237
238static int tx_macro_mclk_event(struct snd_soc_dapm_widget *w,
239 struct snd_kcontrol *kcontrol, int event)
240{
241 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
242 int ret = 0;
243 struct device *tx_dev = NULL;
244 struct tx_macro_priv *tx_priv = NULL;
245
246 if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__))
247 return -EINVAL;
248
249 dev_dbg(tx_dev, "%s: event = %d\n", __func__, event);
250 switch (event) {
251 case SND_SOC_DAPM_PRE_PMU:
252 ret = tx_macro_mclk_enable(tx_priv, 1);
253 break;
254 case SND_SOC_DAPM_POST_PMD:
255 ret = tx_macro_mclk_enable(tx_priv, 0);
256 break;
257 default:
258 dev_err(tx_priv->dev,
259 "%s: invalid DAPM event %d\n", __func__, event);
260 ret = -EINVAL;
261 }
262 return ret;
263}
264
265static int tx_macro_mclk_ctrl(struct device *dev, bool enable)
266{
267 struct tx_macro_priv *tx_priv = dev_get_drvdata(dev);
268 int ret = 0;
269
270 if (enable) {
271 ret = clk_prepare_enable(tx_priv->tx_core_clk);
272 if (ret < 0) {
273 dev_err(dev, "%s:tx mclk enable failed\n", __func__);
274 goto exit;
275 }
276 ret = clk_prepare_enable(tx_priv->tx_npl_clk);
277 if (ret < 0) {
278 dev_err(dev, "%s:tx npl_clk enable failed\n",
279 __func__);
280 clk_disable_unprepare(tx_priv->tx_core_clk);
281 goto exit;
282 }
283 } else {
284 clk_disable_unprepare(tx_priv->tx_npl_clk);
285 clk_disable_unprepare(tx_priv->tx_core_clk);
286 }
287
288exit:
289 return ret;
290}
291
292static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
293{
294 struct delayed_work *hpf_delayed_work = NULL;
295 struct hpf_work *hpf_work = NULL;
296 struct tx_macro_priv *tx_priv = NULL;
297 struct snd_soc_codec *codec = NULL;
298 u16 dec_cfg_reg = 0;
299 u8 hpf_cut_off_freq = 0;
300
301 hpf_delayed_work = to_delayed_work(work);
302 hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
303 tx_priv = hpf_work->tx_priv;
304 codec = tx_priv->codec;
305 hpf_cut_off_freq = hpf_work->hpf_cut_off_freq;
306
307 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
308 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
309
310 dev_dbg(codec->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n",
311 __func__, hpf_work->decimator, hpf_cut_off_freq);
312
313 snd_soc_update_bits(codec, dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
314 hpf_cut_off_freq << 5);
315}
316
317static void tx_macro_mute_update_callback(struct work_struct *work)
318{
319 struct tx_mute_work *tx_mute_dwork = NULL;
320 struct snd_soc_codec *codec = NULL;
321 struct tx_macro_priv *tx_priv = NULL;
322 struct delayed_work *delayed_work = NULL;
323 u16 tx_vol_ctl_reg = 0, hpf_gate_reg = 0;
324 u8 decimator = 0;
325
326 delayed_work = to_delayed_work(work);
327 tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork);
328 tx_priv = tx_mute_dwork->tx_priv;
329 codec = tx_priv->codec;
330 decimator = tx_mute_dwork->decimator;
331
332 tx_vol_ctl_reg =
333 BOLERO_CDC_TX0_TX_PATH_CTL +
334 TX_MACRO_TX_PATH_OFFSET * decimator;
335 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
336 TX_MACRO_TX_PATH_OFFSET * decimator;
337 snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x01);
338 snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x01, 0x00);
339 dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
340 __func__, decimator);
341}
342
343static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
344 struct snd_ctl_elem_value *ucontrol)
345{
346 struct snd_soc_dapm_widget *widget =
347 snd_soc_dapm_kcontrol_widget(kcontrol);
348 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
349 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
350 unsigned int val = 0;
351 u16 mic_sel_reg = 0;
352
353 val = ucontrol->value.enumerated.item[0];
354 if (val > e->items - 1)
355 return -EINVAL;
356
357 dev_dbg(codec->dev, "%s: wname: %s, val: 0x%x\n", __func__,
358 widget->name, val);
359
360 switch (e->reg) {
361 case BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0:
362 mic_sel_reg = BOLERO_CDC_TX0_TX_PATH_CFG0;
363 break;
364 case BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0:
365 mic_sel_reg = BOLERO_CDC_TX1_TX_PATH_CFG0;
366 break;
367 case BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0:
368 mic_sel_reg = BOLERO_CDC_TX2_TX_PATH_CFG0;
369 break;
370 case BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0:
371 mic_sel_reg = BOLERO_CDC_TX3_TX_PATH_CFG0;
372 break;
373 case BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0:
374 mic_sel_reg = BOLERO_CDC_TX4_TX_PATH_CFG0;
375 break;
376 case BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0:
377 mic_sel_reg = BOLERO_CDC_TX5_TX_PATH_CFG0;
378 break;
379 case BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0:
380 mic_sel_reg = BOLERO_CDC_TX6_TX_PATH_CFG0;
381 break;
382 case BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0:
383 mic_sel_reg = BOLERO_CDC_TX7_TX_PATH_CFG0;
384 break;
385 default:
386 dev_err(codec->dev, "%s: e->reg: 0x%x not expected\n",
387 __func__, e->reg);
388 return -EINVAL;
389 }
390 if (strnstr(widget->name, "smic", strlen(widget->name))) {
391 if (val != 0) {
392 if (val < 5)
393 snd_soc_update_bits(codec, mic_sel_reg,
394 1 << 7, 0x0 << 7);
395 else
396 snd_soc_update_bits(codec, mic_sel_reg,
397 1 << 7, 0x1 << 7);
398 }
399 } else {
400 /* DMIC selected */
401 if (val != 0)
402 snd_soc_update_bits(codec, mic_sel_reg, 1 << 7, 1 << 7);
403 }
404
405 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
406}
407
408static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol,
409 struct snd_ctl_elem_value *ucontrol)
410{
411 struct snd_soc_dapm_widget *widget =
412 snd_soc_dapm_kcontrol_widget(kcontrol);
413 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
414 struct soc_multi_mixer_control *mixer =
415 ((struct soc_multi_mixer_control *)kcontrol->private_value);
416 u32 dai_id = widget->shift;
417 u32 dec_id = mixer->shift;
418 struct device *tx_dev = NULL;
419 struct tx_macro_priv *tx_priv = NULL;
420
421 if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__))
422 return -EINVAL;
423
424 if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id]))
425 ucontrol->value.integer.value[0] = 1;
426 else
427 ucontrol->value.integer.value[0] = 0;
428 return 0;
429}
430
431static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
432 struct snd_ctl_elem_value *ucontrol)
433{
434 struct snd_soc_dapm_widget *widget =
435 snd_soc_dapm_kcontrol_widget(kcontrol);
436 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(widget->dapm);
437 struct snd_soc_dapm_update *update = NULL;
438 struct soc_multi_mixer_control *mixer =
439 ((struct soc_multi_mixer_control *)kcontrol->private_value);
440 u32 dai_id = widget->shift;
441 u32 dec_id = mixer->shift;
442 u32 enable = ucontrol->value.integer.value[0];
443 struct device *tx_dev = NULL;
444 struct tx_macro_priv *tx_priv = NULL;
445
446 if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__))
447 return -EINVAL;
448
449 if (enable) {
450 set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
451 tx_priv->active_ch_cnt[dai_id]++;
452 } else {
453 tx_priv->active_ch_cnt[dai_id]--;
454 clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
455 }
456 snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
457
458 return 0;
459}
460
461static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
462 struct snd_kcontrol *kcontrol, int event)
463{
464 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
465 u8 dmic_clk_en = 0x01;
466 u16 dmic_clk_reg = 0;
467 s32 *dmic_clk_cnt = NULL;
468 unsigned int dmic = 0;
469 int ret = 0;
470 char *wname = NULL;
471 struct device *tx_dev = NULL;
472 struct tx_macro_priv *tx_priv = NULL;
473
474 if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__))
475 return -EINVAL;
476
477 wname = strpbrk(w->name, "01234567");
478 if (!wname) {
479 dev_err(codec->dev, "%s: widget not found\n", __func__);
480 return -EINVAL;
481 }
482
483 ret = kstrtouint(wname, 10, &dmic);
484 if (ret < 0) {
485 dev_err(codec->dev, "%s: Invalid DMIC line on the codec\n",
486 __func__);
487 return -EINVAL;
488 }
489
490 switch (dmic) {
491 case 0:
492 case 1:
493 dmic_clk_cnt = &(tx_priv->dmic_0_1_clk_cnt);
494 dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC0_CTL;
495 break;
496 case 2:
497 case 3:
498 dmic_clk_cnt = &(tx_priv->dmic_2_3_clk_cnt);
499 dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC1_CTL;
500 break;
501 case 4:
502 case 5:
503 dmic_clk_cnt = &(tx_priv->dmic_4_5_clk_cnt);
504 dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC2_CTL;
505 break;
506 case 6:
507 case 7:
508 dmic_clk_cnt = &(tx_priv->dmic_6_7_clk_cnt);
509 dmic_clk_reg = BOLERO_CDC_VA_TOP_CSR_DMIC3_CTL;
510 break;
511 default:
512 dev_err(codec->dev, "%s: Invalid DMIC Selection\n",
513 __func__);
514 return -EINVAL;
515 }
516 dev_dbg(codec->dev, "%s: event %d DMIC%d dmic_clk_cnt %d\n",
517 __func__, event, dmic, *dmic_clk_cnt);
518
519 switch (event) {
520 case SND_SOC_DAPM_PRE_PMU:
521 (*dmic_clk_cnt)++;
522 if (*dmic_clk_cnt == 1) {
523 snd_soc_update_bits(codec, dmic_clk_reg,
524 0x0E, tx_priv->dmic_clk_div << 0x1);
525 snd_soc_update_bits(codec, dmic_clk_reg,
526 dmic_clk_en, dmic_clk_en);
527 }
528 break;
529 case SND_SOC_DAPM_POST_PMD:
530 (*dmic_clk_cnt)--;
531 if (*dmic_clk_cnt == 0)
532 snd_soc_update_bits(codec, dmic_clk_reg,
533 dmic_clk_en, 0);
534 break;
535 }
536
537 return 0;
538}
539
540static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
541 struct snd_kcontrol *kcontrol, int event)
542{
543 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
544 unsigned int decimator = 0;
545 u16 tx_vol_ctl_reg = 0;
546 u16 dec_cfg_reg = 0;
547 u16 hpf_gate_reg = 0;
548 u16 tx_gain_ctl_reg = 0;
549 u8 hpf_cut_off_freq = 0;
550 struct device *tx_dev = NULL;
551 struct tx_macro_priv *tx_priv = NULL;
552
553 if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__))
554 return -EINVAL;
555
556 decimator = w->shift;
557
558 dev_dbg(codec->dev, "%s(): widget = %s decimator = %u\n", __func__,
559 w->name, decimator);
560
561 tx_vol_ctl_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
562 TX_MACRO_TX_PATH_OFFSET * decimator;
563 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
564 TX_MACRO_TX_PATH_OFFSET * decimator;
565 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
566 TX_MACRO_TX_PATH_OFFSET * decimator;
567 tx_gain_ctl_reg = BOLERO_CDC_TX0_TX_VOL_CTL +
568 TX_MACRO_TX_PATH_OFFSET * decimator;
569
570 switch (event) {
571 case SND_SOC_DAPM_PRE_PMU:
572 hpf_cut_off_freq = (snd_soc_read(codec, dec_cfg_reg) &
573 TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
574 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq =
575 hpf_cut_off_freq;
576
577 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ)
578 snd_soc_update_bits(codec, dec_cfg_reg,
579 TX_HPF_CUT_OFF_FREQ_MASK,
580 CF_MIN_3DB_150HZ << 5);
581 /* Enable TX PGA Mute */
582 snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10);
583 break;
584 case SND_SOC_DAPM_POST_PMU:
585 snd_soc_update_bits(codec, hpf_gate_reg, 0x01, 0x00);
586
587 /* schedule work queue to Remove Mute */
588 schedule_delayed_work(&tx_priv->tx_mute_dwork[decimator].dwork,
589 msecs_to_jiffies(tx_unmute_delay));
590 if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq !=
591 CF_MIN_3DB_150HZ)
592 schedule_delayed_work(
593 &tx_priv->tx_hpf_work[decimator].dwork,
594 msecs_to_jiffies(300));
595 /* apply gain after decimator is enabled */
596 snd_soc_write(codec, tx_gain_ctl_reg,
597 snd_soc_read(codec, tx_gain_ctl_reg));
598 break;
599 case SND_SOC_DAPM_PRE_PMD:
600 hpf_cut_off_freq =
601 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq;
602 snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x10);
603 if (cancel_delayed_work_sync(
604 &tx_priv->tx_hpf_work[decimator].dwork)) {
605 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
606 snd_soc_update_bits(codec, dec_cfg_reg,
607 TX_HPF_CUT_OFF_FREQ_MASK,
608 hpf_cut_off_freq << 5);
609 }
610 }
611 cancel_delayed_work_sync(
612 &tx_priv->tx_mute_dwork[decimator].dwork);
613 break;
614 case SND_SOC_DAPM_POST_PMD:
615 snd_soc_update_bits(codec, tx_vol_ctl_reg, 0x10, 0x00);
616 break;
617 }
618 return 0;
619}
620
621static int tx_macro_enable_micbias(struct snd_soc_dapm_widget *w,
622 struct snd_kcontrol *kcontrol, int event)
623{
624 return 0;
625}
626
627static int tx_macro_hw_params(struct snd_pcm_substream *substream,
628 struct snd_pcm_hw_params *params,
629 struct snd_soc_dai *dai)
630{
631 int tx_fs_rate = -EINVAL;
632 struct snd_soc_codec *codec = dai->codec;
633 u32 decimator = 0;
Laxminath Kasamb7f823c2018-08-02 13:23:11 +0530634 u32 sample_rate = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530635 u16 tx_fs_reg = 0;
636 struct device *tx_dev = NULL;
637 struct tx_macro_priv *tx_priv = NULL;
638
639 if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__))
640 return -EINVAL;
641
642 pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
643 dai->name, dai->id, params_rate(params),
644 params_channels(params));
645
646 sample_rate = params_rate(params);
647 switch (sample_rate) {
648 case 8000:
649 tx_fs_rate = 0;
650 break;
651 case 16000:
652 tx_fs_rate = 1;
653 break;
654 case 32000:
655 tx_fs_rate = 3;
656 break;
657 case 48000:
658 tx_fs_rate = 4;
659 break;
660 case 96000:
661 tx_fs_rate = 5;
662 break;
663 case 192000:
664 tx_fs_rate = 6;
665 break;
666 case 384000:
667 tx_fs_rate = 7;
668 break;
669 default:
670 dev_err(codec->dev, "%s: Invalid TX sample rate: %d\n",
671 __func__, params_rate(params));
672 return -EINVAL;
673 }
674 for_each_set_bit(decimator, &tx_priv->active_ch_mask[dai->id],
675 TX_MACRO_DEC_MAX) {
676 if (decimator >= 0) {
677 tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
678 TX_MACRO_TX_PATH_OFFSET * decimator;
679 dev_dbg(codec->dev, "%s: set DEC%u rate to %u\n",
680 __func__, decimator, sample_rate);
681 snd_soc_update_bits(codec, tx_fs_reg, 0x0F,
682 tx_fs_rate);
683 } else {
684 dev_err(codec->dev,
685 "%s: ERROR: Invalid decimator: %d\n",
686 __func__, decimator);
687 return -EINVAL;
688 }
689 }
690 return 0;
691}
692
693static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
694 unsigned int *tx_num, unsigned int *tx_slot,
695 unsigned int *rx_num, unsigned int *rx_slot)
696{
697 struct snd_soc_codec *codec = dai->codec;
698 struct device *tx_dev = NULL;
699 struct tx_macro_priv *tx_priv = NULL;
700
701 if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__))
702 return -EINVAL;
703
704 switch (dai->id) {
705 case TX_MACRO_AIF1_CAP:
706 case TX_MACRO_AIF2_CAP:
707 *tx_slot = tx_priv->active_ch_mask[dai->id];
708 *tx_num = tx_priv->active_ch_cnt[dai->id];
709 break;
710 default:
711 dev_err(tx_dev, "%s: Invalid AIF\n", __func__);
712 break;
713 }
714 return 0;
715}
716
717static struct snd_soc_dai_ops tx_macro_dai_ops = {
718 .hw_params = tx_macro_hw_params,
719 .get_channel_map = tx_macro_get_channel_map,
720};
721
722static struct snd_soc_dai_driver tx_macro_dai[] = {
723 {
724 .name = "tx_macro_tx1",
725 .id = TX_MACRO_AIF1_CAP,
726 .capture = {
727 .stream_name = "TX_AIF1 Capture",
728 .rates = TX_MACRO_RATES,
729 .formats = TX_MACRO_FORMATS,
730 .rate_max = 192000,
731 .rate_min = 8000,
732 .channels_min = 1,
733 .channels_max = 8,
734 },
735 .ops = &tx_macro_dai_ops,
736 },
737 {
738 .name = "tx_macro_tx2",
739 .id = TX_MACRO_AIF2_CAP,
740 .capture = {
741 .stream_name = "TX_AIF2 Capture",
742 .rates = TX_MACRO_RATES,
743 .formats = TX_MACRO_FORMATS,
744 .rate_max = 192000,
745 .rate_min = 8000,
746 .channels_min = 1,
747 .channels_max = 8,
748 },
749 .ops = &tx_macro_dai_ops,
750 },
751};
752
753#define STRING(name) #name
754#define TX_MACRO_DAPM_ENUM(name, reg, offset, text) \
755static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
756static const struct snd_kcontrol_new name##_mux = \
757 SOC_DAPM_ENUM(STRING(name), name##_enum)
758
759#define TX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \
760static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
761static const struct snd_kcontrol_new name##_mux = \
762 SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname)
763
764#define TX_MACRO_DAPM_MUX(name, shift, kctl) \
765 SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux)
766
767static const char * const adc_mux_text[] = {
768 "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1"
769};
770
771TX_MACRO_DAPM_ENUM(tx_dec0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1,
772 0, adc_mux_text);
773TX_MACRO_DAPM_ENUM(tx_dec1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1,
774 0, adc_mux_text);
775TX_MACRO_DAPM_ENUM(tx_dec2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1,
776 0, adc_mux_text);
777TX_MACRO_DAPM_ENUM(tx_dec3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1,
778 0, adc_mux_text);
779TX_MACRO_DAPM_ENUM(tx_dec4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1,
780 0, adc_mux_text);
781TX_MACRO_DAPM_ENUM(tx_dec5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1,
782 0, adc_mux_text);
783TX_MACRO_DAPM_ENUM(tx_dec6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1,
784 0, adc_mux_text);
785TX_MACRO_DAPM_ENUM(tx_dec7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1,
786 0, adc_mux_text);
787
788
789static const char * const dmic_mux_text[] = {
790 "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3",
791 "DMIC4", "DMIC5", "DMIC6", "DMIC7"
792};
793
794TX_MACRO_DAPM_ENUM_EXT(tx_dmic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
795 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
796 tx_macro_put_dec_enum);
797
798TX_MACRO_DAPM_ENUM_EXT(tx_dmic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
799 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
800 tx_macro_put_dec_enum);
801
802TX_MACRO_DAPM_ENUM_EXT(tx_dmic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
803 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
804 tx_macro_put_dec_enum);
805
806TX_MACRO_DAPM_ENUM_EXT(tx_dmic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
807 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
808 tx_macro_put_dec_enum);
809
810TX_MACRO_DAPM_ENUM_EXT(tx_dmic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
811 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
812 tx_macro_put_dec_enum);
813
814TX_MACRO_DAPM_ENUM_EXT(tx_dmic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
815 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
816 tx_macro_put_dec_enum);
817
818TX_MACRO_DAPM_ENUM_EXT(tx_dmic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
819 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
820 tx_macro_put_dec_enum);
821
822TX_MACRO_DAPM_ENUM_EXT(tx_dmic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
823 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
824 tx_macro_put_dec_enum);
825
826static const char * const smic_mux_text[] = {
827 "ZERO", "ADC0", "ADC1", "ADC2", "ADC3",
828 "SWR_DMIC0", "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3",
829 "SWR_DMIC4", "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7"
830};
831
832TX_MACRO_DAPM_ENUM_EXT(tx_smic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
833 0, smic_mux_text, snd_soc_dapm_get_enum_double,
834 tx_macro_put_dec_enum);
835
836TX_MACRO_DAPM_ENUM_EXT(tx_smic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
837 0, smic_mux_text, snd_soc_dapm_get_enum_double,
838 tx_macro_put_dec_enum);
839
840TX_MACRO_DAPM_ENUM_EXT(tx_smic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
841 0, smic_mux_text, snd_soc_dapm_get_enum_double,
842 tx_macro_put_dec_enum);
843
844TX_MACRO_DAPM_ENUM_EXT(tx_smic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
845 0, smic_mux_text, snd_soc_dapm_get_enum_double,
846 tx_macro_put_dec_enum);
847
848TX_MACRO_DAPM_ENUM_EXT(tx_smic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
849 0, smic_mux_text, snd_soc_dapm_get_enum_double,
850 tx_macro_put_dec_enum);
851
852TX_MACRO_DAPM_ENUM_EXT(tx_smic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
853 0, smic_mux_text, snd_soc_dapm_get_enum_double,
854 tx_macro_put_dec_enum);
855
856TX_MACRO_DAPM_ENUM_EXT(tx_smic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
857 0, smic_mux_text, snd_soc_dapm_get_enum_double,
858 tx_macro_put_dec_enum);
859
860TX_MACRO_DAPM_ENUM_EXT(tx_smic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
861 0, smic_mux_text, snd_soc_dapm_get_enum_double,
862 tx_macro_put_dec_enum);
863
864static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = {
865 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
866 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
867 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
868 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
869 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
870 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
871 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
872 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
873 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
874 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
875 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
876 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
877 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
878 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
879 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
880 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
881};
882
883static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = {
884 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
885 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
886 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
887 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
888 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
889 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
890 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
891 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
892 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
893 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
894 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
895 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
896 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
897 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
898 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
899 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
900};
901
902static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
903 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
904 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
905
906 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
907 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
908
909 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
910 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
911
912 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
913 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
914
915
916 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
917 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
918 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
919 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
920 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
921 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
922 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
923 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
924
925 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0),
926 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1),
927 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2),
928 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3),
929 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4),
930 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5),
931 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6),
932 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7),
933
934 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
935 tx_macro_enable_micbias,
936 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
937 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
938 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
939 SND_SOC_DAPM_POST_PMD),
940
941 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
942 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
943 SND_SOC_DAPM_POST_PMD),
944
945 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
946 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
947 SND_SOC_DAPM_POST_PMD),
948
949 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
950 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
951 SND_SOC_DAPM_POST_PMD),
952
953 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
954 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
955 SND_SOC_DAPM_POST_PMD),
956
957 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
958 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
959 SND_SOC_DAPM_POST_PMD),
960
961 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
962 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
963 SND_SOC_DAPM_POST_PMD),
964
965 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
966 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
967 SND_SOC_DAPM_POST_PMD),
968
969 SND_SOC_DAPM_INPUT("TX SWR_ADC0"),
970 SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
971 SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
972 SND_SOC_DAPM_INPUT("TX SWR_ADC3"),
973 SND_SOC_DAPM_INPUT("TX SWR_DMIC0"),
974 SND_SOC_DAPM_INPUT("TX SWR_DMIC1"),
975 SND_SOC_DAPM_INPUT("TX SWR_DMIC2"),
976 SND_SOC_DAPM_INPUT("TX SWR_DMIC3"),
977 SND_SOC_DAPM_INPUT("TX SWR_DMIC4"),
978 SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
979 SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
980 SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
981
982 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", BOLERO_CDC_TX0_TX_PATH_CTL,
983 TX_MACRO_DEC0, 0,
984 &tx_dec0_mux, tx_macro_enable_dec,
985 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
986 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
987
988 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", BOLERO_CDC_TX1_TX_PATH_CTL,
989 TX_MACRO_DEC1, 0,
990 &tx_dec1_mux, tx_macro_enable_dec,
991 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
992 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
993
994 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", BOLERO_CDC_TX2_TX_PATH_CTL,
995 TX_MACRO_DEC2, 0,
996 &tx_dec2_mux, tx_macro_enable_dec,
997 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
998 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
999
1000 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", BOLERO_CDC_TX3_TX_PATH_CTL,
1001 TX_MACRO_DEC3, 0,
1002 &tx_dec3_mux, tx_macro_enable_dec,
1003 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1004 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1005
1006 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", BOLERO_CDC_TX4_TX_PATH_CTL,
1007 TX_MACRO_DEC4, 0,
1008 &tx_dec4_mux, tx_macro_enable_dec,
1009 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1010 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1011
1012 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", BOLERO_CDC_TX5_TX_PATH_CTL,
1013 TX_MACRO_DEC5, 0,
1014 &tx_dec5_mux, tx_macro_enable_dec,
1015 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1016 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1017
1018 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", BOLERO_CDC_TX6_TX_PATH_CTL,
1019 TX_MACRO_DEC6, 0,
1020 &tx_dec6_mux, tx_macro_enable_dec,
1021 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1022 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1023
1024 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", BOLERO_CDC_TX7_TX_PATH_CTL,
1025 TX_MACRO_DEC7, 0,
1026 &tx_dec7_mux, tx_macro_enable_dec,
1027 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1028 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1029
1030 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1031 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1032};
1033
1034static const struct snd_soc_dapm_route tx_audio_map[] = {
1035 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1036 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
1037
1038 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1039 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
1040
1041 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1042 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1043 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1044 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1045 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1046 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1047 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1048 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1049
1050 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1051 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1052 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1053 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1054 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1055 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1056 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1057 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1058
1059 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
1060 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
1061 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
1062 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
1063 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
1064 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
1065 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
1066 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
1067 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
1068
1069 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
1070 {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
1071 {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"},
1072 {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"},
1073 {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"},
1074 {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"},
1075 {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"},
1076 {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"},
1077 {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"},
1078 {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"},
1079 {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"},
1080 {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
1081 {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
1082
1083 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
1084 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
1085 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
1086 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
1087 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
1088 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
1089 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
1090 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
1091 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
1092
1093 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
1094 {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
1095 {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"},
1096 {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"},
1097 {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"},
1098 {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"},
1099 {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"},
1100 {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"},
1101 {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"},
1102 {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"},
1103 {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"},
1104 {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
1105 {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
1106
1107 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
1108 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
1109 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
1110 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
1111 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
1112 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
1113 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
1114 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
1115 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
1116
1117 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
1118 {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
1119 {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"},
1120 {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"},
1121 {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"},
1122 {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"},
1123 {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"},
1124 {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"},
1125 {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"},
1126 {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"},
1127 {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"},
1128 {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
1129 {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
1130
1131 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
1132 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
1133 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
1134 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
1135 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
1136 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
1137 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
1138 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
1139 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
1140
1141 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
1142 {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
1143 {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"},
1144 {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"},
1145 {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"},
1146 {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"},
1147 {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"},
1148 {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"},
1149 {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"},
1150 {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"},
1151 {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"},
1152 {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
1153 {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
1154
1155 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
1156 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
1157 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
1158 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
1159 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
1160 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
1161 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
1162 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
1163 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
1164
1165 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
1166 {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
1167 {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"},
1168 {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"},
1169 {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"},
1170 {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"},
1171 {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"},
1172 {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"},
1173 {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"},
1174 {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"},
1175 {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"},
1176 {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
1177 {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
1178
1179 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
1180 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
1181 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
1182 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
1183 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
1184 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
1185 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
1186 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
1187 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
1188
1189 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
1190 {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
1191 {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"},
1192 {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"},
1193 {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"},
1194 {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"},
1195 {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"},
1196 {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"},
1197 {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"},
1198 {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"},
1199 {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"},
1200 {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
1201 {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
1202
1203 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
1204 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
1205 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
1206 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
1207 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
1208 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
1209 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
1210 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
1211 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
1212
1213 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
1214 {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
1215 {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"},
1216 {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"},
1217 {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"},
1218 {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"},
1219 {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"},
1220 {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"},
1221 {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"},
1222 {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"},
1223 {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"},
1224 {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
1225 {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
1226
1227 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
1228 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
1229 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
1230 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
1231 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
1232 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
1233 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
1234 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
1235 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
1236
1237 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
1238 {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},
1239 {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"},
1240 {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"},
1241 {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"},
1242 {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"},
1243 {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"},
1244 {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"},
1245 {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"},
1246 {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"},
1247 {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"},
1248 {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"},
1249 {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"},
1250};
1251
1252static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
1253 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
1254 BOLERO_CDC_TX0_TX_VOL_CTL,
1255 0, -84, 40, digital_gain),
1256 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
1257 BOLERO_CDC_TX1_TX_VOL_CTL,
1258 0, -84, 40, digital_gain),
1259 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
1260 BOLERO_CDC_TX2_TX_VOL_CTL,
1261 0, -84, 40, digital_gain),
1262 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
1263 BOLERO_CDC_TX3_TX_VOL_CTL,
1264 0, -84, 40, digital_gain),
1265 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
1266 BOLERO_CDC_TX4_TX_VOL_CTL,
1267 0, -84, 40, digital_gain),
1268 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
1269 BOLERO_CDC_TX5_TX_VOL_CTL,
1270 0, -84, 40, digital_gain),
1271 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
1272 BOLERO_CDC_TX6_TX_VOL_CTL,
1273 0, -84, 40, digital_gain),
1274 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
1275 BOLERO_CDC_TX7_TX_VOL_CTL,
1276 0, -84, 40, digital_gain),
1277};
1278
1279static int tx_macro_swrm_clock(void *handle, bool enable)
1280{
1281 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
1282 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
1283 int ret = 0;
1284
1285 mutex_lock(&tx_priv->swr_clk_lock);
1286
1287 dev_dbg(tx_priv->dev, "%s: swrm clock %s\n",
1288 __func__, (enable ? "enable" : "disable"));
1289 if (enable) {
1290 if (tx_priv->swr_clk_users == 0) {
1291 ret = tx_macro_mclk_enable(tx_priv, 1);
1292 if (ret < 0) {
1293 dev_err(tx_priv->dev,
1294 "%s: request clock enable failed\n",
1295 __func__);
1296 goto exit;
1297 }
1298 regmap_update_bits(regmap,
1299 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
1300 0x01, 0x01);
1301 regmap_update_bits(regmap,
1302 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
1303 0x1C, 0x0C);
1304 msm_cdc_pinctrl_select_active_state(
1305 tx_priv->tx_swr_gpio_p);
1306 }
1307 tx_priv->swr_clk_users++;
1308 } else {
1309 if (tx_priv->swr_clk_users <= 0) {
1310 dev_err(tx_priv->dev,
1311 "tx swrm clock users already 0\n");
1312 tx_priv->swr_clk_users = 0;
1313 goto exit;
1314 }
1315 tx_priv->swr_clk_users--;
1316 if (tx_priv->swr_clk_users == 0) {
1317 regmap_update_bits(regmap,
1318 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
1319 0x01, 0x00);
1320 msm_cdc_pinctrl_select_sleep_state(
1321 tx_priv->tx_swr_gpio_p);
1322 tx_macro_mclk_enable(tx_priv, 0);
1323 }
1324 }
1325 dev_dbg(tx_priv->dev, "%s: swrm clock users %d\n",
1326 __func__, tx_priv->swr_clk_users);
1327exit:
1328 mutex_unlock(&tx_priv->swr_clk_lock);
1329 return ret;
1330}
1331
1332static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate,
1333 struct tx_macro_priv *tx_priv)
1334{
1335 u32 div_factor = TX_MACRO_CLK_DIV_2;
1336 u32 mclk_rate = TX_MACRO_MCLK_FREQ;
1337
1338 if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED ||
1339 mclk_rate % dmic_sample_rate != 0)
1340 goto undefined_rate;
1341
1342 div_factor = mclk_rate / dmic_sample_rate;
1343
1344 switch (div_factor) {
1345 case 2:
1346 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
1347 break;
1348 case 3:
1349 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_3;
1350 break;
1351 case 4:
1352 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_4;
1353 break;
1354 case 6:
1355 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_6;
1356 break;
1357 case 8:
1358 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_8;
1359 break;
1360 case 16:
1361 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_16;
1362 break;
1363 default:
1364 /* Any other DIV factor is invalid */
1365 goto undefined_rate;
1366 }
1367
1368 /* Valid dmic DIV factors */
1369 dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n",
1370 __func__, div_factor, mclk_rate);
1371
1372 return dmic_sample_rate;
1373
1374undefined_rate:
1375 dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n",
1376 __func__, dmic_sample_rate, mclk_rate);
1377 dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED;
1378
1379 return dmic_sample_rate;
1380}
1381
1382static int tx_macro_init(struct snd_soc_codec *codec)
1383{
1384 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1385 int ret = 0, i = 0;
1386 struct device *tx_dev = NULL;
1387 struct tx_macro_priv *tx_priv = NULL;
1388
1389 tx_dev = bolero_get_device_ptr(codec->dev, TX_MACRO);
1390 if (!tx_dev) {
1391 dev_err(codec->dev,
1392 "%s: null device for macro!\n", __func__);
1393 return -EINVAL;
1394 }
1395 tx_priv = dev_get_drvdata(tx_dev);
1396 if (!tx_priv) {
1397 dev_err(codec->dev,
1398 "%s: priv is null for macro!\n", __func__);
1399 return -EINVAL;
1400 }
1401 ret = snd_soc_dapm_new_controls(dapm, tx_macro_dapm_widgets,
1402 ARRAY_SIZE(tx_macro_dapm_widgets));
1403 if (ret < 0) {
1404 dev_err(tx_dev, "%s: Failed to add controls\n", __func__);
1405 return ret;
1406 }
1407
1408 ret = snd_soc_dapm_add_routes(dapm, tx_audio_map,
1409 ARRAY_SIZE(tx_audio_map));
1410 if (ret < 0) {
1411 dev_err(tx_dev, "%s: Failed to add routes\n", __func__);
1412 return ret;
1413 }
1414
1415 ret = snd_soc_dapm_new_widgets(dapm->card);
1416 if (ret < 0) {
1417 dev_err(tx_dev, "%s: Failed to add widgets\n", __func__);
1418 return ret;
1419 }
1420
1421 ret = snd_soc_add_codec_controls(codec, tx_macro_snd_controls,
1422 ARRAY_SIZE(tx_macro_snd_controls));
1423 if (ret < 0) {
1424 dev_err(tx_dev, "%s: Failed to add snd_ctls\n", __func__);
1425 return ret;
1426 }
1427 for (i = 0; i < NUM_DECIMATORS; i++) {
1428 tx_priv->tx_hpf_work[i].tx_priv = tx_priv;
1429 tx_priv->tx_hpf_work[i].decimator = i;
1430 INIT_DELAYED_WORK(&tx_priv->tx_hpf_work[i].dwork,
1431 tx_macro_tx_hpf_corner_freq_callback);
1432 }
1433
1434 for (i = 0; i < NUM_DECIMATORS; i++) {
1435 tx_priv->tx_mute_dwork[i].tx_priv = tx_priv;
1436 tx_priv->tx_mute_dwork[i].decimator = i;
1437 INIT_DELAYED_WORK(&tx_priv->tx_mute_dwork[i].dwork,
1438 tx_macro_mute_update_callback);
1439 }
1440 tx_priv->codec = codec;
1441
1442 return 0;
1443}
1444
1445static int tx_macro_deinit(struct snd_soc_codec *codec)
1446{
1447 struct device *tx_dev = NULL;
1448 struct tx_macro_priv *tx_priv = NULL;
1449
1450 if (!tx_macro_get_data(codec, &tx_dev, &tx_priv, __func__))
1451 return -EINVAL;
1452
1453 tx_priv->codec = NULL;
1454 return 0;
1455}
1456
1457static void tx_macro_add_child_devices(struct work_struct *work)
1458{
1459 struct tx_macro_priv *tx_priv = NULL;
1460 struct platform_device *pdev = NULL;
1461 struct device_node *node = NULL;
1462 struct tx_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
1463 int ret = 0;
1464 u16 count = 0, ctrl_num = 0;
1465 struct tx_macro_swr_ctrl_platform_data *platdata = NULL;
1466 char plat_dev_name[TX_MACRO_SWR_STRING_LEN] = "";
1467 bool tx_swr_master_node = false;
1468
1469 tx_priv = container_of(work, struct tx_macro_priv,
1470 tx_macro_add_child_devices_work);
1471 if (!tx_priv) {
1472 pr_err("%s: Memory for tx_priv does not exist\n",
1473 __func__);
1474 return;
1475 }
1476
1477 if (!tx_priv->dev) {
1478 pr_err("%s: tx dev does not exist\n", __func__);
1479 return;
1480 }
1481
1482 if (!tx_priv->dev->of_node) {
1483 dev_err(tx_priv->dev,
1484 "%s: DT node for tx_priv does not exist\n", __func__);
1485 return;
1486 }
1487
1488 platdata = &tx_priv->swr_plat_data;
1489 tx_priv->child_count = 0;
1490
1491 for_each_available_child_of_node(tx_priv->dev->of_node, node) {
1492 tx_swr_master_node = false;
1493 if (strnstr(node->name, "tx_swr_master",
1494 strlen("tx_swr_master")) != NULL)
1495 tx_swr_master_node = true;
1496
1497 if (tx_swr_master_node)
1498 strlcpy(plat_dev_name, "tx_swr_ctrl",
1499 (TX_MACRO_SWR_STRING_LEN - 1));
1500 else
1501 strlcpy(plat_dev_name, node->name,
1502 (TX_MACRO_SWR_STRING_LEN - 1));
1503
1504 pdev = platform_device_alloc(plat_dev_name, -1);
1505 if (!pdev) {
1506 dev_err(tx_priv->dev, "%s: pdev memory alloc failed\n",
1507 __func__);
1508 ret = -ENOMEM;
1509 goto err;
1510 }
1511 pdev->dev.parent = tx_priv->dev;
1512 pdev->dev.of_node = node;
1513
1514 if (tx_swr_master_node) {
1515 ret = platform_device_add_data(pdev, platdata,
1516 sizeof(*platdata));
1517 if (ret) {
1518 dev_err(&pdev->dev,
1519 "%s: cannot add plat data ctrl:%d\n",
1520 __func__, ctrl_num);
1521 goto fail_pdev_add;
1522 }
1523 }
1524
1525 ret = platform_device_add(pdev);
1526 if (ret) {
1527 dev_err(&pdev->dev,
1528 "%s: Cannot add platform device\n",
1529 __func__);
1530 goto fail_pdev_add;
1531 }
1532
1533 if (tx_swr_master_node) {
1534 temp = krealloc(swr_ctrl_data,
1535 (ctrl_num + 1) * sizeof(
1536 struct tx_macro_swr_ctrl_data),
1537 GFP_KERNEL);
1538 if (!temp) {
1539 ret = -ENOMEM;
1540 goto fail_pdev_add;
1541 }
1542 swr_ctrl_data = temp;
1543 swr_ctrl_data[ctrl_num].tx_swr_pdev = pdev;
1544 ctrl_num++;
1545 dev_dbg(&pdev->dev,
1546 "%s: Added soundwire ctrl device(s)\n",
1547 __func__);
1548 tx_priv->swr_ctrl_data = swr_ctrl_data;
1549 }
1550 if (tx_priv->child_count < TX_MACRO_CHILD_DEVICES_MAX)
1551 tx_priv->pdev_child_devices[
1552 tx_priv->child_count++] = pdev;
1553 else
1554 goto err;
1555 }
1556 return;
1557fail_pdev_add:
1558 for (count = 0; count < tx_priv->child_count; count++)
1559 platform_device_put(tx_priv->pdev_child_devices[count]);
1560err:
1561 return;
1562}
1563
1564static void tx_macro_init_ops(struct macro_ops *ops,
1565 char __iomem *tx_io_base)
1566{
1567 memset(ops, 0, sizeof(struct macro_ops));
1568 ops->init = tx_macro_init;
1569 ops->exit = tx_macro_deinit;
1570 ops->io_base = tx_io_base;
1571 ops->dai_ptr = tx_macro_dai;
1572 ops->num_dais = ARRAY_SIZE(tx_macro_dai);
1573 ops->mclk_fn = tx_macro_mclk_ctrl;
1574}
1575
1576static int tx_macro_probe(struct platform_device *pdev)
1577{
1578 struct macro_ops ops = {0};
1579 struct tx_macro_priv *tx_priv = NULL;
1580 u32 tx_base_addr = 0, sample_rate = 0;
1581 char __iomem *tx_io_base = NULL;
1582 struct clk *tx_core_clk = NULL, *tx_npl_clk = NULL;
1583 int ret = 0;
1584 const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate";
1585
1586 tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv),
1587 GFP_KERNEL);
1588 if (!tx_priv)
1589 return -ENOMEM;
1590 platform_set_drvdata(pdev, tx_priv);
1591
1592 tx_priv->dev = &pdev->dev;
1593 ret = of_property_read_u32(pdev->dev.of_node, "reg",
1594 &tx_base_addr);
1595 if (ret) {
1596 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
1597 __func__, "reg");
1598 return ret;
1599 }
1600 dev_set_drvdata(&pdev->dev, tx_priv);
1601 tx_priv->tx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
1602 "qcom,tx-swr-gpios", 0);
1603 if (!tx_priv->tx_swr_gpio_p) {
1604 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
1605 __func__);
1606 return -EINVAL;
1607 }
1608 tx_io_base = devm_ioremap(&pdev->dev,
1609 tx_base_addr, TX_MACRO_MAX_OFFSET);
1610 if (!tx_io_base) {
1611 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
1612 return -ENOMEM;
1613 }
1614 tx_priv->tx_io_base = tx_io_base;
1615 ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate,
1616 &sample_rate);
1617 if (ret) {
1618 dev_err(&pdev->dev,
1619 "%s: could not find sample_rate entry in dt\n",
1620 __func__);
1621 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
1622 } else {
1623 if (tx_macro_validate_dmic_sample_rate(
1624 sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED)
1625 return -EINVAL;
1626 }
1627
1628 INIT_WORK(&tx_priv->tx_macro_add_child_devices_work,
1629 tx_macro_add_child_devices);
1630 tx_priv->swr_plat_data.handle = (void *) tx_priv;
1631 tx_priv->swr_plat_data.read = NULL;
1632 tx_priv->swr_plat_data.write = NULL;
1633 tx_priv->swr_plat_data.bulk_write = NULL;
1634 tx_priv->swr_plat_data.clk = tx_macro_swrm_clock;
1635 tx_priv->swr_plat_data.handle_irq = NULL;
1636 /* Register MCLK for tx macro */
1637 tx_core_clk = devm_clk_get(&pdev->dev, "tx_core_clk");
1638 if (IS_ERR(tx_core_clk)) {
1639 ret = PTR_ERR(tx_core_clk);
1640 dev_err(&pdev->dev, "%s: clk get %s failed %d\n",
1641 __func__, "tx_core_clk", ret);
1642 return ret;
1643 }
1644 tx_priv->tx_core_clk = tx_core_clk;
1645 /* Register npl clk for soundwire */
1646 tx_npl_clk = devm_clk_get(&pdev->dev, "tx_npl_clk");
1647 if (IS_ERR(tx_npl_clk)) {
1648 ret = PTR_ERR(tx_npl_clk);
1649 dev_err(&pdev->dev, "%s: clk get %s failed %d\n",
1650 __func__, "tx_npl_clk", ret);
1651 return ret;
1652 }
1653 tx_priv->tx_npl_clk = tx_npl_clk;
1654
1655 mutex_init(&tx_priv->mclk_lock);
1656 mutex_init(&tx_priv->swr_clk_lock);
1657 tx_macro_init_ops(&ops, tx_io_base);
1658 ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops);
1659 if (ret) {
1660 dev_err(&pdev->dev,
1661 "%s: register macro failed\n", __func__);
1662 goto err_reg_macro;
1663 }
1664 schedule_work(&tx_priv->tx_macro_add_child_devices_work);
1665 return 0;
1666err_reg_macro:
1667 mutex_destroy(&tx_priv->mclk_lock);
1668 mutex_destroy(&tx_priv->swr_clk_lock);
1669 return ret;
1670}
1671
1672static int tx_macro_remove(struct platform_device *pdev)
1673{
1674 struct tx_macro_priv *tx_priv = NULL;
1675 u16 count = 0;
1676
1677 tx_priv = platform_get_drvdata(pdev);
1678
1679 if (!tx_priv)
1680 return -EINVAL;
1681
1682 kfree(tx_priv->swr_ctrl_data);
1683 for (count = 0; count < tx_priv->child_count &&
1684 count < TX_MACRO_CHILD_DEVICES_MAX; count++)
1685 platform_device_unregister(tx_priv->pdev_child_devices[count]);
1686
1687 mutex_destroy(&tx_priv->mclk_lock);
1688 mutex_destroy(&tx_priv->swr_clk_lock);
1689 bolero_unregister_macro(&pdev->dev, TX_MACRO);
1690 return 0;
1691}
1692
1693
1694static const struct of_device_id tx_macro_dt_match[] = {
1695 {.compatible = "qcom,tx-macro"},
1696 {}
1697};
1698
1699static struct platform_driver tx_macro_driver = {
1700 .driver = {
1701 .name = "tx_macro",
1702 .owner = THIS_MODULE,
1703 .of_match_table = tx_macro_dt_match,
1704 },
1705 .probe = tx_macro_probe,
1706 .remove = tx_macro_remove,
1707};
1708
1709module_platform_driver(tx_macro_driver);
1710
1711MODULE_DESCRIPTION("TX macro driver");
1712MODULE_LICENSE("GPL v2");