blob: bccf0f8ddbc9401dbe0d172a144c1e725447b5ae [file] [log] [blame]
Meng Wang43bbb872018-12-10 12:32:05 +08001// SPDX-License-Identifier: GPL-2.0-only
Sudheer Papothif4155002019-12-05 01:36:13 +05302/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303 */
4
5#include <linux/module.h>
6#include <linux/init.h>
7#include <linux/clk.h>
8#include <linux/io.h>
9#include <linux/platform_device.h>
10#include <linux/regmap.h>
Sudheer Papothi7601cc62019-03-30 03:00:52 +053011#include <linux/pm_runtime.h>
Laxminath Kasam989fccf2018-06-15 16:53:31 +053012#include <sound/soc.h>
13#include <sound/soc-dapm.h>
14#include <sound/tlv.h>
Sudheer Papothia3e969d2018-10-27 06:22:10 +053015#include <soc/swr-common.h>
Laxminath Kasamfb0d6832018-09-22 01:49:52 +053016#include <soc/swr-wcd.h>
Meng Wang11a25cf2018-10-31 14:11:26 +080017#include <asoc/msm-cdc-pinctrl.h>
Laxminath Kasam989fccf2018-06-15 16:53:31 +053018#include "bolero-cdc.h"
19#include "bolero-cdc-registers.h"
Vidyakumar Athota5d45f4c2019-03-10 22:35:07 -070020#include "bolero-clk-rsc.h"
Laxminath Kasam989fccf2018-06-15 16:53:31 +053021
Sudheer Papothi7601cc62019-03-30 03:00:52 +053022#define AUTO_SUSPEND_DELAY 50 /* delay in msec */
Laxminath Kasam989fccf2018-06-15 16:53:31 +053023#define TX_MACRO_MAX_OFFSET 0x1000
24
25#define NUM_DECIMATORS 8
26
27#define TX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
28 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
29 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
30#define TX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
31 SNDRV_PCM_FMTBIT_S24_LE |\
32 SNDRV_PCM_FMTBIT_S24_3LE)
33
34#define TX_HPF_CUT_OFF_FREQ_MASK 0x60
35#define CF_MIN_3DB_4HZ 0x0
36#define CF_MIN_3DB_75HZ 0x1
37#define CF_MIN_3DB_150HZ 0x2
38
39#define TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED 0
40#define TX_MACRO_MCLK_FREQ 9600000
41#define TX_MACRO_TX_PATH_OFFSET 0x80
Laxminath Kasam497a6512018-09-17 16:11:52 +053042#define TX_MACRO_SWR_MIC_MUX_SEL_MASK 0xF
Sudheer Papothi339c4112019-12-13 00:49:16 +053043#define TX_MACRO_ADC_MUX_CFG_OFFSET 0x8
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -070044#define TX_MACRO_ADC_MODE_CFG0_SHIFT 1
Laxminath Kasam989fccf2018-06-15 16:53:31 +053045
Sudheer Papothi339c4112019-12-13 00:49:16 +053046#define TX_MACRO_DMIC_UNMUTE_DELAY_MS 40
47#define TX_MACRO_AMIC_UNMUTE_DELAY_MS 100
48#define TX_MACRO_DMIC_HPF_DELAY_MS 300
49#define TX_MACRO_AMIC_HPF_DELAY_MS 300
Laxminath Kasam989fccf2018-06-15 16:53:31 +053050
Sudheer Papothi339c4112019-12-13 00:49:16 +053051static int tx_unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
Laxminath Kasam989fccf2018-06-15 16:53:31 +053052module_param(tx_unmute_delay, int, 0664);
53MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path");
54
55static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
56
57static int tx_macro_hw_params(struct snd_pcm_substream *substream,
58 struct snd_pcm_hw_params *params,
59 struct snd_soc_dai *dai);
60static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
61 unsigned int *tx_num, unsigned int *tx_slot,
62 unsigned int *rx_num, unsigned int *rx_slot);
63
64#define TX_MACRO_SWR_STRING_LEN 80
65#define TX_MACRO_CHILD_DEVICES_MAX 3
66
67/* Hold instance to soundwire platform device */
68struct tx_macro_swr_ctrl_data {
69 struct platform_device *tx_swr_pdev;
70};
71
72struct tx_macro_swr_ctrl_platform_data {
73 void *handle; /* holds codec private data */
74 int (*read)(void *handle, int reg);
75 int (*write)(void *handle, int reg, int val);
76 int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
77 int (*clk)(void *handle, bool enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -070078 int (*core_vote)(void *handle, bool enable);
Laxminath Kasam989fccf2018-06-15 16:53:31 +053079 int (*handle_irq)(void *handle,
80 irqreturn_t (*swrm_irq_handler)(int irq,
81 void *data),
82 void *swrm_handle,
83 int action);
84};
85
86enum {
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +053087 TX_MACRO_AIF_INVALID = 0,
88 TX_MACRO_AIF1_CAP,
Laxminath Kasam989fccf2018-06-15 16:53:31 +053089 TX_MACRO_AIF2_CAP,
Karthikeyan Manif3bb8182019-07-11 14:38:54 -070090 TX_MACRO_AIF3_CAP,
Laxminath Kasam989fccf2018-06-15 16:53:31 +053091 TX_MACRO_MAX_DAIS
92};
93
94enum {
95 TX_MACRO_DEC0,
96 TX_MACRO_DEC1,
97 TX_MACRO_DEC2,
98 TX_MACRO_DEC3,
99 TX_MACRO_DEC4,
100 TX_MACRO_DEC5,
101 TX_MACRO_DEC6,
102 TX_MACRO_DEC7,
103 TX_MACRO_DEC_MAX,
104};
105
106enum {
107 TX_MACRO_CLK_DIV_2,
108 TX_MACRO_CLK_DIV_3,
109 TX_MACRO_CLK_DIV_4,
110 TX_MACRO_CLK_DIV_6,
111 TX_MACRO_CLK_DIV_8,
112 TX_MACRO_CLK_DIV_16,
113};
114
Laxminath Kasam497a6512018-09-17 16:11:52 +0530115enum {
116 MSM_DMIC,
117 SWR_MIC,
118 ANC_FB_TUNE1
119};
120
Sudheer Papothia7397942019-03-19 03:14:23 +0530121enum {
122 TX_MCLK,
123 VA_MCLK,
124};
125
Sudheer Papothi72fef482019-08-30 11:00:20 +0530126struct tx_macro_reg_mask_val {
127 u16 reg;
128 u8 mask;
129 u8 val;
130};
131
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530132struct tx_mute_work {
133 struct tx_macro_priv *tx_priv;
134 u32 decimator;
135 struct delayed_work dwork;
136};
137
138struct hpf_work {
139 struct tx_macro_priv *tx_priv;
140 u8 decimator;
141 u8 hpf_cut_off_freq;
142 struct delayed_work dwork;
143};
144
145struct tx_macro_priv {
146 struct device *dev;
147 bool dec_active[NUM_DECIMATORS];
148 int tx_mclk_users;
149 int swr_clk_users;
Ramprasad Katkam452772a2019-01-07 17:30:36 +0530150 bool dapm_mclk_enable;
Ramprasad Katkama4c747b2018-12-11 19:15:53 +0530151 bool reset_swr;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530152 struct mutex mclk_lock;
153 struct mutex swr_clk_lock;
Meng Wang15c825d2018-09-06 10:49:18 +0800154 struct snd_soc_component *component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530155 struct device_node *tx_swr_gpio_p;
156 struct tx_macro_swr_ctrl_data *swr_ctrl_data;
157 struct tx_macro_swr_ctrl_platform_data swr_plat_data;
158 struct work_struct tx_macro_add_child_devices_work;
159 struct hpf_work tx_hpf_work[NUM_DECIMATORS];
160 struct tx_mute_work tx_mute_dwork[NUM_DECIMATORS];
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530161 u16 dmic_clk_div;
Laxminath Kasam4651dcb2019-10-10 23:45:21 +0530162 u32 version;
Laxminath Kasam2e13d642019-10-12 01:36:30 +0530163 u32 is_used_tx_swr_gpio;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530164 unsigned long active_ch_mask[TX_MACRO_MAX_DAIS];
165 unsigned long active_ch_cnt[TX_MACRO_MAX_DAIS];
166 char __iomem *tx_io_base;
167 struct platform_device *pdev_child_devices
168 [TX_MACRO_CHILD_DEVICES_MAX];
169 int child_count;
Sudheer Papothie456c2c2019-03-05 07:08:45 +0530170 int tx_swr_clk_cnt;
171 int va_swr_clk_cnt;
Sudheer Papothicf3b4062019-05-10 10:48:43 +0530172 int va_clk_status;
173 int tx_clk_status;
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700174 bool bcs_enable;
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700175 int dec_mode[NUM_DECIMATORS];
Vatsal Buchad06525f2019-10-14 23:14:12 +0530176 bool bcs_clk_en;
177 bool hs_slow_insert_complete;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530178};
179
Meng Wang15c825d2018-09-06 10:49:18 +0800180static bool tx_macro_get_data(struct snd_soc_component *component,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530181 struct device **tx_dev,
182 struct tx_macro_priv **tx_priv,
183 const char *func_name)
184{
Meng Wang15c825d2018-09-06 10:49:18 +0800185 *tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530186 if (!(*tx_dev)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800187 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530188 "%s: null device for macro!\n", func_name);
189 return false;
190 }
191
192 *tx_priv = dev_get_drvdata((*tx_dev));
193 if (!(*tx_priv)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800194 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530195 "%s: priv is null for macro!\n", func_name);
196 return false;
197 }
198
Meng Wang15c825d2018-09-06 10:49:18 +0800199 if (!(*tx_priv)->component) {
200 dev_err(component->dev,
201 "%s: tx_priv->component not initialized!\n", func_name);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530202 return false;
203 }
204
205 return true;
206}
207
208static int tx_macro_mclk_enable(struct tx_macro_priv *tx_priv,
209 bool mclk_enable)
210{
211 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
212 int ret = 0;
213
Tanya Dixit8530fb92018-09-14 16:01:25 +0530214 if (regmap == NULL) {
215 dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__);
216 return -EINVAL;
217 }
218
Laxminath Kasamb7f823c2018-08-02 13:23:11 +0530219 dev_dbg(tx_priv->dev, "%s: mclk_enable = %u,clk_users= %d\n",
220 __func__, mclk_enable, tx_priv->tx_mclk_users);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530221
222 mutex_lock(&tx_priv->mclk_lock);
223 if (mclk_enable) {
Meng Wang52a8fb12019-12-12 20:36:05 +0800224 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
225 TX_CORE_CLK,
226 TX_CORE_CLK,
227 true);
228 if (ret < 0) {
229 dev_err_ratelimited(tx_priv->dev,
230 "%s: request clock enable failed\n",
231 __func__);
232 goto exit;
233 }
234 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
235 true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530236 if (tx_priv->tx_mclk_users == 0) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530237 regcache_mark_dirty(regmap);
238 regcache_sync_region(regmap,
239 TX_START_OFFSET,
240 TX_MAX_OFFSET);
241 /* 9.6MHz MCLK, set value 0x00 if other frequency */
242 regmap_update_bits(regmap,
243 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, 0x01, 0x01);
244 regmap_update_bits(regmap,
245 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
246 0x01, 0x01);
247 regmap_update_bits(regmap,
248 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
249 0x01, 0x01);
250 }
251 tx_priv->tx_mclk_users++;
252 } else {
253 if (tx_priv->tx_mclk_users <= 0) {
254 dev_err(tx_priv->dev, "%s: clock already disabled\n",
255 __func__);
256 tx_priv->tx_mclk_users = 0;
257 goto exit;
258 }
259 tx_priv->tx_mclk_users--;
260 if (tx_priv->tx_mclk_users == 0) {
261 regmap_update_bits(regmap,
262 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
263 0x01, 0x00);
264 regmap_update_bits(regmap,
265 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
266 0x01, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530267 }
Meng Wang52a8fb12019-12-12 20:36:05 +0800268
269 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
270 false);
271 bolero_clk_rsc_request_clock(tx_priv->dev,
272 TX_CORE_CLK,
273 TX_CORE_CLK,
274 false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530275 }
276exit:
277 mutex_unlock(&tx_priv->mclk_lock);
278 return ret;
279}
280
Sudheer Papothifc3adb02019-11-24 10:14:21 +0530281static int __tx_macro_mclk_enable(struct snd_soc_component *component,
282 bool enable)
283{
284 struct device *tx_dev = NULL;
285 struct tx_macro_priv *tx_priv = NULL;
286
287 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
288 return -EINVAL;
289
290 return tx_macro_mclk_enable(tx_priv, enable);
291}
292
Sudheer Papothie456c2c2019-03-05 07:08:45 +0530293static int tx_macro_va_swr_clk_event(struct snd_soc_dapm_widget *w,
294 struct snd_kcontrol *kcontrol, int event)
295{
296 struct device *tx_dev = NULL;
297 struct tx_macro_priv *tx_priv = NULL;
298 struct snd_soc_component *component =
299 snd_soc_dapm_to_component(w->dapm);
300
301 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
302 return -EINVAL;
303
304 if (SND_SOC_DAPM_EVENT_ON(event))
305 ++tx_priv->va_swr_clk_cnt;
306 if (SND_SOC_DAPM_EVENT_OFF(event))
307 --tx_priv->va_swr_clk_cnt;
308
309 return 0;
310}
311
312static int tx_macro_tx_swr_clk_event(struct snd_soc_dapm_widget *w,
313 struct snd_kcontrol *kcontrol, int event)
314{
315 struct device *tx_dev = NULL;
316 struct tx_macro_priv *tx_priv = NULL;
317 struct snd_soc_component *component =
318 snd_soc_dapm_to_component(w->dapm);
319
320 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
321 return -EINVAL;
322
323 if (SND_SOC_DAPM_EVENT_ON(event))
324 ++tx_priv->tx_swr_clk_cnt;
325 if (SND_SOC_DAPM_EVENT_OFF(event))
326 --tx_priv->tx_swr_clk_cnt;
327
328 return 0;
329}
330
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530331static int tx_macro_mclk_event(struct snd_soc_dapm_widget *w,
332 struct snd_kcontrol *kcontrol, int event)
333{
Meng Wang15c825d2018-09-06 10:49:18 +0800334 struct snd_soc_component *component =
335 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530336 int ret = 0;
337 struct device *tx_dev = NULL;
338 struct tx_macro_priv *tx_priv = NULL;
339
Meng Wang15c825d2018-09-06 10:49:18 +0800340 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530341 return -EINVAL;
342
343 dev_dbg(tx_dev, "%s: event = %d\n", __func__, event);
344 switch (event) {
345 case SND_SOC_DAPM_PRE_PMU:
346 ret = tx_macro_mclk_enable(tx_priv, 1);
Ramprasad Katkam452772a2019-01-07 17:30:36 +0530347 if (ret)
348 tx_priv->dapm_mclk_enable = false;
349 else
350 tx_priv->dapm_mclk_enable = true;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530351 break;
352 case SND_SOC_DAPM_POST_PMD:
Ramprasad Katkam452772a2019-01-07 17:30:36 +0530353 if (tx_priv->dapm_mclk_enable)
354 ret = tx_macro_mclk_enable(tx_priv, 0);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530355 break;
356 default:
357 dev_err(tx_priv->dev,
358 "%s: invalid DAPM event %d\n", __func__, event);
359 ret = -EINVAL;
360 }
361 return ret;
362}
363
Meng Wang15c825d2018-09-06 10:49:18 +0800364static int tx_macro_event_handler(struct snd_soc_component *component,
365 u16 event, u32 data)
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530366{
367 struct device *tx_dev = NULL;
368 struct tx_macro_priv *tx_priv = NULL;
Aditya Bavanari50ef13e2019-08-09 15:14:43 +0530369 int ret = 0;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530370
Meng Wang15c825d2018-09-06 10:49:18 +0800371 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530372 return -EINVAL;
373
374 switch (event) {
375 case BOLERO_MACRO_EVT_SSR_DOWN:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -0700376 trace_printk("%s, enter SSR down\n", __func__);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700377 if (tx_priv->swr_ctrl_data) {
378 swrm_wcd_notify(
379 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700380 SWR_DEVICE_SSR_DOWN, NULL);
381 }
Aditya Bavanari50ef13e2019-08-09 15:14:43 +0530382 if ((!pm_runtime_enabled(tx_dev) ||
383 !pm_runtime_suspended(tx_dev))) {
384 ret = bolero_runtime_suspend(tx_dev);
385 if (!ret) {
386 pm_runtime_disable(tx_dev);
387 pm_runtime_set_suspended(tx_dev);
388 pm_runtime_enable(tx_dev);
389 }
390 }
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530391 break;
392 case BOLERO_MACRO_EVT_SSR_UP:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -0700393 trace_printk("%s, enter SSR up\n", __func__);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +0530394 /* reset swr after ssr/pdr */
395 tx_priv->reset_swr = true;
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700396 if (tx_priv->swr_ctrl_data)
397 swrm_wcd_notify(
398 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
399 SWR_DEVICE_SSR_UP, NULL);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530400 break;
Meng Wang8ef0cc22019-05-08 15:12:56 +0800401 case BOLERO_MACRO_EVT_CLK_RESET:
402 bolero_rsc_clk_reset(tx_dev, TX_CORE_CLK);
403 break;
Vatsal Buchad06525f2019-10-14 23:14:12 +0530404 case BOLERO_MACRO_EVT_BCS_CLK_OFF:
405 if (tx_priv->bcs_clk_en)
406 snd_soc_component_update_bits(component,
407 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, data << 6);
408 if (data)
409 tx_priv->hs_slow_insert_complete = true;
410 else
411 tx_priv->hs_slow_insert_complete = false;
412 break;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530413 }
414 return 0;
415}
416
Meng Wang15c825d2018-09-06 10:49:18 +0800417static int tx_macro_reg_wake_irq(struct snd_soc_component *component,
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530418 u32 data)
419{
420 struct device *tx_dev = NULL;
421 struct tx_macro_priv *tx_priv = NULL;
422 u32 ipc_wakeup = data;
423 int ret = 0;
424
Meng Wang15c825d2018-09-06 10:49:18 +0800425 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530426 return -EINVAL;
427
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700428 if (tx_priv->swr_ctrl_data)
429 ret = swrm_wcd_notify(
430 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
431 SWR_REGISTER_WAKE_IRQ, &ipc_wakeup);
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530432
433 return ret;
434}
435
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530436static bool is_amic_enabled(struct snd_soc_component *component, int decimator)
Sudheer Papothi339c4112019-12-13 00:49:16 +0530437{
438 u16 adc_mux_reg = 0, adc_reg = 0;
439 u16 adc_n = BOLERO_ADC_MAX;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530440 bool ret = false;
441 struct device *tx_dev = NULL;
442 struct tx_macro_priv *tx_priv = NULL;
443
444 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
445 return ret;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530446
447 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
448 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
449 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530450 if (tx_priv->version == BOLERO_VERSION_2_1)
451 return true;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530452 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
453 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
454 adc_n = snd_soc_component_read32(component, adc_reg) &
455 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530456 if (adc_n < BOLERO_ADC_MAX)
457 return true;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530458 }
459
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530460 return ret;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530461}
462
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530463static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
464{
465 struct delayed_work *hpf_delayed_work = NULL;
466 struct hpf_work *hpf_work = NULL;
467 struct tx_macro_priv *tx_priv = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800468 struct snd_soc_component *component = NULL;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530469 u16 dec_cfg_reg = 0, hpf_gate_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530470 u8 hpf_cut_off_freq = 0;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530471 u16 adc_reg = 0, adc_n = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530472
473 hpf_delayed_work = to_delayed_work(work);
474 hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
475 tx_priv = hpf_work->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800476 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530477 hpf_cut_off_freq = hpf_work->hpf_cut_off_freq;
478
479 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
480 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530481 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
482 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530483
Meng Wang15c825d2018-09-06 10:49:18 +0800484 dev_dbg(component->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530485 __func__, hpf_work->decimator, hpf_cut_off_freq);
486
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530487 if (is_amic_enabled(component, hpf_work->decimator)) {
488 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
489 TX_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator;
490 adc_n = snd_soc_component_read32(component, adc_reg) &
491 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
Laxminath Kasam497a6512018-09-17 16:11:52 +0530492 /* analog mic clear TX hold */
Meng Wang15c825d2018-09-06 10:49:18 +0800493 bolero_clear_amic_tx_hold(component->dev, adc_n);
Sudheer Papothi339c4112019-12-13 00:49:16 +0530494 snd_soc_component_update_bits(component,
495 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
496 hpf_cut_off_freq << 5);
497 snd_soc_component_update_bits(component, hpf_gate_reg,
498 0x03, 0x02);
499 /* Minimum 1 clk cycle delay is required as per HW spec */
500 usleep_range(1000, 1010);
501 snd_soc_component_update_bits(component, hpf_gate_reg,
502 0x03, 0x01);
503 } else {
504 snd_soc_component_update_bits(component,
505 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
506 hpf_cut_off_freq << 5);
507 snd_soc_component_update_bits(component, hpf_gate_reg,
508 0x02, 0x02);
509 /* Minimum 1 clk cycle delay is required as per HW spec */
510 usleep_range(1000, 1010);
511 snd_soc_component_update_bits(component, hpf_gate_reg,
512 0x02, 0x00);
Laxminath Kasam497a6512018-09-17 16:11:52 +0530513 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530514}
515
516static void tx_macro_mute_update_callback(struct work_struct *work)
517{
518 struct tx_mute_work *tx_mute_dwork = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800519 struct snd_soc_component *component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530520 struct tx_macro_priv *tx_priv = NULL;
521 struct delayed_work *delayed_work = NULL;
Xiaojun Sangd155fdc2018-10-11 15:11:59 +0800522 u16 tx_vol_ctl_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530523 u8 decimator = 0;
524
525 delayed_work = to_delayed_work(work);
526 tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork);
527 tx_priv = tx_mute_dwork->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800528 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530529 decimator = tx_mute_dwork->decimator;
530
531 tx_vol_ctl_reg =
532 BOLERO_CDC_TX0_TX_PATH_CTL +
533 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +0800534 snd_soc_component_update_bits(component, tx_vol_ctl_reg, 0x10, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530535 dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
536 __func__, decimator);
537}
538
539static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
540 struct snd_ctl_elem_value *ucontrol)
541{
542 struct snd_soc_dapm_widget *widget =
543 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800544 struct snd_soc_component *component =
545 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530546 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
547 unsigned int val = 0;
548 u16 mic_sel_reg = 0;
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530549 u16 dmic_clk_reg = 0;
550 struct device *tx_dev = NULL;
551 struct tx_macro_priv *tx_priv = NULL;
552
553 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
554 return -EINVAL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530555
556 val = ucontrol->value.enumerated.item[0];
557 if (val > e->items - 1)
558 return -EINVAL;
559
Meng Wang15c825d2018-09-06 10:49:18 +0800560 dev_dbg(component->dev, "%s: wname: %s, val: 0x%x\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530561 widget->name, val);
562
563 switch (e->reg) {
564 case BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0:
565 mic_sel_reg = BOLERO_CDC_TX0_TX_PATH_CFG0;
566 break;
567 case BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0:
568 mic_sel_reg = BOLERO_CDC_TX1_TX_PATH_CFG0;
569 break;
570 case BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0:
571 mic_sel_reg = BOLERO_CDC_TX2_TX_PATH_CFG0;
572 break;
573 case BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0:
574 mic_sel_reg = BOLERO_CDC_TX3_TX_PATH_CFG0;
575 break;
576 case BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0:
577 mic_sel_reg = BOLERO_CDC_TX4_TX_PATH_CFG0;
578 break;
579 case BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0:
580 mic_sel_reg = BOLERO_CDC_TX5_TX_PATH_CFG0;
581 break;
582 case BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0:
583 mic_sel_reg = BOLERO_CDC_TX6_TX_PATH_CFG0;
584 break;
585 case BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0:
586 mic_sel_reg = BOLERO_CDC_TX7_TX_PATH_CFG0;
587 break;
588 default:
Meng Wang15c825d2018-09-06 10:49:18 +0800589 dev_err(component->dev, "%s: e->reg: 0x%x not expected\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530590 __func__, e->reg);
591 return -EINVAL;
592 }
Laxminath Kasam497a6512018-09-17 16:11:52 +0530593 if (strnstr(widget->name, "SMIC", strlen(widget->name))) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530594 if (val != 0) {
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530595 if (val < 5) {
Meng Wang15c825d2018-09-06 10:49:18 +0800596 snd_soc_component_update_bits(component,
597 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530598 1 << 7, 0x0 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530599 } else {
Meng Wang15c825d2018-09-06 10:49:18 +0800600 snd_soc_component_update_bits(component,
601 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530602 1 << 7, 0x1 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530603 snd_soc_component_update_bits(component,
604 BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
605 0x80, 0x00);
606 dmic_clk_reg =
607 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
608 ((val - 5)/2) * 4;
609 snd_soc_component_update_bits(component,
610 dmic_clk_reg,
611 0x0E, tx_priv->dmic_clk_div << 0x1);
612 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530613 }
614 } else {
615 /* DMIC selected */
616 if (val != 0)
Meng Wang15c825d2018-09-06 10:49:18 +0800617 snd_soc_component_update_bits(component, mic_sel_reg,
618 1 << 7, 1 << 7);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530619 }
620
621 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
622}
623
624static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol,
625 struct snd_ctl_elem_value *ucontrol)
626{
627 struct snd_soc_dapm_widget *widget =
628 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800629 struct snd_soc_component *component =
630 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530631 struct soc_multi_mixer_control *mixer =
632 ((struct soc_multi_mixer_control *)kcontrol->private_value);
633 u32 dai_id = widget->shift;
634 u32 dec_id = mixer->shift;
635 struct device *tx_dev = NULL;
636 struct tx_macro_priv *tx_priv = NULL;
637
Meng Wang15c825d2018-09-06 10:49:18 +0800638 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530639 return -EINVAL;
640
641 if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id]))
642 ucontrol->value.integer.value[0] = 1;
643 else
644 ucontrol->value.integer.value[0] = 0;
645 return 0;
646}
647
648static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
649 struct snd_ctl_elem_value *ucontrol)
650{
651 struct snd_soc_dapm_widget *widget =
652 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800653 struct snd_soc_component *component =
654 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530655 struct snd_soc_dapm_update *update = NULL;
656 struct soc_multi_mixer_control *mixer =
657 ((struct soc_multi_mixer_control *)kcontrol->private_value);
658 u32 dai_id = widget->shift;
659 u32 dec_id = mixer->shift;
660 u32 enable = ucontrol->value.integer.value[0];
661 struct device *tx_dev = NULL;
662 struct tx_macro_priv *tx_priv = NULL;
663
Meng Wang15c825d2018-09-06 10:49:18 +0800664 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530665 return -EINVAL;
666
667 if (enable) {
668 set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
669 tx_priv->active_ch_cnt[dai_id]++;
670 } else {
671 tx_priv->active_ch_cnt[dai_id]--;
672 clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
673 }
674 snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
675
676 return 0;
677}
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700678
679static inline int tx_macro_path_get(const char *wname,
680 unsigned int *path_num)
681{
682 int ret = 0;
683 char *widget_name = NULL;
684 char *w_name = NULL;
685 char *path_num_char = NULL;
686 char *path_name = NULL;
687
688 widget_name = kstrndup(wname, 10, GFP_KERNEL);
689 if (!widget_name)
690 return -EINVAL;
691
692 w_name = widget_name;
693
694 path_name = strsep(&widget_name, " ");
695 if (!path_name) {
696 pr_err("%s: Invalid widget name = %s\n",
697 __func__, widget_name);
698 ret = -EINVAL;
699 goto err;
700 }
701 path_num_char = strpbrk(path_name, "01234567");
702 if (!path_num_char) {
703 pr_err("%s: tx path index not found\n",
704 __func__);
705 ret = -EINVAL;
706 goto err;
707 }
708 ret = kstrtouint(path_num_char, 10, path_num);
709 if (ret < 0)
710 pr_err("%s: Invalid tx path = %s\n",
711 __func__, w_name);
712
713err:
714 kfree(w_name);
715 return ret;
716}
717
718static int tx_macro_dec_mode_get(struct snd_kcontrol *kcontrol,
719 struct snd_ctl_elem_value *ucontrol)
720{
721 struct snd_soc_component *component =
722 snd_soc_kcontrol_component(kcontrol);
723 struct tx_macro_priv *tx_priv = NULL;
724 struct device *tx_dev = NULL;
725 int ret = 0;
726 int path = 0;
727
728 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
729 return -EINVAL;
730
731 ret = tx_macro_path_get(kcontrol->id.name, &path);
732 if (ret)
733 return ret;
734
735 ucontrol->value.integer.value[0] = tx_priv->dec_mode[path];
736
737 return 0;
738}
739
740static int tx_macro_dec_mode_put(struct snd_kcontrol *kcontrol,
741 struct snd_ctl_elem_value *ucontrol)
742{
743 struct snd_soc_component *component =
744 snd_soc_kcontrol_component(kcontrol);
745 struct tx_macro_priv *tx_priv = NULL;
746 struct device *tx_dev = NULL;
747 int value = ucontrol->value.integer.value[0];
748 int ret = 0;
749 int path = 0;
750
751 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
752 return -EINVAL;
753
754 ret = tx_macro_path_get(kcontrol->id.name, &path);
755 if (ret)
756 return ret;
757
758 tx_priv->dec_mode[path] = value;
759
760 return 0;
761}
762
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700763static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol,
764 struct snd_ctl_elem_value *ucontrol)
765{
766 struct snd_soc_component *component =
767 snd_soc_kcontrol_component(kcontrol);
768 struct tx_macro_priv *tx_priv = NULL;
769 struct device *tx_dev = NULL;
770
771 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
772 return -EINVAL;
773
774 ucontrol->value.integer.value[0] = tx_priv->bcs_enable;
775
776 return 0;
777}
778
779static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol,
780 struct snd_ctl_elem_value *ucontrol)
781{
782 struct snd_soc_component *component =
783 snd_soc_kcontrol_component(kcontrol);
784 struct tx_macro_priv *tx_priv = NULL;
785 struct device *tx_dev = NULL;
786 int value = ucontrol->value.integer.value[0];
787
788 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
789 return -EINVAL;
790
791 tx_priv->bcs_enable = value;
792
793 return 0;
794}
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530795
796static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
797 struct snd_kcontrol *kcontrol, int event)
798{
Meng Wang15c825d2018-09-06 10:49:18 +0800799 struct snd_soc_component *component =
800 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530801 unsigned int dmic = 0;
802 int ret = 0;
803 char *wname = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530804
805 wname = strpbrk(w->name, "01234567");
806 if (!wname) {
Meng Wang15c825d2018-09-06 10:49:18 +0800807 dev_err(component->dev, "%s: widget not found\n", __func__);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530808 return -EINVAL;
809 }
810
811 ret = kstrtouint(wname, 10, &dmic);
812 if (ret < 0) {
Meng Wang15c825d2018-09-06 10:49:18 +0800813 dev_err(component->dev, "%s: Invalid DMIC line on the codec\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530814 __func__);
815 return -EINVAL;
816 }
817
Sudheer Papothid50a5812019-11-21 07:24:42 +0530818 dev_dbg(component->dev, "%s: event %d DMIC%d\n",
819 __func__, event, dmic);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530820
821 switch (event) {
822 case SND_SOC_DAPM_PRE_PMU:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530823 bolero_dmic_clk_enable(component, dmic, DMIC_TX, true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530824 break;
825 case SND_SOC_DAPM_POST_PMD:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530826 bolero_dmic_clk_enable(component, dmic, DMIC_TX, false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530827 break;
828 }
829
830 return 0;
831}
832
833static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
834 struct snd_kcontrol *kcontrol, int event)
835{
Meng Wang15c825d2018-09-06 10:49:18 +0800836 struct snd_soc_component *component =
837 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530838 unsigned int decimator = 0;
839 u16 tx_vol_ctl_reg = 0;
840 u16 dec_cfg_reg = 0;
841 u16 hpf_gate_reg = 0;
842 u16 tx_gain_ctl_reg = 0;
843 u8 hpf_cut_off_freq = 0;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530844 int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS;
845 int unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530846 struct device *tx_dev = NULL;
847 struct tx_macro_priv *tx_priv = NULL;
Meng Wang2825fce2020-01-13 15:17:21 +0800848 u16 adc_mux_reg = 0, adc_reg = 0, adc_n = 0;
849 u16 dmic_clk_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530850
Meng Wang15c825d2018-09-06 10:49:18 +0800851 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530852 return -EINVAL;
853
854 decimator = w->shift;
855
Meng Wang15c825d2018-09-06 10:49:18 +0800856 dev_dbg(component->dev, "%s(): widget = %s decimator = %u\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530857 w->name, decimator);
858
859 tx_vol_ctl_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
860 TX_MACRO_TX_PATH_OFFSET * decimator;
861 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
862 TX_MACRO_TX_PATH_OFFSET * decimator;
863 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
864 TX_MACRO_TX_PATH_OFFSET * decimator;
865 tx_gain_ctl_reg = BOLERO_CDC_TX0_TX_VOL_CTL +
866 TX_MACRO_TX_PATH_OFFSET * decimator;
867
868 switch (event) {
869 case SND_SOC_DAPM_PRE_PMU:
Meng Wang2825fce2020-01-13 15:17:21 +0800870 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
871 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
872 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
873 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
874 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
875 adc_n = snd_soc_component_read32(component, adc_reg) &
876 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
877 if (adc_n >= BOLERO_ADC_MAX) {
878 dmic_clk_reg =
879 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
880 ((adc_n - 5) / 2) * 4;
881 snd_soc_component_update_bits(component,
882 dmic_clk_reg,
883 0x0E, tx_priv->dmic_clk_div << 0x1);
884 }
885 }
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700886 snd_soc_component_update_bits(component,
887 dec_cfg_reg, 0x06, tx_priv->dec_mode[decimator] <<
888 TX_MACRO_ADC_MODE_CFG0_SHIFT);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530889 /* Enable TX PGA Mute */
Meng Wang15c825d2018-09-06 10:49:18 +0800890 snd_soc_component_update_bits(component,
891 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530892 break;
893 case SND_SOC_DAPM_POST_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +0800894 snd_soc_component_update_bits(component,
895 tx_vol_ctl_reg, 0x20, 0x20);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530896 if (!is_amic_enabled(component, decimator)) {
Vatsal Bucha95725722020-01-08 12:40:58 +0530897 snd_soc_component_update_bits(component,
898 hpf_gate_reg, 0x01, 0x00);
899 /*
900 * Minimum 1 clk cycle delay is required as per HW spec
901 */
902 usleep_range(1000, 1010);
903 }
Meng Wang15c825d2018-09-06 10:49:18 +0800904 hpf_cut_off_freq = (
905 snd_soc_component_read32(component, dec_cfg_reg) &
906 TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
907
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530908 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq =
Meng Wang15c825d2018-09-06 10:49:18 +0800909 hpf_cut_off_freq;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530910
911 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ)
Meng Wang15c825d2018-09-06 10:49:18 +0800912 snd_soc_component_update_bits(component, dec_cfg_reg,
913 TX_HPF_CUT_OFF_FREQ_MASK,
914 CF_MIN_3DB_150HZ << 5);
915
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530916 if (is_amic_enabled(component, decimator)) {
Sudheer Papothi339c4112019-12-13 00:49:16 +0530917 hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS;
918 unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS;
919 }
920 if (tx_unmute_delay < unmute_delay)
921 tx_unmute_delay = unmute_delay;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530922 /* schedule work queue to Remove Mute */
923 schedule_delayed_work(&tx_priv->tx_mute_dwork[decimator].dwork,
924 msecs_to_jiffies(tx_unmute_delay));
925 if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq !=
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530926 CF_MIN_3DB_150HZ) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530927 schedule_delayed_work(
Sudheer Papothi339c4112019-12-13 00:49:16 +0530928 &tx_priv->tx_hpf_work[decimator].dwork,
929 msecs_to_jiffies(hpf_delay));
Meng Wang15c825d2018-09-06 10:49:18 +0800930 snd_soc_component_update_bits(component,
Vatsal Bucha95725722020-01-08 12:40:58 +0530931 hpf_gate_reg, 0x03, 0x02);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530932 if (!is_amic_enabled(component, decimator))
Vatsal Bucha95725722020-01-08 12:40:58 +0530933 snd_soc_component_update_bits(component,
934 hpf_gate_reg, 0x03, 0x00);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530935 /*
936 * Minimum 1 clk cycle delay is required as per HW spec
937 */
938 usleep_range(1000, 1010);
Meng Wang15c825d2018-09-06 10:49:18 +0800939 snd_soc_component_update_bits(component,
Vatsal Bucha95725722020-01-08 12:40:58 +0530940 hpf_gate_reg, 0x03, 0x01);
Karthikeyan Mani9366ce62019-11-06 11:43:36 -0800941 /*
942 * 6ms delay is required as per HW spec
943 */
944 usleep_range(6000, 6010);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530945 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530946 /* apply gain after decimator is enabled */
Meng Wang15c825d2018-09-06 10:49:18 +0800947 snd_soc_component_write(component, tx_gain_ctl_reg,
948 snd_soc_component_read32(component,
949 tx_gain_ctl_reg));
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700950 if (tx_priv->bcs_enable) {
951 snd_soc_component_update_bits(component, dec_cfg_reg,
952 0x01, 0x01);
Vatsal Buchad06525f2019-10-14 23:14:12 +0530953 tx_priv->bcs_clk_en = true;
954 if (tx_priv->hs_slow_insert_complete)
955 snd_soc_component_update_bits(component,
956 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40,
957 0x40);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700958 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530959 break;
960 case SND_SOC_DAPM_PRE_PMD:
961 hpf_cut_off_freq =
962 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq;
Meng Wang15c825d2018-09-06 10:49:18 +0800963 snd_soc_component_update_bits(component,
964 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530965 if (cancel_delayed_work_sync(
966 &tx_priv->tx_hpf_work[decimator].dwork)) {
967 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
Meng Wang15c825d2018-09-06 10:49:18 +0800968 snd_soc_component_update_bits(
969 component, dec_cfg_reg,
970 TX_HPF_CUT_OFF_FREQ_MASK,
971 hpf_cut_off_freq << 5);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530972 if (is_amic_enabled(component, decimator))
Vatsal Bucha95725722020-01-08 12:40:58 +0530973 snd_soc_component_update_bits(component,
974 hpf_gate_reg,
975 0x03, 0x02);
976 else
977 snd_soc_component_update_bits(component,
978 hpf_gate_reg,
979 0x03, 0x03);
980
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530981 /*
982 * Minimum 1 clk cycle delay is required
983 * as per HW spec
984 */
985 usleep_range(1000, 1010);
Meng Wang15c825d2018-09-06 10:49:18 +0800986 snd_soc_component_update_bits(component,
987 hpf_gate_reg,
Vatsal Bucha95725722020-01-08 12:40:58 +0530988 0x03, 0x01);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530989 }
990 }
991 cancel_delayed_work_sync(
992 &tx_priv->tx_mute_dwork[decimator].dwork);
993 break;
994 case SND_SOC_DAPM_POST_PMD:
Meng Wang15c825d2018-09-06 10:49:18 +0800995 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
996 0x20, 0x00);
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700997 snd_soc_component_update_bits(component,
998 dec_cfg_reg, 0x06, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +0800999 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
1000 0x10, 0x00);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001001 if (tx_priv->bcs_enable) {
1002 snd_soc_component_update_bits(component, dec_cfg_reg,
1003 0x01, 0x00);
1004 snd_soc_component_update_bits(component,
1005 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x00);
Vatsal Buchad06525f2019-10-14 23:14:12 +05301006 tx_priv->bcs_clk_en = false;
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001007 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301008 break;
1009 }
1010 return 0;
1011}
1012
1013static int tx_macro_enable_micbias(struct snd_soc_dapm_widget *w,
1014 struct snd_kcontrol *kcontrol, int event)
1015{
1016 return 0;
1017}
1018
1019static int tx_macro_hw_params(struct snd_pcm_substream *substream,
1020 struct snd_pcm_hw_params *params,
1021 struct snd_soc_dai *dai)
1022{
1023 int tx_fs_rate = -EINVAL;
Meng Wang15c825d2018-09-06 10:49:18 +08001024 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301025 u32 decimator = 0;
Laxminath Kasamb7f823c2018-08-02 13:23:11 +05301026 u32 sample_rate = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301027 u16 tx_fs_reg = 0;
1028 struct device *tx_dev = NULL;
1029 struct tx_macro_priv *tx_priv = NULL;
1030
Meng Wang15c825d2018-09-06 10:49:18 +08001031 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301032 return -EINVAL;
1033
1034 pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
1035 dai->name, dai->id, params_rate(params),
1036 params_channels(params));
1037
1038 sample_rate = params_rate(params);
1039 switch (sample_rate) {
1040 case 8000:
1041 tx_fs_rate = 0;
1042 break;
1043 case 16000:
1044 tx_fs_rate = 1;
1045 break;
1046 case 32000:
1047 tx_fs_rate = 3;
1048 break;
1049 case 48000:
1050 tx_fs_rate = 4;
1051 break;
1052 case 96000:
1053 tx_fs_rate = 5;
1054 break;
1055 case 192000:
1056 tx_fs_rate = 6;
1057 break;
1058 case 384000:
1059 tx_fs_rate = 7;
1060 break;
1061 default:
Meng Wang15c825d2018-09-06 10:49:18 +08001062 dev_err(component->dev, "%s: Invalid TX sample rate: %d\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301063 __func__, params_rate(params));
1064 return -EINVAL;
1065 }
1066 for_each_set_bit(decimator, &tx_priv->active_ch_mask[dai->id],
1067 TX_MACRO_DEC_MAX) {
1068 if (decimator >= 0) {
1069 tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
1070 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +08001071 dev_dbg(component->dev, "%s: set DEC%u rate to %u\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301072 __func__, decimator, sample_rate);
Meng Wang15c825d2018-09-06 10:49:18 +08001073 snd_soc_component_update_bits(component, tx_fs_reg,
1074 0x0F, tx_fs_rate);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301075 } else {
Meng Wang15c825d2018-09-06 10:49:18 +08001076 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301077 "%s: ERROR: Invalid decimator: %d\n",
1078 __func__, decimator);
1079 return -EINVAL;
1080 }
1081 }
1082 return 0;
1083}
1084
1085static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
1086 unsigned int *tx_num, unsigned int *tx_slot,
1087 unsigned int *rx_num, unsigned int *rx_slot)
1088{
Meng Wang15c825d2018-09-06 10:49:18 +08001089 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301090 struct device *tx_dev = NULL;
1091 struct tx_macro_priv *tx_priv = NULL;
1092
Meng Wang15c825d2018-09-06 10:49:18 +08001093 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301094 return -EINVAL;
1095
1096 switch (dai->id) {
1097 case TX_MACRO_AIF1_CAP:
1098 case TX_MACRO_AIF2_CAP:
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001099 case TX_MACRO_AIF3_CAP:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301100 *tx_slot = tx_priv->active_ch_mask[dai->id];
1101 *tx_num = tx_priv->active_ch_cnt[dai->id];
1102 break;
1103 default:
1104 dev_err(tx_dev, "%s: Invalid AIF\n", __func__);
1105 break;
1106 }
1107 return 0;
1108}
1109
1110static struct snd_soc_dai_ops tx_macro_dai_ops = {
1111 .hw_params = tx_macro_hw_params,
1112 .get_channel_map = tx_macro_get_channel_map,
1113};
1114
1115static struct snd_soc_dai_driver tx_macro_dai[] = {
1116 {
1117 .name = "tx_macro_tx1",
1118 .id = TX_MACRO_AIF1_CAP,
1119 .capture = {
1120 .stream_name = "TX_AIF1 Capture",
1121 .rates = TX_MACRO_RATES,
1122 .formats = TX_MACRO_FORMATS,
1123 .rate_max = 192000,
1124 .rate_min = 8000,
1125 .channels_min = 1,
1126 .channels_max = 8,
1127 },
1128 .ops = &tx_macro_dai_ops,
1129 },
1130 {
1131 .name = "tx_macro_tx2",
1132 .id = TX_MACRO_AIF2_CAP,
1133 .capture = {
1134 .stream_name = "TX_AIF2 Capture",
1135 .rates = TX_MACRO_RATES,
1136 .formats = TX_MACRO_FORMATS,
1137 .rate_max = 192000,
1138 .rate_min = 8000,
1139 .channels_min = 1,
1140 .channels_max = 8,
1141 },
1142 .ops = &tx_macro_dai_ops,
1143 },
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001144 {
1145 .name = "tx_macro_tx3",
1146 .id = TX_MACRO_AIF3_CAP,
1147 .capture = {
1148 .stream_name = "TX_AIF3 Capture",
1149 .rates = TX_MACRO_RATES,
1150 .formats = TX_MACRO_FORMATS,
1151 .rate_max = 192000,
1152 .rate_min = 8000,
1153 .channels_min = 1,
1154 .channels_max = 8,
1155 },
1156 .ops = &tx_macro_dai_ops,
1157 },
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301158};
1159
1160#define STRING(name) #name
1161#define TX_MACRO_DAPM_ENUM(name, reg, offset, text) \
1162static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1163static const struct snd_kcontrol_new name##_mux = \
1164 SOC_DAPM_ENUM(STRING(name), name##_enum)
1165
1166#define TX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \
1167static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1168static const struct snd_kcontrol_new name##_mux = \
1169 SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname)
1170
1171#define TX_MACRO_DAPM_MUX(name, shift, kctl) \
1172 SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux)
1173
1174static const char * const adc_mux_text[] = {
1175 "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1"
1176};
1177
1178TX_MACRO_DAPM_ENUM(tx_dec0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1,
1179 0, adc_mux_text);
1180TX_MACRO_DAPM_ENUM(tx_dec1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1,
1181 0, adc_mux_text);
1182TX_MACRO_DAPM_ENUM(tx_dec2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1,
1183 0, adc_mux_text);
1184TX_MACRO_DAPM_ENUM(tx_dec3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1,
1185 0, adc_mux_text);
1186TX_MACRO_DAPM_ENUM(tx_dec4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1,
1187 0, adc_mux_text);
1188TX_MACRO_DAPM_ENUM(tx_dec5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1,
1189 0, adc_mux_text);
1190TX_MACRO_DAPM_ENUM(tx_dec6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1,
1191 0, adc_mux_text);
1192TX_MACRO_DAPM_ENUM(tx_dec7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1,
1193 0, adc_mux_text);
1194
1195
1196static const char * const dmic_mux_text[] = {
1197 "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3",
1198 "DMIC4", "DMIC5", "DMIC6", "DMIC7"
1199};
1200
1201TX_MACRO_DAPM_ENUM_EXT(tx_dmic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1202 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1203 tx_macro_put_dec_enum);
1204
1205TX_MACRO_DAPM_ENUM_EXT(tx_dmic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1206 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1207 tx_macro_put_dec_enum);
1208
1209TX_MACRO_DAPM_ENUM_EXT(tx_dmic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1210 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1211 tx_macro_put_dec_enum);
1212
1213TX_MACRO_DAPM_ENUM_EXT(tx_dmic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1214 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1215 tx_macro_put_dec_enum);
1216
1217TX_MACRO_DAPM_ENUM_EXT(tx_dmic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1218 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1219 tx_macro_put_dec_enum);
1220
1221TX_MACRO_DAPM_ENUM_EXT(tx_dmic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1222 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1223 tx_macro_put_dec_enum);
1224
1225TX_MACRO_DAPM_ENUM_EXT(tx_dmic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1226 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1227 tx_macro_put_dec_enum);
1228
1229TX_MACRO_DAPM_ENUM_EXT(tx_dmic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1230 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1231 tx_macro_put_dec_enum);
1232
1233static const char * const smic_mux_text[] = {
Sudheer Papothi324b4952019-06-11 04:14:51 +05301234 "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", "SWR_DMIC0",
1235 "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", "SWR_DMIC4",
1236 "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7"
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301237};
1238
1239TX_MACRO_DAPM_ENUM_EXT(tx_smic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1240 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1241 tx_macro_put_dec_enum);
1242
1243TX_MACRO_DAPM_ENUM_EXT(tx_smic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1244 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1245 tx_macro_put_dec_enum);
1246
1247TX_MACRO_DAPM_ENUM_EXT(tx_smic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1248 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1249 tx_macro_put_dec_enum);
1250
1251TX_MACRO_DAPM_ENUM_EXT(tx_smic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1252 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1253 tx_macro_put_dec_enum);
1254
1255TX_MACRO_DAPM_ENUM_EXT(tx_smic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1256 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1257 tx_macro_put_dec_enum);
1258
1259TX_MACRO_DAPM_ENUM_EXT(tx_smic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1260 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1261 tx_macro_put_dec_enum);
1262
1263TX_MACRO_DAPM_ENUM_EXT(tx_smic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1264 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1265 tx_macro_put_dec_enum);
1266
1267TX_MACRO_DAPM_ENUM_EXT(tx_smic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1268 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1269 tx_macro_put_dec_enum);
1270
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301271static const char * const smic_mux_text_v2[] = {
1272 "ZERO", "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3",
1273 "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7",
1274 "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11"
1275};
1276
1277TX_MACRO_DAPM_ENUM_EXT(tx_smic0_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1278 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1279 tx_macro_put_dec_enum);
1280
1281TX_MACRO_DAPM_ENUM_EXT(tx_smic1_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1282 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1283 tx_macro_put_dec_enum);
1284
1285TX_MACRO_DAPM_ENUM_EXT(tx_smic2_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1286 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1287 tx_macro_put_dec_enum);
1288
1289TX_MACRO_DAPM_ENUM_EXT(tx_smic3_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1290 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1291 tx_macro_put_dec_enum);
1292
1293TX_MACRO_DAPM_ENUM_EXT(tx_smic4_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1294 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1295 tx_macro_put_dec_enum);
1296
1297TX_MACRO_DAPM_ENUM_EXT(tx_smic5_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1298 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1299 tx_macro_put_dec_enum);
1300
1301TX_MACRO_DAPM_ENUM_EXT(tx_smic6_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1302 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1303 tx_macro_put_dec_enum);
1304
1305TX_MACRO_DAPM_ENUM_EXT(tx_smic7_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1306 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1307 tx_macro_put_dec_enum);
1308
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07001309static const char * const dec_mode_mux_text[] = {
1310 "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF",
1311};
1312
1313static const struct soc_enum dec_mode_mux_enum =
1314 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dec_mode_mux_text),
1315 dec_mode_mux_text);
1316
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301317static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = {
1318 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1319 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1320 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1321 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1322 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1323 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1324 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1325 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1326 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1327 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1328 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1329 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1330 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1331 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1332 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1333 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1334};
1335
1336static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = {
1337 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1338 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1339 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1340 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1341 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1342 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1343 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1344 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1345 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1346 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1347 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1348 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1349 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1350 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1351 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1352 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1353};
1354
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001355static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = {
1356 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1357 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1358 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1359 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1360 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1361 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1362 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1363 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1364 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1365 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1366 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1367 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1368 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1369 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1370 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1371 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1372};
1373
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301374static const struct snd_kcontrol_new tx_aif1_cap_mixer_v2[] = {
1375 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1376 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1377 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1378 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1379 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1380 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1381 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1382 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1383};
1384
1385static const struct snd_kcontrol_new tx_aif2_cap_mixer_v2[] = {
1386 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1387 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1388 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1389 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1390 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1391 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1392 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1393 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1394};
1395
1396static const struct snd_kcontrol_new tx_aif3_cap_mixer_v2[] = {
1397 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1398 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1399 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1400 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1401 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1402 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1403 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1404 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1405};
1406
1407static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_common[] = {
1408 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1409 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1410
1411 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1412 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1413
1414 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1415 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1416
1417 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1418 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1419 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1420 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1421
1422 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0_v2),
1423 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1_v2),
1424 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2_v2),
1425 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3_v2),
1426
1427 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1428 tx_macro_enable_micbias,
1429 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1430 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1431 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1432 SND_SOC_DAPM_POST_PMD),
1433
1434 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1435 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1436 SND_SOC_DAPM_POST_PMD),
1437
1438 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1439 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1440 SND_SOC_DAPM_POST_PMD),
1441
1442 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1443 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1444 SND_SOC_DAPM_POST_PMD),
1445
1446 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
1447 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1448 SND_SOC_DAPM_POST_PMD),
1449
1450 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
1451 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1452 SND_SOC_DAPM_POST_PMD),
1453
1454 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
1455 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1456 SND_SOC_DAPM_POST_PMD),
1457
1458 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
1459 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1460 SND_SOC_DAPM_POST_PMD),
1461
1462 SND_SOC_DAPM_INPUT("TX SWR_MIC0"),
1463 SND_SOC_DAPM_INPUT("TX SWR_MIC1"),
1464 SND_SOC_DAPM_INPUT("TX SWR_MIC2"),
1465 SND_SOC_DAPM_INPUT("TX SWR_MIC3"),
1466 SND_SOC_DAPM_INPUT("TX SWR_MIC4"),
1467 SND_SOC_DAPM_INPUT("TX SWR_MIC5"),
1468 SND_SOC_DAPM_INPUT("TX SWR_MIC6"),
1469 SND_SOC_DAPM_INPUT("TX SWR_MIC7"),
1470 SND_SOC_DAPM_INPUT("TX SWR_MIC8"),
1471 SND_SOC_DAPM_INPUT("TX SWR_MIC9"),
1472 SND_SOC_DAPM_INPUT("TX SWR_MIC10"),
1473 SND_SOC_DAPM_INPUT("TX SWR_MIC11"),
1474
1475 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
1476 TX_MACRO_DEC0, 0,
1477 &tx_dec0_mux, tx_macro_enable_dec,
1478 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1479 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1480
1481 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
1482 TX_MACRO_DEC1, 0,
1483 &tx_dec1_mux, tx_macro_enable_dec,
1484 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1485 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1486
1487 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
1488 TX_MACRO_DEC2, 0,
1489 &tx_dec2_mux, tx_macro_enable_dec,
1490 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1491 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1492
1493 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
1494 TX_MACRO_DEC3, 0,
1495 &tx_dec3_mux, tx_macro_enable_dec,
1496 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1497 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1498
1499 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1500 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1501};
1502
1503static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v2[] = {
1504 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1505 TX_MACRO_AIF1_CAP, 0,
1506 tx_aif1_cap_mixer_v2, ARRAY_SIZE(tx_aif1_cap_mixer_v2)),
1507
1508 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1509 TX_MACRO_AIF2_CAP, 0,
1510 tx_aif2_cap_mixer_v2, ARRAY_SIZE(tx_aif2_cap_mixer_v2)),
1511
1512 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1513 TX_MACRO_AIF3_CAP, 0,
1514 tx_aif3_cap_mixer_v2, ARRAY_SIZE(tx_aif3_cap_mixer_v2)),
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301515};
1516
1517static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v3[] = {
1518 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1519 TX_MACRO_AIF1_CAP, 0,
1520 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1521
1522 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1523 TX_MACRO_AIF2_CAP, 0,
1524 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1525
1526 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1527 TX_MACRO_AIF3_CAP, 0,
1528 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1529
1530 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1531 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1532 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1533 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1534
1535 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4_v3),
1536 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5_v3),
1537 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6_v3),
1538 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7_v3),
1539
1540 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
1541 TX_MACRO_DEC4, 0,
1542 &tx_dec4_mux, tx_macro_enable_dec,
1543 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1544 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1545
1546 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
1547 TX_MACRO_DEC5, 0,
1548 &tx_dec5_mux, tx_macro_enable_dec,
1549 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1550 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1551
1552 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
1553 TX_MACRO_DEC6, 0,
1554 &tx_dec6_mux, tx_macro_enable_dec,
1555 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1556 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1557
1558 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
1559 TX_MACRO_DEC7, 0,
1560 &tx_dec7_mux, tx_macro_enable_dec,
1561 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1562 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1563
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05301564 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1565 tx_macro_tx_swr_clk_event,
1566 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1567
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301568 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1569 tx_macro_va_swr_clk_event,
1570 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1571};
1572
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301573static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
1574 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1575 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1576
1577 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1578 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1579
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001580 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1581 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1582
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301583 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
1584 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1585
1586 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
1587 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1588
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001589 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0,
1590 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1591
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301592
1593 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1594 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1595 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1596 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1597 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1598 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1599 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1600 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1601
1602 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0),
1603 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1),
1604 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2),
1605 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3),
1606 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4),
1607 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5),
1608 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6),
1609 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7),
1610
1611 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1612 tx_macro_enable_micbias,
1613 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1614 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1615 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1616 SND_SOC_DAPM_POST_PMD),
1617
1618 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1619 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1620 SND_SOC_DAPM_POST_PMD),
1621
1622 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1623 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1624 SND_SOC_DAPM_POST_PMD),
1625
1626 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1627 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1628 SND_SOC_DAPM_POST_PMD),
1629
1630 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
1631 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1632 SND_SOC_DAPM_POST_PMD),
1633
1634 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
1635 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1636 SND_SOC_DAPM_POST_PMD),
1637
1638 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
1639 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1640 SND_SOC_DAPM_POST_PMD),
1641
1642 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
1643 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1644 SND_SOC_DAPM_POST_PMD),
1645
1646 SND_SOC_DAPM_INPUT("TX SWR_ADC0"),
1647 SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
1648 SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
1649 SND_SOC_DAPM_INPUT("TX SWR_ADC3"),
1650 SND_SOC_DAPM_INPUT("TX SWR_DMIC0"),
1651 SND_SOC_DAPM_INPUT("TX SWR_DMIC1"),
1652 SND_SOC_DAPM_INPUT("TX SWR_DMIC2"),
1653 SND_SOC_DAPM_INPUT("TX SWR_DMIC3"),
1654 SND_SOC_DAPM_INPUT("TX SWR_DMIC4"),
1655 SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
1656 SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
1657 SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
1658
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301659 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301660 TX_MACRO_DEC0, 0,
1661 &tx_dec0_mux, tx_macro_enable_dec,
1662 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1663 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1664
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301665 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301666 TX_MACRO_DEC1, 0,
1667 &tx_dec1_mux, tx_macro_enable_dec,
1668 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1669 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1670
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301671 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301672 TX_MACRO_DEC2, 0,
1673 &tx_dec2_mux, tx_macro_enable_dec,
1674 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1675 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1676
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301677 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301678 TX_MACRO_DEC3, 0,
1679 &tx_dec3_mux, tx_macro_enable_dec,
1680 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1681 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1682
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301683 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301684 TX_MACRO_DEC4, 0,
1685 &tx_dec4_mux, tx_macro_enable_dec,
1686 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1687 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1688
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301689 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301690 TX_MACRO_DEC5, 0,
1691 &tx_dec5_mux, tx_macro_enable_dec,
1692 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1693 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1694
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301695 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301696 TX_MACRO_DEC6, 0,
1697 &tx_dec6_mux, tx_macro_enable_dec,
1698 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1699 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1700
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301701 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301702 TX_MACRO_DEC7, 0,
1703 &tx_dec7_mux, tx_macro_enable_dec,
1704 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1705 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1706
1707 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1708 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Sudheer Papothie456c2c2019-03-05 07:08:45 +05301709
1710 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1711 tx_macro_tx_swr_clk_event,
1712 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1713
1714 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1715 tx_macro_va_swr_clk_event,
1716 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301717};
1718
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301719static const struct snd_soc_dapm_route tx_audio_map_common[] = {
1720 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1721 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
1722 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
1723
1724 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1725 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
1726 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
1727
1728 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1729 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1730 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1731 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1732
1733 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1734 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1735 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1736 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1737
1738 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1739 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1740 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1741 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1742
1743 {"TX DEC0 MUX", NULL, "TX_MCLK"},
1744 {"TX DEC1 MUX", NULL, "TX_MCLK"},
1745 {"TX DEC2 MUX", NULL, "TX_MCLK"},
1746 {"TX DEC3 MUX", NULL, "TX_MCLK"},
1747
1748 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
1749 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
1750 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
1751 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
1752 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
1753 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
1754 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
1755 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
1756 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
1757
1758 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
1759 {"TX SMIC MUX0", "SWR_MIC0", "TX SWR_MIC0"},
1760 {"TX SMIC MUX0", "SWR_MIC1", "TX SWR_MIC1"},
1761 {"TX SMIC MUX0", "SWR_MIC2", "TX SWR_MIC2"},
1762 {"TX SMIC MUX0", "SWR_MIC3", "TX SWR_MIC3"},
1763 {"TX SMIC MUX0", "SWR_MIC4", "TX SWR_MIC4"},
1764 {"TX SMIC MUX0", "SWR_MIC5", "TX SWR_MIC5"},
1765 {"TX SMIC MUX0", "SWR_MIC6", "TX SWR_MIC6"},
1766 {"TX SMIC MUX0", "SWR_MIC7", "TX SWR_MIC7"},
1767 {"TX SMIC MUX0", "SWR_MIC8", "TX SWR_MIC8"},
1768 {"TX SMIC MUX0", "SWR_MIC9", "TX SWR_MIC9"},
1769 {"TX SMIC MUX0", "SWR_MIC10", "TX SWR_MIC10"},
1770 {"TX SMIC MUX0", "SWR_MIC11", "TX SWR_MIC11"},
1771
1772 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
1773 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
1774 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
1775 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
1776 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
1777 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
1778 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
1779 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
1780 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
1781
1782 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
1783 {"TX SMIC MUX1", "SWR_MIC0", "TX SWR_MIC0"},
1784 {"TX SMIC MUX1", "SWR_MIC1", "TX SWR_MIC1"},
1785 {"TX SMIC MUX1", "SWR_MIC2", "TX SWR_MIC2"},
1786 {"TX SMIC MUX1", "SWR_MIC3", "TX SWR_MIC3"},
1787 {"TX SMIC MUX1", "SWR_MIC4", "TX SWR_MIC4"},
1788 {"TX SMIC MUX1", "SWR_MIC5", "TX SWR_MIC5"},
1789 {"TX SMIC MUX1", "SWR_MIC6", "TX SWR_MIC6"},
1790 {"TX SMIC MUX1", "SWR_MIC7", "TX SWR_MIC7"},
1791 {"TX SMIC MUX1", "SWR_MIC8", "TX SWR_MIC8"},
1792 {"TX SMIC MUX1", "SWR_MIC9", "TX SWR_MIC9"},
1793 {"TX SMIC MUX1", "SWR_MIC10", "TX SWR_MIC10"},
1794 {"TX SMIC MUX1", "SWR_MIC11", "TX SWR_MIC11"},
1795
1796 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
1797 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
1798 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
1799 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
1800 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
1801 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
1802 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
1803 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
1804 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
1805
1806 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
1807 {"TX SMIC MUX2", "SWR_MIC0", "TX SWR_MIC0"},
1808 {"TX SMIC MUX2", "SWR_MIC1", "TX SWR_MIC1"},
1809 {"TX SMIC MUX2", "SWR_MIC2", "TX SWR_MIC2"},
1810 {"TX SMIC MUX2", "SWR_MIC3", "TX SWR_MIC3"},
1811 {"TX SMIC MUX2", "SWR_MIC4", "TX SWR_MIC4"},
1812 {"TX SMIC MUX2", "SWR_MIC5", "TX SWR_MIC5"},
1813 {"TX SMIC MUX2", "SWR_MIC6", "TX SWR_MIC6"},
1814 {"TX SMIC MUX2", "SWR_MIC7", "TX SWR_MIC7"},
1815 {"TX SMIC MUX2", "SWR_MIC8", "TX SWR_MIC8"},
1816 {"TX SMIC MUX2", "SWR_MIC9", "TX SWR_MIC9"},
1817 {"TX SMIC MUX2", "SWR_MIC10", "TX SWR_MIC10"},
1818 {"TX SMIC MUX2", "SWR_MIC11", "TX SWR_MIC11"},
1819
1820 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
1821 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
1822 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
1823 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
1824 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
1825 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
1826 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
1827 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
1828 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
1829
1830 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
1831 {"TX SMIC MUX3", "SWR_MIC0", "TX SWR_MIC0"},
1832 {"TX SMIC MUX3", "SWR_MIC1", "TX SWR_MIC1"},
1833 {"TX SMIC MUX3", "SWR_MIC2", "TX SWR_MIC2"},
1834 {"TX SMIC MUX3", "SWR_MIC3", "TX SWR_MIC3"},
1835 {"TX SMIC MUX3", "SWR_MIC4", "TX SWR_MIC4"},
1836 {"TX SMIC MUX3", "SWR_MIC5", "TX SWR_MIC5"},
1837 {"TX SMIC MUX3", "SWR_MIC6", "TX SWR_MIC6"},
1838 {"TX SMIC MUX3", "SWR_MIC7", "TX SWR_MIC7"},
1839 {"TX SMIC MUX3", "SWR_MIC8", "TX SWR_MIC8"},
1840 {"TX SMIC MUX3", "SWR_MIC9", "TX SWR_MIC9"},
1841 {"TX SMIC MUX3", "SWR_MIC10", "TX SWR_MIC10"},
1842 {"TX SMIC MUX3", "SWR_MIC11", "TX SWR_MIC11"},
1843};
1844
1845static const struct snd_soc_dapm_route tx_audio_map_v3[] = {
1846 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1847 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1848 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1849 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1850
1851 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1852 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1853 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1854 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1855
1856 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1857 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1858 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1859 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1860
1861 {"TX DEC4 MUX", NULL, "TX_MCLK"},
1862 {"TX DEC5 MUX", NULL, "TX_MCLK"},
1863 {"TX DEC6 MUX", NULL, "TX_MCLK"},
1864 {"TX DEC7 MUX", NULL, "TX_MCLK"},
1865
1866 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
1867 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
1868 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
1869 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
1870 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
1871 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
1872 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
1873 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
1874 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
1875
1876 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
1877 {"TX SMIC MUX4", "SWR_MIC0", "TX SWR_MIC0"},
1878 {"TX SMIC MUX4", "SWR_MIC1", "TX SWR_MIC1"},
1879 {"TX SMIC MUX4", "SWR_MIC2", "TX SWR_MIC2"},
1880 {"TX SMIC MUX4", "SWR_MIC3", "TX SWR_MIC3"},
1881 {"TX SMIC MUX4", "SWR_MIC4", "TX SWR_MIC4"},
1882 {"TX SMIC MUX4", "SWR_MIC5", "TX SWR_MIC5"},
1883 {"TX SMIC MUX4", "SWR_MIC6", "TX SWR_MIC6"},
1884 {"TX SMIC MUX4", "SWR_MIC7", "TX SWR_MIC7"},
1885 {"TX SMIC MUX4", "SWR_MIC8", "TX SWR_MIC8"},
1886 {"TX SMIC MUX4", "SWR_MIC9", "TX SWR_MIC9"},
1887 {"TX SMIC MUX4", "SWR_MIC10", "TX SWR_MIC10"},
1888 {"TX SMIC MUX4", "SWR_MIC11", "TX SWR_MIC11"},
1889
1890 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
1891 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
1892 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
1893 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
1894 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
1895 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
1896 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
1897 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
1898 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
1899
1900 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
1901 {"TX SMIC MUX5", "SWR_MIC0", "TX SWR_MIC0"},
1902 {"TX SMIC MUX5", "SWR_MIC1", "TX SWR_MIC1"},
1903 {"TX SMIC MUX5", "SWR_MIC2", "TX SWR_MIC2"},
1904 {"TX SMIC MUX5", "SWR_MIC3", "TX SWR_MIC3"},
1905 {"TX SMIC MUX5", "SWR_MIC4", "TX SWR_MIC4"},
1906 {"TX SMIC MUX5", "SWR_MIC5", "TX SWR_MIC5"},
1907 {"TX SMIC MUX5", "SWR_MIC6", "TX SWR_MIC6"},
1908 {"TX SMIC MUX5", "SWR_MIC7", "TX SWR_MIC7"},
1909 {"TX SMIC MUX5", "SWR_MIC8", "TX SWR_MIC8"},
1910 {"TX SMIC MUX5", "SWR_MIC9", "TX SWR_MIC9"},
1911 {"TX SMIC MUX5", "SWR_MIC10", "TX SWR_MIC10"},
1912 {"TX SMIC MUX5", "SWR_MIC11", "TX SWR_MIC11"},
1913
1914 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
1915 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
1916 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
1917 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
1918 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
1919 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
1920 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
1921 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
1922 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
1923
1924 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
1925 {"TX SMIC MUX6", "SWR_MIC0", "TX SWR_MIC0"},
1926 {"TX SMIC MUX6", "SWR_MIC1", "TX SWR_MIC1"},
1927 {"TX SMIC MUX6", "SWR_MIC2", "TX SWR_MIC2"},
1928 {"TX SMIC MUX6", "SWR_MIC3", "TX SWR_MIC3"},
1929 {"TX SMIC MUX6", "SWR_MIC4", "TX SWR_MIC4"},
1930 {"TX SMIC MUX6", "SWR_MIC5", "TX SWR_MIC5"},
1931 {"TX SMIC MUX6", "SWR_MIC6", "TX SWR_MIC6"},
1932 {"TX SMIC MUX6", "SWR_MIC7", "TX SWR_MIC7"},
1933 {"TX SMIC MUX6", "SWR_MIC8", "TX SWR_MIC8"},
1934 {"TX SMIC MUX6", "SWR_MIC9", "TX SWR_MIC9"},
1935 {"TX SMIC MUX6", "SWR_MIC10", "TX SWR_MIC10"},
1936 {"TX SMIC MUX6", "SWR_MIC11", "TX SWR_MIC11"},
1937
1938 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
1939 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
1940 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
1941 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
1942 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
1943 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
1944 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
1945 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
1946 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
1947
1948 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
1949 {"TX SMIC MUX7", "SWR_MIC0", "TX SWR_MIC0"},
1950 {"TX SMIC MUX7", "SWR_MIC1", "TX SWR_MIC1"},
1951 {"TX SMIC MUX7", "SWR_MIC2", "TX SWR_MIC2"},
1952 {"TX SMIC MUX7", "SWR_MIC3", "TX SWR_MIC3"},
1953 {"TX SMIC MUX7", "SWR_MIC4", "TX SWR_MIC4"},
1954 {"TX SMIC MUX7", "SWR_MIC5", "TX SWR_MIC5"},
1955 {"TX SMIC MUX7", "SWR_MIC6", "TX SWR_MIC6"},
1956 {"TX SMIC MUX7", "SWR_MIC7", "TX SWR_MIC7"},
1957 {"TX SMIC MUX7", "SWR_MIC8", "TX SWR_MIC8"},
1958 {"TX SMIC MUX7", "SWR_MIC9", "TX SWR_MIC9"},
1959 {"TX SMIC MUX7", "SWR_MIC10", "TX SWR_MIC10"},
1960 {"TX SMIC MUX7", "SWR_MIC11", "TX SWR_MIC11"},
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05301961
1962 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
1963 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
1964 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
1965 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
1966 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
1967 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
1968 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
1969 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301970};
1971
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301972static const struct snd_soc_dapm_route tx_audio_map[] = {
1973 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1974 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001975 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301976
1977 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1978 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001979 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301980
1981 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1982 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1983 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1984 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1985 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1986 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1987 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1988 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1989
1990 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1991 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1992 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1993 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1994 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1995 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1996 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1997 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1998
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001999 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
2000 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
2001 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
2002 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
2003 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
2004 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
2005 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
2006 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
2007
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302008 {"TX DEC0 MUX", NULL, "TX_MCLK"},
2009 {"TX DEC1 MUX", NULL, "TX_MCLK"},
2010 {"TX DEC2 MUX", NULL, "TX_MCLK"},
2011 {"TX DEC3 MUX", NULL, "TX_MCLK"},
2012 {"TX DEC4 MUX", NULL, "TX_MCLK"},
2013 {"TX DEC5 MUX", NULL, "TX_MCLK"},
2014 {"TX DEC6 MUX", NULL, "TX_MCLK"},
2015 {"TX DEC7 MUX", NULL, "TX_MCLK"},
2016
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302017 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
2018 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
2019 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
2020 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
2021 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
2022 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
2023 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
2024 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
2025 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
2026
2027 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302028 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302029 {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
2030 {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"},
2031 {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"},
2032 {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"},
2033 {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"},
2034 {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"},
2035 {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"},
2036 {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"},
2037 {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"},
2038 {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"},
2039 {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
2040 {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
2041
2042 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
2043 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
2044 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
2045 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
2046 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
2047 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
2048 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
2049 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
2050 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
2051
2052 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302053 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302054 {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
2055 {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"},
2056 {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"},
2057 {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"},
2058 {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"},
2059 {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"},
2060 {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"},
2061 {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"},
2062 {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"},
2063 {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"},
2064 {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
2065 {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
2066
2067 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
2068 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
2069 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
2070 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
2071 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
2072 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
2073 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
2074 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
2075 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
2076
2077 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302078 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302079 {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
2080 {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"},
2081 {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"},
2082 {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"},
2083 {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"},
2084 {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"},
2085 {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"},
2086 {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"},
2087 {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"},
2088 {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"},
2089 {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
2090 {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
2091
2092 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
2093 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
2094 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
2095 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
2096 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
2097 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
2098 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
2099 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
2100 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
2101
2102 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302103 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302104 {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
2105 {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"},
2106 {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"},
2107 {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"},
2108 {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"},
2109 {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"},
2110 {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"},
2111 {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"},
2112 {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"},
2113 {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"},
2114 {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
2115 {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
2116
2117 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
2118 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
2119 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
2120 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
2121 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
2122 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
2123 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
2124 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
2125 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
2126
2127 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302128 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302129 {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
2130 {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"},
2131 {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"},
2132 {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"},
2133 {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"},
2134 {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"},
2135 {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"},
2136 {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"},
2137 {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"},
2138 {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"},
2139 {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
2140 {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
2141
2142 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
2143 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
2144 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
2145 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
2146 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
2147 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
2148 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
2149 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
2150 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
2151
2152 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302153 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302154 {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
2155 {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"},
2156 {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"},
2157 {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"},
2158 {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"},
2159 {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"},
2160 {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"},
2161 {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"},
2162 {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"},
2163 {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"},
2164 {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
2165 {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
2166
2167 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
2168 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
2169 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
2170 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
2171 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
2172 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
2173 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
2174 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
2175 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
2176
2177 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302178 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302179 {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
2180 {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"},
2181 {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"},
2182 {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"},
2183 {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"},
2184 {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"},
2185 {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"},
2186 {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"},
2187 {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"},
2188 {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"},
2189 {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
2190 {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
2191
2192 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
2193 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
2194 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
2195 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
2196 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
2197 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
2198 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
2199 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
2200 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
2201
2202 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302203 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302204 {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},
2205 {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"},
2206 {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"},
2207 {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"},
2208 {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"},
2209 {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"},
2210 {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"},
2211 {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"},
2212 {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"},
2213 {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"},
2214 {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"},
2215 {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"},
2216};
2217
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302218static const struct snd_kcontrol_new tx_macro_snd_controls_common[] = {
2219 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2220 BOLERO_CDC_TX0_TX_VOL_CTL,
2221 0, -84, 40, digital_gain),
2222 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2223 BOLERO_CDC_TX1_TX_VOL_CTL,
2224 0, -84, 40, digital_gain),
2225 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2226 BOLERO_CDC_TX2_TX_VOL_CTL,
2227 0, -84, 40, digital_gain),
2228 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2229 BOLERO_CDC_TX3_TX_VOL_CTL,
2230 0, -84, 40, digital_gain),
2231
2232 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2233 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2234
2235 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2236 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2237
2238 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2239 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2240
2241 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2242 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2243
2244 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2245 tx_macro_get_bcs, tx_macro_set_bcs),
2246};
2247
2248static const struct snd_kcontrol_new tx_macro_snd_controls_v3[] = {
2249 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2250 BOLERO_CDC_TX4_TX_VOL_CTL,
2251 0, -84, 40, digital_gain),
2252 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2253 BOLERO_CDC_TX5_TX_VOL_CTL,
2254 0, -84, 40, digital_gain),
2255 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2256 BOLERO_CDC_TX6_TX_VOL_CTL,
2257 0, -84, 40, digital_gain),
2258 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2259 BOLERO_CDC_TX7_TX_VOL_CTL,
2260 0, -84, 40, digital_gain),
2261
2262 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2263 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2264
2265 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2266 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2267
2268 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2269 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2270
2271 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2272 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2273};
2274
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302275static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
2276 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2277 BOLERO_CDC_TX0_TX_VOL_CTL,
2278 0, -84, 40, digital_gain),
2279 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2280 BOLERO_CDC_TX1_TX_VOL_CTL,
2281 0, -84, 40, digital_gain),
2282 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2283 BOLERO_CDC_TX2_TX_VOL_CTL,
2284 0, -84, 40, digital_gain),
2285 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2286 BOLERO_CDC_TX3_TX_VOL_CTL,
2287 0, -84, 40, digital_gain),
2288 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2289 BOLERO_CDC_TX4_TX_VOL_CTL,
2290 0, -84, 40, digital_gain),
2291 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2292 BOLERO_CDC_TX5_TX_VOL_CTL,
2293 0, -84, 40, digital_gain),
2294 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2295 BOLERO_CDC_TX6_TX_VOL_CTL,
2296 0, -84, 40, digital_gain),
2297 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2298 BOLERO_CDC_TX7_TX_VOL_CTL,
2299 0, -84, 40, digital_gain),
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002300
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07002301 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2302 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2303
2304 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2305 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2306
2307 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2308 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2309
2310 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2311 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2312
2313 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2314 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2315
2316 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2317 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2318
2319 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2320 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2321
2322 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2323 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2324
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002325 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2326 tx_macro_get_bcs, tx_macro_set_bcs),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302327};
2328
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302329static int tx_macro_register_event_listener(struct snd_soc_component *component,
2330 bool enable)
2331{
2332 struct device *tx_dev = NULL;
2333 struct tx_macro_priv *tx_priv = NULL;
2334 int ret = 0;
2335
2336 if (!component)
2337 return -EINVAL;
2338
2339 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2340 if (!tx_dev) {
2341 dev_err(component->dev,
2342 "%s: null device for macro!\n", __func__);
2343 return -EINVAL;
2344 }
2345 tx_priv = dev_get_drvdata(tx_dev);
2346 if (!tx_priv) {
2347 dev_err(component->dev,
2348 "%s: priv is null for macro!\n", __func__);
2349 return -EINVAL;
2350 }
Meng Wang3c6c7b62020-01-13 14:35:30 +08002351 if (tx_priv->swr_ctrl_data &&
2352 (!tx_priv->tx_swr_clk_cnt || !tx_priv->va_swr_clk_cnt)) {
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302353 if (enable) {
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302354 ret = swrm_wcd_notify(
2355 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
2356 SWR_REGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302357 msm_cdc_pinctrl_set_wakeup_capable(
2358 tx_priv->tx_swr_gpio_p, false);
2359 } else {
2360 msm_cdc_pinctrl_set_wakeup_capable(
2361 tx_priv->tx_swr_gpio_p, true);
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302362 ret = swrm_wcd_notify(
2363 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
2364 SWR_DEREGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302365 }
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302366 }
2367
2368 return ret;
2369}
2370
Sudheer Papothia7397942019-03-19 03:14:23 +05302371static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
2372 struct regmap *regmap, int clk_type,
2373 bool enable)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302374{
Meng Wang69b55c82019-05-29 11:04:29 +08002375 int ret = 0, clk_tx_ret = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302376
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002377 trace_printk("%s: clock type %s, enable: %s tx_mclk_users: %d\n",
2378 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
2379 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302380 dev_dbg(tx_priv->dev,
2381 "%s: clock type %s, enable: %s tx_mclk_users: %d\n",
Sudheer Papothia7397942019-03-19 03:14:23 +05302382 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302383 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Tanya Dixit8530fb92018-09-14 16:01:25 +05302384
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302385 if (enable) {
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002386 if (tx_priv->swr_clk_users == 0) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002387 trace_printk("%s: tx swr clk users 0\n", __func__);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002388 ret = msm_cdc_pinctrl_select_active_state(
Karthikeyan Mani01f1ba42019-02-26 18:48:15 -08002389 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002390 if (ret < 0) {
2391 dev_err_ratelimited(tx_priv->dev,
2392 "%s: tx swr pinctrl enable failed\n",
2393 __func__);
2394 goto exit;
2395 }
2396 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302397
Meng Wang69b55c82019-05-29 11:04:29 +08002398 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302399 TX_CORE_CLK,
2400 TX_CORE_CLK,
2401 true);
2402 if (clk_type == TX_MCLK) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002403 trace_printk("%s: requesting TX_MCLK\n", __func__);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302404 ret = tx_macro_mclk_enable(tx_priv, 1);
2405 if (ret < 0) {
2406 if (tx_priv->swr_clk_users == 0)
2407 msm_cdc_pinctrl_select_sleep_state(
2408 tx_priv->tx_swr_gpio_p);
2409 dev_err_ratelimited(tx_priv->dev,
2410 "%s: request clock enable failed\n",
2411 __func__);
2412 goto done;
2413 }
2414 }
2415 if (clk_type == VA_MCLK) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002416 trace_printk("%s: requesting VA_MCLK\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302417 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2418 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302419 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302420 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302421 if (ret < 0) {
2422 if (tx_priv->swr_clk_users == 0)
Sudheer Papothia7397942019-03-19 03:14:23 +05302423 msm_cdc_pinctrl_select_sleep_state(
2424 tx_priv->tx_swr_gpio_p);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302425 dev_err_ratelimited(tx_priv->dev,
2426 "%s: swr request clk failed\n",
2427 __func__);
2428 goto done;
Sudheer Papothia7397942019-03-19 03:14:23 +05302429 }
Sudheer Papothi296867b2019-06-20 09:24:09 +05302430 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
2431 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302432 if (tx_priv->tx_mclk_users == 0) {
2433 regmap_update_bits(regmap,
2434 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK,
2435 0x01, 0x01);
2436 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002437 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302438 0x01, 0x01);
2439 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002440 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302441 0x01, 0x01);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302442 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002443 tx_priv->tx_mclk_users++;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302444 }
2445 if (tx_priv->swr_clk_users == 0) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302446 dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n",
2447 __func__, tx_priv->reset_swr);
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002448 trace_printk("%s: reset_swr: %d\n",
2449 __func__, tx_priv->reset_swr);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302450 if (tx_priv->reset_swr)
2451 regmap_update_bits(regmap,
2452 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2453 0x02, 0x02);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302454 regmap_update_bits(regmap,
2455 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2456 0x01, 0x01);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302457 if (tx_priv->reset_swr)
2458 regmap_update_bits(regmap,
2459 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2460 0x02, 0x00);
2461 tx_priv->reset_swr = false;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302462 }
Meng Wang69b55c82019-05-29 11:04:29 +08002463 if (!clk_tx_ret)
2464 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302465 TX_CORE_CLK,
2466 TX_CORE_CLK,
2467 false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302468 tx_priv->swr_clk_users++;
2469 } else {
2470 if (tx_priv->swr_clk_users <= 0) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302471 dev_err_ratelimited(tx_priv->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302472 "tx swrm clock users already 0\n");
2473 tx_priv->swr_clk_users = 0;
Sudheer Papothia7397942019-03-19 03:14:23 +05302474 return 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302475 }
Meng Wang69b55c82019-05-29 11:04:29 +08002476 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302477 TX_CORE_CLK,
2478 TX_CORE_CLK,
2479 true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302480 tx_priv->swr_clk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302481 if (tx_priv->swr_clk_users == 0)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302482 regmap_update_bits(regmap,
2483 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2484 0x01, 0x00);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302485 if (clk_type == TX_MCLK)
2486 tx_macro_mclk_enable(tx_priv, 0);
2487 if (clk_type == VA_MCLK) {
Meng Wang52a8fb12019-12-12 20:36:05 +08002488 if (tx_priv->tx_mclk_users <= 0) {
2489 dev_err(tx_priv->dev, "%s: clock already disabled\n",
2490 __func__);
2491 tx_priv->tx_mclk_users = 0;
2492 goto tx_clk;
2493 }
2494 tx_priv->tx_mclk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302495 if (tx_priv->tx_mclk_users == 0) {
2496 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002497 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302498 0x01, 0x00);
2499 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002500 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302501 0x01, 0x00);
Sudheer Papothia7397942019-03-19 03:14:23 +05302502 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002503
Sudheer Papothi296867b2019-06-20 09:24:09 +05302504 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
Meng Wang52a8fb12019-12-12 20:36:05 +08002505 false);
Sudheer Papothia7397942019-03-19 03:14:23 +05302506 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2507 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302508 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302509 false);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302510 if (ret < 0) {
2511 dev_err_ratelimited(tx_priv->dev,
2512 "%s: swr request clk failed\n",
2513 __func__);
2514 goto done;
2515 }
2516 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002517tx_clk:
Meng Wang69b55c82019-05-29 11:04:29 +08002518 if (!clk_tx_ret)
2519 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302520 TX_CORE_CLK,
2521 TX_CORE_CLK,
2522 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002523 if (tx_priv->swr_clk_users == 0) {
2524 ret = msm_cdc_pinctrl_select_sleep_state(
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302525 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002526 if (ret < 0) {
2527 dev_err_ratelimited(tx_priv->dev,
2528 "%s: tx swr pinctrl disable failed\n",
2529 __func__);
2530 goto exit;
2531 }
2532 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302533 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302534 return 0;
2535
2536done:
Meng Wang69b55c82019-05-29 11:04:29 +08002537 if (!clk_tx_ret)
2538 bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothia7397942019-03-19 03:14:23 +05302539 TX_CORE_CLK,
2540 TX_CORE_CLK,
2541 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002542exit:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002543 trace_printk("%s: exit\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302544 return ret;
2545}
2546
Sudheer Papothid50a5812019-11-21 07:24:42 +05302547static int tx_macro_clk_div_get(struct snd_soc_component *component)
2548{
2549 struct device *tx_dev = NULL;
2550 struct tx_macro_priv *tx_priv = NULL;
2551
2552 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
2553 return -EINVAL;
2554
2555 return tx_priv->dmic_clk_div;
2556}
2557
Sudheer Papothif4155002019-12-05 01:36:13 +05302558static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src)
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302559{
2560 struct device *tx_dev = NULL;
2561 struct tx_macro_priv *tx_priv = NULL;
2562 int ret = 0;
2563
2564 if (!component)
2565 return -EINVAL;
2566
2567 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2568 if (!tx_dev) {
2569 dev_err(component->dev,
2570 "%s: null device for macro!\n", __func__);
2571 return -EINVAL;
2572 }
2573 tx_priv = dev_get_drvdata(tx_dev);
2574 if (!tx_priv) {
2575 dev_err(component->dev,
2576 "%s: priv is null for macro!\n", __func__);
2577 return -EINVAL;
2578 }
2579 if (tx_priv->swr_ctrl_data) {
2580 ret = swrm_wcd_notify(
2581 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Sudheer Papothif4155002019-12-05 01:36:13 +05302582 SWR_REQ_CLK_SWITCH, &clk_src);
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302583 }
2584
2585 return ret;
2586}
2587
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002588static int tx_macro_core_vote(void *handle, bool enable)
2589{
2590 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002591
2592 if (tx_priv == NULL) {
2593 pr_err("%s: tx priv data is NULL\n", __func__);
2594 return -EINVAL;
2595 }
2596 if (enable) {
2597 pm_runtime_get_sync(tx_priv->dev);
2598 pm_runtime_put_autosuspend(tx_priv->dev);
2599 pm_runtime_mark_last_busy(tx_priv->dev);
2600 }
2601
Aditya Bavanarid577af92019-10-03 21:09:19 +05302602 if (bolero_check_core_votes(tx_priv->dev))
2603 return 0;
2604 else
2605 return -EINVAL;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002606}
2607
Sudheer Papothia7397942019-03-19 03:14:23 +05302608static int tx_macro_swrm_clock(void *handle, bool enable)
2609{
2610 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
2611 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
2612 int ret = 0;
2613
2614 if (regmap == NULL) {
2615 dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__);
2616 return -EINVAL;
2617 }
2618
2619 mutex_lock(&tx_priv->swr_clk_lock);
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002620 trace_printk("%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2621 __func__,
2622 (enable ? "enable" : "disable"),
2623 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302624 dev_dbg(tx_priv->dev,
2625 "%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2626 __func__, (enable ? "enable" : "disable"),
2627 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothia7397942019-03-19 03:14:23 +05302628
2629 if (enable) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302630 pm_runtime_get_sync(tx_priv->dev);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302631 if (tx_priv->va_swr_clk_cnt && !tx_priv->tx_swr_clk_cnt) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302632 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2633 VA_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002634 if (ret) {
2635 pm_runtime_mark_last_busy(tx_priv->dev);
2636 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302637 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002638 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302639 tx_priv->va_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302640 } else {
Sudheer Papothia7397942019-03-19 03:14:23 +05302641 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2642 TX_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002643 if (ret) {
2644 pm_runtime_mark_last_busy(tx_priv->dev);
2645 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302646 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002647 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302648 tx_priv->tx_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302649 }
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302650 pm_runtime_mark_last_busy(tx_priv->dev);
2651 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302652 } else {
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302653 if (tx_priv->va_clk_status && !tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302654 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2655 VA_MCLK, enable);
2656 if (ret)
2657 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302658 --tx_priv->va_clk_status;
2659 } else if (!tx_priv->va_clk_status && tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302660 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2661 TX_MCLK, enable);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302662 if (ret)
2663 goto done;
2664 --tx_priv->tx_clk_status;
2665 } else if (tx_priv->va_clk_status && tx_priv->tx_clk_status) {
2666 if (!tx_priv->va_swr_clk_cnt && tx_priv->tx_swr_clk_cnt) {
2667 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2668 VA_MCLK, enable);
Sudheer Papothia7397942019-03-19 03:14:23 +05302669 if (ret)
2670 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302671 --tx_priv->va_clk_status;
2672 } else {
2673 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2674 TX_MCLK, enable);
2675 if (ret)
2676 goto done;
2677 --tx_priv->tx_clk_status;
Sudheer Papothia7397942019-03-19 03:14:23 +05302678 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302679
2680 } else {
2681 dev_dbg(tx_priv->dev,
2682 "%s: Both clocks are disabled\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302683 }
2684 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302685
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002686 trace_printk("%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2687 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2688 tx_priv->va_clk_status);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302689 dev_dbg(tx_priv->dev,
2690 "%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2691 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2692 tx_priv->va_clk_status);
Sudheer Papothia7397942019-03-19 03:14:23 +05302693done:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302694 mutex_unlock(&tx_priv->swr_clk_lock);
2695 return ret;
2696}
2697
2698static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate,
2699 struct tx_macro_priv *tx_priv)
2700{
2701 u32 div_factor = TX_MACRO_CLK_DIV_2;
2702 u32 mclk_rate = TX_MACRO_MCLK_FREQ;
2703
2704 if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED ||
2705 mclk_rate % dmic_sample_rate != 0)
2706 goto undefined_rate;
2707
2708 div_factor = mclk_rate / dmic_sample_rate;
2709
2710 switch (div_factor) {
2711 case 2:
2712 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
2713 break;
2714 case 3:
2715 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_3;
2716 break;
2717 case 4:
2718 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_4;
2719 break;
2720 case 6:
2721 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_6;
2722 break;
2723 case 8:
2724 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_8;
2725 break;
2726 case 16:
2727 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_16;
2728 break;
2729 default:
2730 /* Any other DIV factor is invalid */
2731 goto undefined_rate;
2732 }
2733
2734 /* Valid dmic DIV factors */
2735 dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n",
2736 __func__, div_factor, mclk_rate);
2737
2738 return dmic_sample_rate;
2739
2740undefined_rate:
2741 dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n",
2742 __func__, dmic_sample_rate, mclk_rate);
2743 dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED;
2744
2745 return dmic_sample_rate;
2746}
2747
Sudheer Papothi72fef482019-08-30 11:00:20 +05302748static const struct tx_macro_reg_mask_val tx_macro_reg_init[] = {
Vatsal Bucha116ac372020-01-14 12:55:18 +05302749 {BOLERO_CDC_TX0_TX_PATH_SEC7, 0x3F, 0x0A},
Sudheer Papothi72fef482019-08-30 11:00:20 +05302750};
2751
Meng Wang15c825d2018-09-06 10:49:18 +08002752static int tx_macro_init(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302753{
Meng Wang15c825d2018-09-06 10:49:18 +08002754 struct snd_soc_dapm_context *dapm =
2755 snd_soc_component_get_dapm(component);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302756 int ret = 0, i = 0;
2757 struct device *tx_dev = NULL;
2758 struct tx_macro_priv *tx_priv = NULL;
2759
Meng Wang15c825d2018-09-06 10:49:18 +08002760 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302761 if (!tx_dev) {
Meng Wang15c825d2018-09-06 10:49:18 +08002762 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302763 "%s: null device for macro!\n", __func__);
2764 return -EINVAL;
2765 }
2766 tx_priv = dev_get_drvdata(tx_dev);
2767 if (!tx_priv) {
Meng Wang15c825d2018-09-06 10:49:18 +08002768 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302769 "%s: priv is null for macro!\n", __func__);
2770 return -EINVAL;
2771 }
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302772 tx_priv->version = bolero_get_version(tx_dev);
2773 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2774 ret = snd_soc_dapm_new_controls(dapm,
2775 tx_macro_dapm_widgets_common,
2776 ARRAY_SIZE(tx_macro_dapm_widgets_common));
2777 if (ret < 0) {
2778 dev_err(tx_dev, "%s: Failed to add controls\n",
2779 __func__);
2780 return ret;
2781 }
2782 if (tx_priv->version == BOLERO_VERSION_2_1)
2783 ret = snd_soc_dapm_new_controls(dapm,
2784 tx_macro_dapm_widgets_v2,
2785 ARRAY_SIZE(tx_macro_dapm_widgets_v2));
2786 else if (tx_priv->version == BOLERO_VERSION_2_0)
2787 ret = snd_soc_dapm_new_controls(dapm,
2788 tx_macro_dapm_widgets_v3,
2789 ARRAY_SIZE(tx_macro_dapm_widgets_v3));
2790 if (ret < 0) {
2791 dev_err(tx_dev, "%s: Failed to add controls\n",
2792 __func__);
2793 return ret;
2794 }
2795 } else {
2796 ret = snd_soc_dapm_new_controls(dapm, tx_macro_dapm_widgets,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302797 ARRAY_SIZE(tx_macro_dapm_widgets));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302798 if (ret < 0) {
2799 dev_err(tx_dev, "%s: Failed to add controls\n",
2800 __func__);
2801 return ret;
2802 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302803 }
2804
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302805 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2806 ret = snd_soc_dapm_add_routes(dapm,
2807 tx_audio_map_common,
2808 ARRAY_SIZE(tx_audio_map_common));
2809 if (ret < 0) {
2810 dev_err(tx_dev, "%s: Failed to add routes\n",
2811 __func__);
2812 return ret;
2813 }
2814 if (tx_priv->version == BOLERO_VERSION_2_0)
2815 ret = snd_soc_dapm_add_routes(dapm,
2816 tx_audio_map_v3,
2817 ARRAY_SIZE(tx_audio_map_v3));
2818 if (ret < 0) {
2819 dev_err(tx_dev, "%s: Failed to add routes\n",
2820 __func__);
2821 return ret;
2822 }
2823 } else {
2824 ret = snd_soc_dapm_add_routes(dapm, tx_audio_map,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302825 ARRAY_SIZE(tx_audio_map));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302826 if (ret < 0) {
2827 dev_err(tx_dev, "%s: Failed to add routes\n",
2828 __func__);
2829 return ret;
2830 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302831 }
2832
2833 ret = snd_soc_dapm_new_widgets(dapm->card);
2834 if (ret < 0) {
2835 dev_err(tx_dev, "%s: Failed to add widgets\n", __func__);
2836 return ret;
2837 }
2838
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302839 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2840 ret = snd_soc_add_component_controls(component,
2841 tx_macro_snd_controls_common,
2842 ARRAY_SIZE(tx_macro_snd_controls_common));
2843 if (ret < 0) {
2844 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2845 __func__);
2846 return ret;
2847 }
2848 if (tx_priv->version == BOLERO_VERSION_2_0)
2849 ret = snd_soc_add_component_controls(component,
2850 tx_macro_snd_controls_v3,
2851 ARRAY_SIZE(tx_macro_snd_controls_v3));
2852 if (ret < 0) {
2853 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2854 __func__);
2855 return ret;
2856 }
2857 } else {
2858 ret = snd_soc_add_component_controls(component,
2859 tx_macro_snd_controls,
2860 ARRAY_SIZE(tx_macro_snd_controls));
2861 if (ret < 0) {
2862 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2863 __func__);
2864 return ret;
2865 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302866 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302867
2868 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF1 Capture");
2869 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF2 Capture");
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002870 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF3 Capture");
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302871 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2872 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC0");
2873 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC1");
2874 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC2");
2875 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC3");
2876 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC4");
2877 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC5");
2878 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC6");
2879 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC7");
2880 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC8");
2881 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC9");
2882 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC10");
2883 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC11");
2884 } else {
2885 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC0");
2886 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1");
2887 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2");
2888 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC3");
2889 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC0");
2890 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC1");
2891 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC2");
2892 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC3");
2893 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC4");
2894 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC5");
2895 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC6");
2896 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC7");
2897 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302898 snd_soc_dapm_sync(dapm);
2899
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302900 for (i = 0; i < NUM_DECIMATORS; i++) {
2901 tx_priv->tx_hpf_work[i].tx_priv = tx_priv;
2902 tx_priv->tx_hpf_work[i].decimator = i;
2903 INIT_DELAYED_WORK(&tx_priv->tx_hpf_work[i].dwork,
2904 tx_macro_tx_hpf_corner_freq_callback);
2905 }
2906
2907 for (i = 0; i < NUM_DECIMATORS; i++) {
2908 tx_priv->tx_mute_dwork[i].tx_priv = tx_priv;
2909 tx_priv->tx_mute_dwork[i].decimator = i;
2910 INIT_DELAYED_WORK(&tx_priv->tx_mute_dwork[i].dwork,
2911 tx_macro_mute_update_callback);
2912 }
Meng Wang15c825d2018-09-06 10:49:18 +08002913 tx_priv->component = component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302914
Sudheer Papothi72fef482019-08-30 11:00:20 +05302915 for (i = 0; i < ARRAY_SIZE(tx_macro_reg_init); i++)
2916 snd_soc_component_update_bits(component,
2917 tx_macro_reg_init[i].reg,
2918 tx_macro_reg_init[i].mask,
2919 tx_macro_reg_init[i].val);
2920
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302921 if (tx_priv->version == BOLERO_VERSION_2_1)
2922 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05302923 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302924 else if (tx_priv->version == BOLERO_VERSION_2_0)
2925 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05302926 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302927
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302928 return 0;
2929}
2930
Meng Wang15c825d2018-09-06 10:49:18 +08002931static int tx_macro_deinit(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302932{
2933 struct device *tx_dev = NULL;
2934 struct tx_macro_priv *tx_priv = NULL;
2935
Meng Wang15c825d2018-09-06 10:49:18 +08002936 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302937 return -EINVAL;
2938
Meng Wang15c825d2018-09-06 10:49:18 +08002939 tx_priv->component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302940 return 0;
2941}
2942
2943static void tx_macro_add_child_devices(struct work_struct *work)
2944{
2945 struct tx_macro_priv *tx_priv = NULL;
2946 struct platform_device *pdev = NULL;
2947 struct device_node *node = NULL;
2948 struct tx_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
2949 int ret = 0;
2950 u16 count = 0, ctrl_num = 0;
2951 struct tx_macro_swr_ctrl_platform_data *platdata = NULL;
2952 char plat_dev_name[TX_MACRO_SWR_STRING_LEN] = "";
2953 bool tx_swr_master_node = false;
2954
2955 tx_priv = container_of(work, struct tx_macro_priv,
2956 tx_macro_add_child_devices_work);
2957 if (!tx_priv) {
2958 pr_err("%s: Memory for tx_priv does not exist\n",
2959 __func__);
2960 return;
2961 }
2962
2963 if (!tx_priv->dev) {
2964 pr_err("%s: tx dev does not exist\n", __func__);
2965 return;
2966 }
2967
2968 if (!tx_priv->dev->of_node) {
2969 dev_err(tx_priv->dev,
2970 "%s: DT node for tx_priv does not exist\n", __func__);
2971 return;
2972 }
2973
2974 platdata = &tx_priv->swr_plat_data;
2975 tx_priv->child_count = 0;
2976
2977 for_each_available_child_of_node(tx_priv->dev->of_node, node) {
2978 tx_swr_master_node = false;
2979 if (strnstr(node->name, "tx_swr_master",
2980 strlen("tx_swr_master")) != NULL)
2981 tx_swr_master_node = true;
2982
2983 if (tx_swr_master_node)
2984 strlcpy(plat_dev_name, "tx_swr_ctrl",
2985 (TX_MACRO_SWR_STRING_LEN - 1));
2986 else
2987 strlcpy(plat_dev_name, node->name,
2988 (TX_MACRO_SWR_STRING_LEN - 1));
2989
2990 pdev = platform_device_alloc(plat_dev_name, -1);
2991 if (!pdev) {
2992 dev_err(tx_priv->dev, "%s: pdev memory alloc failed\n",
2993 __func__);
2994 ret = -ENOMEM;
2995 goto err;
2996 }
2997 pdev->dev.parent = tx_priv->dev;
2998 pdev->dev.of_node = node;
2999
3000 if (tx_swr_master_node) {
3001 ret = platform_device_add_data(pdev, platdata,
3002 sizeof(*platdata));
3003 if (ret) {
3004 dev_err(&pdev->dev,
3005 "%s: cannot add plat data ctrl:%d\n",
3006 __func__, ctrl_num);
3007 goto fail_pdev_add;
3008 }
3009 }
3010
3011 ret = platform_device_add(pdev);
3012 if (ret) {
3013 dev_err(&pdev->dev,
3014 "%s: Cannot add platform device\n",
3015 __func__);
3016 goto fail_pdev_add;
3017 }
3018
3019 if (tx_swr_master_node) {
3020 temp = krealloc(swr_ctrl_data,
3021 (ctrl_num + 1) * sizeof(
3022 struct tx_macro_swr_ctrl_data),
3023 GFP_KERNEL);
3024 if (!temp) {
3025 ret = -ENOMEM;
3026 goto fail_pdev_add;
3027 }
3028 swr_ctrl_data = temp;
3029 swr_ctrl_data[ctrl_num].tx_swr_pdev = pdev;
3030 ctrl_num++;
3031 dev_dbg(&pdev->dev,
3032 "%s: Added soundwire ctrl device(s)\n",
3033 __func__);
3034 tx_priv->swr_ctrl_data = swr_ctrl_data;
3035 }
3036 if (tx_priv->child_count < TX_MACRO_CHILD_DEVICES_MAX)
3037 tx_priv->pdev_child_devices[
3038 tx_priv->child_count++] = pdev;
3039 else
3040 goto err;
3041 }
3042 return;
3043fail_pdev_add:
3044 for (count = 0; count < tx_priv->child_count; count++)
3045 platform_device_put(tx_priv->pdev_child_devices[count]);
3046err:
3047 return;
3048}
3049
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303050static int tx_macro_set_port_map(struct snd_soc_component *component,
3051 u32 usecase, u32 size, void *data)
3052{
3053 struct device *tx_dev = NULL;
3054 struct tx_macro_priv *tx_priv = NULL;
3055 struct swrm_port_config port_cfg;
3056 int ret = 0;
3057
3058 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
3059 return -EINVAL;
3060
3061 memset(&port_cfg, 0, sizeof(port_cfg));
3062 port_cfg.uc = usecase;
3063 port_cfg.size = size;
3064 port_cfg.params = data;
3065
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003066 if (tx_priv->swr_ctrl_data)
3067 ret = swrm_wcd_notify(
3068 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
3069 SWR_SET_PORT_MAP, &port_cfg);
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303070
3071 return ret;
3072}
3073
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303074static void tx_macro_init_ops(struct macro_ops *ops,
3075 char __iomem *tx_io_base)
3076{
3077 memset(ops, 0, sizeof(struct macro_ops));
3078 ops->init = tx_macro_init;
3079 ops->exit = tx_macro_deinit;
3080 ops->io_base = tx_io_base;
3081 ops->dai_ptr = tx_macro_dai;
3082 ops->num_dais = ARRAY_SIZE(tx_macro_dai);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05303083 ops->event_handler = tx_macro_event_handler;
Aditya Bavanaric4e96122018-11-14 14:46:38 +05303084 ops->reg_wake_irq = tx_macro_reg_wake_irq;
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303085 ops->set_port_map = tx_macro_set_port_map;
Sudheer Papothid50a5812019-11-21 07:24:42 +05303086 ops->clk_div_get = tx_macro_clk_div_get;
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05303087 ops->clk_switch = tx_macro_clk_switch;
Sudheer Papothi06a4c642019-08-08 05:17:46 +05303088 ops->reg_evt_listener = tx_macro_register_event_listener;
Sudheer Papothifc3adb02019-11-24 10:14:21 +05303089 ops->clk_enable = __tx_macro_mclk_enable;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303090}
3091
3092static int tx_macro_probe(struct platform_device *pdev)
3093{
3094 struct macro_ops ops = {0};
3095 struct tx_macro_priv *tx_priv = NULL;
3096 u32 tx_base_addr = 0, sample_rate = 0;
3097 char __iomem *tx_io_base = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303098 int ret = 0;
3099 const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate";
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003100 u32 is_used_tx_swr_gpio = 1;
3101 const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio";
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303102
3103 tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv),
3104 GFP_KERNEL);
3105 if (!tx_priv)
3106 return -ENOMEM;
3107 platform_set_drvdata(pdev, tx_priv);
3108
3109 tx_priv->dev = &pdev->dev;
3110 ret = of_property_read_u32(pdev->dev.of_node, "reg",
3111 &tx_base_addr);
3112 if (ret) {
3113 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3114 __func__, "reg");
3115 return ret;
3116 }
3117 dev_set_drvdata(&pdev->dev, tx_priv);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003118 if (of_find_property(pdev->dev.of_node, is_used_tx_swr_gpio_dt,
3119 NULL)) {
3120 ret = of_property_read_u32(pdev->dev.of_node,
3121 is_used_tx_swr_gpio_dt,
3122 &is_used_tx_swr_gpio);
3123 if (ret) {
3124 dev_err(&pdev->dev, "%s: error reading %s in dt\n",
3125 __func__, is_used_tx_swr_gpio_dt);
3126 is_used_tx_swr_gpio = 1;
3127 }
3128 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303129 tx_priv->tx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
3130 "qcom,tx-swr-gpios", 0);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003131 if (!tx_priv->tx_swr_gpio_p && is_used_tx_swr_gpio) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303132 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
3133 __func__);
3134 return -EINVAL;
3135 }
Karthikeyan Manib44e4552019-09-09 23:06:04 -07003136 if (msm_cdc_pinctrl_get_state(tx_priv->tx_swr_gpio_p) < 0 &&
3137 is_used_tx_swr_gpio) {
Karthikeyan Mani326536d2019-06-03 13:29:43 -07003138 dev_err(&pdev->dev, "%s: failed to get swr pin state\n",
3139 __func__);
3140 return -EPROBE_DEFER;
3141 }
3142
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303143 tx_io_base = devm_ioremap(&pdev->dev,
3144 tx_base_addr, TX_MACRO_MAX_OFFSET);
3145 if (!tx_io_base) {
3146 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
3147 return -ENOMEM;
3148 }
3149 tx_priv->tx_io_base = tx_io_base;
3150 ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate,
3151 &sample_rate);
3152 if (ret) {
3153 dev_err(&pdev->dev,
3154 "%s: could not find sample_rate entry in dt\n",
3155 __func__);
3156 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
3157 } else {
3158 if (tx_macro_validate_dmic_sample_rate(
3159 sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED)
3160 return -EINVAL;
3161 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303162 if (is_used_tx_swr_gpio) {
3163 tx_priv->reset_swr = true;
3164 INIT_WORK(&tx_priv->tx_macro_add_child_devices_work,
3165 tx_macro_add_child_devices);
3166 tx_priv->swr_plat_data.handle = (void *) tx_priv;
3167 tx_priv->swr_plat_data.read = NULL;
3168 tx_priv->swr_plat_data.write = NULL;
3169 tx_priv->swr_plat_data.bulk_write = NULL;
3170 tx_priv->swr_plat_data.clk = tx_macro_swrm_clock;
3171 tx_priv->swr_plat_data.core_vote = tx_macro_core_vote;
3172 tx_priv->swr_plat_data.handle_irq = NULL;
3173 mutex_init(&tx_priv->swr_clk_lock);
3174 }
3175 tx_priv->is_used_tx_swr_gpio = is_used_tx_swr_gpio;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303176 mutex_init(&tx_priv->mclk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303177 tx_macro_init_ops(&ops, tx_io_base);
Vidyakumar Athota5d45f4c2019-03-10 22:35:07 -07003178 ops.clk_id_req = TX_CORE_CLK;
3179 ops.default_clk_id = TX_CORE_CLK;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303180 ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops);
3181 if (ret) {
3182 dev_err(&pdev->dev,
3183 "%s: register macro failed\n", __func__);
3184 goto err_reg_macro;
3185 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303186 if (is_used_tx_swr_gpio)
3187 schedule_work(&tx_priv->tx_macro_add_child_devices_work);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303188 pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY);
3189 pm_runtime_use_autosuspend(&pdev->dev);
3190 pm_runtime_set_suspended(&pdev->dev);
Sudheer Papothi296867b2019-06-20 09:24:09 +05303191 pm_suspend_ignore_children(&pdev->dev, true);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303192 pm_runtime_enable(&pdev->dev);
3193
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303194 return 0;
3195err_reg_macro:
3196 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303197 if (is_used_tx_swr_gpio)
3198 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303199 return ret;
3200}
3201
3202static int tx_macro_remove(struct platform_device *pdev)
3203{
3204 struct tx_macro_priv *tx_priv = NULL;
3205 u16 count = 0;
3206
3207 tx_priv = platform_get_drvdata(pdev);
3208
3209 if (!tx_priv)
3210 return -EINVAL;
3211
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303212 if (tx_priv->is_used_tx_swr_gpio) {
3213 if (tx_priv->swr_ctrl_data)
3214 kfree(tx_priv->swr_ctrl_data);
3215 for (count = 0; count < tx_priv->child_count &&
3216 count < TX_MACRO_CHILD_DEVICES_MAX; count++)
3217 platform_device_unregister(
3218 tx_priv->pdev_child_devices[count]);
3219 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303220
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303221 pm_runtime_disable(&pdev->dev);
3222 pm_runtime_set_suspended(&pdev->dev);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303223 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303224 if (tx_priv->is_used_tx_swr_gpio)
3225 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303226 bolero_unregister_macro(&pdev->dev, TX_MACRO);
3227 return 0;
3228}
3229
3230
3231static const struct of_device_id tx_macro_dt_match[] = {
3232 {.compatible = "qcom,tx-macro"},
3233 {}
3234};
3235
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303236static const struct dev_pm_ops bolero_dev_pm_ops = {
3237 SET_RUNTIME_PM_OPS(
3238 bolero_runtime_suspend,
3239 bolero_runtime_resume,
3240 NULL
3241 )
3242};
3243
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303244static struct platform_driver tx_macro_driver = {
3245 .driver = {
3246 .name = "tx_macro",
3247 .owner = THIS_MODULE,
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303248 .pm = &bolero_dev_pm_ops,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303249 .of_match_table = tx_macro_dt_match,
Xiaojun Sang53cd13a2018-06-29 15:14:37 +08003250 .suppress_bind_attrs = true,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303251 },
3252 .probe = tx_macro_probe,
3253 .remove = tx_macro_remove,
3254};
3255
3256module_platform_driver(tx_macro_driver);
3257
3258MODULE_DESCRIPTION("TX macro driver");
3259MODULE_LICENSE("GPL v2");