blob: a9efa300412fcc0a0e029ddc6e7167ace674fed5 [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:
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700376 if (tx_priv->swr_ctrl_data) {
377 swrm_wcd_notify(
378 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
379 SWR_DEVICE_DOWN, NULL);
380 swrm_wcd_notify(
381 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
382 SWR_DEVICE_SSR_DOWN, NULL);
383 }
Aditya Bavanari50ef13e2019-08-09 15:14:43 +0530384 if ((!pm_runtime_enabled(tx_dev) ||
385 !pm_runtime_suspended(tx_dev))) {
386 ret = bolero_runtime_suspend(tx_dev);
387 if (!ret) {
388 pm_runtime_disable(tx_dev);
389 pm_runtime_set_suspended(tx_dev);
390 pm_runtime_enable(tx_dev);
391 }
392 }
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530393 break;
394 case BOLERO_MACRO_EVT_SSR_UP:
Ramprasad Katkama4c747b2018-12-11 19:15:53 +0530395 /* reset swr after ssr/pdr */
396 tx_priv->reset_swr = true;
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700397 if (tx_priv->swr_ctrl_data)
398 swrm_wcd_notify(
399 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
400 SWR_DEVICE_SSR_UP, NULL);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530401 break;
Meng Wang8ef0cc22019-05-08 15:12:56 +0800402 case BOLERO_MACRO_EVT_CLK_RESET:
403 bolero_rsc_clk_reset(tx_dev, TX_CORE_CLK);
404 break;
Vatsal Buchad06525f2019-10-14 23:14:12 +0530405 case BOLERO_MACRO_EVT_BCS_CLK_OFF:
406 if (tx_priv->bcs_clk_en)
407 snd_soc_component_update_bits(component,
408 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, data << 6);
409 if (data)
410 tx_priv->hs_slow_insert_complete = true;
411 else
412 tx_priv->hs_slow_insert_complete = false;
413 break;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530414 }
415 return 0;
416}
417
Meng Wang15c825d2018-09-06 10:49:18 +0800418static int tx_macro_reg_wake_irq(struct snd_soc_component *component,
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530419 u32 data)
420{
421 struct device *tx_dev = NULL;
422 struct tx_macro_priv *tx_priv = NULL;
423 u32 ipc_wakeup = data;
424 int ret = 0;
425
Meng Wang15c825d2018-09-06 10:49:18 +0800426 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530427 return -EINVAL;
428
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700429 if (tx_priv->swr_ctrl_data)
430 ret = swrm_wcd_notify(
431 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
432 SWR_REGISTER_WAKE_IRQ, &ipc_wakeup);
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530433
434 return ret;
435}
436
Sudheer Papothi339c4112019-12-13 00:49:16 +0530437static int is_amic_enabled(struct snd_soc_component *component, int decimator)
438{
439 u16 adc_mux_reg = 0, adc_reg = 0;
440 u16 adc_n = BOLERO_ADC_MAX;
441
442 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
443 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
444 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
445 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
446 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
447 adc_n = snd_soc_component_read32(component, adc_reg) &
448 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
449 if (adc_n >= BOLERO_ADC_MAX)
450 adc_n = BOLERO_ADC_MAX;
451 }
452
453 return adc_n;
454}
455
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530456static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
457{
458 struct delayed_work *hpf_delayed_work = NULL;
459 struct hpf_work *hpf_work = NULL;
460 struct tx_macro_priv *tx_priv = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800461 struct snd_soc_component *component = NULL;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530462 u16 dec_cfg_reg = 0, hpf_gate_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530463 u8 hpf_cut_off_freq = 0;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530464 u16 adc_n = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530465
466 hpf_delayed_work = to_delayed_work(work);
467 hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
468 tx_priv = hpf_work->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800469 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530470 hpf_cut_off_freq = hpf_work->hpf_cut_off_freq;
471
472 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
473 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530474 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
475 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530476
Meng Wang15c825d2018-09-06 10:49:18 +0800477 dev_dbg(component->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530478 __func__, hpf_work->decimator, hpf_cut_off_freq);
479
Sudheer Papothi339c4112019-12-13 00:49:16 +0530480 adc_n = is_amic_enabled(component, hpf_work->decimator);
481 if (adc_n < BOLERO_ADC_MAX) {
Laxminath Kasam497a6512018-09-17 16:11:52 +0530482 /* analog mic clear TX hold */
Meng Wang15c825d2018-09-06 10:49:18 +0800483 bolero_clear_amic_tx_hold(component->dev, adc_n);
Sudheer Papothi339c4112019-12-13 00:49:16 +0530484 snd_soc_component_update_bits(component,
485 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
486 hpf_cut_off_freq << 5);
487 snd_soc_component_update_bits(component, hpf_gate_reg,
488 0x03, 0x02);
489 /* Minimum 1 clk cycle delay is required as per HW spec */
490 usleep_range(1000, 1010);
491 snd_soc_component_update_bits(component, hpf_gate_reg,
492 0x03, 0x01);
493 } else {
494 snd_soc_component_update_bits(component,
495 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
496 hpf_cut_off_freq << 5);
497 snd_soc_component_update_bits(component, hpf_gate_reg,
498 0x02, 0x02);
499 /* Minimum 1 clk cycle delay is required as per HW spec */
500 usleep_range(1000, 1010);
501 snd_soc_component_update_bits(component, hpf_gate_reg,
502 0x02, 0x00);
Laxminath Kasam497a6512018-09-17 16:11:52 +0530503 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530504}
505
506static void tx_macro_mute_update_callback(struct work_struct *work)
507{
508 struct tx_mute_work *tx_mute_dwork = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800509 struct snd_soc_component *component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530510 struct tx_macro_priv *tx_priv = NULL;
511 struct delayed_work *delayed_work = NULL;
Xiaojun Sangd155fdc2018-10-11 15:11:59 +0800512 u16 tx_vol_ctl_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530513 u8 decimator = 0;
514
515 delayed_work = to_delayed_work(work);
516 tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork);
517 tx_priv = tx_mute_dwork->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800518 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530519 decimator = tx_mute_dwork->decimator;
520
521 tx_vol_ctl_reg =
522 BOLERO_CDC_TX0_TX_PATH_CTL +
523 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +0800524 snd_soc_component_update_bits(component, tx_vol_ctl_reg, 0x10, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530525 dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
526 __func__, decimator);
527}
528
529static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
530 struct snd_ctl_elem_value *ucontrol)
531{
532 struct snd_soc_dapm_widget *widget =
533 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800534 struct snd_soc_component *component =
535 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530536 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
537 unsigned int val = 0;
538 u16 mic_sel_reg = 0;
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530539 u16 dmic_clk_reg = 0;
540 struct device *tx_dev = NULL;
541 struct tx_macro_priv *tx_priv = NULL;
542
543 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
544 return -EINVAL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530545
546 val = ucontrol->value.enumerated.item[0];
547 if (val > e->items - 1)
548 return -EINVAL;
549
Meng Wang15c825d2018-09-06 10:49:18 +0800550 dev_dbg(component->dev, "%s: wname: %s, val: 0x%x\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530551 widget->name, val);
552
553 switch (e->reg) {
554 case BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0:
555 mic_sel_reg = BOLERO_CDC_TX0_TX_PATH_CFG0;
556 break;
557 case BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0:
558 mic_sel_reg = BOLERO_CDC_TX1_TX_PATH_CFG0;
559 break;
560 case BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0:
561 mic_sel_reg = BOLERO_CDC_TX2_TX_PATH_CFG0;
562 break;
563 case BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0:
564 mic_sel_reg = BOLERO_CDC_TX3_TX_PATH_CFG0;
565 break;
566 case BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0:
567 mic_sel_reg = BOLERO_CDC_TX4_TX_PATH_CFG0;
568 break;
569 case BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0:
570 mic_sel_reg = BOLERO_CDC_TX5_TX_PATH_CFG0;
571 break;
572 case BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0:
573 mic_sel_reg = BOLERO_CDC_TX6_TX_PATH_CFG0;
574 break;
575 case BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0:
576 mic_sel_reg = BOLERO_CDC_TX7_TX_PATH_CFG0;
577 break;
578 default:
Meng Wang15c825d2018-09-06 10:49:18 +0800579 dev_err(component->dev, "%s: e->reg: 0x%x not expected\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530580 __func__, e->reg);
581 return -EINVAL;
582 }
Laxminath Kasam497a6512018-09-17 16:11:52 +0530583 if (strnstr(widget->name, "SMIC", strlen(widget->name))) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530584 if (val != 0) {
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530585 if (val < 5) {
Meng Wang15c825d2018-09-06 10:49:18 +0800586 snd_soc_component_update_bits(component,
587 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530588 1 << 7, 0x0 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530589 } else {
Meng Wang15c825d2018-09-06 10:49:18 +0800590 snd_soc_component_update_bits(component,
591 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530592 1 << 7, 0x1 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530593 snd_soc_component_update_bits(component,
594 BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
595 0x80, 0x00);
596 dmic_clk_reg =
597 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
598 ((val - 5)/2) * 4;
599 snd_soc_component_update_bits(component,
600 dmic_clk_reg,
601 0x0E, tx_priv->dmic_clk_div << 0x1);
602 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530603 }
604 } else {
605 /* DMIC selected */
606 if (val != 0)
Meng Wang15c825d2018-09-06 10:49:18 +0800607 snd_soc_component_update_bits(component, mic_sel_reg,
608 1 << 7, 1 << 7);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530609 }
610
611 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
612}
613
614static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol,
615 struct snd_ctl_elem_value *ucontrol)
616{
617 struct snd_soc_dapm_widget *widget =
618 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800619 struct snd_soc_component *component =
620 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530621 struct soc_multi_mixer_control *mixer =
622 ((struct soc_multi_mixer_control *)kcontrol->private_value);
623 u32 dai_id = widget->shift;
624 u32 dec_id = mixer->shift;
625 struct device *tx_dev = NULL;
626 struct tx_macro_priv *tx_priv = NULL;
627
Meng Wang15c825d2018-09-06 10:49:18 +0800628 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530629 return -EINVAL;
630
631 if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id]))
632 ucontrol->value.integer.value[0] = 1;
633 else
634 ucontrol->value.integer.value[0] = 0;
635 return 0;
636}
637
638static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
639 struct snd_ctl_elem_value *ucontrol)
640{
641 struct snd_soc_dapm_widget *widget =
642 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800643 struct snd_soc_component *component =
644 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530645 struct snd_soc_dapm_update *update = NULL;
646 struct soc_multi_mixer_control *mixer =
647 ((struct soc_multi_mixer_control *)kcontrol->private_value);
648 u32 dai_id = widget->shift;
649 u32 dec_id = mixer->shift;
650 u32 enable = ucontrol->value.integer.value[0];
651 struct device *tx_dev = NULL;
652 struct tx_macro_priv *tx_priv = NULL;
653
Meng Wang15c825d2018-09-06 10:49:18 +0800654 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530655 return -EINVAL;
656
657 if (enable) {
658 set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
659 tx_priv->active_ch_cnt[dai_id]++;
660 } else {
661 tx_priv->active_ch_cnt[dai_id]--;
662 clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
663 }
664 snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
665
666 return 0;
667}
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700668
669static inline int tx_macro_path_get(const char *wname,
670 unsigned int *path_num)
671{
672 int ret = 0;
673 char *widget_name = NULL;
674 char *w_name = NULL;
675 char *path_num_char = NULL;
676 char *path_name = NULL;
677
678 widget_name = kstrndup(wname, 10, GFP_KERNEL);
679 if (!widget_name)
680 return -EINVAL;
681
682 w_name = widget_name;
683
684 path_name = strsep(&widget_name, " ");
685 if (!path_name) {
686 pr_err("%s: Invalid widget name = %s\n",
687 __func__, widget_name);
688 ret = -EINVAL;
689 goto err;
690 }
691 path_num_char = strpbrk(path_name, "01234567");
692 if (!path_num_char) {
693 pr_err("%s: tx path index not found\n",
694 __func__);
695 ret = -EINVAL;
696 goto err;
697 }
698 ret = kstrtouint(path_num_char, 10, path_num);
699 if (ret < 0)
700 pr_err("%s: Invalid tx path = %s\n",
701 __func__, w_name);
702
703err:
704 kfree(w_name);
705 return ret;
706}
707
708static int tx_macro_dec_mode_get(struct snd_kcontrol *kcontrol,
709 struct snd_ctl_elem_value *ucontrol)
710{
711 struct snd_soc_component *component =
712 snd_soc_kcontrol_component(kcontrol);
713 struct tx_macro_priv *tx_priv = NULL;
714 struct device *tx_dev = NULL;
715 int ret = 0;
716 int path = 0;
717
718 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
719 return -EINVAL;
720
721 ret = tx_macro_path_get(kcontrol->id.name, &path);
722 if (ret)
723 return ret;
724
725 ucontrol->value.integer.value[0] = tx_priv->dec_mode[path];
726
727 return 0;
728}
729
730static int tx_macro_dec_mode_put(struct snd_kcontrol *kcontrol,
731 struct snd_ctl_elem_value *ucontrol)
732{
733 struct snd_soc_component *component =
734 snd_soc_kcontrol_component(kcontrol);
735 struct tx_macro_priv *tx_priv = NULL;
736 struct device *tx_dev = NULL;
737 int value = ucontrol->value.integer.value[0];
738 int ret = 0;
739 int path = 0;
740
741 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
742 return -EINVAL;
743
744 ret = tx_macro_path_get(kcontrol->id.name, &path);
745 if (ret)
746 return ret;
747
748 tx_priv->dec_mode[path] = value;
749
750 return 0;
751}
752
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700753static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol,
754 struct snd_ctl_elem_value *ucontrol)
755{
756 struct snd_soc_component *component =
757 snd_soc_kcontrol_component(kcontrol);
758 struct tx_macro_priv *tx_priv = NULL;
759 struct device *tx_dev = NULL;
760
761 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
762 return -EINVAL;
763
764 ucontrol->value.integer.value[0] = tx_priv->bcs_enable;
765
766 return 0;
767}
768
769static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol,
770 struct snd_ctl_elem_value *ucontrol)
771{
772 struct snd_soc_component *component =
773 snd_soc_kcontrol_component(kcontrol);
774 struct tx_macro_priv *tx_priv = NULL;
775 struct device *tx_dev = NULL;
776 int value = ucontrol->value.integer.value[0];
777
778 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
779 return -EINVAL;
780
781 tx_priv->bcs_enable = value;
782
783 return 0;
784}
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530785
786static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
787 struct snd_kcontrol *kcontrol, int event)
788{
Meng Wang15c825d2018-09-06 10:49:18 +0800789 struct snd_soc_component *component =
790 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530791 unsigned int dmic = 0;
792 int ret = 0;
793 char *wname = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530794
795 wname = strpbrk(w->name, "01234567");
796 if (!wname) {
Meng Wang15c825d2018-09-06 10:49:18 +0800797 dev_err(component->dev, "%s: widget not found\n", __func__);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530798 return -EINVAL;
799 }
800
801 ret = kstrtouint(wname, 10, &dmic);
802 if (ret < 0) {
Meng Wang15c825d2018-09-06 10:49:18 +0800803 dev_err(component->dev, "%s: Invalid DMIC line on the codec\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530804 __func__);
805 return -EINVAL;
806 }
807
Sudheer Papothid50a5812019-11-21 07:24:42 +0530808 dev_dbg(component->dev, "%s: event %d DMIC%d\n",
809 __func__, event, dmic);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530810
811 switch (event) {
812 case SND_SOC_DAPM_PRE_PMU:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530813 bolero_dmic_clk_enable(component, dmic, DMIC_TX, true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530814 break;
815 case SND_SOC_DAPM_POST_PMD:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530816 bolero_dmic_clk_enable(component, dmic, DMIC_TX, false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530817 break;
818 }
819
820 return 0;
821}
822
823static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
824 struct snd_kcontrol *kcontrol, int event)
825{
Meng Wang15c825d2018-09-06 10:49:18 +0800826 struct snd_soc_component *component =
827 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530828 unsigned int decimator = 0;
829 u16 tx_vol_ctl_reg = 0;
830 u16 dec_cfg_reg = 0;
831 u16 hpf_gate_reg = 0;
832 u16 tx_gain_ctl_reg = 0;
833 u8 hpf_cut_off_freq = 0;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530834 int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS;
835 int unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530836 struct device *tx_dev = NULL;
837 struct tx_macro_priv *tx_priv = NULL;
Meng Wang2825fce2020-01-13 15:17:21 +0800838 u16 adc_mux_reg = 0, adc_reg = 0, adc_n = 0;
839 u16 dmic_clk_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530840
Meng Wang15c825d2018-09-06 10:49:18 +0800841 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530842 return -EINVAL;
843
844 decimator = w->shift;
845
Meng Wang15c825d2018-09-06 10:49:18 +0800846 dev_dbg(component->dev, "%s(): widget = %s decimator = %u\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530847 w->name, decimator);
848
849 tx_vol_ctl_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
850 TX_MACRO_TX_PATH_OFFSET * decimator;
851 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
852 TX_MACRO_TX_PATH_OFFSET * decimator;
853 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
854 TX_MACRO_TX_PATH_OFFSET * decimator;
855 tx_gain_ctl_reg = BOLERO_CDC_TX0_TX_VOL_CTL +
856 TX_MACRO_TX_PATH_OFFSET * decimator;
857
858 switch (event) {
859 case SND_SOC_DAPM_PRE_PMU:
Meng Wang2825fce2020-01-13 15:17:21 +0800860 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
861 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
862 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
863 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
864 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
865 adc_n = snd_soc_component_read32(component, adc_reg) &
866 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
867 if (adc_n >= BOLERO_ADC_MAX) {
868 dmic_clk_reg =
869 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
870 ((adc_n - 5) / 2) * 4;
871 snd_soc_component_update_bits(component,
872 dmic_clk_reg,
873 0x0E, tx_priv->dmic_clk_div << 0x1);
874 }
875 }
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700876 snd_soc_component_update_bits(component,
877 dec_cfg_reg, 0x06, tx_priv->dec_mode[decimator] <<
878 TX_MACRO_ADC_MODE_CFG0_SHIFT);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530879 /* Enable TX PGA Mute */
Meng Wang15c825d2018-09-06 10:49:18 +0800880 snd_soc_component_update_bits(component,
881 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530882 break;
883 case SND_SOC_DAPM_POST_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +0800884 snd_soc_component_update_bits(component,
885 tx_vol_ctl_reg, 0x20, 0x20);
886 snd_soc_component_update_bits(component,
887 hpf_gate_reg, 0x01, 0x00);
Karthikeyan Mani144659b2019-10-02 17:29:57 -0700888 /*
889 * Minimum 1 clk cycle delay is required as per HW spec
890 */
891 usleep_range(1000, 1010);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530892
Meng Wang15c825d2018-09-06 10:49:18 +0800893 hpf_cut_off_freq = (
894 snd_soc_component_read32(component, dec_cfg_reg) &
895 TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
896
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530897 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq =
Meng Wang15c825d2018-09-06 10:49:18 +0800898 hpf_cut_off_freq;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530899
900 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ)
Meng Wang15c825d2018-09-06 10:49:18 +0800901 snd_soc_component_update_bits(component, dec_cfg_reg,
902 TX_HPF_CUT_OFF_FREQ_MASK,
903 CF_MIN_3DB_150HZ << 5);
904
Sudheer Papothi339c4112019-12-13 00:49:16 +0530905 if (is_amic_enabled(component, decimator) < BOLERO_ADC_MAX) {
906 hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS;
907 unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS;
908 }
909 if (tx_unmute_delay < unmute_delay)
910 tx_unmute_delay = unmute_delay;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530911 /* schedule work queue to Remove Mute */
912 schedule_delayed_work(&tx_priv->tx_mute_dwork[decimator].dwork,
913 msecs_to_jiffies(tx_unmute_delay));
914 if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq !=
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530915 CF_MIN_3DB_150HZ) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530916 schedule_delayed_work(
Sudheer Papothi339c4112019-12-13 00:49:16 +0530917 &tx_priv->tx_hpf_work[decimator].dwork,
918 msecs_to_jiffies(hpf_delay));
Meng Wang15c825d2018-09-06 10:49:18 +0800919 snd_soc_component_update_bits(component,
Karthikeyan Mani144659b2019-10-02 17:29:57 -0700920 hpf_gate_reg, 0x03, 0x03);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530921 /*
922 * Minimum 1 clk cycle delay is required as per HW spec
923 */
924 usleep_range(1000, 1010);
Meng Wang15c825d2018-09-06 10:49:18 +0800925 snd_soc_component_update_bits(component,
926 hpf_gate_reg, 0x02, 0x00);
Karthikeyan Mani9366ce62019-11-06 11:43:36 -0800927 snd_soc_component_update_bits(component,
928 hpf_gate_reg, 0x01, 0x01);
929 /*
930 * 6ms delay is required as per HW spec
931 */
932 usleep_range(6000, 6010);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530933 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530934 /* apply gain after decimator is enabled */
Meng Wang15c825d2018-09-06 10:49:18 +0800935 snd_soc_component_write(component, tx_gain_ctl_reg,
936 snd_soc_component_read32(component,
937 tx_gain_ctl_reg));
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700938 if (tx_priv->bcs_enable) {
939 snd_soc_component_update_bits(component, dec_cfg_reg,
940 0x01, 0x01);
Vatsal Buchad06525f2019-10-14 23:14:12 +0530941 tx_priv->bcs_clk_en = true;
942 if (tx_priv->hs_slow_insert_complete)
943 snd_soc_component_update_bits(component,
944 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40,
945 0x40);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700946 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530947 break;
948 case SND_SOC_DAPM_PRE_PMD:
949 hpf_cut_off_freq =
950 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq;
Meng Wang15c825d2018-09-06 10:49:18 +0800951 snd_soc_component_update_bits(component,
952 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530953 if (cancel_delayed_work_sync(
954 &tx_priv->tx_hpf_work[decimator].dwork)) {
955 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
Meng Wang15c825d2018-09-06 10:49:18 +0800956 snd_soc_component_update_bits(
957 component, dec_cfg_reg,
958 TX_HPF_CUT_OFF_FREQ_MASK,
959 hpf_cut_off_freq << 5);
960 snd_soc_component_update_bits(component,
961 hpf_gate_reg,
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530962 0x02, 0x02);
963 /*
964 * Minimum 1 clk cycle delay is required
965 * as per HW spec
966 */
967 usleep_range(1000, 1010);
Meng Wang15c825d2018-09-06 10:49:18 +0800968 snd_soc_component_update_bits(component,
969 hpf_gate_reg,
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530970 0x02, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530971 }
972 }
973 cancel_delayed_work_sync(
974 &tx_priv->tx_mute_dwork[decimator].dwork);
975 break;
976 case SND_SOC_DAPM_POST_PMD:
Meng Wang15c825d2018-09-06 10:49:18 +0800977 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
978 0x20, 0x00);
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700979 snd_soc_component_update_bits(component,
980 dec_cfg_reg, 0x06, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +0800981 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
982 0x10, 0x00);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700983 if (tx_priv->bcs_enable) {
984 snd_soc_component_update_bits(component, dec_cfg_reg,
985 0x01, 0x00);
986 snd_soc_component_update_bits(component,
987 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x00);
Vatsal Buchad06525f2019-10-14 23:14:12 +0530988 tx_priv->bcs_clk_en = false;
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700989 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530990 break;
991 }
992 return 0;
993}
994
995static int tx_macro_enable_micbias(struct snd_soc_dapm_widget *w,
996 struct snd_kcontrol *kcontrol, int event)
997{
998 return 0;
999}
1000
1001static int tx_macro_hw_params(struct snd_pcm_substream *substream,
1002 struct snd_pcm_hw_params *params,
1003 struct snd_soc_dai *dai)
1004{
1005 int tx_fs_rate = -EINVAL;
Meng Wang15c825d2018-09-06 10:49:18 +08001006 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301007 u32 decimator = 0;
Laxminath Kasamb7f823c2018-08-02 13:23:11 +05301008 u32 sample_rate = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301009 u16 tx_fs_reg = 0;
1010 struct device *tx_dev = NULL;
1011 struct tx_macro_priv *tx_priv = NULL;
1012
Meng Wang15c825d2018-09-06 10:49:18 +08001013 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301014 return -EINVAL;
1015
1016 pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
1017 dai->name, dai->id, params_rate(params),
1018 params_channels(params));
1019
1020 sample_rate = params_rate(params);
1021 switch (sample_rate) {
1022 case 8000:
1023 tx_fs_rate = 0;
1024 break;
1025 case 16000:
1026 tx_fs_rate = 1;
1027 break;
1028 case 32000:
1029 tx_fs_rate = 3;
1030 break;
1031 case 48000:
1032 tx_fs_rate = 4;
1033 break;
1034 case 96000:
1035 tx_fs_rate = 5;
1036 break;
1037 case 192000:
1038 tx_fs_rate = 6;
1039 break;
1040 case 384000:
1041 tx_fs_rate = 7;
1042 break;
1043 default:
Meng Wang15c825d2018-09-06 10:49:18 +08001044 dev_err(component->dev, "%s: Invalid TX sample rate: %d\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301045 __func__, params_rate(params));
1046 return -EINVAL;
1047 }
1048 for_each_set_bit(decimator, &tx_priv->active_ch_mask[dai->id],
1049 TX_MACRO_DEC_MAX) {
1050 if (decimator >= 0) {
1051 tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
1052 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +08001053 dev_dbg(component->dev, "%s: set DEC%u rate to %u\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301054 __func__, decimator, sample_rate);
Meng Wang15c825d2018-09-06 10:49:18 +08001055 snd_soc_component_update_bits(component, tx_fs_reg,
1056 0x0F, tx_fs_rate);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301057 } else {
Meng Wang15c825d2018-09-06 10:49:18 +08001058 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301059 "%s: ERROR: Invalid decimator: %d\n",
1060 __func__, decimator);
1061 return -EINVAL;
1062 }
1063 }
1064 return 0;
1065}
1066
1067static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
1068 unsigned int *tx_num, unsigned int *tx_slot,
1069 unsigned int *rx_num, unsigned int *rx_slot)
1070{
Meng Wang15c825d2018-09-06 10:49:18 +08001071 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301072 struct device *tx_dev = NULL;
1073 struct tx_macro_priv *tx_priv = NULL;
1074
Meng Wang15c825d2018-09-06 10:49:18 +08001075 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301076 return -EINVAL;
1077
1078 switch (dai->id) {
1079 case TX_MACRO_AIF1_CAP:
1080 case TX_MACRO_AIF2_CAP:
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001081 case TX_MACRO_AIF3_CAP:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301082 *tx_slot = tx_priv->active_ch_mask[dai->id];
1083 *tx_num = tx_priv->active_ch_cnt[dai->id];
1084 break;
1085 default:
1086 dev_err(tx_dev, "%s: Invalid AIF\n", __func__);
1087 break;
1088 }
1089 return 0;
1090}
1091
1092static struct snd_soc_dai_ops tx_macro_dai_ops = {
1093 .hw_params = tx_macro_hw_params,
1094 .get_channel_map = tx_macro_get_channel_map,
1095};
1096
1097static struct snd_soc_dai_driver tx_macro_dai[] = {
1098 {
1099 .name = "tx_macro_tx1",
1100 .id = TX_MACRO_AIF1_CAP,
1101 .capture = {
1102 .stream_name = "TX_AIF1 Capture",
1103 .rates = TX_MACRO_RATES,
1104 .formats = TX_MACRO_FORMATS,
1105 .rate_max = 192000,
1106 .rate_min = 8000,
1107 .channels_min = 1,
1108 .channels_max = 8,
1109 },
1110 .ops = &tx_macro_dai_ops,
1111 },
1112 {
1113 .name = "tx_macro_tx2",
1114 .id = TX_MACRO_AIF2_CAP,
1115 .capture = {
1116 .stream_name = "TX_AIF2 Capture",
1117 .rates = TX_MACRO_RATES,
1118 .formats = TX_MACRO_FORMATS,
1119 .rate_max = 192000,
1120 .rate_min = 8000,
1121 .channels_min = 1,
1122 .channels_max = 8,
1123 },
1124 .ops = &tx_macro_dai_ops,
1125 },
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001126 {
1127 .name = "tx_macro_tx3",
1128 .id = TX_MACRO_AIF3_CAP,
1129 .capture = {
1130 .stream_name = "TX_AIF3 Capture",
1131 .rates = TX_MACRO_RATES,
1132 .formats = TX_MACRO_FORMATS,
1133 .rate_max = 192000,
1134 .rate_min = 8000,
1135 .channels_min = 1,
1136 .channels_max = 8,
1137 },
1138 .ops = &tx_macro_dai_ops,
1139 },
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301140};
1141
1142#define STRING(name) #name
1143#define TX_MACRO_DAPM_ENUM(name, reg, offset, text) \
1144static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1145static const struct snd_kcontrol_new name##_mux = \
1146 SOC_DAPM_ENUM(STRING(name), name##_enum)
1147
1148#define TX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \
1149static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1150static const struct snd_kcontrol_new name##_mux = \
1151 SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname)
1152
1153#define TX_MACRO_DAPM_MUX(name, shift, kctl) \
1154 SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux)
1155
1156static const char * const adc_mux_text[] = {
1157 "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1"
1158};
1159
1160TX_MACRO_DAPM_ENUM(tx_dec0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1,
1161 0, adc_mux_text);
1162TX_MACRO_DAPM_ENUM(tx_dec1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1,
1163 0, adc_mux_text);
1164TX_MACRO_DAPM_ENUM(tx_dec2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1,
1165 0, adc_mux_text);
1166TX_MACRO_DAPM_ENUM(tx_dec3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1,
1167 0, adc_mux_text);
1168TX_MACRO_DAPM_ENUM(tx_dec4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1,
1169 0, adc_mux_text);
1170TX_MACRO_DAPM_ENUM(tx_dec5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1,
1171 0, adc_mux_text);
1172TX_MACRO_DAPM_ENUM(tx_dec6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1,
1173 0, adc_mux_text);
1174TX_MACRO_DAPM_ENUM(tx_dec7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1,
1175 0, adc_mux_text);
1176
1177
1178static const char * const dmic_mux_text[] = {
1179 "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3",
1180 "DMIC4", "DMIC5", "DMIC6", "DMIC7"
1181};
1182
1183TX_MACRO_DAPM_ENUM_EXT(tx_dmic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1184 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1185 tx_macro_put_dec_enum);
1186
1187TX_MACRO_DAPM_ENUM_EXT(tx_dmic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1188 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1189 tx_macro_put_dec_enum);
1190
1191TX_MACRO_DAPM_ENUM_EXT(tx_dmic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1192 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1193 tx_macro_put_dec_enum);
1194
1195TX_MACRO_DAPM_ENUM_EXT(tx_dmic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1196 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1197 tx_macro_put_dec_enum);
1198
1199TX_MACRO_DAPM_ENUM_EXT(tx_dmic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1200 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1201 tx_macro_put_dec_enum);
1202
1203TX_MACRO_DAPM_ENUM_EXT(tx_dmic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1204 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1205 tx_macro_put_dec_enum);
1206
1207TX_MACRO_DAPM_ENUM_EXT(tx_dmic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1208 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1209 tx_macro_put_dec_enum);
1210
1211TX_MACRO_DAPM_ENUM_EXT(tx_dmic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1212 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1213 tx_macro_put_dec_enum);
1214
1215static const char * const smic_mux_text[] = {
Sudheer Papothi324b4952019-06-11 04:14:51 +05301216 "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", "SWR_DMIC0",
1217 "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", "SWR_DMIC4",
1218 "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7"
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301219};
1220
1221TX_MACRO_DAPM_ENUM_EXT(tx_smic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1222 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1223 tx_macro_put_dec_enum);
1224
1225TX_MACRO_DAPM_ENUM_EXT(tx_smic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1226 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1227 tx_macro_put_dec_enum);
1228
1229TX_MACRO_DAPM_ENUM_EXT(tx_smic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1230 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1231 tx_macro_put_dec_enum);
1232
1233TX_MACRO_DAPM_ENUM_EXT(tx_smic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1234 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1235 tx_macro_put_dec_enum);
1236
1237TX_MACRO_DAPM_ENUM_EXT(tx_smic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1238 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1239 tx_macro_put_dec_enum);
1240
1241TX_MACRO_DAPM_ENUM_EXT(tx_smic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1242 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1243 tx_macro_put_dec_enum);
1244
1245TX_MACRO_DAPM_ENUM_EXT(tx_smic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1246 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1247 tx_macro_put_dec_enum);
1248
1249TX_MACRO_DAPM_ENUM_EXT(tx_smic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1250 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1251 tx_macro_put_dec_enum);
1252
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301253static const char * const smic_mux_text_v2[] = {
1254 "ZERO", "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3",
1255 "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7",
1256 "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11"
1257};
1258
1259TX_MACRO_DAPM_ENUM_EXT(tx_smic0_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1260 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1261 tx_macro_put_dec_enum);
1262
1263TX_MACRO_DAPM_ENUM_EXT(tx_smic1_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1264 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1265 tx_macro_put_dec_enum);
1266
1267TX_MACRO_DAPM_ENUM_EXT(tx_smic2_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1268 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1269 tx_macro_put_dec_enum);
1270
1271TX_MACRO_DAPM_ENUM_EXT(tx_smic3_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1272 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1273 tx_macro_put_dec_enum);
1274
1275TX_MACRO_DAPM_ENUM_EXT(tx_smic4_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1276 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1277 tx_macro_put_dec_enum);
1278
1279TX_MACRO_DAPM_ENUM_EXT(tx_smic5_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1280 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1281 tx_macro_put_dec_enum);
1282
1283TX_MACRO_DAPM_ENUM_EXT(tx_smic6_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1284 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1285 tx_macro_put_dec_enum);
1286
1287TX_MACRO_DAPM_ENUM_EXT(tx_smic7_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1288 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1289 tx_macro_put_dec_enum);
1290
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07001291static const char * const dec_mode_mux_text[] = {
1292 "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF",
1293};
1294
1295static const struct soc_enum dec_mode_mux_enum =
1296 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dec_mode_mux_text),
1297 dec_mode_mux_text);
1298
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301299static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = {
1300 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1301 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1302 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1303 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1304 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1305 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1306 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1307 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1308 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1309 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1310 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1311 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1312 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1313 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1314 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1315 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1316};
1317
1318static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = {
1319 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1320 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1321 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1322 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1323 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1324 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1325 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1326 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1327 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1328 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1329 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1330 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1331 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1332 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1333 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1334 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1335};
1336
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001337static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = {
1338 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1339 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1340 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1341 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1342 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1343 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1344 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1345 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1346 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1347 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1348 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1349 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1350 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1351 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1352 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1353 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1354};
1355
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301356static const struct snd_kcontrol_new tx_aif1_cap_mixer_v2[] = {
1357 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1358 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1359 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1360 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1361 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1362 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1363 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1364 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1365};
1366
1367static const struct snd_kcontrol_new tx_aif2_cap_mixer_v2[] = {
1368 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1369 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1370 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1371 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1372 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1373 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1374 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1375 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1376};
1377
1378static const struct snd_kcontrol_new tx_aif3_cap_mixer_v2[] = {
1379 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1380 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1381 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1382 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1383 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1384 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1385 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1386 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1387};
1388
1389static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_common[] = {
1390 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1391 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1392
1393 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1394 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1395
1396 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1397 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1398
1399 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1400 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1401 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1402 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1403
1404 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0_v2),
1405 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1_v2),
1406 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2_v2),
1407 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3_v2),
1408
1409 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1410 tx_macro_enable_micbias,
1411 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1412 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1413 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1414 SND_SOC_DAPM_POST_PMD),
1415
1416 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1417 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1418 SND_SOC_DAPM_POST_PMD),
1419
1420 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1421 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1422 SND_SOC_DAPM_POST_PMD),
1423
1424 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1425 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1426 SND_SOC_DAPM_POST_PMD),
1427
1428 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
1429 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1430 SND_SOC_DAPM_POST_PMD),
1431
1432 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
1433 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1434 SND_SOC_DAPM_POST_PMD),
1435
1436 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
1437 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1438 SND_SOC_DAPM_POST_PMD),
1439
1440 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
1441 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1442 SND_SOC_DAPM_POST_PMD),
1443
1444 SND_SOC_DAPM_INPUT("TX SWR_MIC0"),
1445 SND_SOC_DAPM_INPUT("TX SWR_MIC1"),
1446 SND_SOC_DAPM_INPUT("TX SWR_MIC2"),
1447 SND_SOC_DAPM_INPUT("TX SWR_MIC3"),
1448 SND_SOC_DAPM_INPUT("TX SWR_MIC4"),
1449 SND_SOC_DAPM_INPUT("TX SWR_MIC5"),
1450 SND_SOC_DAPM_INPUT("TX SWR_MIC6"),
1451 SND_SOC_DAPM_INPUT("TX SWR_MIC7"),
1452 SND_SOC_DAPM_INPUT("TX SWR_MIC8"),
1453 SND_SOC_DAPM_INPUT("TX SWR_MIC9"),
1454 SND_SOC_DAPM_INPUT("TX SWR_MIC10"),
1455 SND_SOC_DAPM_INPUT("TX SWR_MIC11"),
1456
1457 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
1458 TX_MACRO_DEC0, 0,
1459 &tx_dec0_mux, tx_macro_enable_dec,
1460 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1461 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1462
1463 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
1464 TX_MACRO_DEC1, 0,
1465 &tx_dec1_mux, tx_macro_enable_dec,
1466 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1467 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1468
1469 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
1470 TX_MACRO_DEC2, 0,
1471 &tx_dec2_mux, tx_macro_enable_dec,
1472 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1473 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1474
1475 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
1476 TX_MACRO_DEC3, 0,
1477 &tx_dec3_mux, tx_macro_enable_dec,
1478 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1479 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1480
1481 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1482 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1483};
1484
1485static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v2[] = {
1486 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1487 TX_MACRO_AIF1_CAP, 0,
1488 tx_aif1_cap_mixer_v2, ARRAY_SIZE(tx_aif1_cap_mixer_v2)),
1489
1490 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1491 TX_MACRO_AIF2_CAP, 0,
1492 tx_aif2_cap_mixer_v2, ARRAY_SIZE(tx_aif2_cap_mixer_v2)),
1493
1494 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1495 TX_MACRO_AIF3_CAP, 0,
1496 tx_aif3_cap_mixer_v2, ARRAY_SIZE(tx_aif3_cap_mixer_v2)),
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301497};
1498
1499static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v3[] = {
1500 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1501 TX_MACRO_AIF1_CAP, 0,
1502 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1503
1504 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1505 TX_MACRO_AIF2_CAP, 0,
1506 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1507
1508 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1509 TX_MACRO_AIF3_CAP, 0,
1510 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1511
1512 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1513 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1514 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1515 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1516
1517 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4_v3),
1518 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5_v3),
1519 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6_v3),
1520 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7_v3),
1521
1522 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
1523 TX_MACRO_DEC4, 0,
1524 &tx_dec4_mux, tx_macro_enable_dec,
1525 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1526 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1527
1528 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
1529 TX_MACRO_DEC5, 0,
1530 &tx_dec5_mux, tx_macro_enable_dec,
1531 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1532 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1533
1534 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
1535 TX_MACRO_DEC6, 0,
1536 &tx_dec6_mux, tx_macro_enable_dec,
1537 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1538 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1539
1540 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
1541 TX_MACRO_DEC7, 0,
1542 &tx_dec7_mux, tx_macro_enable_dec,
1543 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1544 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1545
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05301546 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1547 tx_macro_tx_swr_clk_event,
1548 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1549
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301550 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1551 tx_macro_va_swr_clk_event,
1552 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1553};
1554
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301555static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
1556 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1557 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1558
1559 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1560 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1561
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001562 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1563 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1564
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301565 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
1566 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1567
1568 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
1569 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1570
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001571 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0,
1572 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1573
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301574
1575 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1576 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1577 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1578 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1579 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1580 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1581 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1582 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1583
1584 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0),
1585 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1),
1586 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2),
1587 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3),
1588 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4),
1589 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5),
1590 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6),
1591 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7),
1592
1593 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1594 tx_macro_enable_micbias,
1595 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1596 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1597 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1598 SND_SOC_DAPM_POST_PMD),
1599
1600 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1601 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1602 SND_SOC_DAPM_POST_PMD),
1603
1604 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1605 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1606 SND_SOC_DAPM_POST_PMD),
1607
1608 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1609 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1610 SND_SOC_DAPM_POST_PMD),
1611
1612 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
1613 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1614 SND_SOC_DAPM_POST_PMD),
1615
1616 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
1617 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1618 SND_SOC_DAPM_POST_PMD),
1619
1620 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
1621 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1622 SND_SOC_DAPM_POST_PMD),
1623
1624 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
1625 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1626 SND_SOC_DAPM_POST_PMD),
1627
1628 SND_SOC_DAPM_INPUT("TX SWR_ADC0"),
1629 SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
1630 SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
1631 SND_SOC_DAPM_INPUT("TX SWR_ADC3"),
1632 SND_SOC_DAPM_INPUT("TX SWR_DMIC0"),
1633 SND_SOC_DAPM_INPUT("TX SWR_DMIC1"),
1634 SND_SOC_DAPM_INPUT("TX SWR_DMIC2"),
1635 SND_SOC_DAPM_INPUT("TX SWR_DMIC3"),
1636 SND_SOC_DAPM_INPUT("TX SWR_DMIC4"),
1637 SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
1638 SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
1639 SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
1640
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301641 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301642 TX_MACRO_DEC0, 0,
1643 &tx_dec0_mux, tx_macro_enable_dec,
1644 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1645 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1646
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301647 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301648 TX_MACRO_DEC1, 0,
1649 &tx_dec1_mux, tx_macro_enable_dec,
1650 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1651 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1652
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301653 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301654 TX_MACRO_DEC2, 0,
1655 &tx_dec2_mux, tx_macro_enable_dec,
1656 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1657 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1658
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301659 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301660 TX_MACRO_DEC3, 0,
1661 &tx_dec3_mux, tx_macro_enable_dec,
1662 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1663 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1664
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301665 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301666 TX_MACRO_DEC4, 0,
1667 &tx_dec4_mux, tx_macro_enable_dec,
1668 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1669 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1670
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301671 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301672 TX_MACRO_DEC5, 0,
1673 &tx_dec5_mux, tx_macro_enable_dec,
1674 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1675 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1676
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301677 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301678 TX_MACRO_DEC6, 0,
1679 &tx_dec6_mux, tx_macro_enable_dec,
1680 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1681 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1682
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301683 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301684 TX_MACRO_DEC7, 0,
1685 &tx_dec7_mux, tx_macro_enable_dec,
1686 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1687 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1688
1689 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1690 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Sudheer Papothie456c2c2019-03-05 07:08:45 +05301691
1692 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1693 tx_macro_tx_swr_clk_event,
1694 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1695
1696 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1697 tx_macro_va_swr_clk_event,
1698 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301699};
1700
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301701static const struct snd_soc_dapm_route tx_audio_map_common[] = {
1702 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1703 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
1704 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
1705
1706 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1707 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
1708 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
1709
1710 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1711 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1712 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1713 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1714
1715 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1716 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1717 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1718 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1719
1720 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1721 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1722 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1723 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1724
1725 {"TX DEC0 MUX", NULL, "TX_MCLK"},
1726 {"TX DEC1 MUX", NULL, "TX_MCLK"},
1727 {"TX DEC2 MUX", NULL, "TX_MCLK"},
1728 {"TX DEC3 MUX", NULL, "TX_MCLK"},
1729
1730 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
1731 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
1732 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
1733 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
1734 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
1735 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
1736 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
1737 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
1738 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
1739
1740 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
1741 {"TX SMIC MUX0", "SWR_MIC0", "TX SWR_MIC0"},
1742 {"TX SMIC MUX0", "SWR_MIC1", "TX SWR_MIC1"},
1743 {"TX SMIC MUX0", "SWR_MIC2", "TX SWR_MIC2"},
1744 {"TX SMIC MUX0", "SWR_MIC3", "TX SWR_MIC3"},
1745 {"TX SMIC MUX0", "SWR_MIC4", "TX SWR_MIC4"},
1746 {"TX SMIC MUX0", "SWR_MIC5", "TX SWR_MIC5"},
1747 {"TX SMIC MUX0", "SWR_MIC6", "TX SWR_MIC6"},
1748 {"TX SMIC MUX0", "SWR_MIC7", "TX SWR_MIC7"},
1749 {"TX SMIC MUX0", "SWR_MIC8", "TX SWR_MIC8"},
1750 {"TX SMIC MUX0", "SWR_MIC9", "TX SWR_MIC9"},
1751 {"TX SMIC MUX0", "SWR_MIC10", "TX SWR_MIC10"},
1752 {"TX SMIC MUX0", "SWR_MIC11", "TX SWR_MIC11"},
1753
1754 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
1755 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
1756 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
1757 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
1758 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
1759 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
1760 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
1761 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
1762 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
1763
1764 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
1765 {"TX SMIC MUX1", "SWR_MIC0", "TX SWR_MIC0"},
1766 {"TX SMIC MUX1", "SWR_MIC1", "TX SWR_MIC1"},
1767 {"TX SMIC MUX1", "SWR_MIC2", "TX SWR_MIC2"},
1768 {"TX SMIC MUX1", "SWR_MIC3", "TX SWR_MIC3"},
1769 {"TX SMIC MUX1", "SWR_MIC4", "TX SWR_MIC4"},
1770 {"TX SMIC MUX1", "SWR_MIC5", "TX SWR_MIC5"},
1771 {"TX SMIC MUX1", "SWR_MIC6", "TX SWR_MIC6"},
1772 {"TX SMIC MUX1", "SWR_MIC7", "TX SWR_MIC7"},
1773 {"TX SMIC MUX1", "SWR_MIC8", "TX SWR_MIC8"},
1774 {"TX SMIC MUX1", "SWR_MIC9", "TX SWR_MIC9"},
1775 {"TX SMIC MUX1", "SWR_MIC10", "TX SWR_MIC10"},
1776 {"TX SMIC MUX1", "SWR_MIC11", "TX SWR_MIC11"},
1777
1778 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
1779 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
1780 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
1781 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
1782 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
1783 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
1784 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
1785 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
1786 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
1787
1788 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
1789 {"TX SMIC MUX2", "SWR_MIC0", "TX SWR_MIC0"},
1790 {"TX SMIC MUX2", "SWR_MIC1", "TX SWR_MIC1"},
1791 {"TX SMIC MUX2", "SWR_MIC2", "TX SWR_MIC2"},
1792 {"TX SMIC MUX2", "SWR_MIC3", "TX SWR_MIC3"},
1793 {"TX SMIC MUX2", "SWR_MIC4", "TX SWR_MIC4"},
1794 {"TX SMIC MUX2", "SWR_MIC5", "TX SWR_MIC5"},
1795 {"TX SMIC MUX2", "SWR_MIC6", "TX SWR_MIC6"},
1796 {"TX SMIC MUX2", "SWR_MIC7", "TX SWR_MIC7"},
1797 {"TX SMIC MUX2", "SWR_MIC8", "TX SWR_MIC8"},
1798 {"TX SMIC MUX2", "SWR_MIC9", "TX SWR_MIC9"},
1799 {"TX SMIC MUX2", "SWR_MIC10", "TX SWR_MIC10"},
1800 {"TX SMIC MUX2", "SWR_MIC11", "TX SWR_MIC11"},
1801
1802 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
1803 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
1804 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
1805 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
1806 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
1807 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
1808 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
1809 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
1810 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
1811
1812 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
1813 {"TX SMIC MUX3", "SWR_MIC0", "TX SWR_MIC0"},
1814 {"TX SMIC MUX3", "SWR_MIC1", "TX SWR_MIC1"},
1815 {"TX SMIC MUX3", "SWR_MIC2", "TX SWR_MIC2"},
1816 {"TX SMIC MUX3", "SWR_MIC3", "TX SWR_MIC3"},
1817 {"TX SMIC MUX3", "SWR_MIC4", "TX SWR_MIC4"},
1818 {"TX SMIC MUX3", "SWR_MIC5", "TX SWR_MIC5"},
1819 {"TX SMIC MUX3", "SWR_MIC6", "TX SWR_MIC6"},
1820 {"TX SMIC MUX3", "SWR_MIC7", "TX SWR_MIC7"},
1821 {"TX SMIC MUX3", "SWR_MIC8", "TX SWR_MIC8"},
1822 {"TX SMIC MUX3", "SWR_MIC9", "TX SWR_MIC9"},
1823 {"TX SMIC MUX3", "SWR_MIC10", "TX SWR_MIC10"},
1824 {"TX SMIC MUX3", "SWR_MIC11", "TX SWR_MIC11"},
1825};
1826
1827static const struct snd_soc_dapm_route tx_audio_map_v3[] = {
1828 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1829 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1830 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1831 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1832
1833 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1834 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1835 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1836 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1837
1838 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1839 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1840 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1841 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1842
1843 {"TX DEC4 MUX", NULL, "TX_MCLK"},
1844 {"TX DEC5 MUX", NULL, "TX_MCLK"},
1845 {"TX DEC6 MUX", NULL, "TX_MCLK"},
1846 {"TX DEC7 MUX", NULL, "TX_MCLK"},
1847
1848 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
1849 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
1850 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
1851 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
1852 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
1853 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
1854 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
1855 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
1856 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
1857
1858 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
1859 {"TX SMIC MUX4", "SWR_MIC0", "TX SWR_MIC0"},
1860 {"TX SMIC MUX4", "SWR_MIC1", "TX SWR_MIC1"},
1861 {"TX SMIC MUX4", "SWR_MIC2", "TX SWR_MIC2"},
1862 {"TX SMIC MUX4", "SWR_MIC3", "TX SWR_MIC3"},
1863 {"TX SMIC MUX4", "SWR_MIC4", "TX SWR_MIC4"},
1864 {"TX SMIC MUX4", "SWR_MIC5", "TX SWR_MIC5"},
1865 {"TX SMIC MUX4", "SWR_MIC6", "TX SWR_MIC6"},
1866 {"TX SMIC MUX4", "SWR_MIC7", "TX SWR_MIC7"},
1867 {"TX SMIC MUX4", "SWR_MIC8", "TX SWR_MIC8"},
1868 {"TX SMIC MUX4", "SWR_MIC9", "TX SWR_MIC9"},
1869 {"TX SMIC MUX4", "SWR_MIC10", "TX SWR_MIC10"},
1870 {"TX SMIC MUX4", "SWR_MIC11", "TX SWR_MIC11"},
1871
1872 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
1873 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
1874 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
1875 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
1876 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
1877 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
1878 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
1879 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
1880 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
1881
1882 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
1883 {"TX SMIC MUX5", "SWR_MIC0", "TX SWR_MIC0"},
1884 {"TX SMIC MUX5", "SWR_MIC1", "TX SWR_MIC1"},
1885 {"TX SMIC MUX5", "SWR_MIC2", "TX SWR_MIC2"},
1886 {"TX SMIC MUX5", "SWR_MIC3", "TX SWR_MIC3"},
1887 {"TX SMIC MUX5", "SWR_MIC4", "TX SWR_MIC4"},
1888 {"TX SMIC MUX5", "SWR_MIC5", "TX SWR_MIC5"},
1889 {"TX SMIC MUX5", "SWR_MIC6", "TX SWR_MIC6"},
1890 {"TX SMIC MUX5", "SWR_MIC7", "TX SWR_MIC7"},
1891 {"TX SMIC MUX5", "SWR_MIC8", "TX SWR_MIC8"},
1892 {"TX SMIC MUX5", "SWR_MIC9", "TX SWR_MIC9"},
1893 {"TX SMIC MUX5", "SWR_MIC10", "TX SWR_MIC10"},
1894 {"TX SMIC MUX5", "SWR_MIC11", "TX SWR_MIC11"},
1895
1896 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
1897 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
1898 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
1899 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
1900 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
1901 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
1902 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
1903 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
1904 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
1905
1906 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
1907 {"TX SMIC MUX6", "SWR_MIC0", "TX SWR_MIC0"},
1908 {"TX SMIC MUX6", "SWR_MIC1", "TX SWR_MIC1"},
1909 {"TX SMIC MUX6", "SWR_MIC2", "TX SWR_MIC2"},
1910 {"TX SMIC MUX6", "SWR_MIC3", "TX SWR_MIC3"},
1911 {"TX SMIC MUX6", "SWR_MIC4", "TX SWR_MIC4"},
1912 {"TX SMIC MUX6", "SWR_MIC5", "TX SWR_MIC5"},
1913 {"TX SMIC MUX6", "SWR_MIC6", "TX SWR_MIC6"},
1914 {"TX SMIC MUX6", "SWR_MIC7", "TX SWR_MIC7"},
1915 {"TX SMIC MUX6", "SWR_MIC8", "TX SWR_MIC8"},
1916 {"TX SMIC MUX6", "SWR_MIC9", "TX SWR_MIC9"},
1917 {"TX SMIC MUX6", "SWR_MIC10", "TX SWR_MIC10"},
1918 {"TX SMIC MUX6", "SWR_MIC11", "TX SWR_MIC11"},
1919
1920 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
1921 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
1922 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
1923 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
1924 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
1925 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
1926 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
1927 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
1928 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
1929
1930 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
1931 {"TX SMIC MUX7", "SWR_MIC0", "TX SWR_MIC0"},
1932 {"TX SMIC MUX7", "SWR_MIC1", "TX SWR_MIC1"},
1933 {"TX SMIC MUX7", "SWR_MIC2", "TX SWR_MIC2"},
1934 {"TX SMIC MUX7", "SWR_MIC3", "TX SWR_MIC3"},
1935 {"TX SMIC MUX7", "SWR_MIC4", "TX SWR_MIC4"},
1936 {"TX SMIC MUX7", "SWR_MIC5", "TX SWR_MIC5"},
1937 {"TX SMIC MUX7", "SWR_MIC6", "TX SWR_MIC6"},
1938 {"TX SMIC MUX7", "SWR_MIC7", "TX SWR_MIC7"},
1939 {"TX SMIC MUX7", "SWR_MIC8", "TX SWR_MIC8"},
1940 {"TX SMIC MUX7", "SWR_MIC9", "TX SWR_MIC9"},
1941 {"TX SMIC MUX7", "SWR_MIC10", "TX SWR_MIC10"},
1942 {"TX SMIC MUX7", "SWR_MIC11", "TX SWR_MIC11"},
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05301943
1944 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
1945 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
1946 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
1947 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
1948 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
1949 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
1950 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
1951 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301952};
1953
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301954static const struct snd_soc_dapm_route tx_audio_map[] = {
1955 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1956 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001957 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301958
1959 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1960 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001961 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301962
1963 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1964 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1965 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1966 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1967 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1968 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1969 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1970 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1971
1972 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1973 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1974 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1975 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1976 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1977 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1978 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1979 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1980
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001981 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1982 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1983 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1984 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1985 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1986 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1987 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1988 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1989
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05301990 {"TX DEC0 MUX", NULL, "TX_MCLK"},
1991 {"TX DEC1 MUX", NULL, "TX_MCLK"},
1992 {"TX DEC2 MUX", NULL, "TX_MCLK"},
1993 {"TX DEC3 MUX", NULL, "TX_MCLK"},
1994 {"TX DEC4 MUX", NULL, "TX_MCLK"},
1995 {"TX DEC5 MUX", NULL, "TX_MCLK"},
1996 {"TX DEC6 MUX", NULL, "TX_MCLK"},
1997 {"TX DEC7 MUX", NULL, "TX_MCLK"},
1998
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301999 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
2000 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
2001 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
2002 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
2003 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
2004 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
2005 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
2006 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
2007 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
2008
2009 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302010 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302011 {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
2012 {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"},
2013 {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"},
2014 {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"},
2015 {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"},
2016 {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"},
2017 {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"},
2018 {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"},
2019 {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"},
2020 {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"},
2021 {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
2022 {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
2023
2024 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
2025 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
2026 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
2027 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
2028 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
2029 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
2030 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
2031 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
2032 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
2033
2034 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302035 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302036 {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
2037 {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"},
2038 {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"},
2039 {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"},
2040 {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"},
2041 {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"},
2042 {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"},
2043 {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"},
2044 {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"},
2045 {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"},
2046 {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
2047 {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
2048
2049 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
2050 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
2051 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
2052 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
2053 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
2054 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
2055 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
2056 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
2057 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
2058
2059 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302060 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302061 {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
2062 {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"},
2063 {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"},
2064 {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"},
2065 {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"},
2066 {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"},
2067 {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"},
2068 {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"},
2069 {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"},
2070 {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"},
2071 {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
2072 {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
2073
2074 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
2075 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
2076 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
2077 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
2078 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
2079 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
2080 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
2081 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
2082 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
2083
2084 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302085 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302086 {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
2087 {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"},
2088 {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"},
2089 {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"},
2090 {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"},
2091 {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"},
2092 {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"},
2093 {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"},
2094 {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"},
2095 {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"},
2096 {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
2097 {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
2098
2099 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
2100 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
2101 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
2102 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
2103 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
2104 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
2105 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
2106 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
2107 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
2108
2109 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302110 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302111 {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
2112 {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"},
2113 {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"},
2114 {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"},
2115 {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"},
2116 {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"},
2117 {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"},
2118 {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"},
2119 {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"},
2120 {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"},
2121 {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
2122 {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
2123
2124 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
2125 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
2126 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
2127 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
2128 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
2129 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
2130 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
2131 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
2132 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
2133
2134 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302135 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302136 {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
2137 {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"},
2138 {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"},
2139 {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"},
2140 {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"},
2141 {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"},
2142 {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"},
2143 {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"},
2144 {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"},
2145 {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"},
2146 {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
2147 {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
2148
2149 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
2150 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
2151 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
2152 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
2153 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
2154 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
2155 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
2156 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
2157 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
2158
2159 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302160 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302161 {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
2162 {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"},
2163 {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"},
2164 {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"},
2165 {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"},
2166 {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"},
2167 {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"},
2168 {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"},
2169 {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"},
2170 {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"},
2171 {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
2172 {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
2173
2174 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
2175 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
2176 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
2177 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
2178 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
2179 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
2180 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
2181 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
2182 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
2183
2184 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302185 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302186 {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},
2187 {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"},
2188 {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"},
2189 {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"},
2190 {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"},
2191 {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"},
2192 {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"},
2193 {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"},
2194 {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"},
2195 {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"},
2196 {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"},
2197 {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"},
2198};
2199
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302200static const struct snd_kcontrol_new tx_macro_snd_controls_common[] = {
2201 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2202 BOLERO_CDC_TX0_TX_VOL_CTL,
2203 0, -84, 40, digital_gain),
2204 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2205 BOLERO_CDC_TX1_TX_VOL_CTL,
2206 0, -84, 40, digital_gain),
2207 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2208 BOLERO_CDC_TX2_TX_VOL_CTL,
2209 0, -84, 40, digital_gain),
2210 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2211 BOLERO_CDC_TX3_TX_VOL_CTL,
2212 0, -84, 40, digital_gain),
2213
2214 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2215 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2216
2217 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2218 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2219
2220 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2221 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2222
2223 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2224 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2225
2226 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2227 tx_macro_get_bcs, tx_macro_set_bcs),
2228};
2229
2230static const struct snd_kcontrol_new tx_macro_snd_controls_v3[] = {
2231 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2232 BOLERO_CDC_TX4_TX_VOL_CTL,
2233 0, -84, 40, digital_gain),
2234 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2235 BOLERO_CDC_TX5_TX_VOL_CTL,
2236 0, -84, 40, digital_gain),
2237 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2238 BOLERO_CDC_TX6_TX_VOL_CTL,
2239 0, -84, 40, digital_gain),
2240 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2241 BOLERO_CDC_TX7_TX_VOL_CTL,
2242 0, -84, 40, digital_gain),
2243
2244 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2245 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2246
2247 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2248 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2249
2250 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2251 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2252
2253 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2254 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2255};
2256
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302257static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
2258 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2259 BOLERO_CDC_TX0_TX_VOL_CTL,
2260 0, -84, 40, digital_gain),
2261 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2262 BOLERO_CDC_TX1_TX_VOL_CTL,
2263 0, -84, 40, digital_gain),
2264 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2265 BOLERO_CDC_TX2_TX_VOL_CTL,
2266 0, -84, 40, digital_gain),
2267 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2268 BOLERO_CDC_TX3_TX_VOL_CTL,
2269 0, -84, 40, digital_gain),
2270 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2271 BOLERO_CDC_TX4_TX_VOL_CTL,
2272 0, -84, 40, digital_gain),
2273 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2274 BOLERO_CDC_TX5_TX_VOL_CTL,
2275 0, -84, 40, digital_gain),
2276 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2277 BOLERO_CDC_TX6_TX_VOL_CTL,
2278 0, -84, 40, digital_gain),
2279 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2280 BOLERO_CDC_TX7_TX_VOL_CTL,
2281 0, -84, 40, digital_gain),
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002282
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07002283 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2284 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2285
2286 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2287 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2288
2289 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2290 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2291
2292 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2293 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2294
2295 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2296 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2297
2298 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2299 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2300
2301 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2302 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2303
2304 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2305 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2306
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002307 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2308 tx_macro_get_bcs, tx_macro_set_bcs),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302309};
2310
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302311static int tx_macro_register_event_listener(struct snd_soc_component *component,
2312 bool enable)
2313{
2314 struct device *tx_dev = NULL;
2315 struct tx_macro_priv *tx_priv = NULL;
2316 int ret = 0;
2317
2318 if (!component)
2319 return -EINVAL;
2320
2321 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2322 if (!tx_dev) {
2323 dev_err(component->dev,
2324 "%s: null device for macro!\n", __func__);
2325 return -EINVAL;
2326 }
2327 tx_priv = dev_get_drvdata(tx_dev);
2328 if (!tx_priv) {
2329 dev_err(component->dev,
2330 "%s: priv is null for macro!\n", __func__);
2331 return -EINVAL;
2332 }
Sudheer Papothifc3adb02019-11-24 10:14:21 +05302333 if (tx_priv->swr_ctrl_data && !tx_priv->tx_swr_clk_cnt) {
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302334 if (enable) {
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302335 ret = swrm_wcd_notify(
2336 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
2337 SWR_REGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302338 msm_cdc_pinctrl_set_wakeup_capable(
2339 tx_priv->tx_swr_gpio_p, false);
2340 } else {
2341 msm_cdc_pinctrl_set_wakeup_capable(
2342 tx_priv->tx_swr_gpio_p, true);
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302343 ret = swrm_wcd_notify(
2344 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
2345 SWR_DEREGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302346 }
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302347 }
2348
2349 return ret;
2350}
2351
Sudheer Papothia7397942019-03-19 03:14:23 +05302352static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
2353 struct regmap *regmap, int clk_type,
2354 bool enable)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302355{
Meng Wang69b55c82019-05-29 11:04:29 +08002356 int ret = 0, clk_tx_ret = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302357
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302358 dev_dbg(tx_priv->dev,
2359 "%s: clock type %s, enable: %s tx_mclk_users: %d\n",
Sudheer Papothia7397942019-03-19 03:14:23 +05302360 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302361 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Tanya Dixit8530fb92018-09-14 16:01:25 +05302362
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302363 if (enable) {
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002364 if (tx_priv->swr_clk_users == 0) {
2365 ret = msm_cdc_pinctrl_select_active_state(
Karthikeyan Mani01f1ba42019-02-26 18:48:15 -08002366 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002367 if (ret < 0) {
2368 dev_err_ratelimited(tx_priv->dev,
2369 "%s: tx swr pinctrl enable failed\n",
2370 __func__);
2371 goto exit;
2372 }
2373 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302374
Meng Wang69b55c82019-05-29 11:04:29 +08002375 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302376 TX_CORE_CLK,
2377 TX_CORE_CLK,
2378 true);
2379 if (clk_type == TX_MCLK) {
2380 ret = tx_macro_mclk_enable(tx_priv, 1);
2381 if (ret < 0) {
2382 if (tx_priv->swr_clk_users == 0)
2383 msm_cdc_pinctrl_select_sleep_state(
2384 tx_priv->tx_swr_gpio_p);
2385 dev_err_ratelimited(tx_priv->dev,
2386 "%s: request clock enable failed\n",
2387 __func__);
2388 goto done;
2389 }
2390 }
2391 if (clk_type == VA_MCLK) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302392 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2393 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302394 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302395 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302396 if (ret < 0) {
2397 if (tx_priv->swr_clk_users == 0)
Sudheer Papothia7397942019-03-19 03:14:23 +05302398 msm_cdc_pinctrl_select_sleep_state(
2399 tx_priv->tx_swr_gpio_p);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302400 dev_err_ratelimited(tx_priv->dev,
2401 "%s: swr request clk failed\n",
2402 __func__);
2403 goto done;
Sudheer Papothia7397942019-03-19 03:14:23 +05302404 }
Sudheer Papothi296867b2019-06-20 09:24:09 +05302405 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
2406 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302407 if (tx_priv->tx_mclk_users == 0) {
2408 regmap_update_bits(regmap,
2409 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK,
2410 0x01, 0x01);
2411 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002412 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302413 0x01, 0x01);
2414 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002415 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302416 0x01, 0x01);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302417 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002418 tx_priv->tx_mclk_users++;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302419 }
2420 if (tx_priv->swr_clk_users == 0) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302421 dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n",
2422 __func__, tx_priv->reset_swr);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302423 if (tx_priv->reset_swr)
2424 regmap_update_bits(regmap,
2425 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2426 0x02, 0x02);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302427 regmap_update_bits(regmap,
2428 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2429 0x01, 0x01);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302430 if (tx_priv->reset_swr)
2431 regmap_update_bits(regmap,
2432 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2433 0x02, 0x00);
2434 tx_priv->reset_swr = false;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302435 }
Meng Wang69b55c82019-05-29 11:04:29 +08002436 if (!clk_tx_ret)
2437 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302438 TX_CORE_CLK,
2439 TX_CORE_CLK,
2440 false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302441 tx_priv->swr_clk_users++;
2442 } else {
2443 if (tx_priv->swr_clk_users <= 0) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302444 dev_err_ratelimited(tx_priv->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302445 "tx swrm clock users already 0\n");
2446 tx_priv->swr_clk_users = 0;
Sudheer Papothia7397942019-03-19 03:14:23 +05302447 return 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302448 }
Meng Wang69b55c82019-05-29 11:04:29 +08002449 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302450 TX_CORE_CLK,
2451 TX_CORE_CLK,
2452 true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302453 tx_priv->swr_clk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302454 if (tx_priv->swr_clk_users == 0)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302455 regmap_update_bits(regmap,
2456 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2457 0x01, 0x00);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302458 if (clk_type == TX_MCLK)
2459 tx_macro_mclk_enable(tx_priv, 0);
2460 if (clk_type == VA_MCLK) {
Meng Wang52a8fb12019-12-12 20:36:05 +08002461 if (tx_priv->tx_mclk_users <= 0) {
2462 dev_err(tx_priv->dev, "%s: clock already disabled\n",
2463 __func__);
2464 tx_priv->tx_mclk_users = 0;
2465 goto tx_clk;
2466 }
2467 tx_priv->tx_mclk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302468 if (tx_priv->tx_mclk_users == 0) {
2469 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002470 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302471 0x01, 0x00);
2472 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002473 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302474 0x01, 0x00);
Sudheer Papothia7397942019-03-19 03:14:23 +05302475 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002476
Sudheer Papothi296867b2019-06-20 09:24:09 +05302477 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
Meng Wang52a8fb12019-12-12 20:36:05 +08002478 false);
Sudheer Papothia7397942019-03-19 03:14:23 +05302479 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2480 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302481 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302482 false);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302483 if (ret < 0) {
2484 dev_err_ratelimited(tx_priv->dev,
2485 "%s: swr request clk failed\n",
2486 __func__);
2487 goto done;
2488 }
2489 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002490tx_clk:
Meng Wang69b55c82019-05-29 11:04:29 +08002491 if (!clk_tx_ret)
2492 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302493 TX_CORE_CLK,
2494 TX_CORE_CLK,
2495 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002496 if (tx_priv->swr_clk_users == 0) {
2497 ret = msm_cdc_pinctrl_select_sleep_state(
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302498 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002499 if (ret < 0) {
2500 dev_err_ratelimited(tx_priv->dev,
2501 "%s: tx swr pinctrl disable failed\n",
2502 __func__);
2503 goto exit;
2504 }
2505 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302506 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302507 return 0;
2508
2509done:
Meng Wang69b55c82019-05-29 11:04:29 +08002510 if (!clk_tx_ret)
2511 bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothia7397942019-03-19 03:14:23 +05302512 TX_CORE_CLK,
2513 TX_CORE_CLK,
2514 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002515exit:
Sudheer Papothia7397942019-03-19 03:14:23 +05302516 return ret;
2517}
2518
Sudheer Papothid50a5812019-11-21 07:24:42 +05302519static int tx_macro_clk_div_get(struct snd_soc_component *component)
2520{
2521 struct device *tx_dev = NULL;
2522 struct tx_macro_priv *tx_priv = NULL;
2523
2524 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
2525 return -EINVAL;
2526
2527 return tx_priv->dmic_clk_div;
2528}
2529
Sudheer Papothif4155002019-12-05 01:36:13 +05302530static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src)
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302531{
2532 struct device *tx_dev = NULL;
2533 struct tx_macro_priv *tx_priv = NULL;
2534 int ret = 0;
2535
2536 if (!component)
2537 return -EINVAL;
2538
2539 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2540 if (!tx_dev) {
2541 dev_err(component->dev,
2542 "%s: null device for macro!\n", __func__);
2543 return -EINVAL;
2544 }
2545 tx_priv = dev_get_drvdata(tx_dev);
2546 if (!tx_priv) {
2547 dev_err(component->dev,
2548 "%s: priv is null for macro!\n", __func__);
2549 return -EINVAL;
2550 }
2551 if (tx_priv->swr_ctrl_data) {
2552 ret = swrm_wcd_notify(
2553 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Sudheer Papothif4155002019-12-05 01:36:13 +05302554 SWR_REQ_CLK_SWITCH, &clk_src);
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302555 }
2556
2557 return ret;
2558}
2559
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002560static int tx_macro_core_vote(void *handle, bool enable)
2561{
2562 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002563
2564 if (tx_priv == NULL) {
2565 pr_err("%s: tx priv data is NULL\n", __func__);
2566 return -EINVAL;
2567 }
2568 if (enable) {
2569 pm_runtime_get_sync(tx_priv->dev);
2570 pm_runtime_put_autosuspend(tx_priv->dev);
2571 pm_runtime_mark_last_busy(tx_priv->dev);
2572 }
2573
Aditya Bavanarid577af92019-10-03 21:09:19 +05302574 if (bolero_check_core_votes(tx_priv->dev))
2575 return 0;
2576 else
2577 return -EINVAL;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002578}
2579
Sudheer Papothia7397942019-03-19 03:14:23 +05302580static int tx_macro_swrm_clock(void *handle, bool enable)
2581{
2582 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
2583 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
2584 int ret = 0;
2585
2586 if (regmap == NULL) {
2587 dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__);
2588 return -EINVAL;
2589 }
2590
2591 mutex_lock(&tx_priv->swr_clk_lock);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302592 dev_dbg(tx_priv->dev,
2593 "%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2594 __func__, (enable ? "enable" : "disable"),
2595 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothia7397942019-03-19 03:14:23 +05302596
2597 if (enable) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302598 pm_runtime_get_sync(tx_priv->dev);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302599 if (tx_priv->va_swr_clk_cnt && !tx_priv->tx_swr_clk_cnt) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302600 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2601 VA_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002602 if (ret) {
2603 pm_runtime_mark_last_busy(tx_priv->dev);
2604 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302605 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002606 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302607 tx_priv->va_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302608 } else {
Sudheer Papothia7397942019-03-19 03:14:23 +05302609 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2610 TX_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002611 if (ret) {
2612 pm_runtime_mark_last_busy(tx_priv->dev);
2613 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302614 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002615 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302616 tx_priv->tx_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302617 }
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302618 pm_runtime_mark_last_busy(tx_priv->dev);
2619 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302620 } else {
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302621 if (tx_priv->va_clk_status && !tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302622 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2623 VA_MCLK, enable);
2624 if (ret)
2625 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302626 --tx_priv->va_clk_status;
2627 } else if (!tx_priv->va_clk_status && tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302628 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2629 TX_MCLK, enable);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302630 if (ret)
2631 goto done;
2632 --tx_priv->tx_clk_status;
2633 } else if (tx_priv->va_clk_status && tx_priv->tx_clk_status) {
2634 if (!tx_priv->va_swr_clk_cnt && tx_priv->tx_swr_clk_cnt) {
2635 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2636 VA_MCLK, enable);
Sudheer Papothia7397942019-03-19 03:14:23 +05302637 if (ret)
2638 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302639 --tx_priv->va_clk_status;
2640 } else {
2641 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2642 TX_MCLK, enable);
2643 if (ret)
2644 goto done;
2645 --tx_priv->tx_clk_status;
Sudheer Papothia7397942019-03-19 03:14:23 +05302646 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302647
2648 } else {
2649 dev_dbg(tx_priv->dev,
2650 "%s: Both clocks are disabled\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302651 }
2652 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302653
2654 dev_dbg(tx_priv->dev,
2655 "%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2656 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2657 tx_priv->va_clk_status);
Sudheer Papothia7397942019-03-19 03:14:23 +05302658done:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302659 mutex_unlock(&tx_priv->swr_clk_lock);
2660 return ret;
2661}
2662
2663static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate,
2664 struct tx_macro_priv *tx_priv)
2665{
2666 u32 div_factor = TX_MACRO_CLK_DIV_2;
2667 u32 mclk_rate = TX_MACRO_MCLK_FREQ;
2668
2669 if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED ||
2670 mclk_rate % dmic_sample_rate != 0)
2671 goto undefined_rate;
2672
2673 div_factor = mclk_rate / dmic_sample_rate;
2674
2675 switch (div_factor) {
2676 case 2:
2677 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
2678 break;
2679 case 3:
2680 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_3;
2681 break;
2682 case 4:
2683 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_4;
2684 break;
2685 case 6:
2686 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_6;
2687 break;
2688 case 8:
2689 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_8;
2690 break;
2691 case 16:
2692 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_16;
2693 break;
2694 default:
2695 /* Any other DIV factor is invalid */
2696 goto undefined_rate;
2697 }
2698
2699 /* Valid dmic DIV factors */
2700 dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n",
2701 __func__, div_factor, mclk_rate);
2702
2703 return dmic_sample_rate;
2704
2705undefined_rate:
2706 dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n",
2707 __func__, dmic_sample_rate, mclk_rate);
2708 dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED;
2709
2710 return dmic_sample_rate;
2711}
2712
Sudheer Papothi72fef482019-08-30 11:00:20 +05302713static const struct tx_macro_reg_mask_val tx_macro_reg_init[] = {
Vatsal Bucha126be652019-09-11 11:32:55 +05302714 {BOLERO_CDC_TX0_TX_PATH_SEC7, 0x3F, 0x02},
Sudheer Papothi72fef482019-08-30 11:00:20 +05302715};
2716
Meng Wang15c825d2018-09-06 10:49:18 +08002717static int tx_macro_init(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302718{
Meng Wang15c825d2018-09-06 10:49:18 +08002719 struct snd_soc_dapm_context *dapm =
2720 snd_soc_component_get_dapm(component);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302721 int ret = 0, i = 0;
2722 struct device *tx_dev = NULL;
2723 struct tx_macro_priv *tx_priv = NULL;
2724
Meng Wang15c825d2018-09-06 10:49:18 +08002725 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302726 if (!tx_dev) {
Meng Wang15c825d2018-09-06 10:49:18 +08002727 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302728 "%s: null device for macro!\n", __func__);
2729 return -EINVAL;
2730 }
2731 tx_priv = dev_get_drvdata(tx_dev);
2732 if (!tx_priv) {
Meng Wang15c825d2018-09-06 10:49:18 +08002733 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302734 "%s: priv is null for macro!\n", __func__);
2735 return -EINVAL;
2736 }
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302737 tx_priv->version = bolero_get_version(tx_dev);
2738 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2739 ret = snd_soc_dapm_new_controls(dapm,
2740 tx_macro_dapm_widgets_common,
2741 ARRAY_SIZE(tx_macro_dapm_widgets_common));
2742 if (ret < 0) {
2743 dev_err(tx_dev, "%s: Failed to add controls\n",
2744 __func__);
2745 return ret;
2746 }
2747 if (tx_priv->version == BOLERO_VERSION_2_1)
2748 ret = snd_soc_dapm_new_controls(dapm,
2749 tx_macro_dapm_widgets_v2,
2750 ARRAY_SIZE(tx_macro_dapm_widgets_v2));
2751 else if (tx_priv->version == BOLERO_VERSION_2_0)
2752 ret = snd_soc_dapm_new_controls(dapm,
2753 tx_macro_dapm_widgets_v3,
2754 ARRAY_SIZE(tx_macro_dapm_widgets_v3));
2755 if (ret < 0) {
2756 dev_err(tx_dev, "%s: Failed to add controls\n",
2757 __func__);
2758 return ret;
2759 }
2760 } else {
2761 ret = snd_soc_dapm_new_controls(dapm, tx_macro_dapm_widgets,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302762 ARRAY_SIZE(tx_macro_dapm_widgets));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302763 if (ret < 0) {
2764 dev_err(tx_dev, "%s: Failed to add controls\n",
2765 __func__);
2766 return ret;
2767 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302768 }
2769
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302770 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2771 ret = snd_soc_dapm_add_routes(dapm,
2772 tx_audio_map_common,
2773 ARRAY_SIZE(tx_audio_map_common));
2774 if (ret < 0) {
2775 dev_err(tx_dev, "%s: Failed to add routes\n",
2776 __func__);
2777 return ret;
2778 }
2779 if (tx_priv->version == BOLERO_VERSION_2_0)
2780 ret = snd_soc_dapm_add_routes(dapm,
2781 tx_audio_map_v3,
2782 ARRAY_SIZE(tx_audio_map_v3));
2783 if (ret < 0) {
2784 dev_err(tx_dev, "%s: Failed to add routes\n",
2785 __func__);
2786 return ret;
2787 }
2788 } else {
2789 ret = snd_soc_dapm_add_routes(dapm, tx_audio_map,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302790 ARRAY_SIZE(tx_audio_map));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302791 if (ret < 0) {
2792 dev_err(tx_dev, "%s: Failed to add routes\n",
2793 __func__);
2794 return ret;
2795 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302796 }
2797
2798 ret = snd_soc_dapm_new_widgets(dapm->card);
2799 if (ret < 0) {
2800 dev_err(tx_dev, "%s: Failed to add widgets\n", __func__);
2801 return ret;
2802 }
2803
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302804 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2805 ret = snd_soc_add_component_controls(component,
2806 tx_macro_snd_controls_common,
2807 ARRAY_SIZE(tx_macro_snd_controls_common));
2808 if (ret < 0) {
2809 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2810 __func__);
2811 return ret;
2812 }
2813 if (tx_priv->version == BOLERO_VERSION_2_0)
2814 ret = snd_soc_add_component_controls(component,
2815 tx_macro_snd_controls_v3,
2816 ARRAY_SIZE(tx_macro_snd_controls_v3));
2817 if (ret < 0) {
2818 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2819 __func__);
2820 return ret;
2821 }
2822 } else {
2823 ret = snd_soc_add_component_controls(component,
2824 tx_macro_snd_controls,
2825 ARRAY_SIZE(tx_macro_snd_controls));
2826 if (ret < 0) {
2827 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2828 __func__);
2829 return ret;
2830 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302831 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302832
2833 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF1 Capture");
2834 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF2 Capture");
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002835 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF3 Capture");
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302836 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2837 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC0");
2838 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC1");
2839 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC2");
2840 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC3");
2841 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC4");
2842 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC5");
2843 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC6");
2844 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC7");
2845 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC8");
2846 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC9");
2847 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC10");
2848 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC11");
2849 } else {
2850 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC0");
2851 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1");
2852 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2");
2853 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC3");
2854 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC0");
2855 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC1");
2856 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC2");
2857 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC3");
2858 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC4");
2859 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC5");
2860 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC6");
2861 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC7");
2862 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302863 snd_soc_dapm_sync(dapm);
2864
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302865 for (i = 0; i < NUM_DECIMATORS; i++) {
2866 tx_priv->tx_hpf_work[i].tx_priv = tx_priv;
2867 tx_priv->tx_hpf_work[i].decimator = i;
2868 INIT_DELAYED_WORK(&tx_priv->tx_hpf_work[i].dwork,
2869 tx_macro_tx_hpf_corner_freq_callback);
2870 }
2871
2872 for (i = 0; i < NUM_DECIMATORS; i++) {
2873 tx_priv->tx_mute_dwork[i].tx_priv = tx_priv;
2874 tx_priv->tx_mute_dwork[i].decimator = i;
2875 INIT_DELAYED_WORK(&tx_priv->tx_mute_dwork[i].dwork,
2876 tx_macro_mute_update_callback);
2877 }
Meng Wang15c825d2018-09-06 10:49:18 +08002878 tx_priv->component = component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302879
Sudheer Papothi72fef482019-08-30 11:00:20 +05302880 for (i = 0; i < ARRAY_SIZE(tx_macro_reg_init); i++)
2881 snd_soc_component_update_bits(component,
2882 tx_macro_reg_init[i].reg,
2883 tx_macro_reg_init[i].mask,
2884 tx_macro_reg_init[i].val);
2885
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302886 if (tx_priv->version == BOLERO_VERSION_2_1)
2887 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05302888 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302889 else if (tx_priv->version == BOLERO_VERSION_2_0)
2890 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05302891 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302892
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302893 return 0;
2894}
2895
Meng Wang15c825d2018-09-06 10:49:18 +08002896static int tx_macro_deinit(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302897{
2898 struct device *tx_dev = NULL;
2899 struct tx_macro_priv *tx_priv = NULL;
2900
Meng Wang15c825d2018-09-06 10:49:18 +08002901 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302902 return -EINVAL;
2903
Meng Wang15c825d2018-09-06 10:49:18 +08002904 tx_priv->component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302905 return 0;
2906}
2907
2908static void tx_macro_add_child_devices(struct work_struct *work)
2909{
2910 struct tx_macro_priv *tx_priv = NULL;
2911 struct platform_device *pdev = NULL;
2912 struct device_node *node = NULL;
2913 struct tx_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
2914 int ret = 0;
2915 u16 count = 0, ctrl_num = 0;
2916 struct tx_macro_swr_ctrl_platform_data *platdata = NULL;
2917 char plat_dev_name[TX_MACRO_SWR_STRING_LEN] = "";
2918 bool tx_swr_master_node = false;
2919
2920 tx_priv = container_of(work, struct tx_macro_priv,
2921 tx_macro_add_child_devices_work);
2922 if (!tx_priv) {
2923 pr_err("%s: Memory for tx_priv does not exist\n",
2924 __func__);
2925 return;
2926 }
2927
2928 if (!tx_priv->dev) {
2929 pr_err("%s: tx dev does not exist\n", __func__);
2930 return;
2931 }
2932
2933 if (!tx_priv->dev->of_node) {
2934 dev_err(tx_priv->dev,
2935 "%s: DT node for tx_priv does not exist\n", __func__);
2936 return;
2937 }
2938
2939 platdata = &tx_priv->swr_plat_data;
2940 tx_priv->child_count = 0;
2941
2942 for_each_available_child_of_node(tx_priv->dev->of_node, node) {
2943 tx_swr_master_node = false;
2944 if (strnstr(node->name, "tx_swr_master",
2945 strlen("tx_swr_master")) != NULL)
2946 tx_swr_master_node = true;
2947
2948 if (tx_swr_master_node)
2949 strlcpy(plat_dev_name, "tx_swr_ctrl",
2950 (TX_MACRO_SWR_STRING_LEN - 1));
2951 else
2952 strlcpy(plat_dev_name, node->name,
2953 (TX_MACRO_SWR_STRING_LEN - 1));
2954
2955 pdev = platform_device_alloc(plat_dev_name, -1);
2956 if (!pdev) {
2957 dev_err(tx_priv->dev, "%s: pdev memory alloc failed\n",
2958 __func__);
2959 ret = -ENOMEM;
2960 goto err;
2961 }
2962 pdev->dev.parent = tx_priv->dev;
2963 pdev->dev.of_node = node;
2964
2965 if (tx_swr_master_node) {
2966 ret = platform_device_add_data(pdev, platdata,
2967 sizeof(*platdata));
2968 if (ret) {
2969 dev_err(&pdev->dev,
2970 "%s: cannot add plat data ctrl:%d\n",
2971 __func__, ctrl_num);
2972 goto fail_pdev_add;
2973 }
2974 }
2975
2976 ret = platform_device_add(pdev);
2977 if (ret) {
2978 dev_err(&pdev->dev,
2979 "%s: Cannot add platform device\n",
2980 __func__);
2981 goto fail_pdev_add;
2982 }
2983
2984 if (tx_swr_master_node) {
2985 temp = krealloc(swr_ctrl_data,
2986 (ctrl_num + 1) * sizeof(
2987 struct tx_macro_swr_ctrl_data),
2988 GFP_KERNEL);
2989 if (!temp) {
2990 ret = -ENOMEM;
2991 goto fail_pdev_add;
2992 }
2993 swr_ctrl_data = temp;
2994 swr_ctrl_data[ctrl_num].tx_swr_pdev = pdev;
2995 ctrl_num++;
2996 dev_dbg(&pdev->dev,
2997 "%s: Added soundwire ctrl device(s)\n",
2998 __func__);
2999 tx_priv->swr_ctrl_data = swr_ctrl_data;
3000 }
3001 if (tx_priv->child_count < TX_MACRO_CHILD_DEVICES_MAX)
3002 tx_priv->pdev_child_devices[
3003 tx_priv->child_count++] = pdev;
3004 else
3005 goto err;
3006 }
3007 return;
3008fail_pdev_add:
3009 for (count = 0; count < tx_priv->child_count; count++)
3010 platform_device_put(tx_priv->pdev_child_devices[count]);
3011err:
3012 return;
3013}
3014
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303015static int tx_macro_set_port_map(struct snd_soc_component *component,
3016 u32 usecase, u32 size, void *data)
3017{
3018 struct device *tx_dev = NULL;
3019 struct tx_macro_priv *tx_priv = NULL;
3020 struct swrm_port_config port_cfg;
3021 int ret = 0;
3022
3023 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
3024 return -EINVAL;
3025
3026 memset(&port_cfg, 0, sizeof(port_cfg));
3027 port_cfg.uc = usecase;
3028 port_cfg.size = size;
3029 port_cfg.params = data;
3030
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003031 if (tx_priv->swr_ctrl_data)
3032 ret = swrm_wcd_notify(
3033 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
3034 SWR_SET_PORT_MAP, &port_cfg);
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303035
3036 return ret;
3037}
3038
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303039static void tx_macro_init_ops(struct macro_ops *ops,
3040 char __iomem *tx_io_base)
3041{
3042 memset(ops, 0, sizeof(struct macro_ops));
3043 ops->init = tx_macro_init;
3044 ops->exit = tx_macro_deinit;
3045 ops->io_base = tx_io_base;
3046 ops->dai_ptr = tx_macro_dai;
3047 ops->num_dais = ARRAY_SIZE(tx_macro_dai);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05303048 ops->event_handler = tx_macro_event_handler;
Aditya Bavanaric4e96122018-11-14 14:46:38 +05303049 ops->reg_wake_irq = tx_macro_reg_wake_irq;
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303050 ops->set_port_map = tx_macro_set_port_map;
Sudheer Papothid50a5812019-11-21 07:24:42 +05303051 ops->clk_div_get = tx_macro_clk_div_get;
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05303052 ops->clk_switch = tx_macro_clk_switch;
Sudheer Papothi06a4c642019-08-08 05:17:46 +05303053 ops->reg_evt_listener = tx_macro_register_event_listener;
Sudheer Papothifc3adb02019-11-24 10:14:21 +05303054 ops->clk_enable = __tx_macro_mclk_enable;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303055}
3056
3057static int tx_macro_probe(struct platform_device *pdev)
3058{
3059 struct macro_ops ops = {0};
3060 struct tx_macro_priv *tx_priv = NULL;
3061 u32 tx_base_addr = 0, sample_rate = 0;
3062 char __iomem *tx_io_base = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303063 int ret = 0;
3064 const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate";
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003065 u32 is_used_tx_swr_gpio = 1;
3066 const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio";
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303067
3068 tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv),
3069 GFP_KERNEL);
3070 if (!tx_priv)
3071 return -ENOMEM;
3072 platform_set_drvdata(pdev, tx_priv);
3073
3074 tx_priv->dev = &pdev->dev;
3075 ret = of_property_read_u32(pdev->dev.of_node, "reg",
3076 &tx_base_addr);
3077 if (ret) {
3078 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3079 __func__, "reg");
3080 return ret;
3081 }
3082 dev_set_drvdata(&pdev->dev, tx_priv);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003083 if (of_find_property(pdev->dev.of_node, is_used_tx_swr_gpio_dt,
3084 NULL)) {
3085 ret = of_property_read_u32(pdev->dev.of_node,
3086 is_used_tx_swr_gpio_dt,
3087 &is_used_tx_swr_gpio);
3088 if (ret) {
3089 dev_err(&pdev->dev, "%s: error reading %s in dt\n",
3090 __func__, is_used_tx_swr_gpio_dt);
3091 is_used_tx_swr_gpio = 1;
3092 }
3093 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303094 tx_priv->tx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
3095 "qcom,tx-swr-gpios", 0);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003096 if (!tx_priv->tx_swr_gpio_p && is_used_tx_swr_gpio) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303097 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
3098 __func__);
3099 return -EINVAL;
3100 }
Karthikeyan Manib44e4552019-09-09 23:06:04 -07003101 if (msm_cdc_pinctrl_get_state(tx_priv->tx_swr_gpio_p) < 0 &&
3102 is_used_tx_swr_gpio) {
Karthikeyan Mani326536d2019-06-03 13:29:43 -07003103 dev_err(&pdev->dev, "%s: failed to get swr pin state\n",
3104 __func__);
3105 return -EPROBE_DEFER;
3106 }
3107
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303108 tx_io_base = devm_ioremap(&pdev->dev,
3109 tx_base_addr, TX_MACRO_MAX_OFFSET);
3110 if (!tx_io_base) {
3111 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
3112 return -ENOMEM;
3113 }
3114 tx_priv->tx_io_base = tx_io_base;
3115 ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate,
3116 &sample_rate);
3117 if (ret) {
3118 dev_err(&pdev->dev,
3119 "%s: could not find sample_rate entry in dt\n",
3120 __func__);
3121 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
3122 } else {
3123 if (tx_macro_validate_dmic_sample_rate(
3124 sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED)
3125 return -EINVAL;
3126 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303127 if (is_used_tx_swr_gpio) {
3128 tx_priv->reset_swr = true;
3129 INIT_WORK(&tx_priv->tx_macro_add_child_devices_work,
3130 tx_macro_add_child_devices);
3131 tx_priv->swr_plat_data.handle = (void *) tx_priv;
3132 tx_priv->swr_plat_data.read = NULL;
3133 tx_priv->swr_plat_data.write = NULL;
3134 tx_priv->swr_plat_data.bulk_write = NULL;
3135 tx_priv->swr_plat_data.clk = tx_macro_swrm_clock;
3136 tx_priv->swr_plat_data.core_vote = tx_macro_core_vote;
3137 tx_priv->swr_plat_data.handle_irq = NULL;
3138 mutex_init(&tx_priv->swr_clk_lock);
3139 }
3140 tx_priv->is_used_tx_swr_gpio = is_used_tx_swr_gpio;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303141 mutex_init(&tx_priv->mclk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303142 tx_macro_init_ops(&ops, tx_io_base);
Vidyakumar Athota5d45f4c2019-03-10 22:35:07 -07003143 ops.clk_id_req = TX_CORE_CLK;
3144 ops.default_clk_id = TX_CORE_CLK;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303145 ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops);
3146 if (ret) {
3147 dev_err(&pdev->dev,
3148 "%s: register macro failed\n", __func__);
3149 goto err_reg_macro;
3150 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303151 if (is_used_tx_swr_gpio)
3152 schedule_work(&tx_priv->tx_macro_add_child_devices_work);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303153 pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY);
3154 pm_runtime_use_autosuspend(&pdev->dev);
3155 pm_runtime_set_suspended(&pdev->dev);
Sudheer Papothi296867b2019-06-20 09:24:09 +05303156 pm_suspend_ignore_children(&pdev->dev, true);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303157 pm_runtime_enable(&pdev->dev);
3158
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303159 return 0;
3160err_reg_macro:
3161 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303162 if (is_used_tx_swr_gpio)
3163 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303164 return ret;
3165}
3166
3167static int tx_macro_remove(struct platform_device *pdev)
3168{
3169 struct tx_macro_priv *tx_priv = NULL;
3170 u16 count = 0;
3171
3172 tx_priv = platform_get_drvdata(pdev);
3173
3174 if (!tx_priv)
3175 return -EINVAL;
3176
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303177 if (tx_priv->is_used_tx_swr_gpio) {
3178 if (tx_priv->swr_ctrl_data)
3179 kfree(tx_priv->swr_ctrl_data);
3180 for (count = 0; count < tx_priv->child_count &&
3181 count < TX_MACRO_CHILD_DEVICES_MAX; count++)
3182 platform_device_unregister(
3183 tx_priv->pdev_child_devices[count]);
3184 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303185
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303186 pm_runtime_disable(&pdev->dev);
3187 pm_runtime_set_suspended(&pdev->dev);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303188 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303189 if (tx_priv->is_used_tx_swr_gpio)
3190 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303191 bolero_unregister_macro(&pdev->dev, TX_MACRO);
3192 return 0;
3193}
3194
3195
3196static const struct of_device_id tx_macro_dt_match[] = {
3197 {.compatible = "qcom,tx-macro"},
3198 {}
3199};
3200
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303201static const struct dev_pm_ops bolero_dev_pm_ops = {
3202 SET_RUNTIME_PM_OPS(
3203 bolero_runtime_suspend,
3204 bolero_runtime_resume,
3205 NULL
3206 )
3207};
3208
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303209static struct platform_driver tx_macro_driver = {
3210 .driver = {
3211 .name = "tx_macro",
3212 .owner = THIS_MODULE,
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303213 .pm = &bolero_dev_pm_ops,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303214 .of_match_table = tx_macro_dt_match,
Xiaojun Sang53cd13a2018-06-29 15:14:37 +08003215 .suppress_bind_attrs = true,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303216 },
3217 .probe = tx_macro_probe,
3218 .remove = tx_macro_remove,
3219};
3220
3221module_platform_driver(tx_macro_driver);
3222
3223MODULE_DESCRIPTION("TX macro driver");
3224MODULE_LICENSE("GPL v2");