blob: 12bb331e0ea3999bbb1fc3ce9d1d2488ef3a7ebe [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,
380 SWR_DEVICE_DOWN, NULL);
381 swrm_wcd_notify(
382 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
383 SWR_DEVICE_SSR_DOWN, NULL);
384 }
Aditya Bavanari50ef13e2019-08-09 15:14:43 +0530385 if ((!pm_runtime_enabled(tx_dev) ||
386 !pm_runtime_suspended(tx_dev))) {
387 ret = bolero_runtime_suspend(tx_dev);
388 if (!ret) {
389 pm_runtime_disable(tx_dev);
390 pm_runtime_set_suspended(tx_dev);
391 pm_runtime_enable(tx_dev);
392 }
393 }
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530394 break;
395 case BOLERO_MACRO_EVT_SSR_UP:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -0700396 trace_printk("%s, enter SSR up\n", __func__);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +0530397 /* reset swr after ssr/pdr */
398 tx_priv->reset_swr = true;
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700399 if (tx_priv->swr_ctrl_data)
400 swrm_wcd_notify(
401 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
402 SWR_DEVICE_SSR_UP, NULL);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530403 break;
Meng Wang8ef0cc22019-05-08 15:12:56 +0800404 case BOLERO_MACRO_EVT_CLK_RESET:
405 bolero_rsc_clk_reset(tx_dev, TX_CORE_CLK);
406 break;
Vatsal Buchad06525f2019-10-14 23:14:12 +0530407 case BOLERO_MACRO_EVT_BCS_CLK_OFF:
408 if (tx_priv->bcs_clk_en)
409 snd_soc_component_update_bits(component,
410 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, data << 6);
411 if (data)
412 tx_priv->hs_slow_insert_complete = true;
413 else
414 tx_priv->hs_slow_insert_complete = false;
415 break;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530416 }
417 return 0;
418}
419
Meng Wang15c825d2018-09-06 10:49:18 +0800420static int tx_macro_reg_wake_irq(struct snd_soc_component *component,
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530421 u32 data)
422{
423 struct device *tx_dev = NULL;
424 struct tx_macro_priv *tx_priv = NULL;
425 u32 ipc_wakeup = data;
426 int ret = 0;
427
Meng Wang15c825d2018-09-06 10:49:18 +0800428 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530429 return -EINVAL;
430
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700431 if (tx_priv->swr_ctrl_data)
432 ret = swrm_wcd_notify(
433 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
434 SWR_REGISTER_WAKE_IRQ, &ipc_wakeup);
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530435
436 return ret;
437}
438
Sudheer Papothi339c4112019-12-13 00:49:16 +0530439static int is_amic_enabled(struct snd_soc_component *component, int decimator)
440{
441 u16 adc_mux_reg = 0, adc_reg = 0;
442 u16 adc_n = BOLERO_ADC_MAX;
443
444 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
445 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
446 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
447 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
448 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
449 adc_n = snd_soc_component_read32(component, adc_reg) &
450 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
451 if (adc_n >= BOLERO_ADC_MAX)
452 adc_n = BOLERO_ADC_MAX;
453 }
454
455 return adc_n;
456}
457
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530458static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
459{
460 struct delayed_work *hpf_delayed_work = NULL;
461 struct hpf_work *hpf_work = NULL;
462 struct tx_macro_priv *tx_priv = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800463 struct snd_soc_component *component = NULL;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530464 u16 dec_cfg_reg = 0, hpf_gate_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530465 u8 hpf_cut_off_freq = 0;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530466 u16 adc_n = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530467
468 hpf_delayed_work = to_delayed_work(work);
469 hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
470 tx_priv = hpf_work->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800471 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530472 hpf_cut_off_freq = hpf_work->hpf_cut_off_freq;
473
474 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
475 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530476 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
477 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530478
Meng Wang15c825d2018-09-06 10:49:18 +0800479 dev_dbg(component->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530480 __func__, hpf_work->decimator, hpf_cut_off_freq);
481
Sudheer Papothi339c4112019-12-13 00:49:16 +0530482 adc_n = is_amic_enabled(component, hpf_work->decimator);
483 if (adc_n < BOLERO_ADC_MAX) {
Laxminath Kasam497a6512018-09-17 16:11:52 +0530484 /* analog mic clear TX hold */
Meng Wang15c825d2018-09-06 10:49:18 +0800485 bolero_clear_amic_tx_hold(component->dev, adc_n);
Sudheer Papothi339c4112019-12-13 00:49:16 +0530486 snd_soc_component_update_bits(component,
487 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
488 hpf_cut_off_freq << 5);
489 snd_soc_component_update_bits(component, hpf_gate_reg,
490 0x03, 0x02);
491 /* Minimum 1 clk cycle delay is required as per HW spec */
492 usleep_range(1000, 1010);
493 snd_soc_component_update_bits(component, hpf_gate_reg,
494 0x03, 0x01);
495 } else {
496 snd_soc_component_update_bits(component,
497 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
498 hpf_cut_off_freq << 5);
499 snd_soc_component_update_bits(component, hpf_gate_reg,
500 0x02, 0x02);
501 /* Minimum 1 clk cycle delay is required as per HW spec */
502 usleep_range(1000, 1010);
503 snd_soc_component_update_bits(component, hpf_gate_reg,
504 0x02, 0x00);
Laxminath Kasam497a6512018-09-17 16:11:52 +0530505 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530506}
507
508static void tx_macro_mute_update_callback(struct work_struct *work)
509{
510 struct tx_mute_work *tx_mute_dwork = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800511 struct snd_soc_component *component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530512 struct tx_macro_priv *tx_priv = NULL;
513 struct delayed_work *delayed_work = NULL;
Xiaojun Sangd155fdc2018-10-11 15:11:59 +0800514 u16 tx_vol_ctl_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530515 u8 decimator = 0;
516
517 delayed_work = to_delayed_work(work);
518 tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork);
519 tx_priv = tx_mute_dwork->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800520 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530521 decimator = tx_mute_dwork->decimator;
522
523 tx_vol_ctl_reg =
524 BOLERO_CDC_TX0_TX_PATH_CTL +
525 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +0800526 snd_soc_component_update_bits(component, tx_vol_ctl_reg, 0x10, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530527 dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
528 __func__, decimator);
529}
530
531static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
532 struct snd_ctl_elem_value *ucontrol)
533{
534 struct snd_soc_dapm_widget *widget =
535 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800536 struct snd_soc_component *component =
537 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530538 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
539 unsigned int val = 0;
540 u16 mic_sel_reg = 0;
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530541 u16 dmic_clk_reg = 0;
542 struct device *tx_dev = NULL;
543 struct tx_macro_priv *tx_priv = NULL;
544
545 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
546 return -EINVAL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530547
548 val = ucontrol->value.enumerated.item[0];
549 if (val > e->items - 1)
550 return -EINVAL;
551
Meng Wang15c825d2018-09-06 10:49:18 +0800552 dev_dbg(component->dev, "%s: wname: %s, val: 0x%x\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530553 widget->name, val);
554
555 switch (e->reg) {
556 case BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0:
557 mic_sel_reg = BOLERO_CDC_TX0_TX_PATH_CFG0;
558 break;
559 case BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0:
560 mic_sel_reg = BOLERO_CDC_TX1_TX_PATH_CFG0;
561 break;
562 case BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0:
563 mic_sel_reg = BOLERO_CDC_TX2_TX_PATH_CFG0;
564 break;
565 case BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0:
566 mic_sel_reg = BOLERO_CDC_TX3_TX_PATH_CFG0;
567 break;
568 case BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0:
569 mic_sel_reg = BOLERO_CDC_TX4_TX_PATH_CFG0;
570 break;
571 case BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0:
572 mic_sel_reg = BOLERO_CDC_TX5_TX_PATH_CFG0;
573 break;
574 case BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0:
575 mic_sel_reg = BOLERO_CDC_TX6_TX_PATH_CFG0;
576 break;
577 case BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0:
578 mic_sel_reg = BOLERO_CDC_TX7_TX_PATH_CFG0;
579 break;
580 default:
Meng Wang15c825d2018-09-06 10:49:18 +0800581 dev_err(component->dev, "%s: e->reg: 0x%x not expected\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530582 __func__, e->reg);
583 return -EINVAL;
584 }
Laxminath Kasam497a6512018-09-17 16:11:52 +0530585 if (strnstr(widget->name, "SMIC", strlen(widget->name))) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530586 if (val != 0) {
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530587 if (val < 5) {
Meng Wang15c825d2018-09-06 10:49:18 +0800588 snd_soc_component_update_bits(component,
589 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530590 1 << 7, 0x0 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530591 } else {
Meng Wang15c825d2018-09-06 10:49:18 +0800592 snd_soc_component_update_bits(component,
593 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530594 1 << 7, 0x1 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530595 snd_soc_component_update_bits(component,
596 BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
597 0x80, 0x00);
598 dmic_clk_reg =
599 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
600 ((val - 5)/2) * 4;
601 snd_soc_component_update_bits(component,
602 dmic_clk_reg,
603 0x0E, tx_priv->dmic_clk_div << 0x1);
604 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530605 }
606 } else {
607 /* DMIC selected */
608 if (val != 0)
Meng Wang15c825d2018-09-06 10:49:18 +0800609 snd_soc_component_update_bits(component, mic_sel_reg,
610 1 << 7, 1 << 7);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530611 }
612
613 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
614}
615
616static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol,
617 struct snd_ctl_elem_value *ucontrol)
618{
619 struct snd_soc_dapm_widget *widget =
620 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800621 struct snd_soc_component *component =
622 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530623 struct soc_multi_mixer_control *mixer =
624 ((struct soc_multi_mixer_control *)kcontrol->private_value);
625 u32 dai_id = widget->shift;
626 u32 dec_id = mixer->shift;
627 struct device *tx_dev = NULL;
628 struct tx_macro_priv *tx_priv = NULL;
629
Meng Wang15c825d2018-09-06 10:49:18 +0800630 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530631 return -EINVAL;
632
633 if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id]))
634 ucontrol->value.integer.value[0] = 1;
635 else
636 ucontrol->value.integer.value[0] = 0;
637 return 0;
638}
639
640static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
641 struct snd_ctl_elem_value *ucontrol)
642{
643 struct snd_soc_dapm_widget *widget =
644 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800645 struct snd_soc_component *component =
646 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530647 struct snd_soc_dapm_update *update = NULL;
648 struct soc_multi_mixer_control *mixer =
649 ((struct soc_multi_mixer_control *)kcontrol->private_value);
650 u32 dai_id = widget->shift;
651 u32 dec_id = mixer->shift;
652 u32 enable = ucontrol->value.integer.value[0];
653 struct device *tx_dev = NULL;
654 struct tx_macro_priv *tx_priv = NULL;
655
Meng Wang15c825d2018-09-06 10:49:18 +0800656 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530657 return -EINVAL;
658
659 if (enable) {
660 set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
661 tx_priv->active_ch_cnt[dai_id]++;
662 } else {
663 tx_priv->active_ch_cnt[dai_id]--;
664 clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
665 }
666 snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
667
668 return 0;
669}
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700670
671static inline int tx_macro_path_get(const char *wname,
672 unsigned int *path_num)
673{
674 int ret = 0;
675 char *widget_name = NULL;
676 char *w_name = NULL;
677 char *path_num_char = NULL;
678 char *path_name = NULL;
679
680 widget_name = kstrndup(wname, 10, GFP_KERNEL);
681 if (!widget_name)
682 return -EINVAL;
683
684 w_name = widget_name;
685
686 path_name = strsep(&widget_name, " ");
687 if (!path_name) {
688 pr_err("%s: Invalid widget name = %s\n",
689 __func__, widget_name);
690 ret = -EINVAL;
691 goto err;
692 }
693 path_num_char = strpbrk(path_name, "01234567");
694 if (!path_num_char) {
695 pr_err("%s: tx path index not found\n",
696 __func__);
697 ret = -EINVAL;
698 goto err;
699 }
700 ret = kstrtouint(path_num_char, 10, path_num);
701 if (ret < 0)
702 pr_err("%s: Invalid tx path = %s\n",
703 __func__, w_name);
704
705err:
706 kfree(w_name);
707 return ret;
708}
709
710static int tx_macro_dec_mode_get(struct snd_kcontrol *kcontrol,
711 struct snd_ctl_elem_value *ucontrol)
712{
713 struct snd_soc_component *component =
714 snd_soc_kcontrol_component(kcontrol);
715 struct tx_macro_priv *tx_priv = NULL;
716 struct device *tx_dev = NULL;
717 int ret = 0;
718 int path = 0;
719
720 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
721 return -EINVAL;
722
723 ret = tx_macro_path_get(kcontrol->id.name, &path);
724 if (ret)
725 return ret;
726
727 ucontrol->value.integer.value[0] = tx_priv->dec_mode[path];
728
729 return 0;
730}
731
732static int tx_macro_dec_mode_put(struct snd_kcontrol *kcontrol,
733 struct snd_ctl_elem_value *ucontrol)
734{
735 struct snd_soc_component *component =
736 snd_soc_kcontrol_component(kcontrol);
737 struct tx_macro_priv *tx_priv = NULL;
738 struct device *tx_dev = NULL;
739 int value = ucontrol->value.integer.value[0];
740 int ret = 0;
741 int path = 0;
742
743 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
744 return -EINVAL;
745
746 ret = tx_macro_path_get(kcontrol->id.name, &path);
747 if (ret)
748 return ret;
749
750 tx_priv->dec_mode[path] = value;
751
752 return 0;
753}
754
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700755static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol,
756 struct snd_ctl_elem_value *ucontrol)
757{
758 struct snd_soc_component *component =
759 snd_soc_kcontrol_component(kcontrol);
760 struct tx_macro_priv *tx_priv = NULL;
761 struct device *tx_dev = NULL;
762
763 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
764 return -EINVAL;
765
766 ucontrol->value.integer.value[0] = tx_priv->bcs_enable;
767
768 return 0;
769}
770
771static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol,
772 struct snd_ctl_elem_value *ucontrol)
773{
774 struct snd_soc_component *component =
775 snd_soc_kcontrol_component(kcontrol);
776 struct tx_macro_priv *tx_priv = NULL;
777 struct device *tx_dev = NULL;
778 int value = ucontrol->value.integer.value[0];
779
780 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
781 return -EINVAL;
782
783 tx_priv->bcs_enable = value;
784
785 return 0;
786}
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530787
788static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
789 struct snd_kcontrol *kcontrol, int event)
790{
Meng Wang15c825d2018-09-06 10:49:18 +0800791 struct snd_soc_component *component =
792 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530793 unsigned int dmic = 0;
794 int ret = 0;
795 char *wname = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530796
797 wname = strpbrk(w->name, "01234567");
798 if (!wname) {
Meng Wang15c825d2018-09-06 10:49:18 +0800799 dev_err(component->dev, "%s: widget not found\n", __func__);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530800 return -EINVAL;
801 }
802
803 ret = kstrtouint(wname, 10, &dmic);
804 if (ret < 0) {
Meng Wang15c825d2018-09-06 10:49:18 +0800805 dev_err(component->dev, "%s: Invalid DMIC line on the codec\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530806 __func__);
807 return -EINVAL;
808 }
809
Sudheer Papothid50a5812019-11-21 07:24:42 +0530810 dev_dbg(component->dev, "%s: event %d DMIC%d\n",
811 __func__, event, dmic);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530812
813 switch (event) {
814 case SND_SOC_DAPM_PRE_PMU:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530815 bolero_dmic_clk_enable(component, dmic, DMIC_TX, true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530816 break;
817 case SND_SOC_DAPM_POST_PMD:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530818 bolero_dmic_clk_enable(component, dmic, DMIC_TX, false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530819 break;
820 }
821
822 return 0;
823}
824
825static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
826 struct snd_kcontrol *kcontrol, int event)
827{
Meng Wang15c825d2018-09-06 10:49:18 +0800828 struct snd_soc_component *component =
829 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530830 unsigned int decimator = 0;
831 u16 tx_vol_ctl_reg = 0;
832 u16 dec_cfg_reg = 0;
833 u16 hpf_gate_reg = 0;
834 u16 tx_gain_ctl_reg = 0;
835 u8 hpf_cut_off_freq = 0;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530836 int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS;
837 int unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530838 struct device *tx_dev = NULL;
839 struct tx_macro_priv *tx_priv = NULL;
Meng Wang2825fce2020-01-13 15:17:21 +0800840 u16 adc_mux_reg = 0, adc_reg = 0, adc_n = 0;
841 u16 dmic_clk_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530842
Meng Wang15c825d2018-09-06 10:49:18 +0800843 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530844 return -EINVAL;
845
846 decimator = w->shift;
847
Meng Wang15c825d2018-09-06 10:49:18 +0800848 dev_dbg(component->dev, "%s(): widget = %s decimator = %u\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530849 w->name, decimator);
850
851 tx_vol_ctl_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
852 TX_MACRO_TX_PATH_OFFSET * decimator;
853 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
854 TX_MACRO_TX_PATH_OFFSET * decimator;
855 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
856 TX_MACRO_TX_PATH_OFFSET * decimator;
857 tx_gain_ctl_reg = BOLERO_CDC_TX0_TX_VOL_CTL +
858 TX_MACRO_TX_PATH_OFFSET * decimator;
859
860 switch (event) {
861 case SND_SOC_DAPM_PRE_PMU:
Meng Wang2825fce2020-01-13 15:17:21 +0800862 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
863 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
864 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
865 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
866 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
867 adc_n = snd_soc_component_read32(component, adc_reg) &
868 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
869 if (adc_n >= BOLERO_ADC_MAX) {
870 dmic_clk_reg =
871 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
872 ((adc_n - 5) / 2) * 4;
873 snd_soc_component_update_bits(component,
874 dmic_clk_reg,
875 0x0E, tx_priv->dmic_clk_div << 0x1);
876 }
877 }
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700878 snd_soc_component_update_bits(component,
879 dec_cfg_reg, 0x06, tx_priv->dec_mode[decimator] <<
880 TX_MACRO_ADC_MODE_CFG0_SHIFT);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530881 /* Enable TX PGA Mute */
Meng Wang15c825d2018-09-06 10:49:18 +0800882 snd_soc_component_update_bits(component,
883 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530884 break;
885 case SND_SOC_DAPM_POST_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +0800886 snd_soc_component_update_bits(component,
887 tx_vol_ctl_reg, 0x20, 0x20);
888 snd_soc_component_update_bits(component,
889 hpf_gate_reg, 0x01, 0x00);
Karthikeyan Mani144659b2019-10-02 17:29:57 -0700890 /*
891 * Minimum 1 clk cycle delay is required as per HW spec
892 */
893 usleep_range(1000, 1010);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530894
Meng Wang15c825d2018-09-06 10:49:18 +0800895 hpf_cut_off_freq = (
896 snd_soc_component_read32(component, dec_cfg_reg) &
897 TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
898
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530899 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq =
Meng Wang15c825d2018-09-06 10:49:18 +0800900 hpf_cut_off_freq;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530901
902 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ)
Meng Wang15c825d2018-09-06 10:49:18 +0800903 snd_soc_component_update_bits(component, dec_cfg_reg,
904 TX_HPF_CUT_OFF_FREQ_MASK,
905 CF_MIN_3DB_150HZ << 5);
906
Sudheer Papothi339c4112019-12-13 00:49:16 +0530907 if (is_amic_enabled(component, decimator) < BOLERO_ADC_MAX) {
908 hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS;
909 unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS;
910 }
911 if (tx_unmute_delay < unmute_delay)
912 tx_unmute_delay = unmute_delay;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530913 /* schedule work queue to Remove Mute */
914 schedule_delayed_work(&tx_priv->tx_mute_dwork[decimator].dwork,
915 msecs_to_jiffies(tx_unmute_delay));
916 if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq !=
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530917 CF_MIN_3DB_150HZ) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530918 schedule_delayed_work(
Sudheer Papothi339c4112019-12-13 00:49:16 +0530919 &tx_priv->tx_hpf_work[decimator].dwork,
920 msecs_to_jiffies(hpf_delay));
Meng Wang15c825d2018-09-06 10:49:18 +0800921 snd_soc_component_update_bits(component,
Karthikeyan Mani144659b2019-10-02 17:29:57 -0700922 hpf_gate_reg, 0x03, 0x03);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530923 /*
924 * Minimum 1 clk cycle delay is required as per HW spec
925 */
926 usleep_range(1000, 1010);
Meng Wang15c825d2018-09-06 10:49:18 +0800927 snd_soc_component_update_bits(component,
928 hpf_gate_reg, 0x02, 0x00);
Karthikeyan Mani9366ce62019-11-06 11:43:36 -0800929 snd_soc_component_update_bits(component,
930 hpf_gate_reg, 0x01, 0x01);
931 /*
932 * 6ms delay is required as per HW spec
933 */
934 usleep_range(6000, 6010);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530935 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530936 /* apply gain after decimator is enabled */
Meng Wang15c825d2018-09-06 10:49:18 +0800937 snd_soc_component_write(component, tx_gain_ctl_reg,
938 snd_soc_component_read32(component,
939 tx_gain_ctl_reg));
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700940 if (tx_priv->bcs_enable) {
941 snd_soc_component_update_bits(component, dec_cfg_reg,
942 0x01, 0x01);
Vatsal Buchad06525f2019-10-14 23:14:12 +0530943 tx_priv->bcs_clk_en = true;
944 if (tx_priv->hs_slow_insert_complete)
945 snd_soc_component_update_bits(component,
946 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40,
947 0x40);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700948 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530949 break;
950 case SND_SOC_DAPM_PRE_PMD:
951 hpf_cut_off_freq =
952 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq;
Meng Wang15c825d2018-09-06 10:49:18 +0800953 snd_soc_component_update_bits(component,
954 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530955 if (cancel_delayed_work_sync(
956 &tx_priv->tx_hpf_work[decimator].dwork)) {
957 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
Meng Wang15c825d2018-09-06 10:49:18 +0800958 snd_soc_component_update_bits(
959 component, dec_cfg_reg,
960 TX_HPF_CUT_OFF_FREQ_MASK,
961 hpf_cut_off_freq << 5);
962 snd_soc_component_update_bits(component,
963 hpf_gate_reg,
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530964 0x02, 0x02);
965 /*
966 * Minimum 1 clk cycle delay is required
967 * as per HW spec
968 */
969 usleep_range(1000, 1010);
Meng Wang15c825d2018-09-06 10:49:18 +0800970 snd_soc_component_update_bits(component,
971 hpf_gate_reg,
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530972 0x02, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530973 }
974 }
975 cancel_delayed_work_sync(
976 &tx_priv->tx_mute_dwork[decimator].dwork);
977 break;
978 case SND_SOC_DAPM_POST_PMD:
Meng Wang15c825d2018-09-06 10:49:18 +0800979 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
980 0x20, 0x00);
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700981 snd_soc_component_update_bits(component,
982 dec_cfg_reg, 0x06, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +0800983 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
984 0x10, 0x00);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700985 if (tx_priv->bcs_enable) {
986 snd_soc_component_update_bits(component, dec_cfg_reg,
987 0x01, 0x00);
988 snd_soc_component_update_bits(component,
989 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x00);
Vatsal Buchad06525f2019-10-14 23:14:12 +0530990 tx_priv->bcs_clk_en = false;
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700991 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530992 break;
993 }
994 return 0;
995}
996
997static int tx_macro_enable_micbias(struct snd_soc_dapm_widget *w,
998 struct snd_kcontrol *kcontrol, int event)
999{
1000 return 0;
1001}
1002
1003static int tx_macro_hw_params(struct snd_pcm_substream *substream,
1004 struct snd_pcm_hw_params *params,
1005 struct snd_soc_dai *dai)
1006{
1007 int tx_fs_rate = -EINVAL;
Meng Wang15c825d2018-09-06 10:49:18 +08001008 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301009 u32 decimator = 0;
Laxminath Kasamb7f823c2018-08-02 13:23:11 +05301010 u32 sample_rate = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301011 u16 tx_fs_reg = 0;
1012 struct device *tx_dev = NULL;
1013 struct tx_macro_priv *tx_priv = NULL;
1014
Meng Wang15c825d2018-09-06 10:49:18 +08001015 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301016 return -EINVAL;
1017
1018 pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
1019 dai->name, dai->id, params_rate(params),
1020 params_channels(params));
1021
1022 sample_rate = params_rate(params);
1023 switch (sample_rate) {
1024 case 8000:
1025 tx_fs_rate = 0;
1026 break;
1027 case 16000:
1028 tx_fs_rate = 1;
1029 break;
1030 case 32000:
1031 tx_fs_rate = 3;
1032 break;
1033 case 48000:
1034 tx_fs_rate = 4;
1035 break;
1036 case 96000:
1037 tx_fs_rate = 5;
1038 break;
1039 case 192000:
1040 tx_fs_rate = 6;
1041 break;
1042 case 384000:
1043 tx_fs_rate = 7;
1044 break;
1045 default:
Meng Wang15c825d2018-09-06 10:49:18 +08001046 dev_err(component->dev, "%s: Invalid TX sample rate: %d\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301047 __func__, params_rate(params));
1048 return -EINVAL;
1049 }
1050 for_each_set_bit(decimator, &tx_priv->active_ch_mask[dai->id],
1051 TX_MACRO_DEC_MAX) {
1052 if (decimator >= 0) {
1053 tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
1054 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +08001055 dev_dbg(component->dev, "%s: set DEC%u rate to %u\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301056 __func__, decimator, sample_rate);
Meng Wang15c825d2018-09-06 10:49:18 +08001057 snd_soc_component_update_bits(component, tx_fs_reg,
1058 0x0F, tx_fs_rate);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301059 } else {
Meng Wang15c825d2018-09-06 10:49:18 +08001060 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301061 "%s: ERROR: Invalid decimator: %d\n",
1062 __func__, decimator);
1063 return -EINVAL;
1064 }
1065 }
1066 return 0;
1067}
1068
1069static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
1070 unsigned int *tx_num, unsigned int *tx_slot,
1071 unsigned int *rx_num, unsigned int *rx_slot)
1072{
Meng Wang15c825d2018-09-06 10:49:18 +08001073 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301074 struct device *tx_dev = NULL;
1075 struct tx_macro_priv *tx_priv = NULL;
1076
Meng Wang15c825d2018-09-06 10:49:18 +08001077 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301078 return -EINVAL;
1079
1080 switch (dai->id) {
1081 case TX_MACRO_AIF1_CAP:
1082 case TX_MACRO_AIF2_CAP:
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001083 case TX_MACRO_AIF3_CAP:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301084 *tx_slot = tx_priv->active_ch_mask[dai->id];
1085 *tx_num = tx_priv->active_ch_cnt[dai->id];
1086 break;
1087 default:
1088 dev_err(tx_dev, "%s: Invalid AIF\n", __func__);
1089 break;
1090 }
1091 return 0;
1092}
1093
1094static struct snd_soc_dai_ops tx_macro_dai_ops = {
1095 .hw_params = tx_macro_hw_params,
1096 .get_channel_map = tx_macro_get_channel_map,
1097};
1098
1099static struct snd_soc_dai_driver tx_macro_dai[] = {
1100 {
1101 .name = "tx_macro_tx1",
1102 .id = TX_MACRO_AIF1_CAP,
1103 .capture = {
1104 .stream_name = "TX_AIF1 Capture",
1105 .rates = TX_MACRO_RATES,
1106 .formats = TX_MACRO_FORMATS,
1107 .rate_max = 192000,
1108 .rate_min = 8000,
1109 .channels_min = 1,
1110 .channels_max = 8,
1111 },
1112 .ops = &tx_macro_dai_ops,
1113 },
1114 {
1115 .name = "tx_macro_tx2",
1116 .id = TX_MACRO_AIF2_CAP,
1117 .capture = {
1118 .stream_name = "TX_AIF2 Capture",
1119 .rates = TX_MACRO_RATES,
1120 .formats = TX_MACRO_FORMATS,
1121 .rate_max = 192000,
1122 .rate_min = 8000,
1123 .channels_min = 1,
1124 .channels_max = 8,
1125 },
1126 .ops = &tx_macro_dai_ops,
1127 },
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001128 {
1129 .name = "tx_macro_tx3",
1130 .id = TX_MACRO_AIF3_CAP,
1131 .capture = {
1132 .stream_name = "TX_AIF3 Capture",
1133 .rates = TX_MACRO_RATES,
1134 .formats = TX_MACRO_FORMATS,
1135 .rate_max = 192000,
1136 .rate_min = 8000,
1137 .channels_min = 1,
1138 .channels_max = 8,
1139 },
1140 .ops = &tx_macro_dai_ops,
1141 },
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301142};
1143
1144#define STRING(name) #name
1145#define TX_MACRO_DAPM_ENUM(name, reg, offset, text) \
1146static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1147static const struct snd_kcontrol_new name##_mux = \
1148 SOC_DAPM_ENUM(STRING(name), name##_enum)
1149
1150#define TX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \
1151static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1152static const struct snd_kcontrol_new name##_mux = \
1153 SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname)
1154
1155#define TX_MACRO_DAPM_MUX(name, shift, kctl) \
1156 SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux)
1157
1158static const char * const adc_mux_text[] = {
1159 "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1"
1160};
1161
1162TX_MACRO_DAPM_ENUM(tx_dec0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1,
1163 0, adc_mux_text);
1164TX_MACRO_DAPM_ENUM(tx_dec1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1,
1165 0, adc_mux_text);
1166TX_MACRO_DAPM_ENUM(tx_dec2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1,
1167 0, adc_mux_text);
1168TX_MACRO_DAPM_ENUM(tx_dec3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1,
1169 0, adc_mux_text);
1170TX_MACRO_DAPM_ENUM(tx_dec4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1,
1171 0, adc_mux_text);
1172TX_MACRO_DAPM_ENUM(tx_dec5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1,
1173 0, adc_mux_text);
1174TX_MACRO_DAPM_ENUM(tx_dec6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1,
1175 0, adc_mux_text);
1176TX_MACRO_DAPM_ENUM(tx_dec7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1,
1177 0, adc_mux_text);
1178
1179
1180static const char * const dmic_mux_text[] = {
1181 "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3",
1182 "DMIC4", "DMIC5", "DMIC6", "DMIC7"
1183};
1184
1185TX_MACRO_DAPM_ENUM_EXT(tx_dmic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1186 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1187 tx_macro_put_dec_enum);
1188
1189TX_MACRO_DAPM_ENUM_EXT(tx_dmic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1190 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1191 tx_macro_put_dec_enum);
1192
1193TX_MACRO_DAPM_ENUM_EXT(tx_dmic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1194 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1195 tx_macro_put_dec_enum);
1196
1197TX_MACRO_DAPM_ENUM_EXT(tx_dmic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1198 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1199 tx_macro_put_dec_enum);
1200
1201TX_MACRO_DAPM_ENUM_EXT(tx_dmic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_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_dmic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_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_dmic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_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_dmic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1214 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1215 tx_macro_put_dec_enum);
1216
1217static const char * const smic_mux_text[] = {
Sudheer Papothi324b4952019-06-11 04:14:51 +05301218 "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", "SWR_DMIC0",
1219 "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", "SWR_DMIC4",
1220 "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7"
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301221};
1222
1223TX_MACRO_DAPM_ENUM_EXT(tx_smic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1224 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1225 tx_macro_put_dec_enum);
1226
1227TX_MACRO_DAPM_ENUM_EXT(tx_smic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1228 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1229 tx_macro_put_dec_enum);
1230
1231TX_MACRO_DAPM_ENUM_EXT(tx_smic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1232 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1233 tx_macro_put_dec_enum);
1234
1235TX_MACRO_DAPM_ENUM_EXT(tx_smic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1236 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1237 tx_macro_put_dec_enum);
1238
1239TX_MACRO_DAPM_ENUM_EXT(tx_smic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_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_smic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_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_smic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_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_smic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1252 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1253 tx_macro_put_dec_enum);
1254
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301255static const char * const smic_mux_text_v2[] = {
1256 "ZERO", "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3",
1257 "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7",
1258 "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11"
1259};
1260
1261TX_MACRO_DAPM_ENUM_EXT(tx_smic0_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1262 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1263 tx_macro_put_dec_enum);
1264
1265TX_MACRO_DAPM_ENUM_EXT(tx_smic1_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1266 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1267 tx_macro_put_dec_enum);
1268
1269TX_MACRO_DAPM_ENUM_EXT(tx_smic2_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1270 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1271 tx_macro_put_dec_enum);
1272
1273TX_MACRO_DAPM_ENUM_EXT(tx_smic3_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1274 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1275 tx_macro_put_dec_enum);
1276
1277TX_MACRO_DAPM_ENUM_EXT(tx_smic4_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_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_smic5_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_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_smic6_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_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_smic7_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1290 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1291 tx_macro_put_dec_enum);
1292
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07001293static const char * const dec_mode_mux_text[] = {
1294 "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF",
1295};
1296
1297static const struct soc_enum dec_mode_mux_enum =
1298 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dec_mode_mux_text),
1299 dec_mode_mux_text);
1300
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301301static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = {
1302 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1303 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1304 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1305 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1306 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1307 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1308 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1309 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1310 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1311 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1312 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1313 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1314 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1315 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1316 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1317 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1318};
1319
1320static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = {
1321 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1322 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1323 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1324 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1325 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1326 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1327 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1328 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1329 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1330 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1331 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1332 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1333 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1334 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1335 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1336 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1337};
1338
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001339static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = {
1340 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1341 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1342 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1343 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1344 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1345 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1346 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1347 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1348 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1349 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1350 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1351 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1352 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1353 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1354 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1355 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1356};
1357
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301358static const struct snd_kcontrol_new tx_aif1_cap_mixer_v2[] = {
1359 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1360 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1361 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1362 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1363 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1364 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1365 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1366 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1367};
1368
1369static const struct snd_kcontrol_new tx_aif2_cap_mixer_v2[] = {
1370 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1371 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1372 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1373 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1374 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1375 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1376 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1377 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1378};
1379
1380static const struct snd_kcontrol_new tx_aif3_cap_mixer_v2[] = {
1381 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1382 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1383 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1384 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1385 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1386 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1387 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1388 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1389};
1390
1391static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_common[] = {
1392 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1393 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1394
1395 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1396 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1397
1398 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1399 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1400
1401 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1402 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1403 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1404 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1405
1406 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0_v2),
1407 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1_v2),
1408 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2_v2),
1409 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3_v2),
1410
1411 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1412 tx_macro_enable_micbias,
1413 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1414 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1415 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1416 SND_SOC_DAPM_POST_PMD),
1417
1418 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1419 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1420 SND_SOC_DAPM_POST_PMD),
1421
1422 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1423 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1424 SND_SOC_DAPM_POST_PMD),
1425
1426 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1427 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1428 SND_SOC_DAPM_POST_PMD),
1429
1430 SND_SOC_DAPM_ADC_E("TX DMIC4", 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 DMIC5", 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 DMIC6", 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 DMIC7", 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_INPUT("TX SWR_MIC0"),
1447 SND_SOC_DAPM_INPUT("TX SWR_MIC1"),
1448 SND_SOC_DAPM_INPUT("TX SWR_MIC2"),
1449 SND_SOC_DAPM_INPUT("TX SWR_MIC3"),
1450 SND_SOC_DAPM_INPUT("TX SWR_MIC4"),
1451 SND_SOC_DAPM_INPUT("TX SWR_MIC5"),
1452 SND_SOC_DAPM_INPUT("TX SWR_MIC6"),
1453 SND_SOC_DAPM_INPUT("TX SWR_MIC7"),
1454 SND_SOC_DAPM_INPUT("TX SWR_MIC8"),
1455 SND_SOC_DAPM_INPUT("TX SWR_MIC9"),
1456 SND_SOC_DAPM_INPUT("TX SWR_MIC10"),
1457 SND_SOC_DAPM_INPUT("TX SWR_MIC11"),
1458
1459 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
1460 TX_MACRO_DEC0, 0,
1461 &tx_dec0_mux, tx_macro_enable_dec,
1462 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1463 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1464
1465 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
1466 TX_MACRO_DEC1, 0,
1467 &tx_dec1_mux, tx_macro_enable_dec,
1468 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1469 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1470
1471 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
1472 TX_MACRO_DEC2, 0,
1473 &tx_dec2_mux, tx_macro_enable_dec,
1474 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1475 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1476
1477 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
1478 TX_MACRO_DEC3, 0,
1479 &tx_dec3_mux, tx_macro_enable_dec,
1480 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1481 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1482
1483 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1484 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1485};
1486
1487static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v2[] = {
1488 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1489 TX_MACRO_AIF1_CAP, 0,
1490 tx_aif1_cap_mixer_v2, ARRAY_SIZE(tx_aif1_cap_mixer_v2)),
1491
1492 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1493 TX_MACRO_AIF2_CAP, 0,
1494 tx_aif2_cap_mixer_v2, ARRAY_SIZE(tx_aif2_cap_mixer_v2)),
1495
1496 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1497 TX_MACRO_AIF3_CAP, 0,
1498 tx_aif3_cap_mixer_v2, ARRAY_SIZE(tx_aif3_cap_mixer_v2)),
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301499};
1500
1501static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v3[] = {
1502 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1503 TX_MACRO_AIF1_CAP, 0,
1504 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1505
1506 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1507 TX_MACRO_AIF2_CAP, 0,
1508 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1509
1510 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1511 TX_MACRO_AIF3_CAP, 0,
1512 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1513
1514 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1515 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1516 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1517 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1518
1519 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4_v3),
1520 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5_v3),
1521 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6_v3),
1522 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7_v3),
1523
1524 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
1525 TX_MACRO_DEC4, 0,
1526 &tx_dec4_mux, tx_macro_enable_dec,
1527 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1528 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1529
1530 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
1531 TX_MACRO_DEC5, 0,
1532 &tx_dec5_mux, tx_macro_enable_dec,
1533 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1534 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1535
1536 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
1537 TX_MACRO_DEC6, 0,
1538 &tx_dec6_mux, tx_macro_enable_dec,
1539 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1540 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1541
1542 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
1543 TX_MACRO_DEC7, 0,
1544 &tx_dec7_mux, tx_macro_enable_dec,
1545 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1546 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1547
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05301548 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1549 tx_macro_tx_swr_clk_event,
1550 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1551
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301552 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1553 tx_macro_va_swr_clk_event,
1554 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1555};
1556
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301557static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
1558 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1559 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1560
1561 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1562 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1563
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001564 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1565 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1566
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301567 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
1568 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1569
1570 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
1571 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1572
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001573 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0,
1574 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1575
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301576
1577 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1578 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1579 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1580 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1581 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1582 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1583 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1584 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1585
1586 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0),
1587 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1),
1588 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2),
1589 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3),
1590 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4),
1591 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5),
1592 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6),
1593 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7),
1594
1595 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1596 tx_macro_enable_micbias,
1597 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1598 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1599 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1600 SND_SOC_DAPM_POST_PMD),
1601
1602 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1603 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1604 SND_SOC_DAPM_POST_PMD),
1605
1606 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1607 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1608 SND_SOC_DAPM_POST_PMD),
1609
1610 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1611 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1612 SND_SOC_DAPM_POST_PMD),
1613
1614 SND_SOC_DAPM_ADC_E("TX DMIC4", 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 DMIC5", 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 DMIC6", 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 DMIC7", 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_INPUT("TX SWR_ADC0"),
1631 SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
1632 SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
1633 SND_SOC_DAPM_INPUT("TX SWR_ADC3"),
1634 SND_SOC_DAPM_INPUT("TX SWR_DMIC0"),
1635 SND_SOC_DAPM_INPUT("TX SWR_DMIC1"),
1636 SND_SOC_DAPM_INPUT("TX SWR_DMIC2"),
1637 SND_SOC_DAPM_INPUT("TX SWR_DMIC3"),
1638 SND_SOC_DAPM_INPUT("TX SWR_DMIC4"),
1639 SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
1640 SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
1641 SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
1642
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301643 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301644 TX_MACRO_DEC0, 0,
1645 &tx_dec0_mux, tx_macro_enable_dec,
1646 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1647 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1648
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301649 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301650 TX_MACRO_DEC1, 0,
1651 &tx_dec1_mux, tx_macro_enable_dec,
1652 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1653 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1654
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301655 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301656 TX_MACRO_DEC2, 0,
1657 &tx_dec2_mux, tx_macro_enable_dec,
1658 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1659 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1660
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301661 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301662 TX_MACRO_DEC3, 0,
1663 &tx_dec3_mux, tx_macro_enable_dec,
1664 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1665 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1666
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301667 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301668 TX_MACRO_DEC4, 0,
1669 &tx_dec4_mux, tx_macro_enable_dec,
1670 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1671 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1672
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301673 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301674 TX_MACRO_DEC5, 0,
1675 &tx_dec5_mux, tx_macro_enable_dec,
1676 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1677 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1678
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301679 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301680 TX_MACRO_DEC6, 0,
1681 &tx_dec6_mux, tx_macro_enable_dec,
1682 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1683 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1684
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301685 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301686 TX_MACRO_DEC7, 0,
1687 &tx_dec7_mux, tx_macro_enable_dec,
1688 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1689 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1690
1691 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1692 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Sudheer Papothie456c2c2019-03-05 07:08:45 +05301693
1694 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1695 tx_macro_tx_swr_clk_event,
1696 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1697
1698 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1699 tx_macro_va_swr_clk_event,
1700 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301701};
1702
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301703static const struct snd_soc_dapm_route tx_audio_map_common[] = {
1704 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1705 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
1706 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
1707
1708 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1709 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
1710 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
1711
1712 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1713 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1714 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1715 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1716
1717 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1718 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1719 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1720 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1721
1722 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1723 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1724 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1725 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1726
1727 {"TX DEC0 MUX", NULL, "TX_MCLK"},
1728 {"TX DEC1 MUX", NULL, "TX_MCLK"},
1729 {"TX DEC2 MUX", NULL, "TX_MCLK"},
1730 {"TX DEC3 MUX", NULL, "TX_MCLK"},
1731
1732 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
1733 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
1734 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
1735 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
1736 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
1737 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
1738 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
1739 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
1740 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
1741
1742 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
1743 {"TX SMIC MUX0", "SWR_MIC0", "TX SWR_MIC0"},
1744 {"TX SMIC MUX0", "SWR_MIC1", "TX SWR_MIC1"},
1745 {"TX SMIC MUX0", "SWR_MIC2", "TX SWR_MIC2"},
1746 {"TX SMIC MUX0", "SWR_MIC3", "TX SWR_MIC3"},
1747 {"TX SMIC MUX0", "SWR_MIC4", "TX SWR_MIC4"},
1748 {"TX SMIC MUX0", "SWR_MIC5", "TX SWR_MIC5"},
1749 {"TX SMIC MUX0", "SWR_MIC6", "TX SWR_MIC6"},
1750 {"TX SMIC MUX0", "SWR_MIC7", "TX SWR_MIC7"},
1751 {"TX SMIC MUX0", "SWR_MIC8", "TX SWR_MIC8"},
1752 {"TX SMIC MUX0", "SWR_MIC9", "TX SWR_MIC9"},
1753 {"TX SMIC MUX0", "SWR_MIC10", "TX SWR_MIC10"},
1754 {"TX SMIC MUX0", "SWR_MIC11", "TX SWR_MIC11"},
1755
1756 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
1757 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
1758 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
1759 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
1760 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
1761 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
1762 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
1763 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
1764 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
1765
1766 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
1767 {"TX SMIC MUX1", "SWR_MIC0", "TX SWR_MIC0"},
1768 {"TX SMIC MUX1", "SWR_MIC1", "TX SWR_MIC1"},
1769 {"TX SMIC MUX1", "SWR_MIC2", "TX SWR_MIC2"},
1770 {"TX SMIC MUX1", "SWR_MIC3", "TX SWR_MIC3"},
1771 {"TX SMIC MUX1", "SWR_MIC4", "TX SWR_MIC4"},
1772 {"TX SMIC MUX1", "SWR_MIC5", "TX SWR_MIC5"},
1773 {"TX SMIC MUX1", "SWR_MIC6", "TX SWR_MIC6"},
1774 {"TX SMIC MUX1", "SWR_MIC7", "TX SWR_MIC7"},
1775 {"TX SMIC MUX1", "SWR_MIC8", "TX SWR_MIC8"},
1776 {"TX SMIC MUX1", "SWR_MIC9", "TX SWR_MIC9"},
1777 {"TX SMIC MUX1", "SWR_MIC10", "TX SWR_MIC10"},
1778 {"TX SMIC MUX1", "SWR_MIC11", "TX SWR_MIC11"},
1779
1780 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
1781 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
1782 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
1783 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
1784 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
1785 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
1786 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
1787 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
1788 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
1789
1790 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
1791 {"TX SMIC MUX2", "SWR_MIC0", "TX SWR_MIC0"},
1792 {"TX SMIC MUX2", "SWR_MIC1", "TX SWR_MIC1"},
1793 {"TX SMIC MUX2", "SWR_MIC2", "TX SWR_MIC2"},
1794 {"TX SMIC MUX2", "SWR_MIC3", "TX SWR_MIC3"},
1795 {"TX SMIC MUX2", "SWR_MIC4", "TX SWR_MIC4"},
1796 {"TX SMIC MUX2", "SWR_MIC5", "TX SWR_MIC5"},
1797 {"TX SMIC MUX2", "SWR_MIC6", "TX SWR_MIC6"},
1798 {"TX SMIC MUX2", "SWR_MIC7", "TX SWR_MIC7"},
1799 {"TX SMIC MUX2", "SWR_MIC8", "TX SWR_MIC8"},
1800 {"TX SMIC MUX2", "SWR_MIC9", "TX SWR_MIC9"},
1801 {"TX SMIC MUX2", "SWR_MIC10", "TX SWR_MIC10"},
1802 {"TX SMIC MUX2", "SWR_MIC11", "TX SWR_MIC11"},
1803
1804 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
1805 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
1806 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
1807 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
1808 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
1809 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
1810 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
1811 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
1812 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
1813
1814 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
1815 {"TX SMIC MUX3", "SWR_MIC0", "TX SWR_MIC0"},
1816 {"TX SMIC MUX3", "SWR_MIC1", "TX SWR_MIC1"},
1817 {"TX SMIC MUX3", "SWR_MIC2", "TX SWR_MIC2"},
1818 {"TX SMIC MUX3", "SWR_MIC3", "TX SWR_MIC3"},
1819 {"TX SMIC MUX3", "SWR_MIC4", "TX SWR_MIC4"},
1820 {"TX SMIC MUX3", "SWR_MIC5", "TX SWR_MIC5"},
1821 {"TX SMIC MUX3", "SWR_MIC6", "TX SWR_MIC6"},
1822 {"TX SMIC MUX3", "SWR_MIC7", "TX SWR_MIC7"},
1823 {"TX SMIC MUX3", "SWR_MIC8", "TX SWR_MIC8"},
1824 {"TX SMIC MUX3", "SWR_MIC9", "TX SWR_MIC9"},
1825 {"TX SMIC MUX3", "SWR_MIC10", "TX SWR_MIC10"},
1826 {"TX SMIC MUX3", "SWR_MIC11", "TX SWR_MIC11"},
1827};
1828
1829static const struct snd_soc_dapm_route tx_audio_map_v3[] = {
1830 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1831 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1832 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1833 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1834
1835 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1836 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1837 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1838 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1839
1840 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1841 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1842 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1843 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1844
1845 {"TX DEC4 MUX", NULL, "TX_MCLK"},
1846 {"TX DEC5 MUX", NULL, "TX_MCLK"},
1847 {"TX DEC6 MUX", NULL, "TX_MCLK"},
1848 {"TX DEC7 MUX", NULL, "TX_MCLK"},
1849
1850 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
1851 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
1852 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
1853 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
1854 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
1855 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
1856 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
1857 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
1858 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
1859
1860 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
1861 {"TX SMIC MUX4", "SWR_MIC0", "TX SWR_MIC0"},
1862 {"TX SMIC MUX4", "SWR_MIC1", "TX SWR_MIC1"},
1863 {"TX SMIC MUX4", "SWR_MIC2", "TX SWR_MIC2"},
1864 {"TX SMIC MUX4", "SWR_MIC3", "TX SWR_MIC3"},
1865 {"TX SMIC MUX4", "SWR_MIC4", "TX SWR_MIC4"},
1866 {"TX SMIC MUX4", "SWR_MIC5", "TX SWR_MIC5"},
1867 {"TX SMIC MUX4", "SWR_MIC6", "TX SWR_MIC6"},
1868 {"TX SMIC MUX4", "SWR_MIC7", "TX SWR_MIC7"},
1869 {"TX SMIC MUX4", "SWR_MIC8", "TX SWR_MIC8"},
1870 {"TX SMIC MUX4", "SWR_MIC9", "TX SWR_MIC9"},
1871 {"TX SMIC MUX4", "SWR_MIC10", "TX SWR_MIC10"},
1872 {"TX SMIC MUX4", "SWR_MIC11", "TX SWR_MIC11"},
1873
1874 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
1875 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
1876 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
1877 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
1878 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
1879 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
1880 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
1881 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
1882 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
1883
1884 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
1885 {"TX SMIC MUX5", "SWR_MIC0", "TX SWR_MIC0"},
1886 {"TX SMIC MUX5", "SWR_MIC1", "TX SWR_MIC1"},
1887 {"TX SMIC MUX5", "SWR_MIC2", "TX SWR_MIC2"},
1888 {"TX SMIC MUX5", "SWR_MIC3", "TX SWR_MIC3"},
1889 {"TX SMIC MUX5", "SWR_MIC4", "TX SWR_MIC4"},
1890 {"TX SMIC MUX5", "SWR_MIC5", "TX SWR_MIC5"},
1891 {"TX SMIC MUX5", "SWR_MIC6", "TX SWR_MIC6"},
1892 {"TX SMIC MUX5", "SWR_MIC7", "TX SWR_MIC7"},
1893 {"TX SMIC MUX5", "SWR_MIC8", "TX SWR_MIC8"},
1894 {"TX SMIC MUX5", "SWR_MIC9", "TX SWR_MIC9"},
1895 {"TX SMIC MUX5", "SWR_MIC10", "TX SWR_MIC10"},
1896 {"TX SMIC MUX5", "SWR_MIC11", "TX SWR_MIC11"},
1897
1898 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
1899 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
1900 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
1901 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
1902 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
1903 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
1904 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
1905 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
1906 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
1907
1908 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
1909 {"TX SMIC MUX6", "SWR_MIC0", "TX SWR_MIC0"},
1910 {"TX SMIC MUX6", "SWR_MIC1", "TX SWR_MIC1"},
1911 {"TX SMIC MUX6", "SWR_MIC2", "TX SWR_MIC2"},
1912 {"TX SMIC MUX6", "SWR_MIC3", "TX SWR_MIC3"},
1913 {"TX SMIC MUX6", "SWR_MIC4", "TX SWR_MIC4"},
1914 {"TX SMIC MUX6", "SWR_MIC5", "TX SWR_MIC5"},
1915 {"TX SMIC MUX6", "SWR_MIC6", "TX SWR_MIC6"},
1916 {"TX SMIC MUX6", "SWR_MIC7", "TX SWR_MIC7"},
1917 {"TX SMIC MUX6", "SWR_MIC8", "TX SWR_MIC8"},
1918 {"TX SMIC MUX6", "SWR_MIC9", "TX SWR_MIC9"},
1919 {"TX SMIC MUX6", "SWR_MIC10", "TX SWR_MIC10"},
1920 {"TX SMIC MUX6", "SWR_MIC11", "TX SWR_MIC11"},
1921
1922 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
1923 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
1924 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
1925 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
1926 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
1927 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
1928 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
1929 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
1930 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
1931
1932 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
1933 {"TX SMIC MUX7", "SWR_MIC0", "TX SWR_MIC0"},
1934 {"TX SMIC MUX7", "SWR_MIC1", "TX SWR_MIC1"},
1935 {"TX SMIC MUX7", "SWR_MIC2", "TX SWR_MIC2"},
1936 {"TX SMIC MUX7", "SWR_MIC3", "TX SWR_MIC3"},
1937 {"TX SMIC MUX7", "SWR_MIC4", "TX SWR_MIC4"},
1938 {"TX SMIC MUX7", "SWR_MIC5", "TX SWR_MIC5"},
1939 {"TX SMIC MUX7", "SWR_MIC6", "TX SWR_MIC6"},
1940 {"TX SMIC MUX7", "SWR_MIC7", "TX SWR_MIC7"},
1941 {"TX SMIC MUX7", "SWR_MIC8", "TX SWR_MIC8"},
1942 {"TX SMIC MUX7", "SWR_MIC9", "TX SWR_MIC9"},
1943 {"TX SMIC MUX7", "SWR_MIC10", "TX SWR_MIC10"},
1944 {"TX SMIC MUX7", "SWR_MIC11", "TX SWR_MIC11"},
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05301945
1946 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
1947 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
1948 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
1949 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
1950 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
1951 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
1952 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
1953 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301954};
1955
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301956static const struct snd_soc_dapm_route tx_audio_map[] = {
1957 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1958 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001959 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301960
1961 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1962 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001963 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301964
1965 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1966 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1967 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1968 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1969 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1970 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1971 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1972 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1973
1974 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1975 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1976 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1977 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1978 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1979 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1980 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1981 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1982
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001983 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1984 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1985 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1986 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1987 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1988 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1989 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1990 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1991
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05301992 {"TX DEC0 MUX", NULL, "TX_MCLK"},
1993 {"TX DEC1 MUX", NULL, "TX_MCLK"},
1994 {"TX DEC2 MUX", NULL, "TX_MCLK"},
1995 {"TX DEC3 MUX", NULL, "TX_MCLK"},
1996 {"TX DEC4 MUX", NULL, "TX_MCLK"},
1997 {"TX DEC5 MUX", NULL, "TX_MCLK"},
1998 {"TX DEC6 MUX", NULL, "TX_MCLK"},
1999 {"TX DEC7 MUX", NULL, "TX_MCLK"},
2000
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302001 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
2002 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
2003 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
2004 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
2005 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
2006 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
2007 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
2008 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
2009 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
2010
2011 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302012 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302013 {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
2014 {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"},
2015 {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"},
2016 {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"},
2017 {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"},
2018 {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"},
2019 {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"},
2020 {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"},
2021 {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"},
2022 {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"},
2023 {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
2024 {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
2025
2026 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
2027 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
2028 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
2029 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
2030 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
2031 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
2032 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
2033 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
2034 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
2035
2036 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302037 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302038 {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
2039 {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"},
2040 {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"},
2041 {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"},
2042 {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"},
2043 {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"},
2044 {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"},
2045 {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"},
2046 {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"},
2047 {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"},
2048 {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
2049 {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
2050
2051 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
2052 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
2053 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
2054 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
2055 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
2056 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
2057 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
2058 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
2059 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
2060
2061 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302062 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302063 {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
2064 {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"},
2065 {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"},
2066 {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"},
2067 {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"},
2068 {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"},
2069 {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"},
2070 {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"},
2071 {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"},
2072 {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"},
2073 {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
2074 {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
2075
2076 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
2077 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
2078 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
2079 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
2080 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
2081 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
2082 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
2083 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
2084 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
2085
2086 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302087 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302088 {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
2089 {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"},
2090 {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"},
2091 {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"},
2092 {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"},
2093 {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"},
2094 {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"},
2095 {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"},
2096 {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"},
2097 {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"},
2098 {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
2099 {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
2100
2101 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
2102 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
2103 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
2104 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
2105 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
2106 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
2107 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
2108 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
2109 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
2110
2111 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302112 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302113 {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
2114 {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"},
2115 {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"},
2116 {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"},
2117 {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"},
2118 {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"},
2119 {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"},
2120 {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"},
2121 {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"},
2122 {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"},
2123 {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
2124 {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
2125
2126 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
2127 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
2128 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
2129 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
2130 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
2131 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
2132 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
2133 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
2134 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
2135
2136 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302137 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302138 {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
2139 {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"},
2140 {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"},
2141 {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"},
2142 {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"},
2143 {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"},
2144 {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"},
2145 {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"},
2146 {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"},
2147 {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"},
2148 {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
2149 {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
2150
2151 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
2152 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
2153 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
2154 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
2155 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
2156 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
2157 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
2158 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
2159 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
2160
2161 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302162 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302163 {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
2164 {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"},
2165 {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"},
2166 {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"},
2167 {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"},
2168 {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"},
2169 {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"},
2170 {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"},
2171 {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"},
2172 {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"},
2173 {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
2174 {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
2175
2176 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
2177 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
2178 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
2179 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
2180 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
2181 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
2182 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
2183 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
2184 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
2185
2186 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302187 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302188 {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},
2189 {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"},
2190 {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"},
2191 {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"},
2192 {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"},
2193 {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"},
2194 {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"},
2195 {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"},
2196 {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"},
2197 {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"},
2198 {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"},
2199 {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"},
2200};
2201
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302202static const struct snd_kcontrol_new tx_macro_snd_controls_common[] = {
2203 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2204 BOLERO_CDC_TX0_TX_VOL_CTL,
2205 0, -84, 40, digital_gain),
2206 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2207 BOLERO_CDC_TX1_TX_VOL_CTL,
2208 0, -84, 40, digital_gain),
2209 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2210 BOLERO_CDC_TX2_TX_VOL_CTL,
2211 0, -84, 40, digital_gain),
2212 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2213 BOLERO_CDC_TX3_TX_VOL_CTL,
2214 0, -84, 40, digital_gain),
2215
2216 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2217 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2218
2219 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2220 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2221
2222 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2223 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2224
2225 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2226 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2227
2228 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2229 tx_macro_get_bcs, tx_macro_set_bcs),
2230};
2231
2232static const struct snd_kcontrol_new tx_macro_snd_controls_v3[] = {
2233 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2234 BOLERO_CDC_TX4_TX_VOL_CTL,
2235 0, -84, 40, digital_gain),
2236 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2237 BOLERO_CDC_TX5_TX_VOL_CTL,
2238 0, -84, 40, digital_gain),
2239 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2240 BOLERO_CDC_TX6_TX_VOL_CTL,
2241 0, -84, 40, digital_gain),
2242 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2243 BOLERO_CDC_TX7_TX_VOL_CTL,
2244 0, -84, 40, digital_gain),
2245
2246 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2247 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2248
2249 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2250 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2251
2252 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2253 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2254
2255 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2256 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2257};
2258
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302259static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
2260 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2261 BOLERO_CDC_TX0_TX_VOL_CTL,
2262 0, -84, 40, digital_gain),
2263 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2264 BOLERO_CDC_TX1_TX_VOL_CTL,
2265 0, -84, 40, digital_gain),
2266 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2267 BOLERO_CDC_TX2_TX_VOL_CTL,
2268 0, -84, 40, digital_gain),
2269 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2270 BOLERO_CDC_TX3_TX_VOL_CTL,
2271 0, -84, 40, digital_gain),
2272 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2273 BOLERO_CDC_TX4_TX_VOL_CTL,
2274 0, -84, 40, digital_gain),
2275 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2276 BOLERO_CDC_TX5_TX_VOL_CTL,
2277 0, -84, 40, digital_gain),
2278 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2279 BOLERO_CDC_TX6_TX_VOL_CTL,
2280 0, -84, 40, digital_gain),
2281 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2282 BOLERO_CDC_TX7_TX_VOL_CTL,
2283 0, -84, 40, digital_gain),
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002284
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07002285 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2286 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2287
2288 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2289 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2290
2291 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2292 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2293
2294 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2295 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2296
2297 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2298 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2299
2300 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2301 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2302
2303 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2304 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2305
2306 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2307 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2308
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002309 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2310 tx_macro_get_bcs, tx_macro_set_bcs),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302311};
2312
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302313static int tx_macro_register_event_listener(struct snd_soc_component *component,
2314 bool enable)
2315{
2316 struct device *tx_dev = NULL;
2317 struct tx_macro_priv *tx_priv = NULL;
2318 int ret = 0;
2319
2320 if (!component)
2321 return -EINVAL;
2322
2323 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2324 if (!tx_dev) {
2325 dev_err(component->dev,
2326 "%s: null device for macro!\n", __func__);
2327 return -EINVAL;
2328 }
2329 tx_priv = dev_get_drvdata(tx_dev);
2330 if (!tx_priv) {
2331 dev_err(component->dev,
2332 "%s: priv is null for macro!\n", __func__);
2333 return -EINVAL;
2334 }
Sudheer Papothifc3adb02019-11-24 10:14:21 +05302335 if (tx_priv->swr_ctrl_data && !tx_priv->tx_swr_clk_cnt) {
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302336 if (enable) {
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302337 ret = swrm_wcd_notify(
2338 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
2339 SWR_REGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302340 msm_cdc_pinctrl_set_wakeup_capable(
2341 tx_priv->tx_swr_gpio_p, false);
2342 } else {
2343 msm_cdc_pinctrl_set_wakeup_capable(
2344 tx_priv->tx_swr_gpio_p, true);
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302345 ret = swrm_wcd_notify(
2346 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
2347 SWR_DEREGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302348 }
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302349 }
2350
2351 return ret;
2352}
2353
Sudheer Papothia7397942019-03-19 03:14:23 +05302354static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
2355 struct regmap *regmap, int clk_type,
2356 bool enable)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302357{
Meng Wang69b55c82019-05-29 11:04:29 +08002358 int ret = 0, clk_tx_ret = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302359
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002360 trace_printk("%s: clock type %s, enable: %s tx_mclk_users: %d\n",
2361 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
2362 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302363 dev_dbg(tx_priv->dev,
2364 "%s: clock type %s, enable: %s tx_mclk_users: %d\n",
Sudheer Papothia7397942019-03-19 03:14:23 +05302365 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302366 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Tanya Dixit8530fb92018-09-14 16:01:25 +05302367
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302368 if (enable) {
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002369 if (tx_priv->swr_clk_users == 0) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002370 trace_printk("%s: tx swr clk users 0\n", __func__);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002371 ret = msm_cdc_pinctrl_select_active_state(
Karthikeyan Mani01f1ba42019-02-26 18:48:15 -08002372 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002373 if (ret < 0) {
2374 dev_err_ratelimited(tx_priv->dev,
2375 "%s: tx swr pinctrl enable failed\n",
2376 __func__);
2377 goto exit;
2378 }
2379 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302380
Meng Wang69b55c82019-05-29 11:04:29 +08002381 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302382 TX_CORE_CLK,
2383 TX_CORE_CLK,
2384 true);
2385 if (clk_type == TX_MCLK) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002386 trace_printk("%s: requesting TX_MCLK\n", __func__);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302387 ret = tx_macro_mclk_enable(tx_priv, 1);
2388 if (ret < 0) {
2389 if (tx_priv->swr_clk_users == 0)
2390 msm_cdc_pinctrl_select_sleep_state(
2391 tx_priv->tx_swr_gpio_p);
2392 dev_err_ratelimited(tx_priv->dev,
2393 "%s: request clock enable failed\n",
2394 __func__);
2395 goto done;
2396 }
2397 }
2398 if (clk_type == VA_MCLK) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002399 trace_printk("%s: requesting VA_MCLK\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302400 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2401 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302402 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302403 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302404 if (ret < 0) {
2405 if (tx_priv->swr_clk_users == 0)
Sudheer Papothia7397942019-03-19 03:14:23 +05302406 msm_cdc_pinctrl_select_sleep_state(
2407 tx_priv->tx_swr_gpio_p);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302408 dev_err_ratelimited(tx_priv->dev,
2409 "%s: swr request clk failed\n",
2410 __func__);
2411 goto done;
Sudheer Papothia7397942019-03-19 03:14:23 +05302412 }
Sudheer Papothi296867b2019-06-20 09:24:09 +05302413 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
2414 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302415 if (tx_priv->tx_mclk_users == 0) {
2416 regmap_update_bits(regmap,
2417 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK,
2418 0x01, 0x01);
2419 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002420 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302421 0x01, 0x01);
2422 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002423 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302424 0x01, 0x01);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302425 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002426 tx_priv->tx_mclk_users++;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302427 }
2428 if (tx_priv->swr_clk_users == 0) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302429 dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n",
2430 __func__, tx_priv->reset_swr);
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002431 trace_printk("%s: reset_swr: %d\n",
2432 __func__, tx_priv->reset_swr);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302433 if (tx_priv->reset_swr)
2434 regmap_update_bits(regmap,
2435 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2436 0x02, 0x02);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302437 regmap_update_bits(regmap,
2438 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2439 0x01, 0x01);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302440 if (tx_priv->reset_swr)
2441 regmap_update_bits(regmap,
2442 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2443 0x02, 0x00);
2444 tx_priv->reset_swr = false;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302445 }
Meng Wang69b55c82019-05-29 11:04:29 +08002446 if (!clk_tx_ret)
2447 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302448 TX_CORE_CLK,
2449 TX_CORE_CLK,
2450 false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302451 tx_priv->swr_clk_users++;
2452 } else {
2453 if (tx_priv->swr_clk_users <= 0) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302454 dev_err_ratelimited(tx_priv->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302455 "tx swrm clock users already 0\n");
2456 tx_priv->swr_clk_users = 0;
Sudheer Papothia7397942019-03-19 03:14:23 +05302457 return 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302458 }
Meng Wang69b55c82019-05-29 11:04:29 +08002459 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302460 TX_CORE_CLK,
2461 TX_CORE_CLK,
2462 true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302463 tx_priv->swr_clk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302464 if (tx_priv->swr_clk_users == 0)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302465 regmap_update_bits(regmap,
2466 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2467 0x01, 0x00);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302468 if (clk_type == TX_MCLK)
2469 tx_macro_mclk_enable(tx_priv, 0);
2470 if (clk_type == VA_MCLK) {
Meng Wang52a8fb12019-12-12 20:36:05 +08002471 if (tx_priv->tx_mclk_users <= 0) {
2472 dev_err(tx_priv->dev, "%s: clock already disabled\n",
2473 __func__);
2474 tx_priv->tx_mclk_users = 0;
2475 goto tx_clk;
2476 }
2477 tx_priv->tx_mclk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302478 if (tx_priv->tx_mclk_users == 0) {
2479 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002480 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302481 0x01, 0x00);
2482 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002483 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302484 0x01, 0x00);
Sudheer Papothia7397942019-03-19 03:14:23 +05302485 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002486
Sudheer Papothi296867b2019-06-20 09:24:09 +05302487 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
Meng Wang52a8fb12019-12-12 20:36:05 +08002488 false);
Sudheer Papothia7397942019-03-19 03:14:23 +05302489 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2490 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302491 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302492 false);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302493 if (ret < 0) {
2494 dev_err_ratelimited(tx_priv->dev,
2495 "%s: swr request clk failed\n",
2496 __func__);
2497 goto done;
2498 }
2499 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002500tx_clk:
Meng Wang69b55c82019-05-29 11:04:29 +08002501 if (!clk_tx_ret)
2502 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302503 TX_CORE_CLK,
2504 TX_CORE_CLK,
2505 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002506 if (tx_priv->swr_clk_users == 0) {
2507 ret = msm_cdc_pinctrl_select_sleep_state(
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302508 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002509 if (ret < 0) {
2510 dev_err_ratelimited(tx_priv->dev,
2511 "%s: tx swr pinctrl disable failed\n",
2512 __func__);
2513 goto exit;
2514 }
2515 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302516 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302517 return 0;
2518
2519done:
Meng Wang69b55c82019-05-29 11:04:29 +08002520 if (!clk_tx_ret)
2521 bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothia7397942019-03-19 03:14:23 +05302522 TX_CORE_CLK,
2523 TX_CORE_CLK,
2524 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002525exit:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002526 trace_printk("%s: exit\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302527 return ret;
2528}
2529
Sudheer Papothid50a5812019-11-21 07:24:42 +05302530static int tx_macro_clk_div_get(struct snd_soc_component *component)
2531{
2532 struct device *tx_dev = NULL;
2533 struct tx_macro_priv *tx_priv = NULL;
2534
2535 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
2536 return -EINVAL;
2537
2538 return tx_priv->dmic_clk_div;
2539}
2540
Sudheer Papothif4155002019-12-05 01:36:13 +05302541static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src)
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302542{
2543 struct device *tx_dev = NULL;
2544 struct tx_macro_priv *tx_priv = NULL;
2545 int ret = 0;
2546
2547 if (!component)
2548 return -EINVAL;
2549
2550 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2551 if (!tx_dev) {
2552 dev_err(component->dev,
2553 "%s: null device for macro!\n", __func__);
2554 return -EINVAL;
2555 }
2556 tx_priv = dev_get_drvdata(tx_dev);
2557 if (!tx_priv) {
2558 dev_err(component->dev,
2559 "%s: priv is null for macro!\n", __func__);
2560 return -EINVAL;
2561 }
2562 if (tx_priv->swr_ctrl_data) {
2563 ret = swrm_wcd_notify(
2564 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Sudheer Papothif4155002019-12-05 01:36:13 +05302565 SWR_REQ_CLK_SWITCH, &clk_src);
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302566 }
2567
2568 return ret;
2569}
2570
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002571static int tx_macro_core_vote(void *handle, bool enable)
2572{
2573 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002574
2575 if (tx_priv == NULL) {
2576 pr_err("%s: tx priv data is NULL\n", __func__);
2577 return -EINVAL;
2578 }
2579 if (enable) {
2580 pm_runtime_get_sync(tx_priv->dev);
2581 pm_runtime_put_autosuspend(tx_priv->dev);
2582 pm_runtime_mark_last_busy(tx_priv->dev);
2583 }
2584
Aditya Bavanarid577af92019-10-03 21:09:19 +05302585 if (bolero_check_core_votes(tx_priv->dev))
2586 return 0;
2587 else
2588 return -EINVAL;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002589}
2590
Sudheer Papothia7397942019-03-19 03:14:23 +05302591static int tx_macro_swrm_clock(void *handle, bool enable)
2592{
2593 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
2594 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
2595 int ret = 0;
2596
2597 if (regmap == NULL) {
2598 dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__);
2599 return -EINVAL;
2600 }
2601
2602 mutex_lock(&tx_priv->swr_clk_lock);
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002603 trace_printk("%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2604 __func__,
2605 (enable ? "enable" : "disable"),
2606 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302607 dev_dbg(tx_priv->dev,
2608 "%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2609 __func__, (enable ? "enable" : "disable"),
2610 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothia7397942019-03-19 03:14:23 +05302611
2612 if (enable) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302613 pm_runtime_get_sync(tx_priv->dev);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302614 if (tx_priv->va_swr_clk_cnt && !tx_priv->tx_swr_clk_cnt) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302615 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2616 VA_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002617 if (ret) {
2618 pm_runtime_mark_last_busy(tx_priv->dev);
2619 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302620 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002621 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302622 tx_priv->va_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302623 } else {
Sudheer Papothia7397942019-03-19 03:14:23 +05302624 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2625 TX_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002626 if (ret) {
2627 pm_runtime_mark_last_busy(tx_priv->dev);
2628 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302629 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002630 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302631 tx_priv->tx_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302632 }
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302633 pm_runtime_mark_last_busy(tx_priv->dev);
2634 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302635 } else {
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302636 if (tx_priv->va_clk_status && !tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302637 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2638 VA_MCLK, enable);
2639 if (ret)
2640 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302641 --tx_priv->va_clk_status;
2642 } else if (!tx_priv->va_clk_status && tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302643 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2644 TX_MCLK, enable);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302645 if (ret)
2646 goto done;
2647 --tx_priv->tx_clk_status;
2648 } else if (tx_priv->va_clk_status && tx_priv->tx_clk_status) {
2649 if (!tx_priv->va_swr_clk_cnt && tx_priv->tx_swr_clk_cnt) {
2650 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2651 VA_MCLK, enable);
Sudheer Papothia7397942019-03-19 03:14:23 +05302652 if (ret)
2653 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302654 --tx_priv->va_clk_status;
2655 } else {
2656 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2657 TX_MCLK, enable);
2658 if (ret)
2659 goto done;
2660 --tx_priv->tx_clk_status;
Sudheer Papothia7397942019-03-19 03:14:23 +05302661 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302662
2663 } else {
2664 dev_dbg(tx_priv->dev,
2665 "%s: Both clocks are disabled\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302666 }
2667 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302668
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002669 trace_printk("%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2670 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2671 tx_priv->va_clk_status);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302672 dev_dbg(tx_priv->dev,
2673 "%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2674 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2675 tx_priv->va_clk_status);
Sudheer Papothia7397942019-03-19 03:14:23 +05302676done:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302677 mutex_unlock(&tx_priv->swr_clk_lock);
2678 return ret;
2679}
2680
2681static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate,
2682 struct tx_macro_priv *tx_priv)
2683{
2684 u32 div_factor = TX_MACRO_CLK_DIV_2;
2685 u32 mclk_rate = TX_MACRO_MCLK_FREQ;
2686
2687 if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED ||
2688 mclk_rate % dmic_sample_rate != 0)
2689 goto undefined_rate;
2690
2691 div_factor = mclk_rate / dmic_sample_rate;
2692
2693 switch (div_factor) {
2694 case 2:
2695 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
2696 break;
2697 case 3:
2698 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_3;
2699 break;
2700 case 4:
2701 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_4;
2702 break;
2703 case 6:
2704 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_6;
2705 break;
2706 case 8:
2707 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_8;
2708 break;
2709 case 16:
2710 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_16;
2711 break;
2712 default:
2713 /* Any other DIV factor is invalid */
2714 goto undefined_rate;
2715 }
2716
2717 /* Valid dmic DIV factors */
2718 dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n",
2719 __func__, div_factor, mclk_rate);
2720
2721 return dmic_sample_rate;
2722
2723undefined_rate:
2724 dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n",
2725 __func__, dmic_sample_rate, mclk_rate);
2726 dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED;
2727
2728 return dmic_sample_rate;
2729}
2730
Sudheer Papothi72fef482019-08-30 11:00:20 +05302731static const struct tx_macro_reg_mask_val tx_macro_reg_init[] = {
Vatsal Bucha126be652019-09-11 11:32:55 +05302732 {BOLERO_CDC_TX0_TX_PATH_SEC7, 0x3F, 0x02},
Sudheer Papothi72fef482019-08-30 11:00:20 +05302733};
2734
Meng Wang15c825d2018-09-06 10:49:18 +08002735static int tx_macro_init(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302736{
Meng Wang15c825d2018-09-06 10:49:18 +08002737 struct snd_soc_dapm_context *dapm =
2738 snd_soc_component_get_dapm(component);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302739 int ret = 0, i = 0;
2740 struct device *tx_dev = NULL;
2741 struct tx_macro_priv *tx_priv = NULL;
2742
Meng Wang15c825d2018-09-06 10:49:18 +08002743 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302744 if (!tx_dev) {
Meng Wang15c825d2018-09-06 10:49:18 +08002745 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302746 "%s: null device for macro!\n", __func__);
2747 return -EINVAL;
2748 }
2749 tx_priv = dev_get_drvdata(tx_dev);
2750 if (!tx_priv) {
Meng Wang15c825d2018-09-06 10:49:18 +08002751 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302752 "%s: priv is null for macro!\n", __func__);
2753 return -EINVAL;
2754 }
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302755 tx_priv->version = bolero_get_version(tx_dev);
2756 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2757 ret = snd_soc_dapm_new_controls(dapm,
2758 tx_macro_dapm_widgets_common,
2759 ARRAY_SIZE(tx_macro_dapm_widgets_common));
2760 if (ret < 0) {
2761 dev_err(tx_dev, "%s: Failed to add controls\n",
2762 __func__);
2763 return ret;
2764 }
2765 if (tx_priv->version == BOLERO_VERSION_2_1)
2766 ret = snd_soc_dapm_new_controls(dapm,
2767 tx_macro_dapm_widgets_v2,
2768 ARRAY_SIZE(tx_macro_dapm_widgets_v2));
2769 else if (tx_priv->version == BOLERO_VERSION_2_0)
2770 ret = snd_soc_dapm_new_controls(dapm,
2771 tx_macro_dapm_widgets_v3,
2772 ARRAY_SIZE(tx_macro_dapm_widgets_v3));
2773 if (ret < 0) {
2774 dev_err(tx_dev, "%s: Failed to add controls\n",
2775 __func__);
2776 return ret;
2777 }
2778 } else {
2779 ret = snd_soc_dapm_new_controls(dapm, tx_macro_dapm_widgets,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302780 ARRAY_SIZE(tx_macro_dapm_widgets));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302781 if (ret < 0) {
2782 dev_err(tx_dev, "%s: Failed to add controls\n",
2783 __func__);
2784 return ret;
2785 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302786 }
2787
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302788 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2789 ret = snd_soc_dapm_add_routes(dapm,
2790 tx_audio_map_common,
2791 ARRAY_SIZE(tx_audio_map_common));
2792 if (ret < 0) {
2793 dev_err(tx_dev, "%s: Failed to add routes\n",
2794 __func__);
2795 return ret;
2796 }
2797 if (tx_priv->version == BOLERO_VERSION_2_0)
2798 ret = snd_soc_dapm_add_routes(dapm,
2799 tx_audio_map_v3,
2800 ARRAY_SIZE(tx_audio_map_v3));
2801 if (ret < 0) {
2802 dev_err(tx_dev, "%s: Failed to add routes\n",
2803 __func__);
2804 return ret;
2805 }
2806 } else {
2807 ret = snd_soc_dapm_add_routes(dapm, tx_audio_map,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302808 ARRAY_SIZE(tx_audio_map));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302809 if (ret < 0) {
2810 dev_err(tx_dev, "%s: Failed to add routes\n",
2811 __func__);
2812 return ret;
2813 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302814 }
2815
2816 ret = snd_soc_dapm_new_widgets(dapm->card);
2817 if (ret < 0) {
2818 dev_err(tx_dev, "%s: Failed to add widgets\n", __func__);
2819 return ret;
2820 }
2821
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302822 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2823 ret = snd_soc_add_component_controls(component,
2824 tx_macro_snd_controls_common,
2825 ARRAY_SIZE(tx_macro_snd_controls_common));
2826 if (ret < 0) {
2827 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2828 __func__);
2829 return ret;
2830 }
2831 if (tx_priv->version == BOLERO_VERSION_2_0)
2832 ret = snd_soc_add_component_controls(component,
2833 tx_macro_snd_controls_v3,
2834 ARRAY_SIZE(tx_macro_snd_controls_v3));
2835 if (ret < 0) {
2836 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2837 __func__);
2838 return ret;
2839 }
2840 } else {
2841 ret = snd_soc_add_component_controls(component,
2842 tx_macro_snd_controls,
2843 ARRAY_SIZE(tx_macro_snd_controls));
2844 if (ret < 0) {
2845 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2846 __func__);
2847 return ret;
2848 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302849 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302850
2851 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF1 Capture");
2852 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF2 Capture");
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002853 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF3 Capture");
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302854 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2855 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC0");
2856 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC1");
2857 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC2");
2858 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC3");
2859 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC4");
2860 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC5");
2861 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC6");
2862 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC7");
2863 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC8");
2864 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC9");
2865 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC10");
2866 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC11");
2867 } else {
2868 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC0");
2869 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1");
2870 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2");
2871 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC3");
2872 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC0");
2873 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC1");
2874 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC2");
2875 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC3");
2876 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC4");
2877 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC5");
2878 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC6");
2879 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC7");
2880 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302881 snd_soc_dapm_sync(dapm);
2882
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302883 for (i = 0; i < NUM_DECIMATORS; i++) {
2884 tx_priv->tx_hpf_work[i].tx_priv = tx_priv;
2885 tx_priv->tx_hpf_work[i].decimator = i;
2886 INIT_DELAYED_WORK(&tx_priv->tx_hpf_work[i].dwork,
2887 tx_macro_tx_hpf_corner_freq_callback);
2888 }
2889
2890 for (i = 0; i < NUM_DECIMATORS; i++) {
2891 tx_priv->tx_mute_dwork[i].tx_priv = tx_priv;
2892 tx_priv->tx_mute_dwork[i].decimator = i;
2893 INIT_DELAYED_WORK(&tx_priv->tx_mute_dwork[i].dwork,
2894 tx_macro_mute_update_callback);
2895 }
Meng Wang15c825d2018-09-06 10:49:18 +08002896 tx_priv->component = component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302897
Sudheer Papothi72fef482019-08-30 11:00:20 +05302898 for (i = 0; i < ARRAY_SIZE(tx_macro_reg_init); i++)
2899 snd_soc_component_update_bits(component,
2900 tx_macro_reg_init[i].reg,
2901 tx_macro_reg_init[i].mask,
2902 tx_macro_reg_init[i].val);
2903
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302904 if (tx_priv->version == BOLERO_VERSION_2_1)
2905 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05302906 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302907 else if (tx_priv->version == BOLERO_VERSION_2_0)
2908 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05302909 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302910
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302911 return 0;
2912}
2913
Meng Wang15c825d2018-09-06 10:49:18 +08002914static int tx_macro_deinit(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302915{
2916 struct device *tx_dev = NULL;
2917 struct tx_macro_priv *tx_priv = NULL;
2918
Meng Wang15c825d2018-09-06 10:49:18 +08002919 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302920 return -EINVAL;
2921
Meng Wang15c825d2018-09-06 10:49:18 +08002922 tx_priv->component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302923 return 0;
2924}
2925
2926static void tx_macro_add_child_devices(struct work_struct *work)
2927{
2928 struct tx_macro_priv *tx_priv = NULL;
2929 struct platform_device *pdev = NULL;
2930 struct device_node *node = NULL;
2931 struct tx_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
2932 int ret = 0;
2933 u16 count = 0, ctrl_num = 0;
2934 struct tx_macro_swr_ctrl_platform_data *platdata = NULL;
2935 char plat_dev_name[TX_MACRO_SWR_STRING_LEN] = "";
2936 bool tx_swr_master_node = false;
2937
2938 tx_priv = container_of(work, struct tx_macro_priv,
2939 tx_macro_add_child_devices_work);
2940 if (!tx_priv) {
2941 pr_err("%s: Memory for tx_priv does not exist\n",
2942 __func__);
2943 return;
2944 }
2945
2946 if (!tx_priv->dev) {
2947 pr_err("%s: tx dev does not exist\n", __func__);
2948 return;
2949 }
2950
2951 if (!tx_priv->dev->of_node) {
2952 dev_err(tx_priv->dev,
2953 "%s: DT node for tx_priv does not exist\n", __func__);
2954 return;
2955 }
2956
2957 platdata = &tx_priv->swr_plat_data;
2958 tx_priv->child_count = 0;
2959
2960 for_each_available_child_of_node(tx_priv->dev->of_node, node) {
2961 tx_swr_master_node = false;
2962 if (strnstr(node->name, "tx_swr_master",
2963 strlen("tx_swr_master")) != NULL)
2964 tx_swr_master_node = true;
2965
2966 if (tx_swr_master_node)
2967 strlcpy(plat_dev_name, "tx_swr_ctrl",
2968 (TX_MACRO_SWR_STRING_LEN - 1));
2969 else
2970 strlcpy(plat_dev_name, node->name,
2971 (TX_MACRO_SWR_STRING_LEN - 1));
2972
2973 pdev = platform_device_alloc(plat_dev_name, -1);
2974 if (!pdev) {
2975 dev_err(tx_priv->dev, "%s: pdev memory alloc failed\n",
2976 __func__);
2977 ret = -ENOMEM;
2978 goto err;
2979 }
2980 pdev->dev.parent = tx_priv->dev;
2981 pdev->dev.of_node = node;
2982
2983 if (tx_swr_master_node) {
2984 ret = platform_device_add_data(pdev, platdata,
2985 sizeof(*platdata));
2986 if (ret) {
2987 dev_err(&pdev->dev,
2988 "%s: cannot add plat data ctrl:%d\n",
2989 __func__, ctrl_num);
2990 goto fail_pdev_add;
2991 }
2992 }
2993
2994 ret = platform_device_add(pdev);
2995 if (ret) {
2996 dev_err(&pdev->dev,
2997 "%s: Cannot add platform device\n",
2998 __func__);
2999 goto fail_pdev_add;
3000 }
3001
3002 if (tx_swr_master_node) {
3003 temp = krealloc(swr_ctrl_data,
3004 (ctrl_num + 1) * sizeof(
3005 struct tx_macro_swr_ctrl_data),
3006 GFP_KERNEL);
3007 if (!temp) {
3008 ret = -ENOMEM;
3009 goto fail_pdev_add;
3010 }
3011 swr_ctrl_data = temp;
3012 swr_ctrl_data[ctrl_num].tx_swr_pdev = pdev;
3013 ctrl_num++;
3014 dev_dbg(&pdev->dev,
3015 "%s: Added soundwire ctrl device(s)\n",
3016 __func__);
3017 tx_priv->swr_ctrl_data = swr_ctrl_data;
3018 }
3019 if (tx_priv->child_count < TX_MACRO_CHILD_DEVICES_MAX)
3020 tx_priv->pdev_child_devices[
3021 tx_priv->child_count++] = pdev;
3022 else
3023 goto err;
3024 }
3025 return;
3026fail_pdev_add:
3027 for (count = 0; count < tx_priv->child_count; count++)
3028 platform_device_put(tx_priv->pdev_child_devices[count]);
3029err:
3030 return;
3031}
3032
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303033static int tx_macro_set_port_map(struct snd_soc_component *component,
3034 u32 usecase, u32 size, void *data)
3035{
3036 struct device *tx_dev = NULL;
3037 struct tx_macro_priv *tx_priv = NULL;
3038 struct swrm_port_config port_cfg;
3039 int ret = 0;
3040
3041 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
3042 return -EINVAL;
3043
3044 memset(&port_cfg, 0, sizeof(port_cfg));
3045 port_cfg.uc = usecase;
3046 port_cfg.size = size;
3047 port_cfg.params = data;
3048
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003049 if (tx_priv->swr_ctrl_data)
3050 ret = swrm_wcd_notify(
3051 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
3052 SWR_SET_PORT_MAP, &port_cfg);
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303053
3054 return ret;
3055}
3056
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303057static void tx_macro_init_ops(struct macro_ops *ops,
3058 char __iomem *tx_io_base)
3059{
3060 memset(ops, 0, sizeof(struct macro_ops));
3061 ops->init = tx_macro_init;
3062 ops->exit = tx_macro_deinit;
3063 ops->io_base = tx_io_base;
3064 ops->dai_ptr = tx_macro_dai;
3065 ops->num_dais = ARRAY_SIZE(tx_macro_dai);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05303066 ops->event_handler = tx_macro_event_handler;
Aditya Bavanaric4e96122018-11-14 14:46:38 +05303067 ops->reg_wake_irq = tx_macro_reg_wake_irq;
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303068 ops->set_port_map = tx_macro_set_port_map;
Sudheer Papothid50a5812019-11-21 07:24:42 +05303069 ops->clk_div_get = tx_macro_clk_div_get;
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05303070 ops->clk_switch = tx_macro_clk_switch;
Sudheer Papothi06a4c642019-08-08 05:17:46 +05303071 ops->reg_evt_listener = tx_macro_register_event_listener;
Sudheer Papothifc3adb02019-11-24 10:14:21 +05303072 ops->clk_enable = __tx_macro_mclk_enable;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303073}
3074
3075static int tx_macro_probe(struct platform_device *pdev)
3076{
3077 struct macro_ops ops = {0};
3078 struct tx_macro_priv *tx_priv = NULL;
3079 u32 tx_base_addr = 0, sample_rate = 0;
3080 char __iomem *tx_io_base = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303081 int ret = 0;
3082 const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate";
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003083 u32 is_used_tx_swr_gpio = 1;
3084 const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio";
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303085
3086 tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv),
3087 GFP_KERNEL);
3088 if (!tx_priv)
3089 return -ENOMEM;
3090 platform_set_drvdata(pdev, tx_priv);
3091
3092 tx_priv->dev = &pdev->dev;
3093 ret = of_property_read_u32(pdev->dev.of_node, "reg",
3094 &tx_base_addr);
3095 if (ret) {
3096 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3097 __func__, "reg");
3098 return ret;
3099 }
3100 dev_set_drvdata(&pdev->dev, tx_priv);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003101 if (of_find_property(pdev->dev.of_node, is_used_tx_swr_gpio_dt,
3102 NULL)) {
3103 ret = of_property_read_u32(pdev->dev.of_node,
3104 is_used_tx_swr_gpio_dt,
3105 &is_used_tx_swr_gpio);
3106 if (ret) {
3107 dev_err(&pdev->dev, "%s: error reading %s in dt\n",
3108 __func__, is_used_tx_swr_gpio_dt);
3109 is_used_tx_swr_gpio = 1;
3110 }
3111 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303112 tx_priv->tx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
3113 "qcom,tx-swr-gpios", 0);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003114 if (!tx_priv->tx_swr_gpio_p && is_used_tx_swr_gpio) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303115 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
3116 __func__);
3117 return -EINVAL;
3118 }
Karthikeyan Manib44e4552019-09-09 23:06:04 -07003119 if (msm_cdc_pinctrl_get_state(tx_priv->tx_swr_gpio_p) < 0 &&
3120 is_used_tx_swr_gpio) {
Karthikeyan Mani326536d2019-06-03 13:29:43 -07003121 dev_err(&pdev->dev, "%s: failed to get swr pin state\n",
3122 __func__);
3123 return -EPROBE_DEFER;
3124 }
3125
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303126 tx_io_base = devm_ioremap(&pdev->dev,
3127 tx_base_addr, TX_MACRO_MAX_OFFSET);
3128 if (!tx_io_base) {
3129 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
3130 return -ENOMEM;
3131 }
3132 tx_priv->tx_io_base = tx_io_base;
3133 ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate,
3134 &sample_rate);
3135 if (ret) {
3136 dev_err(&pdev->dev,
3137 "%s: could not find sample_rate entry in dt\n",
3138 __func__);
3139 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
3140 } else {
3141 if (tx_macro_validate_dmic_sample_rate(
3142 sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED)
3143 return -EINVAL;
3144 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303145 if (is_used_tx_swr_gpio) {
3146 tx_priv->reset_swr = true;
3147 INIT_WORK(&tx_priv->tx_macro_add_child_devices_work,
3148 tx_macro_add_child_devices);
3149 tx_priv->swr_plat_data.handle = (void *) tx_priv;
3150 tx_priv->swr_plat_data.read = NULL;
3151 tx_priv->swr_plat_data.write = NULL;
3152 tx_priv->swr_plat_data.bulk_write = NULL;
3153 tx_priv->swr_plat_data.clk = tx_macro_swrm_clock;
3154 tx_priv->swr_plat_data.core_vote = tx_macro_core_vote;
3155 tx_priv->swr_plat_data.handle_irq = NULL;
3156 mutex_init(&tx_priv->swr_clk_lock);
3157 }
3158 tx_priv->is_used_tx_swr_gpio = is_used_tx_swr_gpio;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303159 mutex_init(&tx_priv->mclk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303160 tx_macro_init_ops(&ops, tx_io_base);
Vidyakumar Athota5d45f4c2019-03-10 22:35:07 -07003161 ops.clk_id_req = TX_CORE_CLK;
3162 ops.default_clk_id = TX_CORE_CLK;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303163 ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops);
3164 if (ret) {
3165 dev_err(&pdev->dev,
3166 "%s: register macro failed\n", __func__);
3167 goto err_reg_macro;
3168 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303169 if (is_used_tx_swr_gpio)
3170 schedule_work(&tx_priv->tx_macro_add_child_devices_work);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303171 pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY);
3172 pm_runtime_use_autosuspend(&pdev->dev);
3173 pm_runtime_set_suspended(&pdev->dev);
Sudheer Papothi296867b2019-06-20 09:24:09 +05303174 pm_suspend_ignore_children(&pdev->dev, true);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303175 pm_runtime_enable(&pdev->dev);
3176
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303177 return 0;
3178err_reg_macro:
3179 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303180 if (is_used_tx_swr_gpio)
3181 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303182 return ret;
3183}
3184
3185static int tx_macro_remove(struct platform_device *pdev)
3186{
3187 struct tx_macro_priv *tx_priv = NULL;
3188 u16 count = 0;
3189
3190 tx_priv = platform_get_drvdata(pdev);
3191
3192 if (!tx_priv)
3193 return -EINVAL;
3194
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303195 if (tx_priv->is_used_tx_swr_gpio) {
3196 if (tx_priv->swr_ctrl_data)
3197 kfree(tx_priv->swr_ctrl_data);
3198 for (count = 0; count < tx_priv->child_count &&
3199 count < TX_MACRO_CHILD_DEVICES_MAX; count++)
3200 platform_device_unregister(
3201 tx_priv->pdev_child_devices[count]);
3202 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303203
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303204 pm_runtime_disable(&pdev->dev);
3205 pm_runtime_set_suspended(&pdev->dev);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303206 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303207 if (tx_priv->is_used_tx_swr_gpio)
3208 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303209 bolero_unregister_macro(&pdev->dev, TX_MACRO);
3210 return 0;
3211}
3212
3213
3214static const struct of_device_id tx_macro_dt_match[] = {
3215 {.compatible = "qcom,tx-macro"},
3216 {}
3217};
3218
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303219static const struct dev_pm_ops bolero_dev_pm_ops = {
3220 SET_RUNTIME_PM_OPS(
3221 bolero_runtime_suspend,
3222 bolero_runtime_resume,
3223 NULL
3224 )
3225};
3226
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303227static struct platform_driver tx_macro_driver = {
3228 .driver = {
3229 .name = "tx_macro",
3230 .owner = THIS_MODULE,
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303231 .pm = &bolero_dev_pm_ops,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303232 .of_match_table = tx_macro_dt_match,
Xiaojun Sang53cd13a2018-06-29 15:14:37 +08003233 .suppress_bind_attrs = true,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303234 },
3235 .probe = tx_macro_probe,
3236 .remove = tx_macro_remove,
3237};
3238
3239module_platform_driver(tx_macro_driver);
3240
3241MODULE_DESCRIPTION("TX macro driver");
3242MODULE_LICENSE("GPL v2");