blob: 59340674476622c9e810c877f2f7962219486762 [file] [log] [blame]
Meng Wang43bbb872018-12-10 12:32:05 +08001// SPDX-License-Identifier: GPL-2.0-only
Sudheer Papothif4155002019-12-05 01:36:13 +05302/* Copyright (c) 2018-2020, The Linux Foundation. All rights reserved.
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303 */
4
5#include <linux/module.h>
6#include <linux/init.h>
7#include <linux/clk.h>
8#include <linux/io.h>
9#include <linux/platform_device.h>
10#include <linux/regmap.h>
Sudheer Papothi7601cc62019-03-30 03:00:52 +053011#include <linux/pm_runtime.h>
Laxminath Kasam989fccf2018-06-15 16:53:31 +053012#include <sound/soc.h>
13#include <sound/soc-dapm.h>
14#include <sound/tlv.h>
Sudheer Papothia3e969d2018-10-27 06:22:10 +053015#include <soc/swr-common.h>
Laxminath Kasamfb0d6832018-09-22 01:49:52 +053016#include <soc/swr-wcd.h>
Meng Wang11a25cf2018-10-31 14:11:26 +080017#include <asoc/msm-cdc-pinctrl.h>
Laxminath Kasam989fccf2018-06-15 16:53:31 +053018#include "bolero-cdc.h"
19#include "bolero-cdc-registers.h"
Vidyakumar Athota5d45f4c2019-03-10 22:35:07 -070020#include "bolero-clk-rsc.h"
Laxminath Kasam989fccf2018-06-15 16:53:31 +053021
Sudheer Papothi7601cc62019-03-30 03:00:52 +053022#define AUTO_SUSPEND_DELAY 50 /* delay in msec */
Laxminath Kasam989fccf2018-06-15 16:53:31 +053023#define TX_MACRO_MAX_OFFSET 0x1000
24
25#define NUM_DECIMATORS 8
26
27#define TX_MACRO_RATES (SNDRV_PCM_RATE_8000 | SNDRV_PCM_RATE_16000 |\
28 SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_48000 |\
29 SNDRV_PCM_RATE_96000 | SNDRV_PCM_RATE_192000)
30#define TX_MACRO_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\
31 SNDRV_PCM_FMTBIT_S24_LE |\
32 SNDRV_PCM_FMTBIT_S24_3LE)
33
34#define TX_HPF_CUT_OFF_FREQ_MASK 0x60
35#define CF_MIN_3DB_4HZ 0x0
36#define CF_MIN_3DB_75HZ 0x1
37#define CF_MIN_3DB_150HZ 0x2
38
39#define TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED 0
40#define TX_MACRO_MCLK_FREQ 9600000
41#define TX_MACRO_TX_PATH_OFFSET 0x80
Laxminath Kasam497a6512018-09-17 16:11:52 +053042#define TX_MACRO_SWR_MIC_MUX_SEL_MASK 0xF
Sudheer Papothi339c4112019-12-13 00:49:16 +053043#define TX_MACRO_ADC_MUX_CFG_OFFSET 0x8
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -070044#define TX_MACRO_ADC_MODE_CFG0_SHIFT 1
Laxminath Kasam989fccf2018-06-15 16:53:31 +053045
Sudheer Papothi339c4112019-12-13 00:49:16 +053046#define TX_MACRO_DMIC_UNMUTE_DELAY_MS 40
47#define TX_MACRO_AMIC_UNMUTE_DELAY_MS 100
48#define TX_MACRO_DMIC_HPF_DELAY_MS 300
49#define TX_MACRO_AMIC_HPF_DELAY_MS 300
Laxminath Kasam989fccf2018-06-15 16:53:31 +053050
Sudheer Papothi339c4112019-12-13 00:49:16 +053051static int tx_unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
Laxminath Kasam989fccf2018-06-15 16:53:31 +053052module_param(tx_unmute_delay, int, 0664);
53MODULE_PARM_DESC(tx_unmute_delay, "delay to unmute the tx path");
54
55static const DECLARE_TLV_DB_SCALE(digital_gain, 0, 1, 0);
56
57static int tx_macro_hw_params(struct snd_pcm_substream *substream,
58 struct snd_pcm_hw_params *params,
59 struct snd_soc_dai *dai);
60static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
61 unsigned int *tx_num, unsigned int *tx_slot,
62 unsigned int *rx_num, unsigned int *rx_slot);
63
64#define TX_MACRO_SWR_STRING_LEN 80
65#define TX_MACRO_CHILD_DEVICES_MAX 3
66
67/* Hold instance to soundwire platform device */
68struct tx_macro_swr_ctrl_data {
69 struct platform_device *tx_swr_pdev;
70};
71
72struct tx_macro_swr_ctrl_platform_data {
73 void *handle; /* holds codec private data */
74 int (*read)(void *handle, int reg);
75 int (*write)(void *handle, int reg, int val);
76 int (*bulk_write)(void *handle, u32 *reg, u32 *val, size_t len);
77 int (*clk)(void *handle, bool enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -070078 int (*core_vote)(void *handle, bool enable);
Laxminath Kasam989fccf2018-06-15 16:53:31 +053079 int (*handle_irq)(void *handle,
80 irqreturn_t (*swrm_irq_handler)(int irq,
81 void *data),
82 void *swrm_handle,
83 int action);
84};
85
86enum {
Laxminath Kasam59c7a1d2018-08-09 16:11:17 +053087 TX_MACRO_AIF_INVALID = 0,
88 TX_MACRO_AIF1_CAP,
Laxminath Kasam989fccf2018-06-15 16:53:31 +053089 TX_MACRO_AIF2_CAP,
Karthikeyan Manif3bb8182019-07-11 14:38:54 -070090 TX_MACRO_AIF3_CAP,
Laxminath Kasam989fccf2018-06-15 16:53:31 +053091 TX_MACRO_MAX_DAIS
92};
93
94enum {
95 TX_MACRO_DEC0,
96 TX_MACRO_DEC1,
97 TX_MACRO_DEC2,
98 TX_MACRO_DEC3,
99 TX_MACRO_DEC4,
100 TX_MACRO_DEC5,
101 TX_MACRO_DEC6,
102 TX_MACRO_DEC7,
103 TX_MACRO_DEC_MAX,
104};
105
106enum {
107 TX_MACRO_CLK_DIV_2,
108 TX_MACRO_CLK_DIV_3,
109 TX_MACRO_CLK_DIV_4,
110 TX_MACRO_CLK_DIV_6,
111 TX_MACRO_CLK_DIV_8,
112 TX_MACRO_CLK_DIV_16,
113};
114
Laxminath Kasam497a6512018-09-17 16:11:52 +0530115enum {
116 MSM_DMIC,
117 SWR_MIC,
118 ANC_FB_TUNE1
119};
120
Sudheer Papothia7397942019-03-19 03:14:23 +0530121enum {
122 TX_MCLK,
123 VA_MCLK,
124};
125
Sudheer Papothi72fef482019-08-30 11:00:20 +0530126struct tx_macro_reg_mask_val {
127 u16 reg;
128 u8 mask;
129 u8 val;
130};
131
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530132struct tx_mute_work {
133 struct tx_macro_priv *tx_priv;
134 u32 decimator;
135 struct delayed_work dwork;
136};
137
138struct hpf_work {
139 struct tx_macro_priv *tx_priv;
140 u8 decimator;
141 u8 hpf_cut_off_freq;
142 struct delayed_work dwork;
143};
144
145struct tx_macro_priv {
146 struct device *dev;
147 bool dec_active[NUM_DECIMATORS];
148 int tx_mclk_users;
149 int swr_clk_users;
Ramprasad Katkam452772a2019-01-07 17:30:36 +0530150 bool dapm_mclk_enable;
Ramprasad Katkama4c747b2018-12-11 19:15:53 +0530151 bool reset_swr;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530152 struct mutex mclk_lock;
153 struct mutex swr_clk_lock;
Meng Wang15c825d2018-09-06 10:49:18 +0800154 struct snd_soc_component *component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530155 struct device_node *tx_swr_gpio_p;
156 struct tx_macro_swr_ctrl_data *swr_ctrl_data;
157 struct tx_macro_swr_ctrl_platform_data swr_plat_data;
158 struct work_struct tx_macro_add_child_devices_work;
159 struct hpf_work tx_hpf_work[NUM_DECIMATORS];
160 struct tx_mute_work tx_mute_dwork[NUM_DECIMATORS];
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530161 u16 dmic_clk_div;
Laxminath Kasam4651dcb2019-10-10 23:45:21 +0530162 u32 version;
Laxminath Kasam2e13d642019-10-12 01:36:30 +0530163 u32 is_used_tx_swr_gpio;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530164 unsigned long active_ch_mask[TX_MACRO_MAX_DAIS];
165 unsigned long active_ch_cnt[TX_MACRO_MAX_DAIS];
166 char __iomem *tx_io_base;
167 struct platform_device *pdev_child_devices
168 [TX_MACRO_CHILD_DEVICES_MAX];
169 int child_count;
Sudheer Papothie456c2c2019-03-05 07:08:45 +0530170 int tx_swr_clk_cnt;
171 int va_swr_clk_cnt;
Sudheer Papothicf3b4062019-05-10 10:48:43 +0530172 int va_clk_status;
173 int tx_clk_status;
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700174 bool bcs_enable;
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700175 int dec_mode[NUM_DECIMATORS];
Vatsal Buchad06525f2019-10-14 23:14:12 +0530176 bool bcs_clk_en;
177 bool hs_slow_insert_complete;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530178};
179
Meng Wang15c825d2018-09-06 10:49:18 +0800180static bool tx_macro_get_data(struct snd_soc_component *component,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530181 struct device **tx_dev,
182 struct tx_macro_priv **tx_priv,
183 const char *func_name)
184{
Meng Wang15c825d2018-09-06 10:49:18 +0800185 *tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530186 if (!(*tx_dev)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800187 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530188 "%s: null device for macro!\n", func_name);
189 return false;
190 }
191
192 *tx_priv = dev_get_drvdata((*tx_dev));
193 if (!(*tx_priv)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800194 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530195 "%s: priv is null for macro!\n", func_name);
196 return false;
197 }
198
Meng Wang15c825d2018-09-06 10:49:18 +0800199 if (!(*tx_priv)->component) {
200 dev_err(component->dev,
201 "%s: tx_priv->component not initialized!\n", func_name);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530202 return false;
203 }
204
205 return true;
206}
207
208static int tx_macro_mclk_enable(struct tx_macro_priv *tx_priv,
209 bool mclk_enable)
210{
211 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
212 int ret = 0;
213
Tanya Dixit8530fb92018-09-14 16:01:25 +0530214 if (regmap == NULL) {
215 dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__);
216 return -EINVAL;
217 }
218
Laxminath Kasamb7f823c2018-08-02 13:23:11 +0530219 dev_dbg(tx_priv->dev, "%s: mclk_enable = %u,clk_users= %d\n",
220 __func__, mclk_enable, tx_priv->tx_mclk_users);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530221
222 mutex_lock(&tx_priv->mclk_lock);
223 if (mclk_enable) {
Meng Wang52a8fb12019-12-12 20:36:05 +0800224 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
225 TX_CORE_CLK,
226 TX_CORE_CLK,
227 true);
228 if (ret < 0) {
229 dev_err_ratelimited(tx_priv->dev,
230 "%s: request clock enable failed\n",
231 __func__);
232 goto exit;
233 }
234 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
235 true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530236 if (tx_priv->tx_mclk_users == 0) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530237 regcache_mark_dirty(regmap);
238 regcache_sync_region(regmap,
239 TX_START_OFFSET,
240 TX_MAX_OFFSET);
241 /* 9.6MHz MCLK, set value 0x00 if other frequency */
242 regmap_update_bits(regmap,
243 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, 0x01, 0x01);
244 regmap_update_bits(regmap,
245 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
246 0x01, 0x01);
247 regmap_update_bits(regmap,
248 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
249 0x01, 0x01);
250 }
251 tx_priv->tx_mclk_users++;
252 } else {
253 if (tx_priv->tx_mclk_users <= 0) {
254 dev_err(tx_priv->dev, "%s: clock already disabled\n",
255 __func__);
256 tx_priv->tx_mclk_users = 0;
257 goto exit;
258 }
259 tx_priv->tx_mclk_users--;
260 if (tx_priv->tx_mclk_users == 0) {
261 regmap_update_bits(regmap,
262 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
263 0x01, 0x00);
264 regmap_update_bits(regmap,
265 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
266 0x01, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530267 }
Meng Wang52a8fb12019-12-12 20:36:05 +0800268
269 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
270 false);
271 bolero_clk_rsc_request_clock(tx_priv->dev,
272 TX_CORE_CLK,
273 TX_CORE_CLK,
274 false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530275 }
276exit:
277 mutex_unlock(&tx_priv->mclk_lock);
278 return ret;
279}
280
Sudheer Papothifc3adb02019-11-24 10:14:21 +0530281static int __tx_macro_mclk_enable(struct snd_soc_component *component,
282 bool enable)
283{
284 struct device *tx_dev = NULL;
285 struct tx_macro_priv *tx_priv = NULL;
286
287 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
288 return -EINVAL;
289
290 return tx_macro_mclk_enable(tx_priv, enable);
291}
292
Sudheer Papothie456c2c2019-03-05 07:08:45 +0530293static int tx_macro_va_swr_clk_event(struct snd_soc_dapm_widget *w,
294 struct snd_kcontrol *kcontrol, int event)
295{
296 struct device *tx_dev = NULL;
297 struct tx_macro_priv *tx_priv = NULL;
298 struct snd_soc_component *component =
299 snd_soc_dapm_to_component(w->dapm);
300
301 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
302 return -EINVAL;
303
304 if (SND_SOC_DAPM_EVENT_ON(event))
305 ++tx_priv->va_swr_clk_cnt;
306 if (SND_SOC_DAPM_EVENT_OFF(event))
307 --tx_priv->va_swr_clk_cnt;
308
309 return 0;
310}
311
312static int tx_macro_tx_swr_clk_event(struct snd_soc_dapm_widget *w,
313 struct snd_kcontrol *kcontrol, int event)
314{
315 struct device *tx_dev = NULL;
316 struct tx_macro_priv *tx_priv = NULL;
317 struct snd_soc_component *component =
318 snd_soc_dapm_to_component(w->dapm);
319
320 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
321 return -EINVAL;
322
323 if (SND_SOC_DAPM_EVENT_ON(event))
324 ++tx_priv->tx_swr_clk_cnt;
325 if (SND_SOC_DAPM_EVENT_OFF(event))
326 --tx_priv->tx_swr_clk_cnt;
327
328 return 0;
329}
330
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530331static int tx_macro_mclk_event(struct snd_soc_dapm_widget *w,
332 struct snd_kcontrol *kcontrol, int event)
333{
Meng Wang15c825d2018-09-06 10:49:18 +0800334 struct snd_soc_component *component =
335 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530336 int ret = 0;
337 struct device *tx_dev = NULL;
338 struct tx_macro_priv *tx_priv = NULL;
339
Meng Wang15c825d2018-09-06 10:49:18 +0800340 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530341 return -EINVAL;
342
343 dev_dbg(tx_dev, "%s: event = %d\n", __func__, event);
344 switch (event) {
345 case SND_SOC_DAPM_PRE_PMU:
346 ret = tx_macro_mclk_enable(tx_priv, 1);
Ramprasad Katkam452772a2019-01-07 17:30:36 +0530347 if (ret)
348 tx_priv->dapm_mclk_enable = false;
349 else
350 tx_priv->dapm_mclk_enable = true;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530351 break;
352 case SND_SOC_DAPM_POST_PMD:
Ramprasad Katkam452772a2019-01-07 17:30:36 +0530353 if (tx_priv->dapm_mclk_enable)
354 ret = tx_macro_mclk_enable(tx_priv, 0);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530355 break;
356 default:
357 dev_err(tx_priv->dev,
358 "%s: invalid DAPM event %d\n", __func__, event);
359 ret = -EINVAL;
360 }
361 return ret;
362}
363
Meng Wang15c825d2018-09-06 10:49:18 +0800364static int tx_macro_event_handler(struct snd_soc_component *component,
365 u16 event, u32 data)
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530366{
367 struct device *tx_dev = NULL;
368 struct tx_macro_priv *tx_priv = NULL;
Aditya Bavanari50ef13e2019-08-09 15:14:43 +0530369 int ret = 0;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530370
Meng Wang15c825d2018-09-06 10:49:18 +0800371 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530372 return -EINVAL;
373
374 switch (event) {
375 case BOLERO_MACRO_EVT_SSR_DOWN:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -0700376 trace_printk("%s, enter SSR down\n", __func__);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700377 if (tx_priv->swr_ctrl_data) {
378 swrm_wcd_notify(
379 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700380 SWR_DEVICE_SSR_DOWN, NULL);
381 }
Aditya Bavanari50ef13e2019-08-09 15:14:43 +0530382 if ((!pm_runtime_enabled(tx_dev) ||
383 !pm_runtime_suspended(tx_dev))) {
384 ret = bolero_runtime_suspend(tx_dev);
385 if (!ret) {
386 pm_runtime_disable(tx_dev);
387 pm_runtime_set_suspended(tx_dev);
388 pm_runtime_enable(tx_dev);
389 }
390 }
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530391 break;
392 case BOLERO_MACRO_EVT_SSR_UP:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -0700393 trace_printk("%s, enter SSR up\n", __func__);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +0530394 /* reset swr after ssr/pdr */
395 tx_priv->reset_swr = true;
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700396 if (tx_priv->swr_ctrl_data)
397 swrm_wcd_notify(
398 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
399 SWR_DEVICE_SSR_UP, NULL);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530400 break;
Meng Wang8ef0cc22019-05-08 15:12:56 +0800401 case BOLERO_MACRO_EVT_CLK_RESET:
402 bolero_rsc_clk_reset(tx_dev, TX_CORE_CLK);
403 break;
Vatsal Buchad06525f2019-10-14 23:14:12 +0530404 case BOLERO_MACRO_EVT_BCS_CLK_OFF:
405 if (tx_priv->bcs_clk_en)
406 snd_soc_component_update_bits(component,
407 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, data << 6);
408 if (data)
409 tx_priv->hs_slow_insert_complete = true;
410 else
411 tx_priv->hs_slow_insert_complete = false;
412 break;
Prasad Kumpatlaefdb3932020-05-13 18:55:32 +0530413 default:
414 pr_debug("%s Invalid Event\n", __func__);
415 break;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530416 }
417 return 0;
418}
419
Meng Wang15c825d2018-09-06 10:49:18 +0800420static int tx_macro_reg_wake_irq(struct snd_soc_component *component,
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530421 u32 data)
422{
423 struct device *tx_dev = NULL;
424 struct tx_macro_priv *tx_priv = NULL;
425 u32 ipc_wakeup = data;
426 int ret = 0;
427
Meng Wang15c825d2018-09-06 10:49:18 +0800428 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530429 return -EINVAL;
430
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700431 if (tx_priv->swr_ctrl_data)
432 ret = swrm_wcd_notify(
433 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
434 SWR_REGISTER_WAKE_IRQ, &ipc_wakeup);
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530435
436 return ret;
437}
438
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530439static bool is_amic_enabled(struct snd_soc_component *component, int decimator)
Sudheer Papothi339c4112019-12-13 00:49:16 +0530440{
441 u16 adc_mux_reg = 0, adc_reg = 0;
442 u16 adc_n = BOLERO_ADC_MAX;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530443 bool ret = false;
444 struct device *tx_dev = NULL;
445 struct tx_macro_priv *tx_priv = NULL;
446
447 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
448 return ret;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530449
450 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
451 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
452 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530453 if (tx_priv->version == BOLERO_VERSION_2_1)
454 return true;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530455 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
456 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
457 adc_n = snd_soc_component_read32(component, adc_reg) &
458 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530459 if (adc_n < BOLERO_ADC_MAX)
460 return true;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530461 }
462
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530463 return ret;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530464}
465
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530466static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
467{
468 struct delayed_work *hpf_delayed_work = NULL;
469 struct hpf_work *hpf_work = NULL;
470 struct tx_macro_priv *tx_priv = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800471 struct snd_soc_component *component = NULL;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530472 u16 dec_cfg_reg = 0, hpf_gate_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530473 u8 hpf_cut_off_freq = 0;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530474 u16 adc_reg = 0, adc_n = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530475
476 hpf_delayed_work = to_delayed_work(work);
477 hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
478 tx_priv = hpf_work->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800479 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530480 hpf_cut_off_freq = hpf_work->hpf_cut_off_freq;
481
482 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
483 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530484 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
485 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530486
Meng Wang15c825d2018-09-06 10:49:18 +0800487 dev_dbg(component->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530488 __func__, hpf_work->decimator, hpf_cut_off_freq);
489
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530490 if (is_amic_enabled(component, hpf_work->decimator)) {
491 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
492 TX_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator;
493 adc_n = snd_soc_component_read32(component, adc_reg) &
494 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
Laxminath Kasam497a6512018-09-17 16:11:52 +0530495 /* analog mic clear TX hold */
Meng Wang15c825d2018-09-06 10:49:18 +0800496 bolero_clear_amic_tx_hold(component->dev, adc_n);
Sudheer Papothi339c4112019-12-13 00:49:16 +0530497 snd_soc_component_update_bits(component,
498 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
499 hpf_cut_off_freq << 5);
500 snd_soc_component_update_bits(component, hpf_gate_reg,
501 0x03, 0x02);
Sudheer Papothi339c4112019-12-13 00:49:16 +0530502 snd_soc_component_update_bits(component, hpf_gate_reg,
503 0x03, 0x01);
504 } else {
505 snd_soc_component_update_bits(component,
506 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
507 hpf_cut_off_freq << 5);
508 snd_soc_component_update_bits(component, hpf_gate_reg,
509 0x02, 0x02);
510 /* Minimum 1 clk cycle delay is required as per HW spec */
511 usleep_range(1000, 1010);
512 snd_soc_component_update_bits(component, hpf_gate_reg,
513 0x02, 0x00);
Laxminath Kasam497a6512018-09-17 16:11:52 +0530514 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530515}
516
517static void tx_macro_mute_update_callback(struct work_struct *work)
518{
519 struct tx_mute_work *tx_mute_dwork = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800520 struct snd_soc_component *component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530521 struct tx_macro_priv *tx_priv = NULL;
522 struct delayed_work *delayed_work = NULL;
Xiaojun Sangd155fdc2018-10-11 15:11:59 +0800523 u16 tx_vol_ctl_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530524 u8 decimator = 0;
525
526 delayed_work = to_delayed_work(work);
527 tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork);
528 tx_priv = tx_mute_dwork->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800529 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530530 decimator = tx_mute_dwork->decimator;
531
532 tx_vol_ctl_reg =
533 BOLERO_CDC_TX0_TX_PATH_CTL +
534 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +0800535 snd_soc_component_update_bits(component, tx_vol_ctl_reg, 0x10, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530536 dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
537 __func__, decimator);
538}
539
540static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
541 struct snd_ctl_elem_value *ucontrol)
542{
543 struct snd_soc_dapm_widget *widget =
544 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800545 struct snd_soc_component *component =
546 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530547 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
548 unsigned int val = 0;
549 u16 mic_sel_reg = 0;
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530550 u16 dmic_clk_reg = 0;
551 struct device *tx_dev = NULL;
552 struct tx_macro_priv *tx_priv = NULL;
553
554 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
555 return -EINVAL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530556
557 val = ucontrol->value.enumerated.item[0];
558 if (val > e->items - 1)
559 return -EINVAL;
560
Meng Wang15c825d2018-09-06 10:49:18 +0800561 dev_dbg(component->dev, "%s: wname: %s, val: 0x%x\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530562 widget->name, val);
563
564 switch (e->reg) {
565 case BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0:
566 mic_sel_reg = BOLERO_CDC_TX0_TX_PATH_CFG0;
567 break;
568 case BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0:
569 mic_sel_reg = BOLERO_CDC_TX1_TX_PATH_CFG0;
570 break;
571 case BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0:
572 mic_sel_reg = BOLERO_CDC_TX2_TX_PATH_CFG0;
573 break;
574 case BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0:
575 mic_sel_reg = BOLERO_CDC_TX3_TX_PATH_CFG0;
576 break;
577 case BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0:
578 mic_sel_reg = BOLERO_CDC_TX4_TX_PATH_CFG0;
579 break;
580 case BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0:
581 mic_sel_reg = BOLERO_CDC_TX5_TX_PATH_CFG0;
582 break;
583 case BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0:
584 mic_sel_reg = BOLERO_CDC_TX6_TX_PATH_CFG0;
585 break;
586 case BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0:
587 mic_sel_reg = BOLERO_CDC_TX7_TX_PATH_CFG0;
588 break;
589 default:
Meng Wang15c825d2018-09-06 10:49:18 +0800590 dev_err(component->dev, "%s: e->reg: 0x%x not expected\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530591 __func__, e->reg);
592 return -EINVAL;
593 }
Laxminath Kasam497a6512018-09-17 16:11:52 +0530594 if (strnstr(widget->name, "SMIC", strlen(widget->name))) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530595 if (val != 0) {
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530596 if (val < 5) {
Meng Wang15c825d2018-09-06 10:49:18 +0800597 snd_soc_component_update_bits(component,
598 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530599 1 << 7, 0x0 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530600 } else {
Meng Wang15c825d2018-09-06 10:49:18 +0800601 snd_soc_component_update_bits(component,
602 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530603 1 << 7, 0x1 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530604 snd_soc_component_update_bits(component,
605 BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
606 0x80, 0x00);
607 dmic_clk_reg =
608 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
609 ((val - 5)/2) * 4;
610 snd_soc_component_update_bits(component,
611 dmic_clk_reg,
612 0x0E, tx_priv->dmic_clk_div << 0x1);
613 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530614 }
615 } else {
616 /* DMIC selected */
617 if (val != 0)
Meng Wang15c825d2018-09-06 10:49:18 +0800618 snd_soc_component_update_bits(component, mic_sel_reg,
619 1 << 7, 1 << 7);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530620 }
621
622 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
623}
624
625static int tx_macro_tx_mixer_get(struct snd_kcontrol *kcontrol,
626 struct snd_ctl_elem_value *ucontrol)
627{
628 struct snd_soc_dapm_widget *widget =
629 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800630 struct snd_soc_component *component =
631 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530632 struct soc_multi_mixer_control *mixer =
633 ((struct soc_multi_mixer_control *)kcontrol->private_value);
634 u32 dai_id = widget->shift;
635 u32 dec_id = mixer->shift;
636 struct device *tx_dev = NULL;
637 struct tx_macro_priv *tx_priv = NULL;
638
Meng Wang15c825d2018-09-06 10:49:18 +0800639 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530640 return -EINVAL;
641
642 if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id]))
643 ucontrol->value.integer.value[0] = 1;
644 else
645 ucontrol->value.integer.value[0] = 0;
646 return 0;
647}
648
649static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
650 struct snd_ctl_elem_value *ucontrol)
651{
652 struct snd_soc_dapm_widget *widget =
653 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800654 struct snd_soc_component *component =
655 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530656 struct snd_soc_dapm_update *update = NULL;
657 struct soc_multi_mixer_control *mixer =
658 ((struct soc_multi_mixer_control *)kcontrol->private_value);
659 u32 dai_id = widget->shift;
660 u32 dec_id = mixer->shift;
661 u32 enable = ucontrol->value.integer.value[0];
662 struct device *tx_dev = NULL;
663 struct tx_macro_priv *tx_priv = NULL;
664
Meng Wang15c825d2018-09-06 10:49:18 +0800665 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530666 return -EINVAL;
667
668 if (enable) {
669 set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
670 tx_priv->active_ch_cnt[dai_id]++;
671 } else {
672 tx_priv->active_ch_cnt[dai_id]--;
673 clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
674 }
675 snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
676
677 return 0;
678}
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700679
680static inline int tx_macro_path_get(const char *wname,
681 unsigned int *path_num)
682{
683 int ret = 0;
684 char *widget_name = NULL;
685 char *w_name = NULL;
686 char *path_num_char = NULL;
687 char *path_name = NULL;
688
689 widget_name = kstrndup(wname, 10, GFP_KERNEL);
690 if (!widget_name)
691 return -EINVAL;
692
693 w_name = widget_name;
694
695 path_name = strsep(&widget_name, " ");
696 if (!path_name) {
697 pr_err("%s: Invalid widget name = %s\n",
698 __func__, widget_name);
699 ret = -EINVAL;
700 goto err;
701 }
702 path_num_char = strpbrk(path_name, "01234567");
703 if (!path_num_char) {
704 pr_err("%s: tx path index not found\n",
705 __func__);
706 ret = -EINVAL;
707 goto err;
708 }
709 ret = kstrtouint(path_num_char, 10, path_num);
710 if (ret < 0)
711 pr_err("%s: Invalid tx path = %s\n",
712 __func__, w_name);
713
714err:
715 kfree(w_name);
716 return ret;
717}
718
719static int tx_macro_dec_mode_get(struct snd_kcontrol *kcontrol,
720 struct snd_ctl_elem_value *ucontrol)
721{
722 struct snd_soc_component *component =
723 snd_soc_kcontrol_component(kcontrol);
724 struct tx_macro_priv *tx_priv = NULL;
725 struct device *tx_dev = NULL;
726 int ret = 0;
727 int path = 0;
728
729 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
730 return -EINVAL;
731
732 ret = tx_macro_path_get(kcontrol->id.name, &path);
733 if (ret)
734 return ret;
735
736 ucontrol->value.integer.value[0] = tx_priv->dec_mode[path];
737
738 return 0;
739}
740
741static int tx_macro_dec_mode_put(struct snd_kcontrol *kcontrol,
742 struct snd_ctl_elem_value *ucontrol)
743{
744 struct snd_soc_component *component =
745 snd_soc_kcontrol_component(kcontrol);
746 struct tx_macro_priv *tx_priv = NULL;
747 struct device *tx_dev = NULL;
748 int value = ucontrol->value.integer.value[0];
749 int ret = 0;
750 int path = 0;
751
752 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
753 return -EINVAL;
754
755 ret = tx_macro_path_get(kcontrol->id.name, &path);
756 if (ret)
757 return ret;
758
759 tx_priv->dec_mode[path] = value;
760
761 return 0;
762}
763
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700764static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol,
765 struct snd_ctl_elem_value *ucontrol)
766{
767 struct snd_soc_component *component =
768 snd_soc_kcontrol_component(kcontrol);
769 struct tx_macro_priv *tx_priv = NULL;
770 struct device *tx_dev = NULL;
771
772 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
773 return -EINVAL;
774
775 ucontrol->value.integer.value[0] = tx_priv->bcs_enable;
776
777 return 0;
778}
779
780static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol,
781 struct snd_ctl_elem_value *ucontrol)
782{
783 struct snd_soc_component *component =
784 snd_soc_kcontrol_component(kcontrol);
785 struct tx_macro_priv *tx_priv = NULL;
786 struct device *tx_dev = NULL;
787 int value = ucontrol->value.integer.value[0];
788
789 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
790 return -EINVAL;
791
792 tx_priv->bcs_enable = value;
793
794 return 0;
795}
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530796
Aditya Bavanari8a3f1e62020-03-23 12:48:26 +0530797static const char * const bcs_ch_sel_mux_text[] = {
798 "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3",
799 "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7",
800 "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11",
801};
802
803static const struct soc_enum bcs_ch_sel_mux_enum =
804 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(bcs_ch_sel_mux_text),
805 bcs_ch_sel_mux_text);
806
807static int tx_macro_get_bcs_ch_sel(struct snd_kcontrol *kcontrol,
808 struct snd_ctl_elem_value *ucontrol)
809{
810 struct snd_soc_component *component =
811 snd_soc_kcontrol_component(kcontrol);
812 struct tx_macro_priv *tx_priv = NULL;
813 struct device *tx_dev = NULL;
814 int value = 0;
815
816 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
817 return -EINVAL;
818
819 if (tx_priv->version == BOLERO_VERSION_2_1)
820 value = (snd_soc_component_read32(component,
821 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL)) & 0x0F;
822 else if (tx_priv->version == BOLERO_VERSION_2_0)
823 value = (snd_soc_component_read32(component,
824 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL)) & 0x0F;
825
826 ucontrol->value.integer.value[0] = value;
827 return 0;
828}
829
830static int tx_macro_put_bcs_ch_sel(struct snd_kcontrol *kcontrol,
831 struct snd_ctl_elem_value *ucontrol)
832{
833 struct snd_soc_component *component =
834 snd_soc_kcontrol_component(kcontrol);
835 struct tx_macro_priv *tx_priv = NULL;
836 struct device *tx_dev = NULL;
837 int value;
838
839 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
840 return -EINVAL;
841
842 if (ucontrol->value.integer.value[0] < 0 ||
843 ucontrol->value.integer.value[0] > ARRAY_SIZE(bcs_ch_sel_mux_text))
844 return -EINVAL;
845
846 value = ucontrol->value.integer.value[0];
847 if (tx_priv->version == BOLERO_VERSION_2_1)
848 snd_soc_component_update_bits(component,
849 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0x0F, value);
850 else if (tx_priv->version == BOLERO_VERSION_2_0)
851 snd_soc_component_update_bits(component,
852 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x0F, value);
853
854 return 0;
855}
856
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530857static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
858 struct snd_kcontrol *kcontrol, int event)
859{
Meng Wang15c825d2018-09-06 10:49:18 +0800860 struct snd_soc_component *component =
861 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530862 unsigned int dmic = 0;
863 int ret = 0;
864 char *wname = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530865
866 wname = strpbrk(w->name, "01234567");
867 if (!wname) {
Meng Wang15c825d2018-09-06 10:49:18 +0800868 dev_err(component->dev, "%s: widget not found\n", __func__);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530869 return -EINVAL;
870 }
871
872 ret = kstrtouint(wname, 10, &dmic);
873 if (ret < 0) {
Meng Wang15c825d2018-09-06 10:49:18 +0800874 dev_err(component->dev, "%s: Invalid DMIC line on the codec\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530875 __func__);
876 return -EINVAL;
877 }
878
Sudheer Papothid50a5812019-11-21 07:24:42 +0530879 dev_dbg(component->dev, "%s: event %d DMIC%d\n",
880 __func__, event, dmic);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530881
882 switch (event) {
883 case SND_SOC_DAPM_PRE_PMU:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530884 bolero_dmic_clk_enable(component, dmic, DMIC_TX, true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530885 break;
886 case SND_SOC_DAPM_POST_PMD:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530887 bolero_dmic_clk_enable(component, dmic, DMIC_TX, false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530888 break;
889 }
890
891 return 0;
892}
893
894static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
895 struct snd_kcontrol *kcontrol, int event)
896{
Meng Wang15c825d2018-09-06 10:49:18 +0800897 struct snd_soc_component *component =
898 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530899 unsigned int decimator = 0;
900 u16 tx_vol_ctl_reg = 0;
901 u16 dec_cfg_reg = 0;
902 u16 hpf_gate_reg = 0;
903 u16 tx_gain_ctl_reg = 0;
904 u8 hpf_cut_off_freq = 0;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530905 int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS;
906 int unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530907 struct device *tx_dev = NULL;
908 struct tx_macro_priv *tx_priv = NULL;
Meng Wang2825fce2020-01-13 15:17:21 +0800909 u16 adc_mux_reg = 0, adc_reg = 0, adc_n = 0;
910 u16 dmic_clk_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530911
Meng Wang15c825d2018-09-06 10:49:18 +0800912 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530913 return -EINVAL;
914
915 decimator = w->shift;
916
Meng Wang15c825d2018-09-06 10:49:18 +0800917 dev_dbg(component->dev, "%s(): widget = %s decimator = %u\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530918 w->name, decimator);
919
920 tx_vol_ctl_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
921 TX_MACRO_TX_PATH_OFFSET * decimator;
922 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
923 TX_MACRO_TX_PATH_OFFSET * decimator;
924 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
925 TX_MACRO_TX_PATH_OFFSET * decimator;
926 tx_gain_ctl_reg = BOLERO_CDC_TX0_TX_VOL_CTL +
927 TX_MACRO_TX_PATH_OFFSET * decimator;
928
929 switch (event) {
930 case SND_SOC_DAPM_PRE_PMU:
Meng Wang2825fce2020-01-13 15:17:21 +0800931 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
932 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
933 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
934 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
935 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
936 adc_n = snd_soc_component_read32(component, adc_reg) &
937 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
938 if (adc_n >= BOLERO_ADC_MAX) {
939 dmic_clk_reg =
940 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
941 ((adc_n - 5) / 2) * 4;
942 snd_soc_component_update_bits(component,
943 dmic_clk_reg,
944 0x0E, tx_priv->dmic_clk_div << 0x1);
945 }
946 }
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700947 snd_soc_component_update_bits(component,
948 dec_cfg_reg, 0x06, tx_priv->dec_mode[decimator] <<
949 TX_MACRO_ADC_MODE_CFG0_SHIFT);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530950 /* Enable TX PGA Mute */
Meng Wang15c825d2018-09-06 10:49:18 +0800951 snd_soc_component_update_bits(component,
952 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530953 break;
954 case SND_SOC_DAPM_POST_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +0800955 snd_soc_component_update_bits(component,
956 tx_vol_ctl_reg, 0x20, 0x20);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530957 if (!is_amic_enabled(component, decimator)) {
Vatsal Bucha95725722020-01-08 12:40:58 +0530958 snd_soc_component_update_bits(component,
959 hpf_gate_reg, 0x01, 0x00);
960 /*
961 * Minimum 1 clk cycle delay is required as per HW spec
962 */
963 usleep_range(1000, 1010);
964 }
Meng Wang15c825d2018-09-06 10:49:18 +0800965 hpf_cut_off_freq = (
966 snd_soc_component_read32(component, dec_cfg_reg) &
967 TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
968
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530969 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq =
Meng Wang15c825d2018-09-06 10:49:18 +0800970 hpf_cut_off_freq;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530971
972 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ)
Meng Wang15c825d2018-09-06 10:49:18 +0800973 snd_soc_component_update_bits(component, dec_cfg_reg,
974 TX_HPF_CUT_OFF_FREQ_MASK,
975 CF_MIN_3DB_150HZ << 5);
976
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530977 if (is_amic_enabled(component, decimator)) {
Sudheer Papothi339c4112019-12-13 00:49:16 +0530978 hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS;
979 unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS;
980 }
981 if (tx_unmute_delay < unmute_delay)
982 tx_unmute_delay = unmute_delay;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530983 /* schedule work queue to Remove Mute */
Aditya Bavanari4460ed22020-02-20 12:46:51 +0530984 queue_delayed_work(system_freezable_wq,
985 &tx_priv->tx_mute_dwork[decimator].dwork,
986 msecs_to_jiffies(tx_unmute_delay));
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530987 if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq !=
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530988 CF_MIN_3DB_150HZ) {
Aditya Bavanari4460ed22020-02-20 12:46:51 +0530989 queue_delayed_work(system_freezable_wq,
Sudheer Papothi339c4112019-12-13 00:49:16 +0530990 &tx_priv->tx_hpf_work[decimator].dwork,
991 msecs_to_jiffies(hpf_delay));
Meng Wang15c825d2018-09-06 10:49:18 +0800992 snd_soc_component_update_bits(component,
Vatsal Bucha95725722020-01-08 12:40:58 +0530993 hpf_gate_reg, 0x03, 0x02);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530994 if (!is_amic_enabled(component, decimator))
Vatsal Bucha95725722020-01-08 12:40:58 +0530995 snd_soc_component_update_bits(component,
996 hpf_gate_reg, 0x03, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +0800997 snd_soc_component_update_bits(component,
Vatsal Bucha95725722020-01-08 12:40:58 +0530998 hpf_gate_reg, 0x03, 0x01);
Karthikeyan Mani9366ce62019-11-06 11:43:36 -0800999 /*
1000 * 6ms delay is required as per HW spec
1001 */
1002 usleep_range(6000, 6010);
Laxminath Kasam9eb80222018-08-29 21:53:14 +05301003 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301004 /* apply gain after decimator is enabled */
Meng Wang15c825d2018-09-06 10:49:18 +08001005 snd_soc_component_write(component, tx_gain_ctl_reg,
1006 snd_soc_component_read32(component,
1007 tx_gain_ctl_reg));
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001008 if (tx_priv->bcs_enable) {
1009 snd_soc_component_update_bits(component, dec_cfg_reg,
1010 0x01, 0x01);
Vatsal Buchad06525f2019-10-14 23:14:12 +05301011 tx_priv->bcs_clk_en = true;
1012 if (tx_priv->hs_slow_insert_complete)
1013 snd_soc_component_update_bits(component,
1014 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40,
1015 0x40);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001016 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301017 break;
1018 case SND_SOC_DAPM_PRE_PMD:
1019 hpf_cut_off_freq =
1020 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq;
Meng Wang15c825d2018-09-06 10:49:18 +08001021 snd_soc_component_update_bits(component,
1022 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301023 if (cancel_delayed_work_sync(
1024 &tx_priv->tx_hpf_work[decimator].dwork)) {
1025 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
Meng Wang15c825d2018-09-06 10:49:18 +08001026 snd_soc_component_update_bits(
1027 component, dec_cfg_reg,
1028 TX_HPF_CUT_OFF_FREQ_MASK,
1029 hpf_cut_off_freq << 5);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +05301030 if (is_amic_enabled(component, decimator))
Vatsal Bucha95725722020-01-08 12:40:58 +05301031 snd_soc_component_update_bits(component,
1032 hpf_gate_reg,
1033 0x03, 0x02);
1034 else
1035 snd_soc_component_update_bits(component,
1036 hpf_gate_reg,
1037 0x03, 0x03);
1038
Laxminath Kasam9eb80222018-08-29 21:53:14 +05301039 /*
1040 * Minimum 1 clk cycle delay is required
1041 * as per HW spec
1042 */
1043 usleep_range(1000, 1010);
Meng Wang15c825d2018-09-06 10:49:18 +08001044 snd_soc_component_update_bits(component,
1045 hpf_gate_reg,
Vatsal Bucha95725722020-01-08 12:40:58 +05301046 0x03, 0x01);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301047 }
1048 }
1049 cancel_delayed_work_sync(
1050 &tx_priv->tx_mute_dwork[decimator].dwork);
1051 break;
1052 case SND_SOC_DAPM_POST_PMD:
Meng Wang15c825d2018-09-06 10:49:18 +08001053 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
1054 0x20, 0x00);
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07001055 snd_soc_component_update_bits(component,
1056 dec_cfg_reg, 0x06, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001057 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
1058 0x10, 0x00);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001059 if (tx_priv->bcs_enable) {
1060 snd_soc_component_update_bits(component, dec_cfg_reg,
1061 0x01, 0x00);
1062 snd_soc_component_update_bits(component,
1063 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x00);
Vatsal Buchad06525f2019-10-14 23:14:12 +05301064 tx_priv->bcs_clk_en = false;
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001065 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301066 break;
1067 }
1068 return 0;
1069}
1070
1071static int tx_macro_enable_micbias(struct snd_soc_dapm_widget *w,
1072 struct snd_kcontrol *kcontrol, int event)
1073{
1074 return 0;
1075}
1076
1077static int tx_macro_hw_params(struct snd_pcm_substream *substream,
1078 struct snd_pcm_hw_params *params,
1079 struct snd_soc_dai *dai)
1080{
1081 int tx_fs_rate = -EINVAL;
Meng Wang15c825d2018-09-06 10:49:18 +08001082 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301083 u32 decimator = 0;
Laxminath Kasamb7f823c2018-08-02 13:23:11 +05301084 u32 sample_rate = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301085 u16 tx_fs_reg = 0;
1086 struct device *tx_dev = NULL;
1087 struct tx_macro_priv *tx_priv = NULL;
1088
Meng Wang15c825d2018-09-06 10:49:18 +08001089 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301090 return -EINVAL;
1091
1092 pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
1093 dai->name, dai->id, params_rate(params),
1094 params_channels(params));
1095
1096 sample_rate = params_rate(params);
1097 switch (sample_rate) {
1098 case 8000:
1099 tx_fs_rate = 0;
1100 break;
1101 case 16000:
1102 tx_fs_rate = 1;
1103 break;
1104 case 32000:
1105 tx_fs_rate = 3;
1106 break;
1107 case 48000:
1108 tx_fs_rate = 4;
1109 break;
1110 case 96000:
1111 tx_fs_rate = 5;
1112 break;
1113 case 192000:
1114 tx_fs_rate = 6;
1115 break;
1116 case 384000:
1117 tx_fs_rate = 7;
1118 break;
1119 default:
Meng Wang15c825d2018-09-06 10:49:18 +08001120 dev_err(component->dev, "%s: Invalid TX sample rate: %d\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301121 __func__, params_rate(params));
1122 return -EINVAL;
1123 }
1124 for_each_set_bit(decimator, &tx_priv->active_ch_mask[dai->id],
1125 TX_MACRO_DEC_MAX) {
1126 if (decimator >= 0) {
1127 tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
1128 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +08001129 dev_dbg(component->dev, "%s: set DEC%u rate to %u\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301130 __func__, decimator, sample_rate);
Meng Wang15c825d2018-09-06 10:49:18 +08001131 snd_soc_component_update_bits(component, tx_fs_reg,
1132 0x0F, tx_fs_rate);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301133 } else {
Meng Wang15c825d2018-09-06 10:49:18 +08001134 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301135 "%s: ERROR: Invalid decimator: %d\n",
1136 __func__, decimator);
1137 return -EINVAL;
1138 }
1139 }
1140 return 0;
1141}
1142
1143static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
1144 unsigned int *tx_num, unsigned int *tx_slot,
1145 unsigned int *rx_num, unsigned int *rx_slot)
1146{
Meng Wang15c825d2018-09-06 10:49:18 +08001147 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301148 struct device *tx_dev = NULL;
1149 struct tx_macro_priv *tx_priv = NULL;
1150
Meng Wang15c825d2018-09-06 10:49:18 +08001151 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301152 return -EINVAL;
1153
1154 switch (dai->id) {
1155 case TX_MACRO_AIF1_CAP:
1156 case TX_MACRO_AIF2_CAP:
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001157 case TX_MACRO_AIF3_CAP:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301158 *tx_slot = tx_priv->active_ch_mask[dai->id];
1159 *tx_num = tx_priv->active_ch_cnt[dai->id];
1160 break;
1161 default:
1162 dev_err(tx_dev, "%s: Invalid AIF\n", __func__);
1163 break;
1164 }
1165 return 0;
1166}
1167
1168static struct snd_soc_dai_ops tx_macro_dai_ops = {
1169 .hw_params = tx_macro_hw_params,
1170 .get_channel_map = tx_macro_get_channel_map,
1171};
1172
1173static struct snd_soc_dai_driver tx_macro_dai[] = {
1174 {
1175 .name = "tx_macro_tx1",
1176 .id = TX_MACRO_AIF1_CAP,
1177 .capture = {
1178 .stream_name = "TX_AIF1 Capture",
1179 .rates = TX_MACRO_RATES,
1180 .formats = TX_MACRO_FORMATS,
1181 .rate_max = 192000,
1182 .rate_min = 8000,
1183 .channels_min = 1,
1184 .channels_max = 8,
1185 },
1186 .ops = &tx_macro_dai_ops,
1187 },
1188 {
1189 .name = "tx_macro_tx2",
1190 .id = TX_MACRO_AIF2_CAP,
1191 .capture = {
1192 .stream_name = "TX_AIF2 Capture",
1193 .rates = TX_MACRO_RATES,
1194 .formats = TX_MACRO_FORMATS,
1195 .rate_max = 192000,
1196 .rate_min = 8000,
1197 .channels_min = 1,
1198 .channels_max = 8,
1199 },
1200 .ops = &tx_macro_dai_ops,
1201 },
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001202 {
1203 .name = "tx_macro_tx3",
1204 .id = TX_MACRO_AIF3_CAP,
1205 .capture = {
1206 .stream_name = "TX_AIF3 Capture",
1207 .rates = TX_MACRO_RATES,
1208 .formats = TX_MACRO_FORMATS,
1209 .rate_max = 192000,
1210 .rate_min = 8000,
1211 .channels_min = 1,
1212 .channels_max = 8,
1213 },
1214 .ops = &tx_macro_dai_ops,
1215 },
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301216};
1217
1218#define STRING(name) #name
1219#define TX_MACRO_DAPM_ENUM(name, reg, offset, text) \
1220static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1221static const struct snd_kcontrol_new name##_mux = \
1222 SOC_DAPM_ENUM(STRING(name), name##_enum)
1223
1224#define TX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \
1225static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1226static const struct snd_kcontrol_new name##_mux = \
1227 SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname)
1228
1229#define TX_MACRO_DAPM_MUX(name, shift, kctl) \
1230 SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux)
1231
1232static const char * const adc_mux_text[] = {
1233 "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1"
1234};
1235
1236TX_MACRO_DAPM_ENUM(tx_dec0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1,
1237 0, adc_mux_text);
1238TX_MACRO_DAPM_ENUM(tx_dec1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1,
1239 0, adc_mux_text);
1240TX_MACRO_DAPM_ENUM(tx_dec2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1,
1241 0, adc_mux_text);
1242TX_MACRO_DAPM_ENUM(tx_dec3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1,
1243 0, adc_mux_text);
1244TX_MACRO_DAPM_ENUM(tx_dec4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1,
1245 0, adc_mux_text);
1246TX_MACRO_DAPM_ENUM(tx_dec5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1,
1247 0, adc_mux_text);
1248TX_MACRO_DAPM_ENUM(tx_dec6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1,
1249 0, adc_mux_text);
1250TX_MACRO_DAPM_ENUM(tx_dec7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1,
1251 0, adc_mux_text);
1252
1253
1254static const char * const dmic_mux_text[] = {
1255 "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3",
1256 "DMIC4", "DMIC5", "DMIC6", "DMIC7"
1257};
1258
1259TX_MACRO_DAPM_ENUM_EXT(tx_dmic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1260 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1261 tx_macro_put_dec_enum);
1262
1263TX_MACRO_DAPM_ENUM_EXT(tx_dmic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1264 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1265 tx_macro_put_dec_enum);
1266
1267TX_MACRO_DAPM_ENUM_EXT(tx_dmic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1268 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1269 tx_macro_put_dec_enum);
1270
1271TX_MACRO_DAPM_ENUM_EXT(tx_dmic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1272 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1273 tx_macro_put_dec_enum);
1274
1275TX_MACRO_DAPM_ENUM_EXT(tx_dmic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1276 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1277 tx_macro_put_dec_enum);
1278
1279TX_MACRO_DAPM_ENUM_EXT(tx_dmic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1280 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1281 tx_macro_put_dec_enum);
1282
1283TX_MACRO_DAPM_ENUM_EXT(tx_dmic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1284 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1285 tx_macro_put_dec_enum);
1286
1287TX_MACRO_DAPM_ENUM_EXT(tx_dmic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1288 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1289 tx_macro_put_dec_enum);
1290
1291static const char * const smic_mux_text[] = {
Sudheer Papothi324b4952019-06-11 04:14:51 +05301292 "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", "SWR_DMIC0",
1293 "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", "SWR_DMIC4",
1294 "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7"
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301295};
1296
1297TX_MACRO_DAPM_ENUM_EXT(tx_smic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1298 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1299 tx_macro_put_dec_enum);
1300
1301TX_MACRO_DAPM_ENUM_EXT(tx_smic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1302 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1303 tx_macro_put_dec_enum);
1304
1305TX_MACRO_DAPM_ENUM_EXT(tx_smic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1306 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1307 tx_macro_put_dec_enum);
1308
1309TX_MACRO_DAPM_ENUM_EXT(tx_smic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1310 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1311 tx_macro_put_dec_enum);
1312
1313TX_MACRO_DAPM_ENUM_EXT(tx_smic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1314 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1315 tx_macro_put_dec_enum);
1316
1317TX_MACRO_DAPM_ENUM_EXT(tx_smic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1318 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1319 tx_macro_put_dec_enum);
1320
1321TX_MACRO_DAPM_ENUM_EXT(tx_smic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1322 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1323 tx_macro_put_dec_enum);
1324
1325TX_MACRO_DAPM_ENUM_EXT(tx_smic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1326 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1327 tx_macro_put_dec_enum);
1328
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301329static const char * const smic_mux_text_v2[] = {
1330 "ZERO", "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3",
1331 "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7",
1332 "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11"
1333};
1334
1335TX_MACRO_DAPM_ENUM_EXT(tx_smic0_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1336 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1337 tx_macro_put_dec_enum);
1338
1339TX_MACRO_DAPM_ENUM_EXT(tx_smic1_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1340 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1341 tx_macro_put_dec_enum);
1342
1343TX_MACRO_DAPM_ENUM_EXT(tx_smic2_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1344 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1345 tx_macro_put_dec_enum);
1346
1347TX_MACRO_DAPM_ENUM_EXT(tx_smic3_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1348 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1349 tx_macro_put_dec_enum);
1350
1351TX_MACRO_DAPM_ENUM_EXT(tx_smic4_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1352 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1353 tx_macro_put_dec_enum);
1354
1355TX_MACRO_DAPM_ENUM_EXT(tx_smic5_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1356 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1357 tx_macro_put_dec_enum);
1358
1359TX_MACRO_DAPM_ENUM_EXT(tx_smic6_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1360 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1361 tx_macro_put_dec_enum);
1362
1363TX_MACRO_DAPM_ENUM_EXT(tx_smic7_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1364 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1365 tx_macro_put_dec_enum);
1366
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07001367static const char * const dec_mode_mux_text[] = {
1368 "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF",
1369};
1370
1371static const struct soc_enum dec_mode_mux_enum =
1372 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dec_mode_mux_text),
1373 dec_mode_mux_text);
1374
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301375static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = {
1376 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1377 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1378 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1379 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1380 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1381 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1382 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1383 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1384 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1385 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1386 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1387 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1388 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1389 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1390 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1391 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1392};
1393
1394static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = {
1395 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1396 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1397 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1398 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1399 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1400 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1401 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1402 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1403 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1404 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1405 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1406 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1407 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1408 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1409 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1410 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1411};
1412
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001413static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = {
1414 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1415 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1416 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1417 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1418 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1419 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1420 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1421 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1422 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1423 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1424 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1425 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1426 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1427 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1428 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1429 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1430};
1431
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301432static const struct snd_kcontrol_new tx_aif1_cap_mixer_v2[] = {
1433 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1434 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1435 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1436 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1437 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1438 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1439 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1440 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1441};
1442
1443static const struct snd_kcontrol_new tx_aif2_cap_mixer_v2[] = {
1444 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1445 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1446 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1447 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1448 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1449 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1450 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1451 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1452};
1453
1454static const struct snd_kcontrol_new tx_aif3_cap_mixer_v2[] = {
1455 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1456 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1457 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1458 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1459 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1460 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1461 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1462 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1463};
1464
1465static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_common[] = {
1466 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1467 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1468
1469 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1470 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1471
1472 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1473 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1474
1475 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1476 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1477 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1478 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1479
1480 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0_v2),
1481 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1_v2),
1482 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2_v2),
1483 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3_v2),
1484
1485 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1486 tx_macro_enable_micbias,
1487 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1488 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1489 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1490 SND_SOC_DAPM_POST_PMD),
1491
1492 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1493 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1494 SND_SOC_DAPM_POST_PMD),
1495
1496 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1497 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1498 SND_SOC_DAPM_POST_PMD),
1499
1500 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1501 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1502 SND_SOC_DAPM_POST_PMD),
1503
1504 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
1505 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1506 SND_SOC_DAPM_POST_PMD),
1507
1508 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
1509 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1510 SND_SOC_DAPM_POST_PMD),
1511
1512 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
1513 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1514 SND_SOC_DAPM_POST_PMD),
1515
1516 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
1517 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1518 SND_SOC_DAPM_POST_PMD),
1519
1520 SND_SOC_DAPM_INPUT("TX SWR_MIC0"),
1521 SND_SOC_DAPM_INPUT("TX SWR_MIC1"),
1522 SND_SOC_DAPM_INPUT("TX SWR_MIC2"),
1523 SND_SOC_DAPM_INPUT("TX SWR_MIC3"),
1524 SND_SOC_DAPM_INPUT("TX SWR_MIC4"),
1525 SND_SOC_DAPM_INPUT("TX SWR_MIC5"),
1526 SND_SOC_DAPM_INPUT("TX SWR_MIC6"),
1527 SND_SOC_DAPM_INPUT("TX SWR_MIC7"),
1528 SND_SOC_DAPM_INPUT("TX SWR_MIC8"),
1529 SND_SOC_DAPM_INPUT("TX SWR_MIC9"),
1530 SND_SOC_DAPM_INPUT("TX SWR_MIC10"),
1531 SND_SOC_DAPM_INPUT("TX SWR_MIC11"),
1532
1533 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
1534 TX_MACRO_DEC0, 0,
1535 &tx_dec0_mux, tx_macro_enable_dec,
1536 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1537 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1538
1539 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
1540 TX_MACRO_DEC1, 0,
1541 &tx_dec1_mux, tx_macro_enable_dec,
1542 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1543 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1544
1545 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
1546 TX_MACRO_DEC2, 0,
1547 &tx_dec2_mux, tx_macro_enable_dec,
1548 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1549 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1550
1551 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
1552 TX_MACRO_DEC3, 0,
1553 &tx_dec3_mux, tx_macro_enable_dec,
1554 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1555 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1556
1557 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1558 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1559};
1560
1561static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v2[] = {
1562 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1563 TX_MACRO_AIF1_CAP, 0,
1564 tx_aif1_cap_mixer_v2, ARRAY_SIZE(tx_aif1_cap_mixer_v2)),
1565
1566 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1567 TX_MACRO_AIF2_CAP, 0,
1568 tx_aif2_cap_mixer_v2, ARRAY_SIZE(tx_aif2_cap_mixer_v2)),
1569
1570 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1571 TX_MACRO_AIF3_CAP, 0,
1572 tx_aif3_cap_mixer_v2, ARRAY_SIZE(tx_aif3_cap_mixer_v2)),
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301573};
1574
1575static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v3[] = {
1576 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1577 TX_MACRO_AIF1_CAP, 0,
1578 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1579
1580 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1581 TX_MACRO_AIF2_CAP, 0,
1582 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1583
1584 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1585 TX_MACRO_AIF3_CAP, 0,
1586 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1587
1588 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1589 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1590 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1591 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1592
1593 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4_v3),
1594 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5_v3),
1595 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6_v3),
1596 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7_v3),
1597
1598 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
1599 TX_MACRO_DEC4, 0,
1600 &tx_dec4_mux, tx_macro_enable_dec,
1601 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1602 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1603
1604 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
1605 TX_MACRO_DEC5, 0,
1606 &tx_dec5_mux, tx_macro_enable_dec,
1607 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1608 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1609
1610 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
1611 TX_MACRO_DEC6, 0,
1612 &tx_dec6_mux, tx_macro_enable_dec,
1613 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1614 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1615
1616 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
1617 TX_MACRO_DEC7, 0,
1618 &tx_dec7_mux, tx_macro_enable_dec,
1619 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1620 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1621
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05301622 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1623 tx_macro_tx_swr_clk_event,
1624 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1625
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301626 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1627 tx_macro_va_swr_clk_event,
1628 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1629};
1630
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301631static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
1632 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1633 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1634
1635 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1636 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1637
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001638 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1639 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1640
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301641 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
1642 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1643
1644 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
1645 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1646
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001647 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0,
1648 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1649
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301650
1651 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1652 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1653 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1654 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1655 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1656 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1657 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1658 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1659
1660 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0),
1661 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1),
1662 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2),
1663 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3),
1664 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4),
1665 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5),
1666 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6),
1667 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7),
1668
1669 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1670 tx_macro_enable_micbias,
1671 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1672 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1673 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1674 SND_SOC_DAPM_POST_PMD),
1675
1676 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1677 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1678 SND_SOC_DAPM_POST_PMD),
1679
1680 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1681 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1682 SND_SOC_DAPM_POST_PMD),
1683
1684 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1685 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1686 SND_SOC_DAPM_POST_PMD),
1687
1688 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
1689 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1690 SND_SOC_DAPM_POST_PMD),
1691
1692 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
1693 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1694 SND_SOC_DAPM_POST_PMD),
1695
1696 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
1697 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1698 SND_SOC_DAPM_POST_PMD),
1699
1700 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
1701 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1702 SND_SOC_DAPM_POST_PMD),
1703
1704 SND_SOC_DAPM_INPUT("TX SWR_ADC0"),
1705 SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
1706 SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
1707 SND_SOC_DAPM_INPUT("TX SWR_ADC3"),
1708 SND_SOC_DAPM_INPUT("TX SWR_DMIC0"),
1709 SND_SOC_DAPM_INPUT("TX SWR_DMIC1"),
1710 SND_SOC_DAPM_INPUT("TX SWR_DMIC2"),
1711 SND_SOC_DAPM_INPUT("TX SWR_DMIC3"),
1712 SND_SOC_DAPM_INPUT("TX SWR_DMIC4"),
1713 SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
1714 SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
1715 SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
1716
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301717 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301718 TX_MACRO_DEC0, 0,
1719 &tx_dec0_mux, tx_macro_enable_dec,
1720 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1721 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1722
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301723 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301724 TX_MACRO_DEC1, 0,
1725 &tx_dec1_mux, tx_macro_enable_dec,
1726 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1727 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1728
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301729 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301730 TX_MACRO_DEC2, 0,
1731 &tx_dec2_mux, tx_macro_enable_dec,
1732 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1733 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1734
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301735 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301736 TX_MACRO_DEC3, 0,
1737 &tx_dec3_mux, tx_macro_enable_dec,
1738 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1739 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1740
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301741 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301742 TX_MACRO_DEC4, 0,
1743 &tx_dec4_mux, tx_macro_enable_dec,
1744 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1745 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1746
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301747 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301748 TX_MACRO_DEC5, 0,
1749 &tx_dec5_mux, tx_macro_enable_dec,
1750 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1751 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1752
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301753 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301754 TX_MACRO_DEC6, 0,
1755 &tx_dec6_mux, tx_macro_enable_dec,
1756 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1757 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1758
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301759 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301760 TX_MACRO_DEC7, 0,
1761 &tx_dec7_mux, tx_macro_enable_dec,
1762 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1763 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1764
1765 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1766 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Sudheer Papothie456c2c2019-03-05 07:08:45 +05301767
1768 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1769 tx_macro_tx_swr_clk_event,
1770 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1771
1772 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1773 tx_macro_va_swr_clk_event,
1774 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301775};
1776
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301777static const struct snd_soc_dapm_route tx_audio_map_common[] = {
1778 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1779 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
1780 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
1781
1782 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1783 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
1784 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
1785
1786 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1787 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1788 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1789 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1790
1791 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1792 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1793 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1794 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1795
1796 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1797 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1798 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1799 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1800
1801 {"TX DEC0 MUX", NULL, "TX_MCLK"},
1802 {"TX DEC1 MUX", NULL, "TX_MCLK"},
1803 {"TX DEC2 MUX", NULL, "TX_MCLK"},
1804 {"TX DEC3 MUX", NULL, "TX_MCLK"},
1805
1806 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
1807 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
1808 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
1809 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
1810 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
1811 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
1812 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
1813 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
1814 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
1815
1816 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
1817 {"TX SMIC MUX0", "SWR_MIC0", "TX SWR_MIC0"},
1818 {"TX SMIC MUX0", "SWR_MIC1", "TX SWR_MIC1"},
1819 {"TX SMIC MUX0", "SWR_MIC2", "TX SWR_MIC2"},
1820 {"TX SMIC MUX0", "SWR_MIC3", "TX SWR_MIC3"},
1821 {"TX SMIC MUX0", "SWR_MIC4", "TX SWR_MIC4"},
1822 {"TX SMIC MUX0", "SWR_MIC5", "TX SWR_MIC5"},
1823 {"TX SMIC MUX0", "SWR_MIC6", "TX SWR_MIC6"},
1824 {"TX SMIC MUX0", "SWR_MIC7", "TX SWR_MIC7"},
1825 {"TX SMIC MUX0", "SWR_MIC8", "TX SWR_MIC8"},
1826 {"TX SMIC MUX0", "SWR_MIC9", "TX SWR_MIC9"},
1827 {"TX SMIC MUX0", "SWR_MIC10", "TX SWR_MIC10"},
1828 {"TX SMIC MUX0", "SWR_MIC11", "TX SWR_MIC11"},
1829
1830 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
1831 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
1832 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
1833 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
1834 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
1835 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
1836 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
1837 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
1838 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
1839
1840 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
1841 {"TX SMIC MUX1", "SWR_MIC0", "TX SWR_MIC0"},
1842 {"TX SMIC MUX1", "SWR_MIC1", "TX SWR_MIC1"},
1843 {"TX SMIC MUX1", "SWR_MIC2", "TX SWR_MIC2"},
1844 {"TX SMIC MUX1", "SWR_MIC3", "TX SWR_MIC3"},
1845 {"TX SMIC MUX1", "SWR_MIC4", "TX SWR_MIC4"},
1846 {"TX SMIC MUX1", "SWR_MIC5", "TX SWR_MIC5"},
1847 {"TX SMIC MUX1", "SWR_MIC6", "TX SWR_MIC6"},
1848 {"TX SMIC MUX1", "SWR_MIC7", "TX SWR_MIC7"},
1849 {"TX SMIC MUX1", "SWR_MIC8", "TX SWR_MIC8"},
1850 {"TX SMIC MUX1", "SWR_MIC9", "TX SWR_MIC9"},
1851 {"TX SMIC MUX1", "SWR_MIC10", "TX SWR_MIC10"},
1852 {"TX SMIC MUX1", "SWR_MIC11", "TX SWR_MIC11"},
1853
1854 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
1855 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
1856 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
1857 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
1858 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
1859 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
1860 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
1861 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
1862 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
1863
1864 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
1865 {"TX SMIC MUX2", "SWR_MIC0", "TX SWR_MIC0"},
1866 {"TX SMIC MUX2", "SWR_MIC1", "TX SWR_MIC1"},
1867 {"TX SMIC MUX2", "SWR_MIC2", "TX SWR_MIC2"},
1868 {"TX SMIC MUX2", "SWR_MIC3", "TX SWR_MIC3"},
1869 {"TX SMIC MUX2", "SWR_MIC4", "TX SWR_MIC4"},
1870 {"TX SMIC MUX2", "SWR_MIC5", "TX SWR_MIC5"},
1871 {"TX SMIC MUX2", "SWR_MIC6", "TX SWR_MIC6"},
1872 {"TX SMIC MUX2", "SWR_MIC7", "TX SWR_MIC7"},
1873 {"TX SMIC MUX2", "SWR_MIC8", "TX SWR_MIC8"},
1874 {"TX SMIC MUX2", "SWR_MIC9", "TX SWR_MIC9"},
1875 {"TX SMIC MUX2", "SWR_MIC10", "TX SWR_MIC10"},
1876 {"TX SMIC MUX2", "SWR_MIC11", "TX SWR_MIC11"},
1877
1878 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
1879 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
1880 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
1881 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
1882 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
1883 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
1884 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
1885 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
1886 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
1887
1888 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
1889 {"TX SMIC MUX3", "SWR_MIC0", "TX SWR_MIC0"},
1890 {"TX SMIC MUX3", "SWR_MIC1", "TX SWR_MIC1"},
1891 {"TX SMIC MUX3", "SWR_MIC2", "TX SWR_MIC2"},
1892 {"TX SMIC MUX3", "SWR_MIC3", "TX SWR_MIC3"},
1893 {"TX SMIC MUX3", "SWR_MIC4", "TX SWR_MIC4"},
1894 {"TX SMIC MUX3", "SWR_MIC5", "TX SWR_MIC5"},
1895 {"TX SMIC MUX3", "SWR_MIC6", "TX SWR_MIC6"},
1896 {"TX SMIC MUX3", "SWR_MIC7", "TX SWR_MIC7"},
1897 {"TX SMIC MUX3", "SWR_MIC8", "TX SWR_MIC8"},
1898 {"TX SMIC MUX3", "SWR_MIC9", "TX SWR_MIC9"},
1899 {"TX SMIC MUX3", "SWR_MIC10", "TX SWR_MIC10"},
1900 {"TX SMIC MUX3", "SWR_MIC11", "TX SWR_MIC11"},
1901};
1902
1903static const struct snd_soc_dapm_route tx_audio_map_v3[] = {
1904 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1905 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1906 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1907 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1908
1909 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1910 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1911 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1912 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1913
1914 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1915 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1916 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1917 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1918
1919 {"TX DEC4 MUX", NULL, "TX_MCLK"},
1920 {"TX DEC5 MUX", NULL, "TX_MCLK"},
1921 {"TX DEC6 MUX", NULL, "TX_MCLK"},
1922 {"TX DEC7 MUX", NULL, "TX_MCLK"},
1923
1924 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
1925 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
1926 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
1927 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
1928 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
1929 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
1930 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
1931 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
1932 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
1933
1934 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
1935 {"TX SMIC MUX4", "SWR_MIC0", "TX SWR_MIC0"},
1936 {"TX SMIC MUX4", "SWR_MIC1", "TX SWR_MIC1"},
1937 {"TX SMIC MUX4", "SWR_MIC2", "TX SWR_MIC2"},
1938 {"TX SMIC MUX4", "SWR_MIC3", "TX SWR_MIC3"},
1939 {"TX SMIC MUX4", "SWR_MIC4", "TX SWR_MIC4"},
1940 {"TX SMIC MUX4", "SWR_MIC5", "TX SWR_MIC5"},
1941 {"TX SMIC MUX4", "SWR_MIC6", "TX SWR_MIC6"},
1942 {"TX SMIC MUX4", "SWR_MIC7", "TX SWR_MIC7"},
1943 {"TX SMIC MUX4", "SWR_MIC8", "TX SWR_MIC8"},
1944 {"TX SMIC MUX4", "SWR_MIC9", "TX SWR_MIC9"},
1945 {"TX SMIC MUX4", "SWR_MIC10", "TX SWR_MIC10"},
1946 {"TX SMIC MUX4", "SWR_MIC11", "TX SWR_MIC11"},
1947
1948 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
1949 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
1950 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
1951 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
1952 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
1953 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
1954 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
1955 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
1956 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
1957
1958 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
1959 {"TX SMIC MUX5", "SWR_MIC0", "TX SWR_MIC0"},
1960 {"TX SMIC MUX5", "SWR_MIC1", "TX SWR_MIC1"},
1961 {"TX SMIC MUX5", "SWR_MIC2", "TX SWR_MIC2"},
1962 {"TX SMIC MUX5", "SWR_MIC3", "TX SWR_MIC3"},
1963 {"TX SMIC MUX5", "SWR_MIC4", "TX SWR_MIC4"},
1964 {"TX SMIC MUX5", "SWR_MIC5", "TX SWR_MIC5"},
1965 {"TX SMIC MUX5", "SWR_MIC6", "TX SWR_MIC6"},
1966 {"TX SMIC MUX5", "SWR_MIC7", "TX SWR_MIC7"},
1967 {"TX SMIC MUX5", "SWR_MIC8", "TX SWR_MIC8"},
1968 {"TX SMIC MUX5", "SWR_MIC9", "TX SWR_MIC9"},
1969 {"TX SMIC MUX5", "SWR_MIC10", "TX SWR_MIC10"},
1970 {"TX SMIC MUX5", "SWR_MIC11", "TX SWR_MIC11"},
1971
1972 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
1973 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
1974 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
1975 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
1976 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
1977 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
1978 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
1979 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
1980 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
1981
1982 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
1983 {"TX SMIC MUX6", "SWR_MIC0", "TX SWR_MIC0"},
1984 {"TX SMIC MUX6", "SWR_MIC1", "TX SWR_MIC1"},
1985 {"TX SMIC MUX6", "SWR_MIC2", "TX SWR_MIC2"},
1986 {"TX SMIC MUX6", "SWR_MIC3", "TX SWR_MIC3"},
1987 {"TX SMIC MUX6", "SWR_MIC4", "TX SWR_MIC4"},
1988 {"TX SMIC MUX6", "SWR_MIC5", "TX SWR_MIC5"},
1989 {"TX SMIC MUX6", "SWR_MIC6", "TX SWR_MIC6"},
1990 {"TX SMIC MUX6", "SWR_MIC7", "TX SWR_MIC7"},
1991 {"TX SMIC MUX6", "SWR_MIC8", "TX SWR_MIC8"},
1992 {"TX SMIC MUX6", "SWR_MIC9", "TX SWR_MIC9"},
1993 {"TX SMIC MUX6", "SWR_MIC10", "TX SWR_MIC10"},
1994 {"TX SMIC MUX6", "SWR_MIC11", "TX SWR_MIC11"},
1995
1996 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
1997 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
1998 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
1999 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
2000 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
2001 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
2002 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
2003 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
2004 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
2005
2006 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
2007 {"TX SMIC MUX7", "SWR_MIC0", "TX SWR_MIC0"},
2008 {"TX SMIC MUX7", "SWR_MIC1", "TX SWR_MIC1"},
2009 {"TX SMIC MUX7", "SWR_MIC2", "TX SWR_MIC2"},
2010 {"TX SMIC MUX7", "SWR_MIC3", "TX SWR_MIC3"},
2011 {"TX SMIC MUX7", "SWR_MIC4", "TX SWR_MIC4"},
2012 {"TX SMIC MUX7", "SWR_MIC5", "TX SWR_MIC5"},
2013 {"TX SMIC MUX7", "SWR_MIC6", "TX SWR_MIC6"},
2014 {"TX SMIC MUX7", "SWR_MIC7", "TX SWR_MIC7"},
2015 {"TX SMIC MUX7", "SWR_MIC8", "TX SWR_MIC8"},
2016 {"TX SMIC MUX7", "SWR_MIC9", "TX SWR_MIC9"},
2017 {"TX SMIC MUX7", "SWR_MIC10", "TX SWR_MIC10"},
2018 {"TX SMIC MUX7", "SWR_MIC11", "TX SWR_MIC11"},
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05302019
2020 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
2021 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
2022 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
2023 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
2024 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
2025 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
2026 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
2027 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302028};
2029
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302030static const struct snd_soc_dapm_route tx_audio_map[] = {
2031 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
2032 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002033 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302034
2035 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
2036 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002037 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302038
2039 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
2040 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
2041 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
2042 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
2043 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
2044 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
2045 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
2046 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
2047
2048 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
2049 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
2050 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
2051 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
2052 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
2053 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
2054 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
2055 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
2056
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002057 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
2058 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
2059 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
2060 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
2061 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
2062 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
2063 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
2064 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
2065
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302066 {"TX DEC0 MUX", NULL, "TX_MCLK"},
2067 {"TX DEC1 MUX", NULL, "TX_MCLK"},
2068 {"TX DEC2 MUX", NULL, "TX_MCLK"},
2069 {"TX DEC3 MUX", NULL, "TX_MCLK"},
2070 {"TX DEC4 MUX", NULL, "TX_MCLK"},
2071 {"TX DEC5 MUX", NULL, "TX_MCLK"},
2072 {"TX DEC6 MUX", NULL, "TX_MCLK"},
2073 {"TX DEC7 MUX", NULL, "TX_MCLK"},
2074
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302075 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
2076 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
2077 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
2078 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
2079 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
2080 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
2081 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
2082 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
2083 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
2084
2085 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302086 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302087 {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
2088 {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"},
2089 {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"},
2090 {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"},
2091 {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"},
2092 {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"},
2093 {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"},
2094 {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"},
2095 {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"},
2096 {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"},
2097 {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
2098 {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
2099
2100 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
2101 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
2102 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
2103 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
2104 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
2105 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
2106 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
2107 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
2108 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
2109
2110 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302111 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302112 {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
2113 {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"},
2114 {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"},
2115 {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"},
2116 {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"},
2117 {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"},
2118 {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"},
2119 {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"},
2120 {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"},
2121 {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"},
2122 {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
2123 {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
2124
2125 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
2126 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
2127 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
2128 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
2129 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
2130 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
2131 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
2132 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
2133 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
2134
2135 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302136 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302137 {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
2138 {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"},
2139 {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"},
2140 {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"},
2141 {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"},
2142 {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"},
2143 {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"},
2144 {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"},
2145 {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"},
2146 {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"},
2147 {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
2148 {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
2149
2150 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
2151 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
2152 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
2153 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
2154 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
2155 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
2156 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
2157 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
2158 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
2159
2160 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302161 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302162 {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
2163 {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"},
2164 {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"},
2165 {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"},
2166 {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"},
2167 {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"},
2168 {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"},
2169 {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"},
2170 {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"},
2171 {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"},
2172 {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
2173 {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
2174
2175 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
2176 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
2177 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
2178 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
2179 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
2180 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
2181 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
2182 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
2183 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
2184
2185 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302186 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302187 {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
2188 {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"},
2189 {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"},
2190 {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"},
2191 {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"},
2192 {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"},
2193 {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"},
2194 {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"},
2195 {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"},
2196 {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"},
2197 {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
2198 {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
2199
2200 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
2201 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
2202 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
2203 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
2204 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
2205 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
2206 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
2207 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
2208 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
2209
2210 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302211 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302212 {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
2213 {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"},
2214 {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"},
2215 {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"},
2216 {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"},
2217 {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"},
2218 {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"},
2219 {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"},
2220 {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"},
2221 {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"},
2222 {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
2223 {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
2224
2225 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
2226 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
2227 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
2228 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
2229 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
2230 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
2231 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
2232 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
2233 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
2234
2235 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302236 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302237 {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
2238 {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"},
2239 {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"},
2240 {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"},
2241 {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"},
2242 {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"},
2243 {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"},
2244 {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"},
2245 {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"},
2246 {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"},
2247 {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
2248 {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
2249
2250 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
2251 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
2252 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
2253 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
2254 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
2255 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
2256 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
2257 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
2258 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
2259
2260 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302261 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302262 {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},
2263 {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"},
2264 {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"},
2265 {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"},
2266 {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"},
2267 {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"},
2268 {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"},
2269 {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"},
2270 {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"},
2271 {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"},
2272 {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"},
2273 {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"},
2274};
2275
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302276static const struct snd_kcontrol_new tx_macro_snd_controls_common[] = {
2277 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2278 BOLERO_CDC_TX0_TX_VOL_CTL,
2279 0, -84, 40, digital_gain),
2280 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2281 BOLERO_CDC_TX1_TX_VOL_CTL,
2282 0, -84, 40, digital_gain),
2283 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2284 BOLERO_CDC_TX2_TX_VOL_CTL,
2285 0, -84, 40, digital_gain),
2286 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2287 BOLERO_CDC_TX3_TX_VOL_CTL,
2288 0, -84, 40, digital_gain),
2289
2290 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2291 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2292
2293 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2294 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2295
2296 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2297 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2298
2299 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2300 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2301
2302 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2303 tx_macro_get_bcs, tx_macro_set_bcs),
Aditya Bavanari8a3f1e62020-03-23 12:48:26 +05302304
2305 SOC_ENUM_EXT("BCS CH_SEL", bcs_ch_sel_mux_enum,
2306 tx_macro_get_bcs_ch_sel, tx_macro_put_bcs_ch_sel),
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302307};
2308
2309static const struct snd_kcontrol_new tx_macro_snd_controls_v3[] = {
2310 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2311 BOLERO_CDC_TX4_TX_VOL_CTL,
2312 0, -84, 40, digital_gain),
2313 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2314 BOLERO_CDC_TX5_TX_VOL_CTL,
2315 0, -84, 40, digital_gain),
2316 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2317 BOLERO_CDC_TX6_TX_VOL_CTL,
2318 0, -84, 40, digital_gain),
2319 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2320 BOLERO_CDC_TX7_TX_VOL_CTL,
2321 0, -84, 40, digital_gain),
2322
2323 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2324 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2325
2326 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2327 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2328
2329 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2330 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2331
2332 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2333 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2334};
2335
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302336static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
2337 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2338 BOLERO_CDC_TX0_TX_VOL_CTL,
2339 0, -84, 40, digital_gain),
2340 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2341 BOLERO_CDC_TX1_TX_VOL_CTL,
2342 0, -84, 40, digital_gain),
2343 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2344 BOLERO_CDC_TX2_TX_VOL_CTL,
2345 0, -84, 40, digital_gain),
2346 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2347 BOLERO_CDC_TX3_TX_VOL_CTL,
2348 0, -84, 40, digital_gain),
2349 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2350 BOLERO_CDC_TX4_TX_VOL_CTL,
2351 0, -84, 40, digital_gain),
2352 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2353 BOLERO_CDC_TX5_TX_VOL_CTL,
2354 0, -84, 40, digital_gain),
2355 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2356 BOLERO_CDC_TX6_TX_VOL_CTL,
2357 0, -84, 40, digital_gain),
2358 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2359 BOLERO_CDC_TX7_TX_VOL_CTL,
2360 0, -84, 40, digital_gain),
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002361
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07002362 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2363 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2364
2365 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2366 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2367
2368 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2369 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2370
2371 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2372 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2373
2374 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2375 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2376
2377 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2378 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2379
2380 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2381 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2382
2383 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2384 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2385
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002386 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2387 tx_macro_get_bcs, tx_macro_set_bcs),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302388};
2389
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302390static int tx_macro_register_event_listener(struct snd_soc_component *component,
Laxminath Kasam2ffc69e2020-06-16 20:15:26 +05302391 bool enable)
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302392{
2393 struct device *tx_dev = NULL;
2394 struct tx_macro_priv *tx_priv = NULL;
2395 int ret = 0;
2396
2397 if (!component)
2398 return -EINVAL;
2399
2400 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2401 if (!tx_dev) {
2402 dev_err(component->dev,
2403 "%s: null device for macro!\n", __func__);
2404 return -EINVAL;
2405 }
2406 tx_priv = dev_get_drvdata(tx_dev);
2407 if (!tx_priv) {
2408 dev_err(component->dev,
2409 "%s: priv is null for macro!\n", __func__);
2410 return -EINVAL;
2411 }
Meng Wang3c6c7b62020-01-13 14:35:30 +08002412 if (tx_priv->swr_ctrl_data &&
2413 (!tx_priv->tx_swr_clk_cnt || !tx_priv->va_swr_clk_cnt)) {
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302414 if (enable) {
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302415 ret = swrm_wcd_notify(
2416 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Laxminath Kasam2ffc69e2020-06-16 20:15:26 +05302417 SWR_REGISTER_WAKEUP, NULL);
Laxminath Kasamea6cbee2020-04-28 00:02:32 +05302418 msm_cdc_pinctrl_set_wakeup_capable(
Laxminath Kasam2ffc69e2020-06-16 20:15:26 +05302419 tx_priv->tx_swr_gpio_p, false);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302420 } else {
Laxminath Kasamea6cbee2020-04-28 00:02:32 +05302421 msm_cdc_pinctrl_set_wakeup_capable(
Laxminath Kasam2ffc69e2020-06-16 20:15:26 +05302422 tx_priv->tx_swr_gpio_p, true);
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302423 ret = swrm_wcd_notify(
2424 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Laxminath Kasam2ffc69e2020-06-16 20:15:26 +05302425 SWR_DEREGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302426 }
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302427 }
2428
2429 return ret;
2430}
2431
Sudheer Papothia7397942019-03-19 03:14:23 +05302432static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
2433 struct regmap *regmap, int clk_type,
2434 bool enable)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302435{
Meng Wang69b55c82019-05-29 11:04:29 +08002436 int ret = 0, clk_tx_ret = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302437
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002438 trace_printk("%s: clock type %s, enable: %s tx_mclk_users: %d\n",
2439 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
2440 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302441 dev_dbg(tx_priv->dev,
2442 "%s: clock type %s, enable: %s tx_mclk_users: %d\n",
Sudheer Papothia7397942019-03-19 03:14:23 +05302443 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302444 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Tanya Dixit8530fb92018-09-14 16:01:25 +05302445
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302446 if (enable) {
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002447 if (tx_priv->swr_clk_users == 0) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002448 trace_printk("%s: tx swr clk users 0\n", __func__);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002449 ret = msm_cdc_pinctrl_select_active_state(
Karthikeyan Mani01f1ba42019-02-26 18:48:15 -08002450 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002451 if (ret < 0) {
2452 dev_err_ratelimited(tx_priv->dev,
2453 "%s: tx swr pinctrl enable failed\n",
2454 __func__);
2455 goto exit;
2456 }
2457 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302458
Meng Wang69b55c82019-05-29 11:04:29 +08002459 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302460 TX_CORE_CLK,
2461 TX_CORE_CLK,
2462 true);
2463 if (clk_type == TX_MCLK) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002464 trace_printk("%s: requesting TX_MCLK\n", __func__);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302465 ret = tx_macro_mclk_enable(tx_priv, 1);
2466 if (ret < 0) {
2467 if (tx_priv->swr_clk_users == 0)
2468 msm_cdc_pinctrl_select_sleep_state(
2469 tx_priv->tx_swr_gpio_p);
2470 dev_err_ratelimited(tx_priv->dev,
2471 "%s: request clock enable failed\n",
2472 __func__);
2473 goto done;
2474 }
2475 }
2476 if (clk_type == VA_MCLK) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002477 trace_printk("%s: requesting VA_MCLK\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302478 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2479 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302480 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302481 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302482 if (ret < 0) {
2483 if (tx_priv->swr_clk_users == 0)
Sudheer Papothia7397942019-03-19 03:14:23 +05302484 msm_cdc_pinctrl_select_sleep_state(
2485 tx_priv->tx_swr_gpio_p);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302486 dev_err_ratelimited(tx_priv->dev,
2487 "%s: swr request clk failed\n",
2488 __func__);
2489 goto done;
Sudheer Papothia7397942019-03-19 03:14:23 +05302490 }
Sudheer Papothi296867b2019-06-20 09:24:09 +05302491 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
2492 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302493 if (tx_priv->tx_mclk_users == 0) {
2494 regmap_update_bits(regmap,
2495 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK,
2496 0x01, 0x01);
2497 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002498 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302499 0x01, 0x01);
2500 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002501 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302502 0x01, 0x01);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302503 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002504 tx_priv->tx_mclk_users++;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302505 }
2506 if (tx_priv->swr_clk_users == 0) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302507 dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n",
2508 __func__, tx_priv->reset_swr);
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002509 trace_printk("%s: reset_swr: %d\n",
2510 __func__, tx_priv->reset_swr);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302511 if (tx_priv->reset_swr)
2512 regmap_update_bits(regmap,
2513 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2514 0x02, 0x02);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302515 regmap_update_bits(regmap,
2516 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2517 0x01, 0x01);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302518 if (tx_priv->reset_swr)
2519 regmap_update_bits(regmap,
2520 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2521 0x02, 0x00);
2522 tx_priv->reset_swr = false;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302523 }
Meng Wang69b55c82019-05-29 11:04:29 +08002524 if (!clk_tx_ret)
2525 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302526 TX_CORE_CLK,
2527 TX_CORE_CLK,
2528 false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302529 tx_priv->swr_clk_users++;
2530 } else {
2531 if (tx_priv->swr_clk_users <= 0) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302532 dev_err_ratelimited(tx_priv->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302533 "tx swrm clock users already 0\n");
2534 tx_priv->swr_clk_users = 0;
Sudheer Papothia7397942019-03-19 03:14:23 +05302535 return 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302536 }
Meng Wang69b55c82019-05-29 11:04:29 +08002537 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302538 TX_CORE_CLK,
2539 TX_CORE_CLK,
2540 true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302541 tx_priv->swr_clk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302542 if (tx_priv->swr_clk_users == 0)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302543 regmap_update_bits(regmap,
2544 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2545 0x01, 0x00);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302546 if (clk_type == TX_MCLK)
2547 tx_macro_mclk_enable(tx_priv, 0);
2548 if (clk_type == VA_MCLK) {
Meng Wang52a8fb12019-12-12 20:36:05 +08002549 if (tx_priv->tx_mclk_users <= 0) {
2550 dev_err(tx_priv->dev, "%s: clock already disabled\n",
2551 __func__);
2552 tx_priv->tx_mclk_users = 0;
2553 goto tx_clk;
2554 }
2555 tx_priv->tx_mclk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302556 if (tx_priv->tx_mclk_users == 0) {
2557 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002558 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302559 0x01, 0x00);
2560 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002561 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302562 0x01, 0x00);
Sudheer Papothia7397942019-03-19 03:14:23 +05302563 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002564
Sudheer Papothi296867b2019-06-20 09:24:09 +05302565 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
Meng Wang52a8fb12019-12-12 20:36:05 +08002566 false);
Sudheer Papothia7397942019-03-19 03:14:23 +05302567 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2568 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302569 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302570 false);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302571 if (ret < 0) {
2572 dev_err_ratelimited(tx_priv->dev,
2573 "%s: swr request clk failed\n",
2574 __func__);
2575 goto done;
2576 }
2577 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002578tx_clk:
Meng Wang69b55c82019-05-29 11:04:29 +08002579 if (!clk_tx_ret)
2580 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302581 TX_CORE_CLK,
2582 TX_CORE_CLK,
2583 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002584 if (tx_priv->swr_clk_users == 0) {
2585 ret = msm_cdc_pinctrl_select_sleep_state(
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302586 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002587 if (ret < 0) {
2588 dev_err_ratelimited(tx_priv->dev,
2589 "%s: tx swr pinctrl disable failed\n",
2590 __func__);
2591 goto exit;
2592 }
2593 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302594 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302595 return 0;
2596
2597done:
Meng Wang69b55c82019-05-29 11:04:29 +08002598 if (!clk_tx_ret)
2599 bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothia7397942019-03-19 03:14:23 +05302600 TX_CORE_CLK,
2601 TX_CORE_CLK,
2602 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002603exit:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002604 trace_printk("%s: exit\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302605 return ret;
2606}
2607
Sudheer Papothid50a5812019-11-21 07:24:42 +05302608static int tx_macro_clk_div_get(struct snd_soc_component *component)
2609{
2610 struct device *tx_dev = NULL;
2611 struct tx_macro_priv *tx_priv = NULL;
2612
2613 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
2614 return -EINVAL;
2615
2616 return tx_priv->dmic_clk_div;
2617}
2618
Sudheer Papothif4155002019-12-05 01:36:13 +05302619static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src)
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302620{
2621 struct device *tx_dev = NULL;
2622 struct tx_macro_priv *tx_priv = NULL;
2623 int ret = 0;
2624
2625 if (!component)
2626 return -EINVAL;
2627
2628 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2629 if (!tx_dev) {
2630 dev_err(component->dev,
2631 "%s: null device for macro!\n", __func__);
2632 return -EINVAL;
2633 }
2634 tx_priv = dev_get_drvdata(tx_dev);
2635 if (!tx_priv) {
2636 dev_err(component->dev,
2637 "%s: priv is null for macro!\n", __func__);
2638 return -EINVAL;
2639 }
2640 if (tx_priv->swr_ctrl_data) {
2641 ret = swrm_wcd_notify(
2642 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Sudheer Papothif4155002019-12-05 01:36:13 +05302643 SWR_REQ_CLK_SWITCH, &clk_src);
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302644 }
2645
2646 return ret;
2647}
2648
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002649static int tx_macro_core_vote(void *handle, bool enable)
2650{
2651 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002652
2653 if (tx_priv == NULL) {
2654 pr_err("%s: tx priv data is NULL\n", __func__);
2655 return -EINVAL;
2656 }
2657 if (enable) {
2658 pm_runtime_get_sync(tx_priv->dev);
2659 pm_runtime_put_autosuspend(tx_priv->dev);
2660 pm_runtime_mark_last_busy(tx_priv->dev);
2661 }
2662
Aditya Bavanarid577af92019-10-03 21:09:19 +05302663 if (bolero_check_core_votes(tx_priv->dev))
2664 return 0;
2665 else
2666 return -EINVAL;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002667}
2668
Sudheer Papothia7397942019-03-19 03:14:23 +05302669static int tx_macro_swrm_clock(void *handle, bool enable)
2670{
2671 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
2672 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
2673 int ret = 0;
2674
2675 if (regmap == NULL) {
2676 dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__);
2677 return -EINVAL;
2678 }
2679
2680 mutex_lock(&tx_priv->swr_clk_lock);
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002681 trace_printk("%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2682 __func__,
2683 (enable ? "enable" : "disable"),
2684 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302685 dev_dbg(tx_priv->dev,
2686 "%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2687 __func__, (enable ? "enable" : "disable"),
2688 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothia7397942019-03-19 03:14:23 +05302689
2690 if (enable) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302691 pm_runtime_get_sync(tx_priv->dev);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302692 if (tx_priv->va_swr_clk_cnt && !tx_priv->tx_swr_clk_cnt) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302693 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2694 VA_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002695 if (ret) {
2696 pm_runtime_mark_last_busy(tx_priv->dev);
2697 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302698 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002699 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302700 tx_priv->va_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302701 } else {
Sudheer Papothia7397942019-03-19 03:14:23 +05302702 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2703 TX_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002704 if (ret) {
2705 pm_runtime_mark_last_busy(tx_priv->dev);
2706 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302707 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002708 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302709 tx_priv->tx_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302710 }
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302711 pm_runtime_mark_last_busy(tx_priv->dev);
2712 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302713 } else {
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302714 if (tx_priv->va_clk_status && !tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302715 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2716 VA_MCLK, enable);
2717 if (ret)
2718 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302719 --tx_priv->va_clk_status;
2720 } else if (!tx_priv->va_clk_status && tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302721 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2722 TX_MCLK, enable);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302723 if (ret)
2724 goto done;
2725 --tx_priv->tx_clk_status;
2726 } else if (tx_priv->va_clk_status && tx_priv->tx_clk_status) {
2727 if (!tx_priv->va_swr_clk_cnt && tx_priv->tx_swr_clk_cnt) {
2728 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2729 VA_MCLK, enable);
Sudheer Papothia7397942019-03-19 03:14:23 +05302730 if (ret)
2731 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302732 --tx_priv->va_clk_status;
2733 } else {
2734 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2735 TX_MCLK, enable);
2736 if (ret)
2737 goto done;
2738 --tx_priv->tx_clk_status;
Sudheer Papothia7397942019-03-19 03:14:23 +05302739 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302740
2741 } else {
2742 dev_dbg(tx_priv->dev,
2743 "%s: Both clocks are disabled\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302744 }
2745 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302746
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002747 trace_printk("%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2748 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2749 tx_priv->va_clk_status);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302750 dev_dbg(tx_priv->dev,
2751 "%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2752 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2753 tx_priv->va_clk_status);
Sudheer Papothia7397942019-03-19 03:14:23 +05302754done:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302755 mutex_unlock(&tx_priv->swr_clk_lock);
2756 return ret;
2757}
2758
2759static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate,
2760 struct tx_macro_priv *tx_priv)
2761{
2762 u32 div_factor = TX_MACRO_CLK_DIV_2;
2763 u32 mclk_rate = TX_MACRO_MCLK_FREQ;
2764
2765 if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED ||
2766 mclk_rate % dmic_sample_rate != 0)
2767 goto undefined_rate;
2768
2769 div_factor = mclk_rate / dmic_sample_rate;
2770
2771 switch (div_factor) {
2772 case 2:
2773 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
2774 break;
2775 case 3:
2776 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_3;
2777 break;
2778 case 4:
2779 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_4;
2780 break;
2781 case 6:
2782 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_6;
2783 break;
2784 case 8:
2785 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_8;
2786 break;
2787 case 16:
2788 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_16;
2789 break;
2790 default:
2791 /* Any other DIV factor is invalid */
2792 goto undefined_rate;
2793 }
2794
2795 /* Valid dmic DIV factors */
2796 dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n",
2797 __func__, div_factor, mclk_rate);
2798
2799 return dmic_sample_rate;
2800
2801undefined_rate:
2802 dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n",
2803 __func__, dmic_sample_rate, mclk_rate);
2804 dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED;
2805
2806 return dmic_sample_rate;
2807}
2808
Sudheer Papothi72fef482019-08-30 11:00:20 +05302809static const struct tx_macro_reg_mask_val tx_macro_reg_init[] = {
Vatsal Bucha116ac372020-01-14 12:55:18 +05302810 {BOLERO_CDC_TX0_TX_PATH_SEC7, 0x3F, 0x0A},
Sudheer Papothi72fef482019-08-30 11:00:20 +05302811};
2812
Meng Wang15c825d2018-09-06 10:49:18 +08002813static int tx_macro_init(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302814{
Meng Wang15c825d2018-09-06 10:49:18 +08002815 struct snd_soc_dapm_context *dapm =
2816 snd_soc_component_get_dapm(component);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302817 int ret = 0, i = 0;
2818 struct device *tx_dev = NULL;
2819 struct tx_macro_priv *tx_priv = NULL;
2820
Meng Wang15c825d2018-09-06 10:49:18 +08002821 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302822 if (!tx_dev) {
Meng Wang15c825d2018-09-06 10:49:18 +08002823 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302824 "%s: null device for macro!\n", __func__);
2825 return -EINVAL;
2826 }
2827 tx_priv = dev_get_drvdata(tx_dev);
2828 if (!tx_priv) {
Meng Wang15c825d2018-09-06 10:49:18 +08002829 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302830 "%s: priv is null for macro!\n", __func__);
2831 return -EINVAL;
2832 }
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302833 tx_priv->version = bolero_get_version(tx_dev);
2834 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2835 ret = snd_soc_dapm_new_controls(dapm,
2836 tx_macro_dapm_widgets_common,
2837 ARRAY_SIZE(tx_macro_dapm_widgets_common));
2838 if (ret < 0) {
2839 dev_err(tx_dev, "%s: Failed to add controls\n",
2840 __func__);
2841 return ret;
2842 }
2843 if (tx_priv->version == BOLERO_VERSION_2_1)
2844 ret = snd_soc_dapm_new_controls(dapm,
2845 tx_macro_dapm_widgets_v2,
2846 ARRAY_SIZE(tx_macro_dapm_widgets_v2));
2847 else if (tx_priv->version == BOLERO_VERSION_2_0)
2848 ret = snd_soc_dapm_new_controls(dapm,
2849 tx_macro_dapm_widgets_v3,
2850 ARRAY_SIZE(tx_macro_dapm_widgets_v3));
2851 if (ret < 0) {
2852 dev_err(tx_dev, "%s: Failed to add controls\n",
2853 __func__);
2854 return ret;
2855 }
2856 } else {
2857 ret = snd_soc_dapm_new_controls(dapm, tx_macro_dapm_widgets,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302858 ARRAY_SIZE(tx_macro_dapm_widgets));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302859 if (ret < 0) {
2860 dev_err(tx_dev, "%s: Failed to add controls\n",
2861 __func__);
2862 return ret;
2863 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302864 }
2865
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302866 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2867 ret = snd_soc_dapm_add_routes(dapm,
2868 tx_audio_map_common,
2869 ARRAY_SIZE(tx_audio_map_common));
2870 if (ret < 0) {
2871 dev_err(tx_dev, "%s: Failed to add routes\n",
2872 __func__);
2873 return ret;
2874 }
2875 if (tx_priv->version == BOLERO_VERSION_2_0)
2876 ret = snd_soc_dapm_add_routes(dapm,
2877 tx_audio_map_v3,
2878 ARRAY_SIZE(tx_audio_map_v3));
2879 if (ret < 0) {
2880 dev_err(tx_dev, "%s: Failed to add routes\n",
2881 __func__);
2882 return ret;
2883 }
2884 } else {
2885 ret = snd_soc_dapm_add_routes(dapm, tx_audio_map,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302886 ARRAY_SIZE(tx_audio_map));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302887 if (ret < 0) {
2888 dev_err(tx_dev, "%s: Failed to add routes\n",
2889 __func__);
2890 return ret;
2891 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302892 }
2893
2894 ret = snd_soc_dapm_new_widgets(dapm->card);
2895 if (ret < 0) {
2896 dev_err(tx_dev, "%s: Failed to add widgets\n", __func__);
2897 return ret;
2898 }
2899
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302900 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2901 ret = snd_soc_add_component_controls(component,
2902 tx_macro_snd_controls_common,
2903 ARRAY_SIZE(tx_macro_snd_controls_common));
2904 if (ret < 0) {
2905 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2906 __func__);
2907 return ret;
2908 }
2909 if (tx_priv->version == BOLERO_VERSION_2_0)
2910 ret = snd_soc_add_component_controls(component,
2911 tx_macro_snd_controls_v3,
2912 ARRAY_SIZE(tx_macro_snd_controls_v3));
2913 if (ret < 0) {
2914 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2915 __func__);
2916 return ret;
2917 }
2918 } else {
2919 ret = snd_soc_add_component_controls(component,
2920 tx_macro_snd_controls,
2921 ARRAY_SIZE(tx_macro_snd_controls));
2922 if (ret < 0) {
2923 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2924 __func__);
2925 return ret;
2926 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302927 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302928
2929 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF1 Capture");
2930 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF2 Capture");
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002931 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF3 Capture");
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302932 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2933 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC0");
2934 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC1");
2935 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC2");
2936 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC3");
2937 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC4");
2938 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC5");
2939 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC6");
2940 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC7");
2941 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC8");
2942 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC9");
2943 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC10");
2944 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC11");
2945 } else {
2946 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC0");
2947 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1");
2948 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2");
2949 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC3");
2950 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC0");
2951 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC1");
2952 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC2");
2953 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC3");
2954 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC4");
2955 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC5");
2956 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC6");
2957 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC7");
2958 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302959 snd_soc_dapm_sync(dapm);
2960
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302961 for (i = 0; i < NUM_DECIMATORS; i++) {
2962 tx_priv->tx_hpf_work[i].tx_priv = tx_priv;
2963 tx_priv->tx_hpf_work[i].decimator = i;
2964 INIT_DELAYED_WORK(&tx_priv->tx_hpf_work[i].dwork,
2965 tx_macro_tx_hpf_corner_freq_callback);
2966 }
2967
2968 for (i = 0; i < NUM_DECIMATORS; i++) {
2969 tx_priv->tx_mute_dwork[i].tx_priv = tx_priv;
2970 tx_priv->tx_mute_dwork[i].decimator = i;
2971 INIT_DELAYED_WORK(&tx_priv->tx_mute_dwork[i].dwork,
2972 tx_macro_mute_update_callback);
2973 }
Meng Wang15c825d2018-09-06 10:49:18 +08002974 tx_priv->component = component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302975
Sudheer Papothi72fef482019-08-30 11:00:20 +05302976 for (i = 0; i < ARRAY_SIZE(tx_macro_reg_init); i++)
2977 snd_soc_component_update_bits(component,
2978 tx_macro_reg_init[i].reg,
2979 tx_macro_reg_init[i].mask,
2980 tx_macro_reg_init[i].val);
2981
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302982 if (tx_priv->version == BOLERO_VERSION_2_1)
2983 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05302984 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302985 else if (tx_priv->version == BOLERO_VERSION_2_0)
2986 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05302987 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05302988
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302989 return 0;
2990}
2991
Meng Wang15c825d2018-09-06 10:49:18 +08002992static int tx_macro_deinit(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302993{
2994 struct device *tx_dev = NULL;
2995 struct tx_macro_priv *tx_priv = NULL;
2996
Meng Wang15c825d2018-09-06 10:49:18 +08002997 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302998 return -EINVAL;
2999
Meng Wang15c825d2018-09-06 10:49:18 +08003000 tx_priv->component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303001 return 0;
3002}
3003
3004static void tx_macro_add_child_devices(struct work_struct *work)
3005{
3006 struct tx_macro_priv *tx_priv = NULL;
3007 struct platform_device *pdev = NULL;
3008 struct device_node *node = NULL;
3009 struct tx_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
3010 int ret = 0;
3011 u16 count = 0, ctrl_num = 0;
3012 struct tx_macro_swr_ctrl_platform_data *platdata = NULL;
3013 char plat_dev_name[TX_MACRO_SWR_STRING_LEN] = "";
3014 bool tx_swr_master_node = false;
3015
3016 tx_priv = container_of(work, struct tx_macro_priv,
3017 tx_macro_add_child_devices_work);
3018 if (!tx_priv) {
3019 pr_err("%s: Memory for tx_priv does not exist\n",
3020 __func__);
3021 return;
3022 }
3023
3024 if (!tx_priv->dev) {
3025 pr_err("%s: tx dev does not exist\n", __func__);
3026 return;
3027 }
3028
3029 if (!tx_priv->dev->of_node) {
3030 dev_err(tx_priv->dev,
3031 "%s: DT node for tx_priv does not exist\n", __func__);
3032 return;
3033 }
3034
3035 platdata = &tx_priv->swr_plat_data;
3036 tx_priv->child_count = 0;
3037
3038 for_each_available_child_of_node(tx_priv->dev->of_node, node) {
3039 tx_swr_master_node = false;
3040 if (strnstr(node->name, "tx_swr_master",
3041 strlen("tx_swr_master")) != NULL)
3042 tx_swr_master_node = true;
3043
3044 if (tx_swr_master_node)
3045 strlcpy(plat_dev_name, "tx_swr_ctrl",
3046 (TX_MACRO_SWR_STRING_LEN - 1));
3047 else
3048 strlcpy(plat_dev_name, node->name,
3049 (TX_MACRO_SWR_STRING_LEN - 1));
3050
3051 pdev = platform_device_alloc(plat_dev_name, -1);
3052 if (!pdev) {
3053 dev_err(tx_priv->dev, "%s: pdev memory alloc failed\n",
3054 __func__);
3055 ret = -ENOMEM;
3056 goto err;
3057 }
3058 pdev->dev.parent = tx_priv->dev;
3059 pdev->dev.of_node = node;
3060
3061 if (tx_swr_master_node) {
3062 ret = platform_device_add_data(pdev, platdata,
3063 sizeof(*platdata));
3064 if (ret) {
3065 dev_err(&pdev->dev,
3066 "%s: cannot add plat data ctrl:%d\n",
3067 __func__, ctrl_num);
3068 goto fail_pdev_add;
3069 }
3070 }
3071
3072 ret = platform_device_add(pdev);
3073 if (ret) {
3074 dev_err(&pdev->dev,
3075 "%s: Cannot add platform device\n",
3076 __func__);
3077 goto fail_pdev_add;
3078 }
3079
3080 if (tx_swr_master_node) {
3081 temp = krealloc(swr_ctrl_data,
3082 (ctrl_num + 1) * sizeof(
3083 struct tx_macro_swr_ctrl_data),
3084 GFP_KERNEL);
3085 if (!temp) {
3086 ret = -ENOMEM;
3087 goto fail_pdev_add;
3088 }
3089 swr_ctrl_data = temp;
3090 swr_ctrl_data[ctrl_num].tx_swr_pdev = pdev;
3091 ctrl_num++;
3092 dev_dbg(&pdev->dev,
3093 "%s: Added soundwire ctrl device(s)\n",
3094 __func__);
3095 tx_priv->swr_ctrl_data = swr_ctrl_data;
3096 }
3097 if (tx_priv->child_count < TX_MACRO_CHILD_DEVICES_MAX)
3098 tx_priv->pdev_child_devices[
3099 tx_priv->child_count++] = pdev;
3100 else
3101 goto err;
3102 }
3103 return;
3104fail_pdev_add:
3105 for (count = 0; count < tx_priv->child_count; count++)
3106 platform_device_put(tx_priv->pdev_child_devices[count]);
3107err:
3108 return;
3109}
3110
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303111static int tx_macro_set_port_map(struct snd_soc_component *component,
3112 u32 usecase, u32 size, void *data)
3113{
3114 struct device *tx_dev = NULL;
3115 struct tx_macro_priv *tx_priv = NULL;
3116 struct swrm_port_config port_cfg;
3117 int ret = 0;
3118
3119 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
3120 return -EINVAL;
3121
3122 memset(&port_cfg, 0, sizeof(port_cfg));
3123 port_cfg.uc = usecase;
3124 port_cfg.size = size;
3125 port_cfg.params = data;
3126
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003127 if (tx_priv->swr_ctrl_data)
3128 ret = swrm_wcd_notify(
3129 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
3130 SWR_SET_PORT_MAP, &port_cfg);
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303131
3132 return ret;
3133}
3134
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303135static void tx_macro_init_ops(struct macro_ops *ops,
3136 char __iomem *tx_io_base)
3137{
3138 memset(ops, 0, sizeof(struct macro_ops));
3139 ops->init = tx_macro_init;
3140 ops->exit = tx_macro_deinit;
3141 ops->io_base = tx_io_base;
3142 ops->dai_ptr = tx_macro_dai;
3143 ops->num_dais = ARRAY_SIZE(tx_macro_dai);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05303144 ops->event_handler = tx_macro_event_handler;
Aditya Bavanaric4e96122018-11-14 14:46:38 +05303145 ops->reg_wake_irq = tx_macro_reg_wake_irq;
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303146 ops->set_port_map = tx_macro_set_port_map;
Sudheer Papothid50a5812019-11-21 07:24:42 +05303147 ops->clk_div_get = tx_macro_clk_div_get;
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05303148 ops->clk_switch = tx_macro_clk_switch;
Sudheer Papothi06a4c642019-08-08 05:17:46 +05303149 ops->reg_evt_listener = tx_macro_register_event_listener;
Sudheer Papothifc3adb02019-11-24 10:14:21 +05303150 ops->clk_enable = __tx_macro_mclk_enable;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303151}
3152
3153static int tx_macro_probe(struct platform_device *pdev)
3154{
3155 struct macro_ops ops = {0};
3156 struct tx_macro_priv *tx_priv = NULL;
3157 u32 tx_base_addr = 0, sample_rate = 0;
3158 char __iomem *tx_io_base = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303159 int ret = 0;
3160 const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate";
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003161 u32 is_used_tx_swr_gpio = 1;
3162 const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio";
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303163
Laxminath Kasam251ce992020-07-01 23:37:33 +05303164 if (!bolero_is_va_macro_registered(&pdev->dev)) {
3165 dev_err(&pdev->dev,
3166 "%s: va-macro not registered yet, defer\n", __func__);
3167 return -EPROBE_DEFER;
3168 }
3169
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303170 tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv),
3171 GFP_KERNEL);
3172 if (!tx_priv)
3173 return -ENOMEM;
3174 platform_set_drvdata(pdev, tx_priv);
3175
3176 tx_priv->dev = &pdev->dev;
3177 ret = of_property_read_u32(pdev->dev.of_node, "reg",
3178 &tx_base_addr);
3179 if (ret) {
3180 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3181 __func__, "reg");
3182 return ret;
3183 }
3184 dev_set_drvdata(&pdev->dev, tx_priv);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003185 if (of_find_property(pdev->dev.of_node, is_used_tx_swr_gpio_dt,
3186 NULL)) {
3187 ret = of_property_read_u32(pdev->dev.of_node,
3188 is_used_tx_swr_gpio_dt,
3189 &is_used_tx_swr_gpio);
3190 if (ret) {
3191 dev_err(&pdev->dev, "%s: error reading %s in dt\n",
3192 __func__, is_used_tx_swr_gpio_dt);
3193 is_used_tx_swr_gpio = 1;
3194 }
3195 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303196 tx_priv->tx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
3197 "qcom,tx-swr-gpios", 0);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003198 if (!tx_priv->tx_swr_gpio_p && is_used_tx_swr_gpio) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303199 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
3200 __func__);
3201 return -EINVAL;
3202 }
Karthikeyan Manib44e4552019-09-09 23:06:04 -07003203 if (msm_cdc_pinctrl_get_state(tx_priv->tx_swr_gpio_p) < 0 &&
3204 is_used_tx_swr_gpio) {
Karthikeyan Mani326536d2019-06-03 13:29:43 -07003205 dev_err(&pdev->dev, "%s: failed to get swr pin state\n",
3206 __func__);
3207 return -EPROBE_DEFER;
3208 }
3209
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303210 tx_io_base = devm_ioremap(&pdev->dev,
3211 tx_base_addr, TX_MACRO_MAX_OFFSET);
3212 if (!tx_io_base) {
3213 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
3214 return -ENOMEM;
3215 }
3216 tx_priv->tx_io_base = tx_io_base;
3217 ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate,
3218 &sample_rate);
3219 if (ret) {
3220 dev_err(&pdev->dev,
3221 "%s: could not find sample_rate entry in dt\n",
3222 __func__);
3223 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
3224 } else {
3225 if (tx_macro_validate_dmic_sample_rate(
3226 sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED)
3227 return -EINVAL;
3228 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303229 if (is_used_tx_swr_gpio) {
3230 tx_priv->reset_swr = true;
3231 INIT_WORK(&tx_priv->tx_macro_add_child_devices_work,
3232 tx_macro_add_child_devices);
3233 tx_priv->swr_plat_data.handle = (void *) tx_priv;
3234 tx_priv->swr_plat_data.read = NULL;
3235 tx_priv->swr_plat_data.write = NULL;
3236 tx_priv->swr_plat_data.bulk_write = NULL;
3237 tx_priv->swr_plat_data.clk = tx_macro_swrm_clock;
3238 tx_priv->swr_plat_data.core_vote = tx_macro_core_vote;
3239 tx_priv->swr_plat_data.handle_irq = NULL;
3240 mutex_init(&tx_priv->swr_clk_lock);
3241 }
3242 tx_priv->is_used_tx_swr_gpio = is_used_tx_swr_gpio;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303243 mutex_init(&tx_priv->mclk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303244 tx_macro_init_ops(&ops, tx_io_base);
Vidyakumar Athota5d45f4c2019-03-10 22:35:07 -07003245 ops.clk_id_req = TX_CORE_CLK;
3246 ops.default_clk_id = TX_CORE_CLK;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303247 ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops);
3248 if (ret) {
3249 dev_err(&pdev->dev,
3250 "%s: register macro failed\n", __func__);
3251 goto err_reg_macro;
3252 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303253 if (is_used_tx_swr_gpio)
3254 schedule_work(&tx_priv->tx_macro_add_child_devices_work);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303255 pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY);
3256 pm_runtime_use_autosuspend(&pdev->dev);
3257 pm_runtime_set_suspended(&pdev->dev);
Sudheer Papothi296867b2019-06-20 09:24:09 +05303258 pm_suspend_ignore_children(&pdev->dev, true);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303259 pm_runtime_enable(&pdev->dev);
3260
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303261 return 0;
3262err_reg_macro:
3263 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303264 if (is_used_tx_swr_gpio)
3265 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303266 return ret;
3267}
3268
3269static int tx_macro_remove(struct platform_device *pdev)
3270{
3271 struct tx_macro_priv *tx_priv = NULL;
3272 u16 count = 0;
3273
3274 tx_priv = platform_get_drvdata(pdev);
3275
3276 if (!tx_priv)
3277 return -EINVAL;
3278
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303279 if (tx_priv->is_used_tx_swr_gpio) {
3280 if (tx_priv->swr_ctrl_data)
3281 kfree(tx_priv->swr_ctrl_data);
3282 for (count = 0; count < tx_priv->child_count &&
3283 count < TX_MACRO_CHILD_DEVICES_MAX; count++)
3284 platform_device_unregister(
3285 tx_priv->pdev_child_devices[count]);
3286 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303287
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303288 pm_runtime_disable(&pdev->dev);
3289 pm_runtime_set_suspended(&pdev->dev);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303290 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303291 if (tx_priv->is_used_tx_swr_gpio)
3292 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303293 bolero_unregister_macro(&pdev->dev, TX_MACRO);
3294 return 0;
3295}
3296
3297
3298static const struct of_device_id tx_macro_dt_match[] = {
3299 {.compatible = "qcom,tx-macro"},
3300 {}
3301};
3302
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303303static const struct dev_pm_ops bolero_dev_pm_ops = {
Aditya Bavanari4460ed22020-02-20 12:46:51 +05303304 SET_SYSTEM_SLEEP_PM_OPS(
3305 pm_runtime_force_suspend,
3306 pm_runtime_force_resume
3307 )
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303308 SET_RUNTIME_PM_OPS(
3309 bolero_runtime_suspend,
3310 bolero_runtime_resume,
3311 NULL
3312 )
3313};
3314
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303315static struct platform_driver tx_macro_driver = {
3316 .driver = {
3317 .name = "tx_macro",
3318 .owner = THIS_MODULE,
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303319 .pm = &bolero_dev_pm_ops,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303320 .of_match_table = tx_macro_dt_match,
Xiaojun Sang53cd13a2018-06-29 15:14:37 +08003321 .suppress_bind_attrs = true,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303322 },
3323 .probe = tx_macro_probe,
3324 .remove = tx_macro_remove,
3325};
3326
3327module_platform_driver(tx_macro_driver);
3328
3329MODULE_DESCRIPTION("TX macro driver");
3330MODULE_LICENSE("GPL v2");