blob: 7f0e758b27cd698d355d7639da4d22617b91dfa2 [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;
Vatsal Bucha75ad8c12020-06-22 09:46:36 +0530178 int amic_sample_rate;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530179};
180
Meng Wang15c825d2018-09-06 10:49:18 +0800181static bool tx_macro_get_data(struct snd_soc_component *component,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530182 struct device **tx_dev,
183 struct tx_macro_priv **tx_priv,
184 const char *func_name)
185{
Meng Wang15c825d2018-09-06 10:49:18 +0800186 *tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530187 if (!(*tx_dev)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800188 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530189 "%s: null device for macro!\n", func_name);
190 return false;
191 }
192
193 *tx_priv = dev_get_drvdata((*tx_dev));
194 if (!(*tx_priv)) {
Meng Wang15c825d2018-09-06 10:49:18 +0800195 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530196 "%s: priv is null for macro!\n", func_name);
197 return false;
198 }
199
Meng Wang15c825d2018-09-06 10:49:18 +0800200 if (!(*tx_priv)->component) {
201 dev_err(component->dev,
202 "%s: tx_priv->component not initialized!\n", func_name);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530203 return false;
204 }
205
206 return true;
207}
208
209static int tx_macro_mclk_enable(struct tx_macro_priv *tx_priv,
210 bool mclk_enable)
211{
212 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
213 int ret = 0;
214
Tanya Dixit8530fb92018-09-14 16:01:25 +0530215 if (regmap == NULL) {
216 dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__);
217 return -EINVAL;
218 }
219
Laxminath Kasamb7f823c2018-08-02 13:23:11 +0530220 dev_dbg(tx_priv->dev, "%s: mclk_enable = %u,clk_users= %d\n",
221 __func__, mclk_enable, tx_priv->tx_mclk_users);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530222
223 mutex_lock(&tx_priv->mclk_lock);
224 if (mclk_enable) {
Meng Wang52a8fb12019-12-12 20:36:05 +0800225 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
226 TX_CORE_CLK,
227 TX_CORE_CLK,
228 true);
229 if (ret < 0) {
230 dev_err_ratelimited(tx_priv->dev,
231 "%s: request clock enable failed\n",
232 __func__);
233 goto exit;
234 }
235 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
236 true);
Sudheer Papothicd9b0b02020-07-31 10:34:29 +0530237 regcache_mark_dirty(regmap);
238 regcache_sync_region(regmap,
239 TX_START_OFFSET,
240 TX_MAX_OFFSET);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530241 if (tx_priv->tx_mclk_users == 0) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530242 /* 9.6MHz MCLK, set value 0x00 if other frequency */
243 regmap_update_bits(regmap,
244 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK, 0x01, 0x01);
245 regmap_update_bits(regmap,
246 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
247 0x01, 0x01);
248 regmap_update_bits(regmap,
249 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
250 0x01, 0x01);
251 }
252 tx_priv->tx_mclk_users++;
253 } else {
254 if (tx_priv->tx_mclk_users <= 0) {
255 dev_err(tx_priv->dev, "%s: clock already disabled\n",
256 __func__);
257 tx_priv->tx_mclk_users = 0;
258 goto exit;
259 }
260 tx_priv->tx_mclk_users--;
261 if (tx_priv->tx_mclk_users == 0) {
262 regmap_update_bits(regmap,
263 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
264 0x01, 0x00);
265 regmap_update_bits(regmap,
266 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
267 0x01, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530268 }
Meng Wang52a8fb12019-12-12 20:36:05 +0800269
270 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
271 false);
272 bolero_clk_rsc_request_clock(tx_priv->dev,
273 TX_CORE_CLK,
274 TX_CORE_CLK,
275 false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530276 }
277exit:
278 mutex_unlock(&tx_priv->mclk_lock);
279 return ret;
280}
281
Sudheer Papothifc3adb02019-11-24 10:14:21 +0530282static int __tx_macro_mclk_enable(struct snd_soc_component *component,
283 bool enable)
284{
285 struct device *tx_dev = NULL;
286 struct tx_macro_priv *tx_priv = NULL;
287
288 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
289 return -EINVAL;
290
291 return tx_macro_mclk_enable(tx_priv, enable);
292}
293
Sudheer Papothie456c2c2019-03-05 07:08:45 +0530294static int tx_macro_va_swr_clk_event(struct snd_soc_dapm_widget *w,
295 struct snd_kcontrol *kcontrol, int event)
296{
297 struct device *tx_dev = NULL;
298 struct tx_macro_priv *tx_priv = NULL;
299 struct snd_soc_component *component =
300 snd_soc_dapm_to_component(w->dapm);
301
302 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
303 return -EINVAL;
304
305 if (SND_SOC_DAPM_EVENT_ON(event))
306 ++tx_priv->va_swr_clk_cnt;
307 if (SND_SOC_DAPM_EVENT_OFF(event))
308 --tx_priv->va_swr_clk_cnt;
309
310 return 0;
311}
312
313static int tx_macro_tx_swr_clk_event(struct snd_soc_dapm_widget *w,
314 struct snd_kcontrol *kcontrol, int event)
315{
316 struct device *tx_dev = NULL;
317 struct tx_macro_priv *tx_priv = NULL;
318 struct snd_soc_component *component =
319 snd_soc_dapm_to_component(w->dapm);
320
321 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
322 return -EINVAL;
323
324 if (SND_SOC_DAPM_EVENT_ON(event))
325 ++tx_priv->tx_swr_clk_cnt;
326 if (SND_SOC_DAPM_EVENT_OFF(event))
327 --tx_priv->tx_swr_clk_cnt;
328
329 return 0;
330}
331
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530332static int tx_macro_mclk_event(struct snd_soc_dapm_widget *w,
333 struct snd_kcontrol *kcontrol, int event)
334{
Meng Wang15c825d2018-09-06 10:49:18 +0800335 struct snd_soc_component *component =
336 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530337 int ret = 0;
338 struct device *tx_dev = NULL;
339 struct tx_macro_priv *tx_priv = NULL;
340
Meng Wang15c825d2018-09-06 10:49:18 +0800341 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530342 return -EINVAL;
343
344 dev_dbg(tx_dev, "%s: event = %d\n", __func__, event);
345 switch (event) {
346 case SND_SOC_DAPM_PRE_PMU:
347 ret = tx_macro_mclk_enable(tx_priv, 1);
Ramprasad Katkam452772a2019-01-07 17:30:36 +0530348 if (ret)
349 tx_priv->dapm_mclk_enable = false;
350 else
351 tx_priv->dapm_mclk_enable = true;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530352 break;
353 case SND_SOC_DAPM_POST_PMD:
Ramprasad Katkam452772a2019-01-07 17:30:36 +0530354 if (tx_priv->dapm_mclk_enable)
355 ret = tx_macro_mclk_enable(tx_priv, 0);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530356 break;
357 default:
358 dev_err(tx_priv->dev,
359 "%s: invalid DAPM event %d\n", __func__, event);
360 ret = -EINVAL;
361 }
362 return ret;
363}
364
Meng Wang15c825d2018-09-06 10:49:18 +0800365static int tx_macro_event_handler(struct snd_soc_component *component,
366 u16 event, u32 data)
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530367{
368 struct device *tx_dev = NULL;
369 struct tx_macro_priv *tx_priv = NULL;
Aditya Bavanari50ef13e2019-08-09 15:14:43 +0530370 int ret = 0;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530371
Meng Wang15c825d2018-09-06 10:49:18 +0800372 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530373 return -EINVAL;
374
375 switch (event) {
376 case BOLERO_MACRO_EVT_SSR_DOWN:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -0700377 trace_printk("%s, enter SSR down\n", __func__);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700378 if (tx_priv->swr_ctrl_data) {
379 swrm_wcd_notify(
380 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700381 SWR_DEVICE_SSR_DOWN, NULL);
382 }
Aditya Bavanari50ef13e2019-08-09 15:14:43 +0530383 if ((!pm_runtime_enabled(tx_dev) ||
384 !pm_runtime_suspended(tx_dev))) {
385 ret = bolero_runtime_suspend(tx_dev);
386 if (!ret) {
387 pm_runtime_disable(tx_dev);
388 pm_runtime_set_suspended(tx_dev);
389 pm_runtime_enable(tx_dev);
390 }
391 }
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530392 break;
393 case BOLERO_MACRO_EVT_SSR_UP:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -0700394 trace_printk("%s, enter SSR up\n", __func__);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +0530395 /* reset swr after ssr/pdr */
396 tx_priv->reset_swr = true;
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700397 if (tx_priv->swr_ctrl_data)
398 swrm_wcd_notify(
399 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
400 SWR_DEVICE_SSR_UP, NULL);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530401 break;
Meng Wang8ef0cc22019-05-08 15:12:56 +0800402 case BOLERO_MACRO_EVT_CLK_RESET:
403 bolero_rsc_clk_reset(tx_dev, TX_CORE_CLK);
404 break;
Vatsal Buchad06525f2019-10-14 23:14:12 +0530405 case BOLERO_MACRO_EVT_BCS_CLK_OFF:
406 if (tx_priv->bcs_clk_en)
407 snd_soc_component_update_bits(component,
408 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, data << 6);
409 if (data)
410 tx_priv->hs_slow_insert_complete = true;
411 else
412 tx_priv->hs_slow_insert_complete = false;
413 break;
Prasad Kumpatlaefdb3932020-05-13 18:55:32 +0530414 default:
415 pr_debug("%s Invalid Event\n", __func__);
416 break;
Laxminath Kasamfb0d6832018-09-22 01:49:52 +0530417 }
418 return 0;
419}
420
Meng Wang15c825d2018-09-06 10:49:18 +0800421static int tx_macro_reg_wake_irq(struct snd_soc_component *component,
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530422 u32 data)
423{
424 struct device *tx_dev = NULL;
425 struct tx_macro_priv *tx_priv = NULL;
426 u32 ipc_wakeup = data;
427 int ret = 0;
428
Meng Wang15c825d2018-09-06 10:49:18 +0800429 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530430 return -EINVAL;
431
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -0700432 if (tx_priv->swr_ctrl_data)
433 ret = swrm_wcd_notify(
434 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
435 SWR_REGISTER_WAKE_IRQ, &ipc_wakeup);
Aditya Bavanaric4e96122018-11-14 14:46:38 +0530436
437 return ret;
438}
439
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530440static bool is_amic_enabled(struct snd_soc_component *component, int decimator)
Sudheer Papothi339c4112019-12-13 00:49:16 +0530441{
442 u16 adc_mux_reg = 0, adc_reg = 0;
443 u16 adc_n = BOLERO_ADC_MAX;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530444 bool ret = false;
445 struct device *tx_dev = NULL;
446 struct tx_macro_priv *tx_priv = NULL;
447
448 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
449 return ret;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530450
451 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
452 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
453 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530454 if (tx_priv->version == BOLERO_VERSION_2_1)
455 return true;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530456 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
457 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
458 adc_n = snd_soc_component_read32(component, adc_reg) &
459 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530460 if (adc_n < BOLERO_ADC_MAX)
461 return true;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530462 }
463
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530464 return ret;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530465}
466
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530467static void tx_macro_tx_hpf_corner_freq_callback(struct work_struct *work)
468{
469 struct delayed_work *hpf_delayed_work = NULL;
470 struct hpf_work *hpf_work = NULL;
471 struct tx_macro_priv *tx_priv = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800472 struct snd_soc_component *component = NULL;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530473 u16 dec_cfg_reg = 0, hpf_gate_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530474 u8 hpf_cut_off_freq = 0;
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530475 u16 adc_reg = 0, adc_n = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530476
477 hpf_delayed_work = to_delayed_work(work);
478 hpf_work = container_of(hpf_delayed_work, struct hpf_work, dwork);
479 tx_priv = hpf_work->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800480 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530481 hpf_cut_off_freq = hpf_work->hpf_cut_off_freq;
482
483 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
484 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530485 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
486 TX_MACRO_TX_PATH_OFFSET * hpf_work->decimator;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530487
Meng Wang15c825d2018-09-06 10:49:18 +0800488 dev_dbg(component->dev, "%s: decimator %u hpf_cut_of_freq 0x%x\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530489 __func__, hpf_work->decimator, hpf_cut_off_freq);
490
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530491 if (is_amic_enabled(component, hpf_work->decimator)) {
492 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
493 TX_MACRO_ADC_MUX_CFG_OFFSET * hpf_work->decimator;
494 adc_n = snd_soc_component_read32(component, adc_reg) &
495 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
Laxminath Kasam497a6512018-09-17 16:11:52 +0530496 /* analog mic clear TX hold */
Meng Wang15c825d2018-09-06 10:49:18 +0800497 bolero_clear_amic_tx_hold(component->dev, adc_n);
Sudheer Papothi339c4112019-12-13 00:49:16 +0530498 snd_soc_component_update_bits(component,
499 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
500 hpf_cut_off_freq << 5);
501 snd_soc_component_update_bits(component, hpf_gate_reg,
502 0x03, 0x02);
Vatsal Bucha75ad8c12020-06-22 09:46:36 +0530503 /* Add delay between toggle hpf gate based on sample rate */
504 switch(tx_priv->amic_sample_rate) {
505 case 8000:
506 usleep_range(125, 130);
507 break;
508 case 16000:
509 usleep_range(62, 65);
510 break;
511 case 32000:
512 usleep_range(31, 32);
513 break;
514 case 48000:
515 usleep_range(20, 21);
516 break;
517 case 96000:
518 usleep_range(10, 11);
519 break;
520 case 192000:
521 usleep_range(5, 6);
522 break;
523 default:
524 usleep_range(125, 130);
525 }
Sudheer Papothi339c4112019-12-13 00:49:16 +0530526 snd_soc_component_update_bits(component, hpf_gate_reg,
527 0x03, 0x01);
528 } else {
529 snd_soc_component_update_bits(component,
530 dec_cfg_reg, TX_HPF_CUT_OFF_FREQ_MASK,
531 hpf_cut_off_freq << 5);
532 snd_soc_component_update_bits(component, hpf_gate_reg,
533 0x02, 0x02);
534 /* Minimum 1 clk cycle delay is required as per HW spec */
535 usleep_range(1000, 1010);
536 snd_soc_component_update_bits(component, hpf_gate_reg,
537 0x02, 0x00);
Laxminath Kasam497a6512018-09-17 16:11:52 +0530538 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530539}
540
541static void tx_macro_mute_update_callback(struct work_struct *work)
542{
543 struct tx_mute_work *tx_mute_dwork = NULL;
Meng Wang15c825d2018-09-06 10:49:18 +0800544 struct snd_soc_component *component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530545 struct tx_macro_priv *tx_priv = NULL;
546 struct delayed_work *delayed_work = NULL;
Xiaojun Sangd155fdc2018-10-11 15:11:59 +0800547 u16 tx_vol_ctl_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530548 u8 decimator = 0;
549
550 delayed_work = to_delayed_work(work);
551 tx_mute_dwork = container_of(delayed_work, struct tx_mute_work, dwork);
552 tx_priv = tx_mute_dwork->tx_priv;
Meng Wang15c825d2018-09-06 10:49:18 +0800553 component = tx_priv->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530554 decimator = tx_mute_dwork->decimator;
555
556 tx_vol_ctl_reg =
557 BOLERO_CDC_TX0_TX_PATH_CTL +
558 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +0800559 snd_soc_component_update_bits(component, tx_vol_ctl_reg, 0x10, 0x00);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530560 dev_dbg(tx_priv->dev, "%s: decimator %u unmute\n",
561 __func__, decimator);
562}
563
564static int tx_macro_put_dec_enum(struct snd_kcontrol *kcontrol,
565 struct snd_ctl_elem_value *ucontrol)
566{
567 struct snd_soc_dapm_widget *widget =
568 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800569 struct snd_soc_component *component =
570 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530571 struct soc_enum *e = (struct soc_enum *)kcontrol->private_value;
572 unsigned int val = 0;
573 u16 mic_sel_reg = 0;
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530574 u16 dmic_clk_reg = 0;
575 struct device *tx_dev = NULL;
576 struct tx_macro_priv *tx_priv = NULL;
577
578 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
579 return -EINVAL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530580
581 val = ucontrol->value.enumerated.item[0];
582 if (val > e->items - 1)
583 return -EINVAL;
584
Meng Wang15c825d2018-09-06 10:49:18 +0800585 dev_dbg(component->dev, "%s: wname: %s, val: 0x%x\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530586 widget->name, val);
587
588 switch (e->reg) {
589 case BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0:
590 mic_sel_reg = BOLERO_CDC_TX0_TX_PATH_CFG0;
591 break;
592 case BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0:
593 mic_sel_reg = BOLERO_CDC_TX1_TX_PATH_CFG0;
594 break;
595 case BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0:
596 mic_sel_reg = BOLERO_CDC_TX2_TX_PATH_CFG0;
597 break;
598 case BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0:
599 mic_sel_reg = BOLERO_CDC_TX3_TX_PATH_CFG0;
600 break;
601 case BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0:
602 mic_sel_reg = BOLERO_CDC_TX4_TX_PATH_CFG0;
603 break;
604 case BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0:
605 mic_sel_reg = BOLERO_CDC_TX5_TX_PATH_CFG0;
606 break;
607 case BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0:
608 mic_sel_reg = BOLERO_CDC_TX6_TX_PATH_CFG0;
609 break;
610 case BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0:
611 mic_sel_reg = BOLERO_CDC_TX7_TX_PATH_CFG0;
612 break;
613 default:
Meng Wang15c825d2018-09-06 10:49:18 +0800614 dev_err(component->dev, "%s: e->reg: 0x%x not expected\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530615 __func__, e->reg);
616 return -EINVAL;
617 }
Laxminath Kasam497a6512018-09-17 16:11:52 +0530618 if (strnstr(widget->name, "SMIC", strlen(widget->name))) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530619 if (val != 0) {
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530620 if (val < 5) {
Meng Wang15c825d2018-09-06 10:49:18 +0800621 snd_soc_component_update_bits(component,
622 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530623 1 << 7, 0x0 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530624 } else {
Meng Wang15c825d2018-09-06 10:49:18 +0800625 snd_soc_component_update_bits(component,
626 mic_sel_reg,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530627 1 << 7, 0x1 << 7);
Laxminath Kasam549d11d2019-07-18 13:44:17 +0530628 snd_soc_component_update_bits(component,
629 BOLERO_CDC_VA_TOP_CSR_DMIC_CFG,
630 0x80, 0x00);
631 dmic_clk_reg =
632 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
633 ((val - 5)/2) * 4;
634 snd_soc_component_update_bits(component,
635 dmic_clk_reg,
636 0x0E, tx_priv->dmic_clk_div << 0x1);
637 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530638 }
639 } else {
640 /* DMIC selected */
641 if (val != 0)
Meng Wang15c825d2018-09-06 10:49:18 +0800642 snd_soc_component_update_bits(component, mic_sel_reg,
643 1 << 7, 1 << 7);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530644 }
645
646 return snd_soc_dapm_put_enum_double(kcontrol, ucontrol);
647}
648
649static int tx_macro_tx_mixer_get(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 soc_multi_mixer_control *mixer =
657 ((struct soc_multi_mixer_control *)kcontrol->private_value);
658 u32 dai_id = widget->shift;
659 u32 dec_id = mixer->shift;
660 struct device *tx_dev = NULL;
661 struct tx_macro_priv *tx_priv = NULL;
662
Meng Wang15c825d2018-09-06 10:49:18 +0800663 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530664 return -EINVAL;
665
666 if (test_bit(dec_id, &tx_priv->active_ch_mask[dai_id]))
667 ucontrol->value.integer.value[0] = 1;
668 else
669 ucontrol->value.integer.value[0] = 0;
670 return 0;
671}
672
673static int tx_macro_tx_mixer_put(struct snd_kcontrol *kcontrol,
674 struct snd_ctl_elem_value *ucontrol)
675{
676 struct snd_soc_dapm_widget *widget =
677 snd_soc_dapm_kcontrol_widget(kcontrol);
Meng Wang15c825d2018-09-06 10:49:18 +0800678 struct snd_soc_component *component =
679 snd_soc_dapm_to_component(widget->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530680 struct snd_soc_dapm_update *update = NULL;
681 struct soc_multi_mixer_control *mixer =
682 ((struct soc_multi_mixer_control *)kcontrol->private_value);
683 u32 dai_id = widget->shift;
684 u32 dec_id = mixer->shift;
685 u32 enable = ucontrol->value.integer.value[0];
686 struct device *tx_dev = NULL;
687 struct tx_macro_priv *tx_priv = NULL;
688
Meng Wang15c825d2018-09-06 10:49:18 +0800689 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530690 return -EINVAL;
691
692 if (enable) {
693 set_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
694 tx_priv->active_ch_cnt[dai_id]++;
695 } else {
696 tx_priv->active_ch_cnt[dai_id]--;
697 clear_bit(dec_id, &tx_priv->active_ch_mask[dai_id]);
698 }
699 snd_soc_dapm_mixer_update_power(widget->dapm, kcontrol, enable, update);
700
701 return 0;
702}
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700703
704static inline int tx_macro_path_get(const char *wname,
705 unsigned int *path_num)
706{
707 int ret = 0;
708 char *widget_name = NULL;
709 char *w_name = NULL;
710 char *path_num_char = NULL;
711 char *path_name = NULL;
712
713 widget_name = kstrndup(wname, 10, GFP_KERNEL);
714 if (!widget_name)
715 return -EINVAL;
716
717 w_name = widget_name;
718
719 path_name = strsep(&widget_name, " ");
720 if (!path_name) {
721 pr_err("%s: Invalid widget name = %s\n",
722 __func__, widget_name);
723 ret = -EINVAL;
724 goto err;
725 }
726 path_num_char = strpbrk(path_name, "01234567");
727 if (!path_num_char) {
728 pr_err("%s: tx path index not found\n",
729 __func__);
730 ret = -EINVAL;
731 goto err;
732 }
733 ret = kstrtouint(path_num_char, 10, path_num);
734 if (ret < 0)
735 pr_err("%s: Invalid tx path = %s\n",
736 __func__, w_name);
737
738err:
739 kfree(w_name);
740 return ret;
741}
742
743static int tx_macro_dec_mode_get(struct snd_kcontrol *kcontrol,
744 struct snd_ctl_elem_value *ucontrol)
745{
746 struct snd_soc_component *component =
747 snd_soc_kcontrol_component(kcontrol);
748 struct tx_macro_priv *tx_priv = NULL;
749 struct device *tx_dev = NULL;
750 int ret = 0;
751 int path = 0;
752
753 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
754 return -EINVAL;
755
756 ret = tx_macro_path_get(kcontrol->id.name, &path);
757 if (ret)
758 return ret;
759
760 ucontrol->value.integer.value[0] = tx_priv->dec_mode[path];
761
762 return 0;
763}
764
765static int tx_macro_dec_mode_put(struct snd_kcontrol *kcontrol,
766 struct snd_ctl_elem_value *ucontrol)
767{
768 struct snd_soc_component *component =
769 snd_soc_kcontrol_component(kcontrol);
770 struct tx_macro_priv *tx_priv = NULL;
771 struct device *tx_dev = NULL;
772 int value = ucontrol->value.integer.value[0];
773 int ret = 0;
774 int path = 0;
775
776 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
777 return -EINVAL;
778
779 ret = tx_macro_path_get(kcontrol->id.name, &path);
780 if (ret)
781 return ret;
782
783 tx_priv->dec_mode[path] = value;
784
785 return 0;
786}
787
Karthikeyan Mani765eaab2019-07-18 16:27:01 -0700788static int tx_macro_get_bcs(struct snd_kcontrol *kcontrol,
789 struct snd_ctl_elem_value *ucontrol)
790{
791 struct snd_soc_component *component =
792 snd_soc_kcontrol_component(kcontrol);
793 struct tx_macro_priv *tx_priv = NULL;
794 struct device *tx_dev = NULL;
795
796 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
797 return -EINVAL;
798
799 ucontrol->value.integer.value[0] = tx_priv->bcs_enable;
800
801 return 0;
802}
803
804static int tx_macro_set_bcs(struct snd_kcontrol *kcontrol,
805 struct snd_ctl_elem_value *ucontrol)
806{
807 struct snd_soc_component *component =
808 snd_soc_kcontrol_component(kcontrol);
809 struct tx_macro_priv *tx_priv = NULL;
810 struct device *tx_dev = NULL;
811 int value = ucontrol->value.integer.value[0];
812
813 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
814 return -EINVAL;
815
816 tx_priv->bcs_enable = value;
817
818 return 0;
819}
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530820
Aditya Bavanari8a3f1e62020-03-23 12:48:26 +0530821static const char * const bcs_ch_sel_mux_text[] = {
822 "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3",
823 "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7",
824 "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11",
825};
826
827static const struct soc_enum bcs_ch_sel_mux_enum =
828 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(bcs_ch_sel_mux_text),
829 bcs_ch_sel_mux_text);
830
831static int tx_macro_get_bcs_ch_sel(struct snd_kcontrol *kcontrol,
832 struct snd_ctl_elem_value *ucontrol)
833{
834 struct snd_soc_component *component =
835 snd_soc_kcontrol_component(kcontrol);
836 struct tx_macro_priv *tx_priv = NULL;
837 struct device *tx_dev = NULL;
838 int value = 0;
839
840 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
841 return -EINVAL;
842
843 if (tx_priv->version == BOLERO_VERSION_2_1)
844 value = (snd_soc_component_read32(component,
845 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL)) & 0x0F;
846 else if (tx_priv->version == BOLERO_VERSION_2_0)
847 value = (snd_soc_component_read32(component,
848 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL)) & 0x0F;
849
850 ucontrol->value.integer.value[0] = value;
851 return 0;
852}
853
854static int tx_macro_put_bcs_ch_sel(struct snd_kcontrol *kcontrol,
855 struct snd_ctl_elem_value *ucontrol)
856{
857 struct snd_soc_component *component =
858 snd_soc_kcontrol_component(kcontrol);
859 struct tx_macro_priv *tx_priv = NULL;
860 struct device *tx_dev = NULL;
861 int value;
862
863 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
864 return -EINVAL;
865
866 if (ucontrol->value.integer.value[0] < 0 ||
867 ucontrol->value.integer.value[0] > ARRAY_SIZE(bcs_ch_sel_mux_text))
868 return -EINVAL;
869
870 value = ucontrol->value.integer.value[0];
871 if (tx_priv->version == BOLERO_VERSION_2_1)
872 snd_soc_component_update_bits(component,
873 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0x0F, value);
874 else if (tx_priv->version == BOLERO_VERSION_2_0)
875 snd_soc_component_update_bits(component,
876 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x0F, value);
877
878 return 0;
879}
880
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530881static int tx_macro_enable_dmic(struct snd_soc_dapm_widget *w,
882 struct snd_kcontrol *kcontrol, int event)
883{
Meng Wang15c825d2018-09-06 10:49:18 +0800884 struct snd_soc_component *component =
885 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530886 unsigned int dmic = 0;
887 int ret = 0;
888 char *wname = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530889
890 wname = strpbrk(w->name, "01234567");
891 if (!wname) {
Meng Wang15c825d2018-09-06 10:49:18 +0800892 dev_err(component->dev, "%s: widget not found\n", __func__);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530893 return -EINVAL;
894 }
895
896 ret = kstrtouint(wname, 10, &dmic);
897 if (ret < 0) {
Meng Wang15c825d2018-09-06 10:49:18 +0800898 dev_err(component->dev, "%s: Invalid DMIC line on the codec\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530899 __func__);
900 return -EINVAL;
901 }
902
Sudheer Papothid50a5812019-11-21 07:24:42 +0530903 dev_dbg(component->dev, "%s: event %d DMIC%d\n",
904 __func__, event, dmic);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530905
906 switch (event) {
907 case SND_SOC_DAPM_PRE_PMU:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530908 bolero_dmic_clk_enable(component, dmic, DMIC_TX, true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530909 break;
910 case SND_SOC_DAPM_POST_PMD:
Sudheer Papothid50a5812019-11-21 07:24:42 +0530911 bolero_dmic_clk_enable(component, dmic, DMIC_TX, false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530912 break;
913 }
914
915 return 0;
916}
917
918static int tx_macro_enable_dec(struct snd_soc_dapm_widget *w,
919 struct snd_kcontrol *kcontrol, int event)
920{
Meng Wang15c825d2018-09-06 10:49:18 +0800921 struct snd_soc_component *component =
922 snd_soc_dapm_to_component(w->dapm);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530923 unsigned int decimator = 0;
924 u16 tx_vol_ctl_reg = 0;
925 u16 dec_cfg_reg = 0;
926 u16 hpf_gate_reg = 0;
927 u16 tx_gain_ctl_reg = 0;
Vatsal Bucha75ad8c12020-06-22 09:46:36 +0530928 u16 tx_fs_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530929 u8 hpf_cut_off_freq = 0;
Sudheer Papothi339c4112019-12-13 00:49:16 +0530930 int hpf_delay = TX_MACRO_DMIC_HPF_DELAY_MS;
931 int unmute_delay = TX_MACRO_DMIC_UNMUTE_DELAY_MS;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530932 struct device *tx_dev = NULL;
933 struct tx_macro_priv *tx_priv = NULL;
Meng Wang2825fce2020-01-13 15:17:21 +0800934 u16 adc_mux_reg = 0, adc_reg = 0, adc_n = 0;
935 u16 dmic_clk_reg = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530936
Meng Wang15c825d2018-09-06 10:49:18 +0800937 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530938 return -EINVAL;
939
940 decimator = w->shift;
941
Meng Wang15c825d2018-09-06 10:49:18 +0800942 dev_dbg(component->dev, "%s(): widget = %s decimator = %u\n", __func__,
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530943 w->name, decimator);
944
945 tx_vol_ctl_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
946 TX_MACRO_TX_PATH_OFFSET * decimator;
947 hpf_gate_reg = BOLERO_CDC_TX0_TX_PATH_SEC2 +
948 TX_MACRO_TX_PATH_OFFSET * decimator;
949 dec_cfg_reg = BOLERO_CDC_TX0_TX_PATH_CFG0 +
950 TX_MACRO_TX_PATH_OFFSET * decimator;
951 tx_gain_ctl_reg = BOLERO_CDC_TX0_TX_VOL_CTL +
952 TX_MACRO_TX_PATH_OFFSET * decimator;
Vatsal Bucha75ad8c12020-06-22 09:46:36 +0530953 tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
954 TX_MACRO_TX_PATH_OFFSET * decimator;
955
956 tx_priv->amic_sample_rate = (snd_soc_component_read32(component,
957 tx_fs_reg) & 0x0F);
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530958
959 switch (event) {
960 case SND_SOC_DAPM_PRE_PMU:
Meng Wang2825fce2020-01-13 15:17:21 +0800961 adc_mux_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1 +
962 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
963 if (snd_soc_component_read32(component, adc_mux_reg) & SWR_MIC) {
964 adc_reg = BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0 +
965 TX_MACRO_ADC_MUX_CFG_OFFSET * decimator;
966 adc_n = snd_soc_component_read32(component, adc_reg) &
967 TX_MACRO_SWR_MIC_MUX_SEL_MASK;
968 if (adc_n >= BOLERO_ADC_MAX) {
969 dmic_clk_reg =
970 BOLERO_CDC_TX_TOP_CSR_SWR_DMIC0_CTL +
971 ((adc_n - 5) / 2) * 4;
972 snd_soc_component_update_bits(component,
973 dmic_clk_reg,
974 0x0E, tx_priv->dmic_clk_div << 0x1);
975 }
976 }
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -0700977 snd_soc_component_update_bits(component,
978 dec_cfg_reg, 0x06, tx_priv->dec_mode[decimator] <<
979 TX_MACRO_ADC_MODE_CFG0_SHIFT);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530980 /* Enable TX PGA Mute */
Meng Wang15c825d2018-09-06 10:49:18 +0800981 snd_soc_component_update_bits(component,
982 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam9eb80222018-08-29 21:53:14 +0530983 break;
984 case SND_SOC_DAPM_POST_PMU:
Meng Wang15c825d2018-09-06 10:49:18 +0800985 snd_soc_component_update_bits(component,
986 tx_vol_ctl_reg, 0x20, 0x20);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +0530987 if (!is_amic_enabled(component, decimator)) {
Vatsal Bucha95725722020-01-08 12:40:58 +0530988 snd_soc_component_update_bits(component,
989 hpf_gate_reg, 0x01, 0x00);
990 /*
991 * Minimum 1 clk cycle delay is required as per HW spec
992 */
993 usleep_range(1000, 1010);
994 }
Meng Wang15c825d2018-09-06 10:49:18 +0800995 hpf_cut_off_freq = (
996 snd_soc_component_read32(component, dec_cfg_reg) &
997 TX_HPF_CUT_OFF_FREQ_MASK) >> 5;
998
Laxminath Kasam989fccf2018-06-15 16:53:31 +0530999 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq =
Meng Wang15c825d2018-09-06 10:49:18 +08001000 hpf_cut_off_freq;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301001
1002 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ)
Meng Wang15c825d2018-09-06 10:49:18 +08001003 snd_soc_component_update_bits(component, dec_cfg_reg,
1004 TX_HPF_CUT_OFF_FREQ_MASK,
1005 CF_MIN_3DB_150HZ << 5);
1006
Laxminath Kasam3f7a0732020-02-26 00:35:33 +05301007 if (is_amic_enabled(component, decimator)) {
Sudheer Papothi339c4112019-12-13 00:49:16 +05301008 hpf_delay = TX_MACRO_AMIC_HPF_DELAY_MS;
1009 unmute_delay = TX_MACRO_AMIC_UNMUTE_DELAY_MS;
1010 }
1011 if (tx_unmute_delay < unmute_delay)
1012 tx_unmute_delay = unmute_delay;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301013 /* schedule work queue to Remove Mute */
Aditya Bavanari4460ed22020-02-20 12:46:51 +05301014 queue_delayed_work(system_freezable_wq,
1015 &tx_priv->tx_mute_dwork[decimator].dwork,
1016 msecs_to_jiffies(tx_unmute_delay));
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301017 if (tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq !=
Laxminath Kasam9eb80222018-08-29 21:53:14 +05301018 CF_MIN_3DB_150HZ) {
Aditya Bavanari4460ed22020-02-20 12:46:51 +05301019 queue_delayed_work(system_freezable_wq,
Sudheer Papothi339c4112019-12-13 00:49:16 +05301020 &tx_priv->tx_hpf_work[decimator].dwork,
1021 msecs_to_jiffies(hpf_delay));
Meng Wang15c825d2018-09-06 10:49:18 +08001022 snd_soc_component_update_bits(component,
Vatsal Bucha95725722020-01-08 12:40:58 +05301023 hpf_gate_reg, 0x03, 0x02);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +05301024 if (!is_amic_enabled(component, decimator))
Vatsal Bucha95725722020-01-08 12:40:58 +05301025 snd_soc_component_update_bits(component,
1026 hpf_gate_reg, 0x03, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001027 snd_soc_component_update_bits(component,
Vatsal Bucha95725722020-01-08 12:40:58 +05301028 hpf_gate_reg, 0x03, 0x01);
Karthikeyan Mani9366ce62019-11-06 11:43:36 -08001029 /*
1030 * 6ms delay is required as per HW spec
1031 */
1032 usleep_range(6000, 6010);
Laxminath Kasam9eb80222018-08-29 21:53:14 +05301033 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301034 /* apply gain after decimator is enabled */
Meng Wang15c825d2018-09-06 10:49:18 +08001035 snd_soc_component_write(component, tx_gain_ctl_reg,
1036 snd_soc_component_read32(component,
1037 tx_gain_ctl_reg));
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001038 if (tx_priv->bcs_enable) {
1039 snd_soc_component_update_bits(component, dec_cfg_reg,
1040 0x01, 0x01);
Vatsal Buchad06525f2019-10-14 23:14:12 +05301041 tx_priv->bcs_clk_en = true;
1042 if (tx_priv->hs_slow_insert_complete)
1043 snd_soc_component_update_bits(component,
1044 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40,
1045 0x40);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001046 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301047 break;
1048 case SND_SOC_DAPM_PRE_PMD:
1049 hpf_cut_off_freq =
1050 tx_priv->tx_hpf_work[decimator].hpf_cut_off_freq;
Meng Wang15c825d2018-09-06 10:49:18 +08001051 snd_soc_component_update_bits(component,
1052 tx_vol_ctl_reg, 0x10, 0x10);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301053 if (cancel_delayed_work_sync(
1054 &tx_priv->tx_hpf_work[decimator].dwork)) {
1055 if (hpf_cut_off_freq != CF_MIN_3DB_150HZ) {
Meng Wang15c825d2018-09-06 10:49:18 +08001056 snd_soc_component_update_bits(
1057 component, dec_cfg_reg,
1058 TX_HPF_CUT_OFF_FREQ_MASK,
1059 hpf_cut_off_freq << 5);
Laxminath Kasam3f7a0732020-02-26 00:35:33 +05301060 if (is_amic_enabled(component, decimator))
Vatsal Bucha95725722020-01-08 12:40:58 +05301061 snd_soc_component_update_bits(component,
1062 hpf_gate_reg,
1063 0x03, 0x02);
1064 else
1065 snd_soc_component_update_bits(component,
1066 hpf_gate_reg,
1067 0x03, 0x03);
1068
Laxminath Kasam9eb80222018-08-29 21:53:14 +05301069 /*
1070 * Minimum 1 clk cycle delay is required
1071 * as per HW spec
1072 */
1073 usleep_range(1000, 1010);
Meng Wang15c825d2018-09-06 10:49:18 +08001074 snd_soc_component_update_bits(component,
1075 hpf_gate_reg,
Vatsal Bucha95725722020-01-08 12:40:58 +05301076 0x03, 0x01);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301077 }
1078 }
1079 cancel_delayed_work_sync(
1080 &tx_priv->tx_mute_dwork[decimator].dwork);
1081 break;
1082 case SND_SOC_DAPM_POST_PMD:
Meng Wang15c825d2018-09-06 10:49:18 +08001083 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
1084 0x20, 0x00);
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07001085 snd_soc_component_update_bits(component,
1086 dec_cfg_reg, 0x06, 0x00);
Meng Wang15c825d2018-09-06 10:49:18 +08001087 snd_soc_component_update_bits(component, tx_vol_ctl_reg,
1088 0x10, 0x00);
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001089 if (tx_priv->bcs_enable) {
1090 snd_soc_component_update_bits(component, dec_cfg_reg,
1091 0x01, 0x00);
1092 snd_soc_component_update_bits(component,
1093 BOLERO_CDC_TX0_TX_PATH_SEC7, 0x40, 0x00);
Vatsal Buchad06525f2019-10-14 23:14:12 +05301094 tx_priv->bcs_clk_en = false;
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07001095 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301096 break;
1097 }
1098 return 0;
1099}
1100
1101static int tx_macro_enable_micbias(struct snd_soc_dapm_widget *w,
1102 struct snd_kcontrol *kcontrol, int event)
1103{
1104 return 0;
1105}
1106
1107static int tx_macro_hw_params(struct snd_pcm_substream *substream,
1108 struct snd_pcm_hw_params *params,
1109 struct snd_soc_dai *dai)
1110{
1111 int tx_fs_rate = -EINVAL;
Meng Wang15c825d2018-09-06 10:49:18 +08001112 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301113 u32 decimator = 0;
Laxminath Kasamb7f823c2018-08-02 13:23:11 +05301114 u32 sample_rate = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301115 u16 tx_fs_reg = 0;
1116 struct device *tx_dev = NULL;
1117 struct tx_macro_priv *tx_priv = NULL;
1118
Meng Wang15c825d2018-09-06 10:49:18 +08001119 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301120 return -EINVAL;
1121
1122 pr_debug("%s: dai_name = %s DAI-ID %x rate %d num_ch %d\n", __func__,
1123 dai->name, dai->id, params_rate(params),
1124 params_channels(params));
1125
1126 sample_rate = params_rate(params);
1127 switch (sample_rate) {
1128 case 8000:
1129 tx_fs_rate = 0;
1130 break;
1131 case 16000:
1132 tx_fs_rate = 1;
1133 break;
1134 case 32000:
1135 tx_fs_rate = 3;
1136 break;
1137 case 48000:
1138 tx_fs_rate = 4;
1139 break;
1140 case 96000:
1141 tx_fs_rate = 5;
1142 break;
1143 case 192000:
1144 tx_fs_rate = 6;
1145 break;
1146 case 384000:
1147 tx_fs_rate = 7;
1148 break;
1149 default:
Meng Wang15c825d2018-09-06 10:49:18 +08001150 dev_err(component->dev, "%s: Invalid TX sample rate: %d\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301151 __func__, params_rate(params));
1152 return -EINVAL;
1153 }
1154 for_each_set_bit(decimator, &tx_priv->active_ch_mask[dai->id],
1155 TX_MACRO_DEC_MAX) {
1156 if (decimator >= 0) {
1157 tx_fs_reg = BOLERO_CDC_TX0_TX_PATH_CTL +
1158 TX_MACRO_TX_PATH_OFFSET * decimator;
Meng Wang15c825d2018-09-06 10:49:18 +08001159 dev_dbg(component->dev, "%s: set DEC%u rate to %u\n",
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301160 __func__, decimator, sample_rate);
Meng Wang15c825d2018-09-06 10:49:18 +08001161 snd_soc_component_update_bits(component, tx_fs_reg,
1162 0x0F, tx_fs_rate);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301163 } else {
Meng Wang15c825d2018-09-06 10:49:18 +08001164 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301165 "%s: ERROR: Invalid decimator: %d\n",
1166 __func__, decimator);
1167 return -EINVAL;
1168 }
1169 }
1170 return 0;
1171}
1172
1173static int tx_macro_get_channel_map(struct snd_soc_dai *dai,
1174 unsigned int *tx_num, unsigned int *tx_slot,
1175 unsigned int *rx_num, unsigned int *rx_slot)
1176{
Meng Wang15c825d2018-09-06 10:49:18 +08001177 struct snd_soc_component *component = dai->component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301178 struct device *tx_dev = NULL;
1179 struct tx_macro_priv *tx_priv = NULL;
1180
Meng Wang15c825d2018-09-06 10:49:18 +08001181 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301182 return -EINVAL;
1183
1184 switch (dai->id) {
1185 case TX_MACRO_AIF1_CAP:
1186 case TX_MACRO_AIF2_CAP:
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001187 case TX_MACRO_AIF3_CAP:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301188 *tx_slot = tx_priv->active_ch_mask[dai->id];
1189 *tx_num = tx_priv->active_ch_cnt[dai->id];
1190 break;
1191 default:
1192 dev_err(tx_dev, "%s: Invalid AIF\n", __func__);
1193 break;
1194 }
1195 return 0;
1196}
1197
1198static struct snd_soc_dai_ops tx_macro_dai_ops = {
1199 .hw_params = tx_macro_hw_params,
1200 .get_channel_map = tx_macro_get_channel_map,
1201};
1202
1203static struct snd_soc_dai_driver tx_macro_dai[] = {
1204 {
1205 .name = "tx_macro_tx1",
1206 .id = TX_MACRO_AIF1_CAP,
1207 .capture = {
1208 .stream_name = "TX_AIF1 Capture",
1209 .rates = TX_MACRO_RATES,
1210 .formats = TX_MACRO_FORMATS,
1211 .rate_max = 192000,
1212 .rate_min = 8000,
1213 .channels_min = 1,
1214 .channels_max = 8,
1215 },
1216 .ops = &tx_macro_dai_ops,
1217 },
1218 {
1219 .name = "tx_macro_tx2",
1220 .id = TX_MACRO_AIF2_CAP,
1221 .capture = {
1222 .stream_name = "TX_AIF2 Capture",
1223 .rates = TX_MACRO_RATES,
1224 .formats = TX_MACRO_FORMATS,
1225 .rate_max = 192000,
1226 .rate_min = 8000,
1227 .channels_min = 1,
1228 .channels_max = 8,
1229 },
1230 .ops = &tx_macro_dai_ops,
1231 },
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001232 {
1233 .name = "tx_macro_tx3",
1234 .id = TX_MACRO_AIF3_CAP,
1235 .capture = {
1236 .stream_name = "TX_AIF3 Capture",
1237 .rates = TX_MACRO_RATES,
1238 .formats = TX_MACRO_FORMATS,
1239 .rate_max = 192000,
1240 .rate_min = 8000,
1241 .channels_min = 1,
1242 .channels_max = 8,
1243 },
1244 .ops = &tx_macro_dai_ops,
1245 },
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301246};
1247
1248#define STRING(name) #name
1249#define TX_MACRO_DAPM_ENUM(name, reg, offset, text) \
1250static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1251static const struct snd_kcontrol_new name##_mux = \
1252 SOC_DAPM_ENUM(STRING(name), name##_enum)
1253
1254#define TX_MACRO_DAPM_ENUM_EXT(name, reg, offset, text, getname, putname) \
1255static SOC_ENUM_SINGLE_DECL(name##_enum, reg, offset, text); \
1256static const struct snd_kcontrol_new name##_mux = \
1257 SOC_DAPM_ENUM_EXT(STRING(name), name##_enum, getname, putname)
1258
1259#define TX_MACRO_DAPM_MUX(name, shift, kctl) \
1260 SND_SOC_DAPM_MUX(name, SND_SOC_NOPM, shift, 0, &kctl##_mux)
1261
1262static const char * const adc_mux_text[] = {
1263 "MSM_DMIC", "SWR_MIC", "ANC_FB_TUNE1"
1264};
1265
1266TX_MACRO_DAPM_ENUM(tx_dec0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG1,
1267 0, adc_mux_text);
1268TX_MACRO_DAPM_ENUM(tx_dec1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG1,
1269 0, adc_mux_text);
1270TX_MACRO_DAPM_ENUM(tx_dec2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG1,
1271 0, adc_mux_text);
1272TX_MACRO_DAPM_ENUM(tx_dec3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG1,
1273 0, adc_mux_text);
1274TX_MACRO_DAPM_ENUM(tx_dec4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG1,
1275 0, adc_mux_text);
1276TX_MACRO_DAPM_ENUM(tx_dec5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG1,
1277 0, adc_mux_text);
1278TX_MACRO_DAPM_ENUM(tx_dec6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG1,
1279 0, adc_mux_text);
1280TX_MACRO_DAPM_ENUM(tx_dec7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG1,
1281 0, adc_mux_text);
1282
1283
1284static const char * const dmic_mux_text[] = {
1285 "ZERO", "DMIC0", "DMIC1", "DMIC2", "DMIC3",
1286 "DMIC4", "DMIC5", "DMIC6", "DMIC7"
1287};
1288
1289TX_MACRO_DAPM_ENUM_EXT(tx_dmic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1290 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1291 tx_macro_put_dec_enum);
1292
1293TX_MACRO_DAPM_ENUM_EXT(tx_dmic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1294 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1295 tx_macro_put_dec_enum);
1296
1297TX_MACRO_DAPM_ENUM_EXT(tx_dmic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1298 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1299 tx_macro_put_dec_enum);
1300
1301TX_MACRO_DAPM_ENUM_EXT(tx_dmic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1302 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1303 tx_macro_put_dec_enum);
1304
1305TX_MACRO_DAPM_ENUM_EXT(tx_dmic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1306 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1307 tx_macro_put_dec_enum);
1308
1309TX_MACRO_DAPM_ENUM_EXT(tx_dmic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1310 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1311 tx_macro_put_dec_enum);
1312
1313TX_MACRO_DAPM_ENUM_EXT(tx_dmic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1314 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1315 tx_macro_put_dec_enum);
1316
1317TX_MACRO_DAPM_ENUM_EXT(tx_dmic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1318 4, dmic_mux_text, snd_soc_dapm_get_enum_double,
1319 tx_macro_put_dec_enum);
1320
1321static const char * const smic_mux_text[] = {
Sudheer Papothi324b4952019-06-11 04:14:51 +05301322 "ZERO", "ADC0", "ADC1", "ADC2", "ADC3", "SWR_DMIC0",
1323 "SWR_DMIC1", "SWR_DMIC2", "SWR_DMIC3", "SWR_DMIC4",
1324 "SWR_DMIC5", "SWR_DMIC6", "SWR_DMIC7"
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301325};
1326
1327TX_MACRO_DAPM_ENUM_EXT(tx_smic0, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1328 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1329 tx_macro_put_dec_enum);
1330
1331TX_MACRO_DAPM_ENUM_EXT(tx_smic1, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1332 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1333 tx_macro_put_dec_enum);
1334
1335TX_MACRO_DAPM_ENUM_EXT(tx_smic2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1336 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1337 tx_macro_put_dec_enum);
1338
1339TX_MACRO_DAPM_ENUM_EXT(tx_smic3, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1340 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1341 tx_macro_put_dec_enum);
1342
1343TX_MACRO_DAPM_ENUM_EXT(tx_smic4, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1344 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1345 tx_macro_put_dec_enum);
1346
1347TX_MACRO_DAPM_ENUM_EXT(tx_smic5, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1348 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1349 tx_macro_put_dec_enum);
1350
1351TX_MACRO_DAPM_ENUM_EXT(tx_smic6, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1352 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1353 tx_macro_put_dec_enum);
1354
1355TX_MACRO_DAPM_ENUM_EXT(tx_smic7, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1356 0, smic_mux_text, snd_soc_dapm_get_enum_double,
1357 tx_macro_put_dec_enum);
1358
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301359static const char * const smic_mux_text_v2[] = {
1360 "ZERO", "SWR_MIC0", "SWR_MIC1", "SWR_MIC2", "SWR_MIC3",
1361 "SWR_MIC4", "SWR_MIC5", "SWR_MIC6", "SWR_MIC7",
1362 "SWR_MIC8", "SWR_MIC9", "SWR_MIC10", "SWR_MIC11"
1363};
1364
1365TX_MACRO_DAPM_ENUM_EXT(tx_smic0_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX0_CFG0,
1366 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1367 tx_macro_put_dec_enum);
1368
1369TX_MACRO_DAPM_ENUM_EXT(tx_smic1_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX1_CFG0,
1370 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1371 tx_macro_put_dec_enum);
1372
1373TX_MACRO_DAPM_ENUM_EXT(tx_smic2_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX2_CFG0,
1374 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1375 tx_macro_put_dec_enum);
1376
1377TX_MACRO_DAPM_ENUM_EXT(tx_smic3_v2, BOLERO_CDC_TX_INP_MUX_ADC_MUX3_CFG0,
1378 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1379 tx_macro_put_dec_enum);
1380
1381TX_MACRO_DAPM_ENUM_EXT(tx_smic4_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX4_CFG0,
1382 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1383 tx_macro_put_dec_enum);
1384
1385TX_MACRO_DAPM_ENUM_EXT(tx_smic5_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX5_CFG0,
1386 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1387 tx_macro_put_dec_enum);
1388
1389TX_MACRO_DAPM_ENUM_EXT(tx_smic6_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX6_CFG0,
1390 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1391 tx_macro_put_dec_enum);
1392
1393TX_MACRO_DAPM_ENUM_EXT(tx_smic7_v3, BOLERO_CDC_TX_INP_MUX_ADC_MUX7_CFG0,
1394 0, smic_mux_text_v2, snd_soc_dapm_get_enum_double,
1395 tx_macro_put_dec_enum);
1396
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07001397static const char * const dec_mode_mux_text[] = {
1398 "ADC_DEFAULT", "ADC_LOW_PWR", "ADC_HIGH_PERF",
1399};
1400
1401static const struct soc_enum dec_mode_mux_enum =
1402 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(dec_mode_mux_text),
1403 dec_mode_mux_text);
1404
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301405static const struct snd_kcontrol_new tx_aif1_cap_mixer[] = {
1406 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1407 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1408 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1409 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1410 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1411 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1412 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1413 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1414 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1415 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1416 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1417 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1418 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1419 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1420 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1421 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1422};
1423
1424static const struct snd_kcontrol_new tx_aif2_cap_mixer[] = {
1425 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1426 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1427 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1428 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1429 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1430 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1431 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1432 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1433 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1434 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1435 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1436 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1437 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1438 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1439 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1440 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1441};
1442
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001443static const struct snd_kcontrol_new tx_aif3_cap_mixer[] = {
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 SOC_SINGLE_EXT("DEC4", SND_SOC_NOPM, TX_MACRO_DEC4, 1, 0,
1453 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1454 SOC_SINGLE_EXT("DEC5", SND_SOC_NOPM, TX_MACRO_DEC5, 1, 0,
1455 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1456 SOC_SINGLE_EXT("DEC6", SND_SOC_NOPM, TX_MACRO_DEC6, 1, 0,
1457 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1458 SOC_SINGLE_EXT("DEC7", SND_SOC_NOPM, TX_MACRO_DEC7, 1, 0,
1459 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1460};
1461
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301462static const struct snd_kcontrol_new tx_aif1_cap_mixer_v2[] = {
1463 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1464 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1465 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1466 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1467 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1468 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1469 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1470 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1471};
1472
1473static const struct snd_kcontrol_new tx_aif2_cap_mixer_v2[] = {
1474 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1475 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1476 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1477 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1478 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1479 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1480 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1481 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1482};
1483
1484static const struct snd_kcontrol_new tx_aif3_cap_mixer_v2[] = {
1485 SOC_SINGLE_EXT("DEC0", SND_SOC_NOPM, TX_MACRO_DEC0, 1, 0,
1486 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1487 SOC_SINGLE_EXT("DEC1", SND_SOC_NOPM, TX_MACRO_DEC1, 1, 0,
1488 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1489 SOC_SINGLE_EXT("DEC2", SND_SOC_NOPM, TX_MACRO_DEC2, 1, 0,
1490 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1491 SOC_SINGLE_EXT("DEC3", SND_SOC_NOPM, TX_MACRO_DEC3, 1, 0,
1492 tx_macro_tx_mixer_get, tx_macro_tx_mixer_put),
1493};
1494
1495static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_common[] = {
1496 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1497 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1498
1499 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1500 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1501
1502 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1503 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1504
1505 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1506 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1507 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1508 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1509
1510 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0_v2),
1511 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1_v2),
1512 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2_v2),
1513 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3_v2),
1514
1515 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1516 tx_macro_enable_micbias,
1517 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1518 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1519 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1520 SND_SOC_DAPM_POST_PMD),
1521
1522 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1523 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1524 SND_SOC_DAPM_POST_PMD),
1525
1526 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1527 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1528 SND_SOC_DAPM_POST_PMD),
1529
1530 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1531 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1532 SND_SOC_DAPM_POST_PMD),
1533
1534 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
1535 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1536 SND_SOC_DAPM_POST_PMD),
1537
1538 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
1539 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1540 SND_SOC_DAPM_POST_PMD),
1541
1542 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
1543 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1544 SND_SOC_DAPM_POST_PMD),
1545
1546 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
1547 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1548 SND_SOC_DAPM_POST_PMD),
1549
1550 SND_SOC_DAPM_INPUT("TX SWR_MIC0"),
1551 SND_SOC_DAPM_INPUT("TX SWR_MIC1"),
1552 SND_SOC_DAPM_INPUT("TX SWR_MIC2"),
1553 SND_SOC_DAPM_INPUT("TX SWR_MIC3"),
1554 SND_SOC_DAPM_INPUT("TX SWR_MIC4"),
1555 SND_SOC_DAPM_INPUT("TX SWR_MIC5"),
1556 SND_SOC_DAPM_INPUT("TX SWR_MIC6"),
1557 SND_SOC_DAPM_INPUT("TX SWR_MIC7"),
1558 SND_SOC_DAPM_INPUT("TX SWR_MIC8"),
1559 SND_SOC_DAPM_INPUT("TX SWR_MIC9"),
1560 SND_SOC_DAPM_INPUT("TX SWR_MIC10"),
1561 SND_SOC_DAPM_INPUT("TX SWR_MIC11"),
1562
1563 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
1564 TX_MACRO_DEC0, 0,
1565 &tx_dec0_mux, tx_macro_enable_dec,
1566 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1567 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1568
1569 SND_SOC_DAPM_MUX_E("TX DEC1 MUX", SND_SOC_NOPM,
1570 TX_MACRO_DEC1, 0,
1571 &tx_dec1_mux, tx_macro_enable_dec,
1572 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1573 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1574
1575 SND_SOC_DAPM_MUX_E("TX DEC2 MUX", SND_SOC_NOPM,
1576 TX_MACRO_DEC2, 0,
1577 &tx_dec2_mux, tx_macro_enable_dec,
1578 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1579 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1580
1581 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
1582 TX_MACRO_DEC3, 0,
1583 &tx_dec3_mux, tx_macro_enable_dec,
1584 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1585 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1586
1587 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1588 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1589};
1590
1591static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v2[] = {
1592 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1593 TX_MACRO_AIF1_CAP, 0,
1594 tx_aif1_cap_mixer_v2, ARRAY_SIZE(tx_aif1_cap_mixer_v2)),
1595
1596 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1597 TX_MACRO_AIF2_CAP, 0,
1598 tx_aif2_cap_mixer_v2, ARRAY_SIZE(tx_aif2_cap_mixer_v2)),
1599
1600 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1601 TX_MACRO_AIF3_CAP, 0,
1602 tx_aif3_cap_mixer_v2, ARRAY_SIZE(tx_aif3_cap_mixer_v2)),
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301603};
1604
1605static const struct snd_soc_dapm_widget tx_macro_dapm_widgets_v3[] = {
1606 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM,
1607 TX_MACRO_AIF1_CAP, 0,
1608 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1609
1610 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM,
1611 TX_MACRO_AIF2_CAP, 0,
1612 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1613
1614 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM,
1615 TX_MACRO_AIF3_CAP, 0,
1616 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1617
1618 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1619 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1620 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1621 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1622
1623 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4_v3),
1624 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5_v3),
1625 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6_v3),
1626 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7_v3),
1627
1628 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
1629 TX_MACRO_DEC4, 0,
1630 &tx_dec4_mux, tx_macro_enable_dec,
1631 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1632 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1633
1634 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
1635 TX_MACRO_DEC5, 0,
1636 &tx_dec5_mux, tx_macro_enable_dec,
1637 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1638 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1639
1640 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
1641 TX_MACRO_DEC6, 0,
1642 &tx_dec6_mux, tx_macro_enable_dec,
1643 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1644 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1645
1646 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
1647 TX_MACRO_DEC7, 0,
1648 &tx_dec7_mux, tx_macro_enable_dec,
1649 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1650 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1651
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05301652 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1653 tx_macro_tx_swr_clk_event,
1654 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1655
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301656 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1657 tx_macro_va_swr_clk_event,
1658 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1659};
1660
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301661static const struct snd_soc_dapm_widget tx_macro_dapm_widgets[] = {
1662 SND_SOC_DAPM_AIF_OUT("TX_AIF1 CAP", "TX_AIF1 Capture", 0,
1663 SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0),
1664
1665 SND_SOC_DAPM_AIF_OUT("TX_AIF2 CAP", "TX_AIF2 Capture", 0,
1666 SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0),
1667
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001668 SND_SOC_DAPM_AIF_OUT("TX_AIF3 CAP", "TX_AIF3 Capture", 0,
1669 SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0),
1670
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301671 SND_SOC_DAPM_MIXER("TX_AIF1_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF1_CAP, 0,
1672 tx_aif1_cap_mixer, ARRAY_SIZE(tx_aif1_cap_mixer)),
1673
1674 SND_SOC_DAPM_MIXER("TX_AIF2_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF2_CAP, 0,
1675 tx_aif2_cap_mixer, ARRAY_SIZE(tx_aif2_cap_mixer)),
1676
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07001677 SND_SOC_DAPM_MIXER("TX_AIF3_CAP Mixer", SND_SOC_NOPM, TX_MACRO_AIF3_CAP, 0,
1678 tx_aif3_cap_mixer, ARRAY_SIZE(tx_aif3_cap_mixer)),
1679
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301680
1681 TX_MACRO_DAPM_MUX("TX DMIC MUX0", 0, tx_dmic0),
1682 TX_MACRO_DAPM_MUX("TX DMIC MUX1", 0, tx_dmic1),
1683 TX_MACRO_DAPM_MUX("TX DMIC MUX2", 0, tx_dmic2),
1684 TX_MACRO_DAPM_MUX("TX DMIC MUX3", 0, tx_dmic3),
1685 TX_MACRO_DAPM_MUX("TX DMIC MUX4", 0, tx_dmic4),
1686 TX_MACRO_DAPM_MUX("TX DMIC MUX5", 0, tx_dmic5),
1687 TX_MACRO_DAPM_MUX("TX DMIC MUX6", 0, tx_dmic6),
1688 TX_MACRO_DAPM_MUX("TX DMIC MUX7", 0, tx_dmic7),
1689
1690 TX_MACRO_DAPM_MUX("TX SMIC MUX0", 0, tx_smic0),
1691 TX_MACRO_DAPM_MUX("TX SMIC MUX1", 0, tx_smic1),
1692 TX_MACRO_DAPM_MUX("TX SMIC MUX2", 0, tx_smic2),
1693 TX_MACRO_DAPM_MUX("TX SMIC MUX3", 0, tx_smic3),
1694 TX_MACRO_DAPM_MUX("TX SMIC MUX4", 0, tx_smic4),
1695 TX_MACRO_DAPM_MUX("TX SMIC MUX5", 0, tx_smic5),
1696 TX_MACRO_DAPM_MUX("TX SMIC MUX6", 0, tx_smic6),
1697 TX_MACRO_DAPM_MUX("TX SMIC MUX7", 0, tx_smic7),
1698
1699 SND_SOC_DAPM_MICBIAS_E("TX MIC BIAS1", SND_SOC_NOPM, 0, 0,
1700 tx_macro_enable_micbias,
1701 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1702 SND_SOC_DAPM_ADC_E("TX DMIC0", NULL, SND_SOC_NOPM, 0, 0,
1703 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1704 SND_SOC_DAPM_POST_PMD),
1705
1706 SND_SOC_DAPM_ADC_E("TX DMIC1", NULL, SND_SOC_NOPM, 0, 0,
1707 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1708 SND_SOC_DAPM_POST_PMD),
1709
1710 SND_SOC_DAPM_ADC_E("TX DMIC2", NULL, SND_SOC_NOPM, 0, 0,
1711 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1712 SND_SOC_DAPM_POST_PMD),
1713
1714 SND_SOC_DAPM_ADC_E("TX DMIC3", NULL, SND_SOC_NOPM, 0, 0,
1715 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1716 SND_SOC_DAPM_POST_PMD),
1717
1718 SND_SOC_DAPM_ADC_E("TX DMIC4", NULL, SND_SOC_NOPM, 0, 0,
1719 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1720 SND_SOC_DAPM_POST_PMD),
1721
1722 SND_SOC_DAPM_ADC_E("TX DMIC5", NULL, SND_SOC_NOPM, 0, 0,
1723 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1724 SND_SOC_DAPM_POST_PMD),
1725
1726 SND_SOC_DAPM_ADC_E("TX DMIC6", NULL, SND_SOC_NOPM, 0, 0,
1727 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1728 SND_SOC_DAPM_POST_PMD),
1729
1730 SND_SOC_DAPM_ADC_E("TX DMIC7", NULL, SND_SOC_NOPM, 0, 0,
1731 tx_macro_enable_dmic, SND_SOC_DAPM_PRE_PMU |
1732 SND_SOC_DAPM_POST_PMD),
1733
1734 SND_SOC_DAPM_INPUT("TX SWR_ADC0"),
1735 SND_SOC_DAPM_INPUT("TX SWR_ADC1"),
1736 SND_SOC_DAPM_INPUT("TX SWR_ADC2"),
1737 SND_SOC_DAPM_INPUT("TX SWR_ADC3"),
1738 SND_SOC_DAPM_INPUT("TX SWR_DMIC0"),
1739 SND_SOC_DAPM_INPUT("TX SWR_DMIC1"),
1740 SND_SOC_DAPM_INPUT("TX SWR_DMIC2"),
1741 SND_SOC_DAPM_INPUT("TX SWR_DMIC3"),
1742 SND_SOC_DAPM_INPUT("TX SWR_DMIC4"),
1743 SND_SOC_DAPM_INPUT("TX SWR_DMIC5"),
1744 SND_SOC_DAPM_INPUT("TX SWR_DMIC6"),
1745 SND_SOC_DAPM_INPUT("TX SWR_DMIC7"),
1746
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301747 SND_SOC_DAPM_MUX_E("TX DEC0 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301748 TX_MACRO_DEC0, 0,
1749 &tx_dec0_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 DEC1 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301754 TX_MACRO_DEC1, 0,
1755 &tx_dec1_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 DEC2 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301760 TX_MACRO_DEC2, 0,
1761 &tx_dec2_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
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301765 SND_SOC_DAPM_MUX_E("TX DEC3 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301766 TX_MACRO_DEC3, 0,
1767 &tx_dec3_mux, tx_macro_enable_dec,
1768 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1769 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1770
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301771 SND_SOC_DAPM_MUX_E("TX DEC4 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301772 TX_MACRO_DEC4, 0,
1773 &tx_dec4_mux, tx_macro_enable_dec,
1774 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1775 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1776
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301777 SND_SOC_DAPM_MUX_E("TX DEC5 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301778 TX_MACRO_DEC5, 0,
1779 &tx_dec5_mux, tx_macro_enable_dec,
1780 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1781 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1782
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301783 SND_SOC_DAPM_MUX_E("TX DEC6 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301784 TX_MACRO_DEC6, 0,
1785 &tx_dec6_mux, tx_macro_enable_dec,
1786 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1787 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1788
Ramprasad Katkamf83acfb2018-08-11 23:28:57 +05301789 SND_SOC_DAPM_MUX_E("TX DEC7 MUX", SND_SOC_NOPM,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301790 TX_MACRO_DEC7, 0,
1791 &tx_dec7_mux, tx_macro_enable_dec,
1792 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
1793 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
1794
1795 SND_SOC_DAPM_SUPPLY_S("TX_MCLK", 0, SND_SOC_NOPM, 0, 0,
1796 tx_macro_mclk_event, SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Sudheer Papothie456c2c2019-03-05 07:08:45 +05301797
1798 SND_SOC_DAPM_SUPPLY_S("TX_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1799 tx_macro_tx_swr_clk_event,
1800 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
1801
1802 SND_SOC_DAPM_SUPPLY_S("VA_SWR_CLK", 0, SND_SOC_NOPM, 0, 0,
1803 tx_macro_va_swr_clk_event,
1804 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05301805};
1806
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05301807static const struct snd_soc_dapm_route tx_audio_map_common[] = {
1808 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
1809 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
1810 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
1811
1812 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
1813 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
1814 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
1815
1816 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1817 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1818 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1819 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1820
1821 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1822 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1823 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1824 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1825
1826 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
1827 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
1828 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
1829 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
1830
1831 {"TX DEC0 MUX", NULL, "TX_MCLK"},
1832 {"TX DEC1 MUX", NULL, "TX_MCLK"},
1833 {"TX DEC2 MUX", NULL, "TX_MCLK"},
1834 {"TX DEC3 MUX", NULL, "TX_MCLK"},
1835
1836 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
1837 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
1838 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
1839 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
1840 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
1841 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
1842 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
1843 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
1844 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
1845
1846 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
1847 {"TX SMIC MUX0", "SWR_MIC0", "TX SWR_MIC0"},
1848 {"TX SMIC MUX0", "SWR_MIC1", "TX SWR_MIC1"},
1849 {"TX SMIC MUX0", "SWR_MIC2", "TX SWR_MIC2"},
1850 {"TX SMIC MUX0", "SWR_MIC3", "TX SWR_MIC3"},
1851 {"TX SMIC MUX0", "SWR_MIC4", "TX SWR_MIC4"},
1852 {"TX SMIC MUX0", "SWR_MIC5", "TX SWR_MIC5"},
1853 {"TX SMIC MUX0", "SWR_MIC6", "TX SWR_MIC6"},
1854 {"TX SMIC MUX0", "SWR_MIC7", "TX SWR_MIC7"},
1855 {"TX SMIC MUX0", "SWR_MIC8", "TX SWR_MIC8"},
1856 {"TX SMIC MUX0", "SWR_MIC9", "TX SWR_MIC9"},
1857 {"TX SMIC MUX0", "SWR_MIC10", "TX SWR_MIC10"},
1858 {"TX SMIC MUX0", "SWR_MIC11", "TX SWR_MIC11"},
1859
1860 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
1861 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
1862 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
1863 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
1864 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
1865 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
1866 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
1867 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
1868 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
1869
1870 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
1871 {"TX SMIC MUX1", "SWR_MIC0", "TX SWR_MIC0"},
1872 {"TX SMIC MUX1", "SWR_MIC1", "TX SWR_MIC1"},
1873 {"TX SMIC MUX1", "SWR_MIC2", "TX SWR_MIC2"},
1874 {"TX SMIC MUX1", "SWR_MIC3", "TX SWR_MIC3"},
1875 {"TX SMIC MUX1", "SWR_MIC4", "TX SWR_MIC4"},
1876 {"TX SMIC MUX1", "SWR_MIC5", "TX SWR_MIC5"},
1877 {"TX SMIC MUX1", "SWR_MIC6", "TX SWR_MIC6"},
1878 {"TX SMIC MUX1", "SWR_MIC7", "TX SWR_MIC7"},
1879 {"TX SMIC MUX1", "SWR_MIC8", "TX SWR_MIC8"},
1880 {"TX SMIC MUX1", "SWR_MIC9", "TX SWR_MIC9"},
1881 {"TX SMIC MUX1", "SWR_MIC10", "TX SWR_MIC10"},
1882 {"TX SMIC MUX1", "SWR_MIC11", "TX SWR_MIC11"},
1883
1884 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
1885 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
1886 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
1887 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
1888 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
1889 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
1890 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
1891 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
1892 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
1893
1894 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
1895 {"TX SMIC MUX2", "SWR_MIC0", "TX SWR_MIC0"},
1896 {"TX SMIC MUX2", "SWR_MIC1", "TX SWR_MIC1"},
1897 {"TX SMIC MUX2", "SWR_MIC2", "TX SWR_MIC2"},
1898 {"TX SMIC MUX2", "SWR_MIC3", "TX SWR_MIC3"},
1899 {"TX SMIC MUX2", "SWR_MIC4", "TX SWR_MIC4"},
1900 {"TX SMIC MUX2", "SWR_MIC5", "TX SWR_MIC5"},
1901 {"TX SMIC MUX2", "SWR_MIC6", "TX SWR_MIC6"},
1902 {"TX SMIC MUX2", "SWR_MIC7", "TX SWR_MIC7"},
1903 {"TX SMIC MUX2", "SWR_MIC8", "TX SWR_MIC8"},
1904 {"TX SMIC MUX2", "SWR_MIC9", "TX SWR_MIC9"},
1905 {"TX SMIC MUX2", "SWR_MIC10", "TX SWR_MIC10"},
1906 {"TX SMIC MUX2", "SWR_MIC11", "TX SWR_MIC11"},
1907
1908 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
1909 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
1910 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
1911 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
1912 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
1913 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
1914 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
1915 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
1916 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
1917
1918 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
1919 {"TX SMIC MUX3", "SWR_MIC0", "TX SWR_MIC0"},
1920 {"TX SMIC MUX3", "SWR_MIC1", "TX SWR_MIC1"},
1921 {"TX SMIC MUX3", "SWR_MIC2", "TX SWR_MIC2"},
1922 {"TX SMIC MUX3", "SWR_MIC3", "TX SWR_MIC3"},
1923 {"TX SMIC MUX3", "SWR_MIC4", "TX SWR_MIC4"},
1924 {"TX SMIC MUX3", "SWR_MIC5", "TX SWR_MIC5"},
1925 {"TX SMIC MUX3", "SWR_MIC6", "TX SWR_MIC6"},
1926 {"TX SMIC MUX3", "SWR_MIC7", "TX SWR_MIC7"},
1927 {"TX SMIC MUX3", "SWR_MIC8", "TX SWR_MIC8"},
1928 {"TX SMIC MUX3", "SWR_MIC9", "TX SWR_MIC9"},
1929 {"TX SMIC MUX3", "SWR_MIC10", "TX SWR_MIC10"},
1930 {"TX SMIC MUX3", "SWR_MIC11", "TX SWR_MIC11"},
1931};
1932
1933static const struct snd_soc_dapm_route tx_audio_map_v3[] = {
1934 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1935 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1936 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1937 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1938
1939 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1940 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1941 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1942 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1943
1944 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
1945 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
1946 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
1947 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
1948
1949 {"TX DEC4 MUX", NULL, "TX_MCLK"},
1950 {"TX DEC5 MUX", NULL, "TX_MCLK"},
1951 {"TX DEC6 MUX", NULL, "TX_MCLK"},
1952 {"TX DEC7 MUX", NULL, "TX_MCLK"},
1953
1954 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
1955 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
1956 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
1957 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
1958 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
1959 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
1960 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
1961 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
1962 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
1963
1964 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
1965 {"TX SMIC MUX4", "SWR_MIC0", "TX SWR_MIC0"},
1966 {"TX SMIC MUX4", "SWR_MIC1", "TX SWR_MIC1"},
1967 {"TX SMIC MUX4", "SWR_MIC2", "TX SWR_MIC2"},
1968 {"TX SMIC MUX4", "SWR_MIC3", "TX SWR_MIC3"},
1969 {"TX SMIC MUX4", "SWR_MIC4", "TX SWR_MIC4"},
1970 {"TX SMIC MUX4", "SWR_MIC5", "TX SWR_MIC5"},
1971 {"TX SMIC MUX4", "SWR_MIC6", "TX SWR_MIC6"},
1972 {"TX SMIC MUX4", "SWR_MIC7", "TX SWR_MIC7"},
1973 {"TX SMIC MUX4", "SWR_MIC8", "TX SWR_MIC8"},
1974 {"TX SMIC MUX4", "SWR_MIC9", "TX SWR_MIC9"},
1975 {"TX SMIC MUX4", "SWR_MIC10", "TX SWR_MIC10"},
1976 {"TX SMIC MUX4", "SWR_MIC11", "TX SWR_MIC11"},
1977
1978 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
1979 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
1980 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
1981 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
1982 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
1983 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
1984 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
1985 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
1986 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
1987
1988 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
1989 {"TX SMIC MUX5", "SWR_MIC0", "TX SWR_MIC0"},
1990 {"TX SMIC MUX5", "SWR_MIC1", "TX SWR_MIC1"},
1991 {"TX SMIC MUX5", "SWR_MIC2", "TX SWR_MIC2"},
1992 {"TX SMIC MUX5", "SWR_MIC3", "TX SWR_MIC3"},
1993 {"TX SMIC MUX5", "SWR_MIC4", "TX SWR_MIC4"},
1994 {"TX SMIC MUX5", "SWR_MIC5", "TX SWR_MIC5"},
1995 {"TX SMIC MUX5", "SWR_MIC6", "TX SWR_MIC6"},
1996 {"TX SMIC MUX5", "SWR_MIC7", "TX SWR_MIC7"},
1997 {"TX SMIC MUX5", "SWR_MIC8", "TX SWR_MIC8"},
1998 {"TX SMIC MUX5", "SWR_MIC9", "TX SWR_MIC9"},
1999 {"TX SMIC MUX5", "SWR_MIC10", "TX SWR_MIC10"},
2000 {"TX SMIC MUX5", "SWR_MIC11", "TX SWR_MIC11"},
2001
2002 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
2003 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
2004 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
2005 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
2006 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
2007 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
2008 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
2009 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
2010 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
2011
2012 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
2013 {"TX SMIC MUX6", "SWR_MIC0", "TX SWR_MIC0"},
2014 {"TX SMIC MUX6", "SWR_MIC1", "TX SWR_MIC1"},
2015 {"TX SMIC MUX6", "SWR_MIC2", "TX SWR_MIC2"},
2016 {"TX SMIC MUX6", "SWR_MIC3", "TX SWR_MIC3"},
2017 {"TX SMIC MUX6", "SWR_MIC4", "TX SWR_MIC4"},
2018 {"TX SMIC MUX6", "SWR_MIC5", "TX SWR_MIC5"},
2019 {"TX SMIC MUX6", "SWR_MIC6", "TX SWR_MIC6"},
2020 {"TX SMIC MUX6", "SWR_MIC7", "TX SWR_MIC7"},
2021 {"TX SMIC MUX6", "SWR_MIC8", "TX SWR_MIC8"},
2022 {"TX SMIC MUX6", "SWR_MIC9", "TX SWR_MIC9"},
2023 {"TX SMIC MUX6", "SWR_MIC10", "TX SWR_MIC10"},
2024 {"TX SMIC MUX6", "SWR_MIC11", "TX SWR_MIC11"},
2025
2026 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
2027 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
2028 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
2029 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
2030 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
2031 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
2032 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
2033 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
2034 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
2035
2036 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
2037 {"TX SMIC MUX7", "SWR_MIC0", "TX SWR_MIC0"},
2038 {"TX SMIC MUX7", "SWR_MIC1", "TX SWR_MIC1"},
2039 {"TX SMIC MUX7", "SWR_MIC2", "TX SWR_MIC2"},
2040 {"TX SMIC MUX7", "SWR_MIC3", "TX SWR_MIC3"},
2041 {"TX SMIC MUX7", "SWR_MIC4", "TX SWR_MIC4"},
2042 {"TX SMIC MUX7", "SWR_MIC5", "TX SWR_MIC5"},
2043 {"TX SMIC MUX7", "SWR_MIC6", "TX SWR_MIC6"},
2044 {"TX SMIC MUX7", "SWR_MIC7", "TX SWR_MIC7"},
2045 {"TX SMIC MUX7", "SWR_MIC8", "TX SWR_MIC8"},
2046 {"TX SMIC MUX7", "SWR_MIC9", "TX SWR_MIC9"},
2047 {"TX SMIC MUX7", "SWR_MIC10", "TX SWR_MIC10"},
2048 {"TX SMIC MUX7", "SWR_MIC11", "TX SWR_MIC11"},
Laxminath Kasamb03e82d2019-11-05 13:35:01 +05302049
2050 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
2051 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
2052 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
2053 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
2054 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
2055 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
2056 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
2057 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302058};
2059
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302060static const struct snd_soc_dapm_route tx_audio_map[] = {
2061 {"TX_AIF1 CAP", NULL, "TX_MCLK"},
2062 {"TX_AIF2 CAP", NULL, "TX_MCLK"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002063 {"TX_AIF3 CAP", NULL, "TX_MCLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302064
2065 {"TX_AIF1 CAP", NULL, "TX_AIF1_CAP Mixer"},
2066 {"TX_AIF2 CAP", NULL, "TX_AIF2_CAP Mixer"},
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002067 {"TX_AIF3 CAP", NULL, "TX_AIF3_CAP Mixer"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302068
2069 {"TX_AIF1_CAP Mixer", "DEC0", "TX DEC0 MUX"},
2070 {"TX_AIF1_CAP Mixer", "DEC1", "TX DEC1 MUX"},
2071 {"TX_AIF1_CAP Mixer", "DEC2", "TX DEC2 MUX"},
2072 {"TX_AIF1_CAP Mixer", "DEC3", "TX DEC3 MUX"},
2073 {"TX_AIF1_CAP Mixer", "DEC4", "TX DEC4 MUX"},
2074 {"TX_AIF1_CAP Mixer", "DEC5", "TX DEC5 MUX"},
2075 {"TX_AIF1_CAP Mixer", "DEC6", "TX DEC6 MUX"},
2076 {"TX_AIF1_CAP Mixer", "DEC7", "TX DEC7 MUX"},
2077
2078 {"TX_AIF2_CAP Mixer", "DEC0", "TX DEC0 MUX"},
2079 {"TX_AIF2_CAP Mixer", "DEC1", "TX DEC1 MUX"},
2080 {"TX_AIF2_CAP Mixer", "DEC2", "TX DEC2 MUX"},
2081 {"TX_AIF2_CAP Mixer", "DEC3", "TX DEC3 MUX"},
2082 {"TX_AIF2_CAP Mixer", "DEC4", "TX DEC4 MUX"},
2083 {"TX_AIF2_CAP Mixer", "DEC5", "TX DEC5 MUX"},
2084 {"TX_AIF2_CAP Mixer", "DEC6", "TX DEC6 MUX"},
2085 {"TX_AIF2_CAP Mixer", "DEC7", "TX DEC7 MUX"},
2086
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002087 {"TX_AIF3_CAP Mixer", "DEC0", "TX DEC0 MUX"},
2088 {"TX_AIF3_CAP Mixer", "DEC1", "TX DEC1 MUX"},
2089 {"TX_AIF3_CAP Mixer", "DEC2", "TX DEC2 MUX"},
2090 {"TX_AIF3_CAP Mixer", "DEC3", "TX DEC3 MUX"},
2091 {"TX_AIF3_CAP Mixer", "DEC4", "TX DEC4 MUX"},
2092 {"TX_AIF3_CAP Mixer", "DEC5", "TX DEC5 MUX"},
2093 {"TX_AIF3_CAP Mixer", "DEC6", "TX DEC6 MUX"},
2094 {"TX_AIF3_CAP Mixer", "DEC7", "TX DEC7 MUX"},
2095
Laxminath Kasamfc281ad2018-08-06 20:19:40 +05302096 {"TX DEC0 MUX", NULL, "TX_MCLK"},
2097 {"TX DEC1 MUX", NULL, "TX_MCLK"},
2098 {"TX DEC2 MUX", NULL, "TX_MCLK"},
2099 {"TX DEC3 MUX", NULL, "TX_MCLK"},
2100 {"TX DEC4 MUX", NULL, "TX_MCLK"},
2101 {"TX DEC5 MUX", NULL, "TX_MCLK"},
2102 {"TX DEC6 MUX", NULL, "TX_MCLK"},
2103 {"TX DEC7 MUX", NULL, "TX_MCLK"},
2104
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302105 {"TX DEC0 MUX", "MSM_DMIC", "TX DMIC MUX0"},
2106 {"TX DMIC MUX0", "DMIC0", "TX DMIC0"},
2107 {"TX DMIC MUX0", "DMIC1", "TX DMIC1"},
2108 {"TX DMIC MUX0", "DMIC2", "TX DMIC2"},
2109 {"TX DMIC MUX0", "DMIC3", "TX DMIC3"},
2110 {"TX DMIC MUX0", "DMIC4", "TX DMIC4"},
2111 {"TX DMIC MUX0", "DMIC5", "TX DMIC5"},
2112 {"TX DMIC MUX0", "DMIC6", "TX DMIC6"},
2113 {"TX DMIC MUX0", "DMIC7", "TX DMIC7"},
2114
2115 {"TX DEC0 MUX", "SWR_MIC", "TX SMIC MUX0"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302116 {"TX SMIC MUX0", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302117 {"TX SMIC MUX0", "ADC0", "TX SWR_ADC0"},
2118 {"TX SMIC MUX0", "ADC1", "TX SWR_ADC1"},
2119 {"TX SMIC MUX0", "ADC2", "TX SWR_ADC2"},
2120 {"TX SMIC MUX0", "ADC3", "TX SWR_ADC3"},
2121 {"TX SMIC MUX0", "SWR_DMIC0", "TX SWR_DMIC0"},
2122 {"TX SMIC MUX0", "SWR_DMIC1", "TX SWR_DMIC1"},
2123 {"TX SMIC MUX0", "SWR_DMIC2", "TX SWR_DMIC2"},
2124 {"TX SMIC MUX0", "SWR_DMIC3", "TX SWR_DMIC3"},
2125 {"TX SMIC MUX0", "SWR_DMIC4", "TX SWR_DMIC4"},
2126 {"TX SMIC MUX0", "SWR_DMIC5", "TX SWR_DMIC5"},
2127 {"TX SMIC MUX0", "SWR_DMIC6", "TX SWR_DMIC6"},
2128 {"TX SMIC MUX0", "SWR_DMIC7", "TX SWR_DMIC7"},
2129
2130 {"TX DEC1 MUX", "MSM_DMIC", "TX DMIC MUX1"},
2131 {"TX DMIC MUX1", "DMIC0", "TX DMIC0"},
2132 {"TX DMIC MUX1", "DMIC1", "TX DMIC1"},
2133 {"TX DMIC MUX1", "DMIC2", "TX DMIC2"},
2134 {"TX DMIC MUX1", "DMIC3", "TX DMIC3"},
2135 {"TX DMIC MUX1", "DMIC4", "TX DMIC4"},
2136 {"TX DMIC MUX1", "DMIC5", "TX DMIC5"},
2137 {"TX DMIC MUX1", "DMIC6", "TX DMIC6"},
2138 {"TX DMIC MUX1", "DMIC7", "TX DMIC7"},
2139
2140 {"TX DEC1 MUX", "SWR_MIC", "TX SMIC MUX1"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302141 {"TX SMIC MUX1", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302142 {"TX SMIC MUX1", "ADC0", "TX SWR_ADC0"},
2143 {"TX SMIC MUX1", "ADC1", "TX SWR_ADC1"},
2144 {"TX SMIC MUX1", "ADC2", "TX SWR_ADC2"},
2145 {"TX SMIC MUX1", "ADC3", "TX SWR_ADC3"},
2146 {"TX SMIC MUX1", "SWR_DMIC0", "TX SWR_DMIC0"},
2147 {"TX SMIC MUX1", "SWR_DMIC1", "TX SWR_DMIC1"},
2148 {"TX SMIC MUX1", "SWR_DMIC2", "TX SWR_DMIC2"},
2149 {"TX SMIC MUX1", "SWR_DMIC3", "TX SWR_DMIC3"},
2150 {"TX SMIC MUX1", "SWR_DMIC4", "TX SWR_DMIC4"},
2151 {"TX SMIC MUX1", "SWR_DMIC5", "TX SWR_DMIC5"},
2152 {"TX SMIC MUX1", "SWR_DMIC6", "TX SWR_DMIC6"},
2153 {"TX SMIC MUX1", "SWR_DMIC7", "TX SWR_DMIC7"},
2154
2155 {"TX DEC2 MUX", "MSM_DMIC", "TX DMIC MUX2"},
2156 {"TX DMIC MUX2", "DMIC0", "TX DMIC0"},
2157 {"TX DMIC MUX2", "DMIC1", "TX DMIC1"},
2158 {"TX DMIC MUX2", "DMIC2", "TX DMIC2"},
2159 {"TX DMIC MUX2", "DMIC3", "TX DMIC3"},
2160 {"TX DMIC MUX2", "DMIC4", "TX DMIC4"},
2161 {"TX DMIC MUX2", "DMIC5", "TX DMIC5"},
2162 {"TX DMIC MUX2", "DMIC6", "TX DMIC6"},
2163 {"TX DMIC MUX2", "DMIC7", "TX DMIC7"},
2164
2165 {"TX DEC2 MUX", "SWR_MIC", "TX SMIC MUX2"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302166 {"TX SMIC MUX2", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302167 {"TX SMIC MUX2", "ADC0", "TX SWR_ADC0"},
2168 {"TX SMIC MUX2", "ADC1", "TX SWR_ADC1"},
2169 {"TX SMIC MUX2", "ADC2", "TX SWR_ADC2"},
2170 {"TX SMIC MUX2", "ADC3", "TX SWR_ADC3"},
2171 {"TX SMIC MUX2", "SWR_DMIC0", "TX SWR_DMIC0"},
2172 {"TX SMIC MUX2", "SWR_DMIC1", "TX SWR_DMIC1"},
2173 {"TX SMIC MUX2", "SWR_DMIC2", "TX SWR_DMIC2"},
2174 {"TX SMIC MUX2", "SWR_DMIC3", "TX SWR_DMIC3"},
2175 {"TX SMIC MUX2", "SWR_DMIC4", "TX SWR_DMIC4"},
2176 {"TX SMIC MUX2", "SWR_DMIC5", "TX SWR_DMIC5"},
2177 {"TX SMIC MUX2", "SWR_DMIC6", "TX SWR_DMIC6"},
2178 {"TX SMIC MUX2", "SWR_DMIC7", "TX SWR_DMIC7"},
2179
2180 {"TX DEC3 MUX", "MSM_DMIC", "TX DMIC MUX3"},
2181 {"TX DMIC MUX3", "DMIC0", "TX DMIC0"},
2182 {"TX DMIC MUX3", "DMIC1", "TX DMIC1"},
2183 {"TX DMIC MUX3", "DMIC2", "TX DMIC2"},
2184 {"TX DMIC MUX3", "DMIC3", "TX DMIC3"},
2185 {"TX DMIC MUX3", "DMIC4", "TX DMIC4"},
2186 {"TX DMIC MUX3", "DMIC5", "TX DMIC5"},
2187 {"TX DMIC MUX3", "DMIC6", "TX DMIC6"},
2188 {"TX DMIC MUX3", "DMIC7", "TX DMIC7"},
2189
2190 {"TX DEC3 MUX", "SWR_MIC", "TX SMIC MUX3"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302191 {"TX SMIC MUX3", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302192 {"TX SMIC MUX3", "ADC0", "TX SWR_ADC0"},
2193 {"TX SMIC MUX3", "ADC1", "TX SWR_ADC1"},
2194 {"TX SMIC MUX3", "ADC2", "TX SWR_ADC2"},
2195 {"TX SMIC MUX3", "ADC3", "TX SWR_ADC3"},
2196 {"TX SMIC MUX3", "SWR_DMIC0", "TX SWR_DMIC0"},
2197 {"TX SMIC MUX3", "SWR_DMIC1", "TX SWR_DMIC1"},
2198 {"TX SMIC MUX3", "SWR_DMIC2", "TX SWR_DMIC2"},
2199 {"TX SMIC MUX3", "SWR_DMIC3", "TX SWR_DMIC3"},
2200 {"TX SMIC MUX3", "SWR_DMIC4", "TX SWR_DMIC4"},
2201 {"TX SMIC MUX3", "SWR_DMIC5", "TX SWR_DMIC5"},
2202 {"TX SMIC MUX3", "SWR_DMIC6", "TX SWR_DMIC6"},
2203 {"TX SMIC MUX3", "SWR_DMIC7", "TX SWR_DMIC7"},
2204
2205 {"TX DEC4 MUX", "MSM_DMIC", "TX DMIC MUX4"},
2206 {"TX DMIC MUX4", "DMIC0", "TX DMIC0"},
2207 {"TX DMIC MUX4", "DMIC1", "TX DMIC1"},
2208 {"TX DMIC MUX4", "DMIC2", "TX DMIC2"},
2209 {"TX DMIC MUX4", "DMIC3", "TX DMIC3"},
2210 {"TX DMIC MUX4", "DMIC4", "TX DMIC4"},
2211 {"TX DMIC MUX4", "DMIC5", "TX DMIC5"},
2212 {"TX DMIC MUX4", "DMIC6", "TX DMIC6"},
2213 {"TX DMIC MUX4", "DMIC7", "TX DMIC7"},
2214
2215 {"TX DEC4 MUX", "SWR_MIC", "TX SMIC MUX4"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302216 {"TX SMIC MUX4", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302217 {"TX SMIC MUX4", "ADC0", "TX SWR_ADC0"},
2218 {"TX SMIC MUX4", "ADC1", "TX SWR_ADC1"},
2219 {"TX SMIC MUX4", "ADC2", "TX SWR_ADC2"},
2220 {"TX SMIC MUX4", "ADC3", "TX SWR_ADC3"},
2221 {"TX SMIC MUX4", "SWR_DMIC0", "TX SWR_DMIC0"},
2222 {"TX SMIC MUX4", "SWR_DMIC1", "TX SWR_DMIC1"},
2223 {"TX SMIC MUX4", "SWR_DMIC2", "TX SWR_DMIC2"},
2224 {"TX SMIC MUX4", "SWR_DMIC3", "TX SWR_DMIC3"},
2225 {"TX SMIC MUX4", "SWR_DMIC4", "TX SWR_DMIC4"},
2226 {"TX SMIC MUX4", "SWR_DMIC5", "TX SWR_DMIC5"},
2227 {"TX SMIC MUX4", "SWR_DMIC6", "TX SWR_DMIC6"},
2228 {"TX SMIC MUX4", "SWR_DMIC7", "TX SWR_DMIC7"},
2229
2230 {"TX DEC5 MUX", "MSM_DMIC", "TX DMIC MUX5"},
2231 {"TX DMIC MUX5", "DMIC0", "TX DMIC0"},
2232 {"TX DMIC MUX5", "DMIC1", "TX DMIC1"},
2233 {"TX DMIC MUX5", "DMIC2", "TX DMIC2"},
2234 {"TX DMIC MUX5", "DMIC3", "TX DMIC3"},
2235 {"TX DMIC MUX5", "DMIC4", "TX DMIC4"},
2236 {"TX DMIC MUX5", "DMIC5", "TX DMIC5"},
2237 {"TX DMIC MUX5", "DMIC6", "TX DMIC6"},
2238 {"TX DMIC MUX5", "DMIC7", "TX DMIC7"},
2239
2240 {"TX DEC5 MUX", "SWR_MIC", "TX SMIC MUX5"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302241 {"TX SMIC MUX5", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302242 {"TX SMIC MUX5", "ADC0", "TX SWR_ADC0"},
2243 {"TX SMIC MUX5", "ADC1", "TX SWR_ADC1"},
2244 {"TX SMIC MUX5", "ADC2", "TX SWR_ADC2"},
2245 {"TX SMIC MUX5", "ADC3", "TX SWR_ADC3"},
2246 {"TX SMIC MUX5", "SWR_DMIC0", "TX SWR_DMIC0"},
2247 {"TX SMIC MUX5", "SWR_DMIC1", "TX SWR_DMIC1"},
2248 {"TX SMIC MUX5", "SWR_DMIC2", "TX SWR_DMIC2"},
2249 {"TX SMIC MUX5", "SWR_DMIC3", "TX SWR_DMIC3"},
2250 {"TX SMIC MUX5", "SWR_DMIC4", "TX SWR_DMIC4"},
2251 {"TX SMIC MUX5", "SWR_DMIC5", "TX SWR_DMIC5"},
2252 {"TX SMIC MUX5", "SWR_DMIC6", "TX SWR_DMIC6"},
2253 {"TX SMIC MUX5", "SWR_DMIC7", "TX SWR_DMIC7"},
2254
2255 {"TX DEC6 MUX", "MSM_DMIC", "TX DMIC MUX6"},
2256 {"TX DMIC MUX6", "DMIC0", "TX DMIC0"},
2257 {"TX DMIC MUX6", "DMIC1", "TX DMIC1"},
2258 {"TX DMIC MUX6", "DMIC2", "TX DMIC2"},
2259 {"TX DMIC MUX6", "DMIC3", "TX DMIC3"},
2260 {"TX DMIC MUX6", "DMIC4", "TX DMIC4"},
2261 {"TX DMIC MUX6", "DMIC5", "TX DMIC5"},
2262 {"TX DMIC MUX6", "DMIC6", "TX DMIC6"},
2263 {"TX DMIC MUX6", "DMIC7", "TX DMIC7"},
2264
2265 {"TX DEC6 MUX", "SWR_MIC", "TX SMIC MUX6"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302266 {"TX SMIC MUX6", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302267 {"TX SMIC MUX6", "ADC0", "TX SWR_ADC0"},
2268 {"TX SMIC MUX6", "ADC1", "TX SWR_ADC1"},
2269 {"TX SMIC MUX6", "ADC2", "TX SWR_ADC2"},
2270 {"TX SMIC MUX6", "ADC3", "TX SWR_ADC3"},
2271 {"TX SMIC MUX6", "SWR_DMIC0", "TX SWR_DMIC0"},
2272 {"TX SMIC MUX6", "SWR_DMIC1", "TX SWR_DMIC1"},
2273 {"TX SMIC MUX6", "SWR_DMIC2", "TX SWR_DMIC2"},
2274 {"TX SMIC MUX6", "SWR_DMIC3", "TX SWR_DMIC3"},
2275 {"TX SMIC MUX6", "SWR_DMIC4", "TX SWR_DMIC4"},
2276 {"TX SMIC MUX6", "SWR_DMIC5", "TX SWR_DMIC5"},
2277 {"TX SMIC MUX6", "SWR_DMIC6", "TX SWR_DMIC6"},
2278 {"TX SMIC MUX6", "SWR_DMIC7", "TX SWR_DMIC7"},
2279
2280 {"TX DEC7 MUX", "MSM_DMIC", "TX DMIC MUX7"},
2281 {"TX DMIC MUX7", "DMIC0", "TX DMIC0"},
2282 {"TX DMIC MUX7", "DMIC1", "TX DMIC1"},
2283 {"TX DMIC MUX7", "DMIC2", "TX DMIC2"},
2284 {"TX DMIC MUX7", "DMIC3", "TX DMIC3"},
2285 {"TX DMIC MUX7", "DMIC4", "TX DMIC4"},
2286 {"TX DMIC MUX7", "DMIC5", "TX DMIC5"},
2287 {"TX DMIC MUX7", "DMIC6", "TX DMIC6"},
2288 {"TX DMIC MUX7", "DMIC7", "TX DMIC7"},
2289
2290 {"TX DEC7 MUX", "SWR_MIC", "TX SMIC MUX7"},
Sudheer Papothie456c2c2019-03-05 07:08:45 +05302291 {"TX SMIC MUX7", NULL, "TX_SWR_CLK"},
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302292 {"TX SMIC MUX7", "ADC0", "TX SWR_ADC0"},
2293 {"TX SMIC MUX7", "ADC1", "TX SWR_ADC1"},
2294 {"TX SMIC MUX7", "ADC2", "TX SWR_ADC2"},
2295 {"TX SMIC MUX7", "ADC3", "TX SWR_ADC3"},
2296 {"TX SMIC MUX7", "SWR_DMIC0", "TX SWR_DMIC0"},
2297 {"TX SMIC MUX7", "SWR_DMIC1", "TX SWR_DMIC1"},
2298 {"TX SMIC MUX7", "SWR_DMIC2", "TX SWR_DMIC2"},
2299 {"TX SMIC MUX7", "SWR_DMIC3", "TX SWR_DMIC3"},
2300 {"TX SMIC MUX7", "SWR_DMIC4", "TX SWR_DMIC4"},
2301 {"TX SMIC MUX7", "SWR_DMIC5", "TX SWR_DMIC5"},
2302 {"TX SMIC MUX7", "SWR_DMIC6", "TX SWR_DMIC6"},
2303 {"TX SMIC MUX7", "SWR_DMIC7", "TX SWR_DMIC7"},
2304};
2305
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302306static const struct snd_kcontrol_new tx_macro_snd_controls_common[] = {
2307 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2308 BOLERO_CDC_TX0_TX_VOL_CTL,
2309 0, -84, 40, digital_gain),
2310 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2311 BOLERO_CDC_TX1_TX_VOL_CTL,
2312 0, -84, 40, digital_gain),
2313 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2314 BOLERO_CDC_TX2_TX_VOL_CTL,
2315 0, -84, 40, digital_gain),
2316 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2317 BOLERO_CDC_TX3_TX_VOL_CTL,
2318 0, -84, 40, digital_gain),
2319
2320 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2321 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2322
2323 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2324 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2325
2326 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2327 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2328
2329 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2330 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2331
2332 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2333 tx_macro_get_bcs, tx_macro_set_bcs),
Aditya Bavanari8a3f1e62020-03-23 12:48:26 +05302334
2335 SOC_ENUM_EXT("BCS CH_SEL", bcs_ch_sel_mux_enum,
2336 tx_macro_get_bcs_ch_sel, tx_macro_put_bcs_ch_sel),
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302337};
2338
2339static const struct snd_kcontrol_new tx_macro_snd_controls_v3[] = {
2340 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2341 BOLERO_CDC_TX4_TX_VOL_CTL,
2342 0, -84, 40, digital_gain),
2343 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2344 BOLERO_CDC_TX5_TX_VOL_CTL,
2345 0, -84, 40, digital_gain),
2346 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2347 BOLERO_CDC_TX6_TX_VOL_CTL,
2348 0, -84, 40, digital_gain),
2349 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2350 BOLERO_CDC_TX7_TX_VOL_CTL,
2351 0, -84, 40, digital_gain),
2352
2353 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2354 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2355
2356 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2357 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2358
2359 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2360 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2361
2362 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2363 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2364};
2365
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302366static const struct snd_kcontrol_new tx_macro_snd_controls[] = {
2367 SOC_SINGLE_SX_TLV("TX_DEC0 Volume",
2368 BOLERO_CDC_TX0_TX_VOL_CTL,
2369 0, -84, 40, digital_gain),
2370 SOC_SINGLE_SX_TLV("TX_DEC1 Volume",
2371 BOLERO_CDC_TX1_TX_VOL_CTL,
2372 0, -84, 40, digital_gain),
2373 SOC_SINGLE_SX_TLV("TX_DEC2 Volume",
2374 BOLERO_CDC_TX2_TX_VOL_CTL,
2375 0, -84, 40, digital_gain),
2376 SOC_SINGLE_SX_TLV("TX_DEC3 Volume",
2377 BOLERO_CDC_TX3_TX_VOL_CTL,
2378 0, -84, 40, digital_gain),
2379 SOC_SINGLE_SX_TLV("TX_DEC4 Volume",
2380 BOLERO_CDC_TX4_TX_VOL_CTL,
2381 0, -84, 40, digital_gain),
2382 SOC_SINGLE_SX_TLV("TX_DEC5 Volume",
2383 BOLERO_CDC_TX5_TX_VOL_CTL,
2384 0, -84, 40, digital_gain),
2385 SOC_SINGLE_SX_TLV("TX_DEC6 Volume",
2386 BOLERO_CDC_TX6_TX_VOL_CTL,
2387 0, -84, 40, digital_gain),
2388 SOC_SINGLE_SX_TLV("TX_DEC7 Volume",
2389 BOLERO_CDC_TX7_TX_VOL_CTL,
2390 0, -84, 40, digital_gain),
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002391
Karthikeyan Mani1dcd5a32019-08-22 14:37:13 -07002392 SOC_ENUM_EXT("DEC0 MODE", dec_mode_mux_enum,
2393 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2394
2395 SOC_ENUM_EXT("DEC1 MODE", dec_mode_mux_enum,
2396 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2397
2398 SOC_ENUM_EXT("DEC2 MODE", dec_mode_mux_enum,
2399 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2400
2401 SOC_ENUM_EXT("DEC3 MODE", dec_mode_mux_enum,
2402 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2403
2404 SOC_ENUM_EXT("DEC4 MODE", dec_mode_mux_enum,
2405 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2406
2407 SOC_ENUM_EXT("DEC5 MODE", dec_mode_mux_enum,
2408 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2409
2410 SOC_ENUM_EXT("DEC6 MODE", dec_mode_mux_enum,
2411 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2412
2413 SOC_ENUM_EXT("DEC7 MODE", dec_mode_mux_enum,
2414 tx_macro_dec_mode_get, tx_macro_dec_mode_put),
2415
Karthikeyan Mani765eaab2019-07-18 16:27:01 -07002416 SOC_SINGLE_EXT("DEC0_BCS Switch", SND_SOC_NOPM, 0, 1, 0,
2417 tx_macro_get_bcs, tx_macro_set_bcs),
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302418};
2419
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302420static int tx_macro_register_event_listener(struct snd_soc_component *component,
Laxminath Kasam2ffc69e2020-06-16 20:15:26 +05302421 bool enable)
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302422{
2423 struct device *tx_dev = NULL;
2424 struct tx_macro_priv *tx_priv = NULL;
2425 int ret = 0;
2426
2427 if (!component)
2428 return -EINVAL;
2429
2430 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2431 if (!tx_dev) {
2432 dev_err(component->dev,
2433 "%s: null device for macro!\n", __func__);
2434 return -EINVAL;
2435 }
2436 tx_priv = dev_get_drvdata(tx_dev);
2437 if (!tx_priv) {
2438 dev_err(component->dev,
2439 "%s: priv is null for macro!\n", __func__);
2440 return -EINVAL;
2441 }
Meng Wang3c6c7b62020-01-13 14:35:30 +08002442 if (tx_priv->swr_ctrl_data &&
2443 (!tx_priv->tx_swr_clk_cnt || !tx_priv->va_swr_clk_cnt)) {
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302444 if (enable) {
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302445 ret = swrm_wcd_notify(
2446 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Laxminath Kasam2ffc69e2020-06-16 20:15:26 +05302447 SWR_REGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302448 } else {
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302449 ret = swrm_wcd_notify(
2450 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Laxminath Kasam2ffc69e2020-06-16 20:15:26 +05302451 SWR_DEREGISTER_WAKEUP, NULL);
Sudheer Papothibc3f1e52019-09-17 04:03:10 +05302452 }
Sudheer Papothi06a4c642019-08-08 05:17:46 +05302453 }
2454
2455 return ret;
2456}
2457
Sudheer Papothia7397942019-03-19 03:14:23 +05302458static int tx_macro_tx_va_mclk_enable(struct tx_macro_priv *tx_priv,
2459 struct regmap *regmap, int clk_type,
2460 bool enable)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302461{
Meng Wang69b55c82019-05-29 11:04:29 +08002462 int ret = 0, clk_tx_ret = 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302463
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002464 trace_printk("%s: clock type %s, enable: %s tx_mclk_users: %d\n",
2465 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
2466 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302467 dev_dbg(tx_priv->dev,
2468 "%s: clock type %s, enable: %s tx_mclk_users: %d\n",
Sudheer Papothia7397942019-03-19 03:14:23 +05302469 __func__, (clk_type ? "VA_MCLK" : "TX_MCLK"),
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302470 (enable ? "enable" : "disable"), tx_priv->tx_mclk_users);
Tanya Dixit8530fb92018-09-14 16:01:25 +05302471
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302472 if (enable) {
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002473 if (tx_priv->swr_clk_users == 0) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002474 trace_printk("%s: tx swr clk users 0\n", __func__);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002475 ret = msm_cdc_pinctrl_select_active_state(
Karthikeyan Mani01f1ba42019-02-26 18:48:15 -08002476 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002477 if (ret < 0) {
2478 dev_err_ratelimited(tx_priv->dev,
2479 "%s: tx swr pinctrl enable failed\n",
2480 __func__);
2481 goto exit;
2482 }
Laxminath Kasam36bf2992020-11-02 10:56:07 +05302483 msm_cdc_pinctrl_set_wakeup_capable(
2484 tx_priv->tx_swr_gpio_p, false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002485 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302486
Meng Wang69b55c82019-05-29 11:04:29 +08002487 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302488 TX_CORE_CLK,
2489 TX_CORE_CLK,
2490 true);
2491 if (clk_type == TX_MCLK) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002492 trace_printk("%s: requesting TX_MCLK\n", __func__);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302493 ret = tx_macro_mclk_enable(tx_priv, 1);
2494 if (ret < 0) {
2495 if (tx_priv->swr_clk_users == 0)
2496 msm_cdc_pinctrl_select_sleep_state(
2497 tx_priv->tx_swr_gpio_p);
2498 dev_err_ratelimited(tx_priv->dev,
2499 "%s: request clock enable failed\n",
2500 __func__);
2501 goto done;
2502 }
2503 }
2504 if (clk_type == VA_MCLK) {
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002505 trace_printk("%s: requesting VA_MCLK\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302506 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2507 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302508 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302509 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302510 if (ret < 0) {
2511 if (tx_priv->swr_clk_users == 0)
Sudheer Papothia7397942019-03-19 03:14:23 +05302512 msm_cdc_pinctrl_select_sleep_state(
2513 tx_priv->tx_swr_gpio_p);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302514 dev_err_ratelimited(tx_priv->dev,
2515 "%s: swr request clk failed\n",
2516 __func__);
2517 goto done;
Sudheer Papothia7397942019-03-19 03:14:23 +05302518 }
Sudheer Papothi296867b2019-06-20 09:24:09 +05302519 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
2520 true);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302521 if (tx_priv->tx_mclk_users == 0) {
2522 regmap_update_bits(regmap,
2523 BOLERO_CDC_TX_TOP_CSR_FREQ_MCLK,
2524 0x01, 0x01);
2525 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002526 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302527 0x01, 0x01);
2528 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002529 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302530 0x01, 0x01);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302531 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002532 tx_priv->tx_mclk_users++;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302533 }
2534 if (tx_priv->swr_clk_users == 0) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302535 dev_dbg(tx_priv->dev, "%s: reset_swr: %d\n",
2536 __func__, tx_priv->reset_swr);
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002537 trace_printk("%s: reset_swr: %d\n",
2538 __func__, tx_priv->reset_swr);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302539 if (tx_priv->reset_swr)
2540 regmap_update_bits(regmap,
2541 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2542 0x02, 0x02);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302543 regmap_update_bits(regmap,
2544 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2545 0x01, 0x01);
Ramprasad Katkama4c747b2018-12-11 19:15:53 +05302546 if (tx_priv->reset_swr)
2547 regmap_update_bits(regmap,
2548 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2549 0x02, 0x00);
2550 tx_priv->reset_swr = false;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302551 }
Meng Wang69b55c82019-05-29 11:04:29 +08002552 if (!clk_tx_ret)
2553 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302554 TX_CORE_CLK,
2555 TX_CORE_CLK,
2556 false);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302557 tx_priv->swr_clk_users++;
2558 } else {
2559 if (tx_priv->swr_clk_users <= 0) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302560 dev_err_ratelimited(tx_priv->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302561 "tx swrm clock users already 0\n");
2562 tx_priv->swr_clk_users = 0;
Sudheer Papothia7397942019-03-19 03:14:23 +05302563 return 0;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302564 }
Meng Wang69b55c82019-05-29 11:04:29 +08002565 clk_tx_ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302566 TX_CORE_CLK,
2567 TX_CORE_CLK,
2568 true);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302569 tx_priv->swr_clk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302570 if (tx_priv->swr_clk_users == 0)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302571 regmap_update_bits(regmap,
2572 BOLERO_CDC_TX_CLK_RST_CTRL_SWR_CONTROL,
2573 0x01, 0x00);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302574 if (clk_type == TX_MCLK)
2575 tx_macro_mclk_enable(tx_priv, 0);
2576 if (clk_type == VA_MCLK) {
Meng Wang52a8fb12019-12-12 20:36:05 +08002577 if (tx_priv->tx_mclk_users <= 0) {
2578 dev_err(tx_priv->dev, "%s: clock already disabled\n",
2579 __func__);
2580 tx_priv->tx_mclk_users = 0;
2581 goto tx_clk;
2582 }
2583 tx_priv->tx_mclk_users--;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302584 if (tx_priv->tx_mclk_users == 0) {
2585 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002586 BOLERO_CDC_TX_CLK_RST_CTRL_FS_CNT_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302587 0x01, 0x00);
2588 regmap_update_bits(regmap,
Meng Wang52a8fb12019-12-12 20:36:05 +08002589 BOLERO_CDC_TX_CLK_RST_CTRL_MCLK_CONTROL,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302590 0x01, 0x00);
Sudheer Papothia7397942019-03-19 03:14:23 +05302591 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002592
Sudheer Papothi296867b2019-06-20 09:24:09 +05302593 bolero_clk_rsc_fs_gen_request(tx_priv->dev,
Meng Wang52a8fb12019-12-12 20:36:05 +08002594 false);
Sudheer Papothia7397942019-03-19 03:14:23 +05302595 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
2596 TX_CORE_CLK,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302597 VA_CORE_CLK,
Sudheer Papothia7397942019-03-19 03:14:23 +05302598 false);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302599 if (ret < 0) {
2600 dev_err_ratelimited(tx_priv->dev,
2601 "%s: swr request clk failed\n",
2602 __func__);
2603 goto done;
2604 }
2605 }
Meng Wang52a8fb12019-12-12 20:36:05 +08002606tx_clk:
Meng Wang69b55c82019-05-29 11:04:29 +08002607 if (!clk_tx_ret)
2608 ret = bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302609 TX_CORE_CLK,
2610 TX_CORE_CLK,
2611 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002612 if (tx_priv->swr_clk_users == 0) {
Laxminath Kasam36bf2992020-11-02 10:56:07 +05302613 msm_cdc_pinctrl_set_wakeup_capable(
2614 tx_priv->tx_swr_gpio_p, true);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002615 ret = msm_cdc_pinctrl_select_sleep_state(
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302616 tx_priv->tx_swr_gpio_p);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002617 if (ret < 0) {
2618 dev_err_ratelimited(tx_priv->dev,
2619 "%s: tx swr pinctrl disable failed\n",
2620 __func__);
2621 goto exit;
2622 }
2623 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302624 }
Sudheer Papothia7397942019-03-19 03:14:23 +05302625 return 0;
2626
2627done:
Meng Wang69b55c82019-05-29 11:04:29 +08002628 if (!clk_tx_ret)
2629 bolero_clk_rsc_request_clock(tx_priv->dev,
Sudheer Papothia7397942019-03-19 03:14:23 +05302630 TX_CORE_CLK,
2631 TX_CORE_CLK,
2632 false);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002633exit:
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002634 trace_printk("%s: exit\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302635 return ret;
2636}
2637
Sudheer Papothid50a5812019-11-21 07:24:42 +05302638static int tx_macro_clk_div_get(struct snd_soc_component *component)
2639{
2640 struct device *tx_dev = NULL;
2641 struct tx_macro_priv *tx_priv = NULL;
2642
2643 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
2644 return -EINVAL;
2645
2646 return tx_priv->dmic_clk_div;
2647}
2648
Sudheer Papothif4155002019-12-05 01:36:13 +05302649static int tx_macro_clk_switch(struct snd_soc_component *component, int clk_src)
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302650{
2651 struct device *tx_dev = NULL;
2652 struct tx_macro_priv *tx_priv = NULL;
2653 int ret = 0;
2654
2655 if (!component)
2656 return -EINVAL;
2657
2658 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
2659 if (!tx_dev) {
2660 dev_err(component->dev,
2661 "%s: null device for macro!\n", __func__);
2662 return -EINVAL;
2663 }
2664 tx_priv = dev_get_drvdata(tx_dev);
2665 if (!tx_priv) {
2666 dev_err(component->dev,
2667 "%s: priv is null for macro!\n", __func__);
2668 return -EINVAL;
2669 }
2670 if (tx_priv->swr_ctrl_data) {
2671 ret = swrm_wcd_notify(
2672 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
Sudheer Papothif4155002019-12-05 01:36:13 +05302673 SWR_REQ_CLK_SWITCH, &clk_src);
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05302674 }
2675
2676 return ret;
2677}
2678
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002679static int tx_macro_core_vote(void *handle, bool enable)
2680{
Vangala, Amarnath258d2932020-10-27 23:53:04 +05302681 int rc = 0;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002682 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002683
2684 if (tx_priv == NULL) {
2685 pr_err("%s: tx priv data is NULL\n", __func__);
2686 return -EINVAL;
2687 }
Vangala, Amarnath258d2932020-10-27 23:53:04 +05302688
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002689 if (enable) {
2690 pm_runtime_get_sync(tx_priv->dev);
Vangala, Amarnath258d2932020-10-27 23:53:04 +05302691 if (bolero_check_core_votes(tx_priv->dev))
2692 rc = 0;
2693 else
2694 rc = -ENOTSYNC;
2695 } else {
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002696 pm_runtime_put_autosuspend(tx_priv->dev);
2697 pm_runtime_mark_last_busy(tx_priv->dev);
2698 }
Vangala, Amarnath258d2932020-10-27 23:53:04 +05302699 return rc;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002700}
2701
Sudheer Papothia7397942019-03-19 03:14:23 +05302702static int tx_macro_swrm_clock(void *handle, bool enable)
2703{
2704 struct tx_macro_priv *tx_priv = (struct tx_macro_priv *) handle;
2705 struct regmap *regmap = dev_get_regmap(tx_priv->dev->parent, NULL);
2706 int ret = 0;
2707
2708 if (regmap == NULL) {
2709 dev_err(tx_priv->dev, "%s: regmap is NULL\n", __func__);
2710 return -EINVAL;
2711 }
2712
2713 mutex_lock(&tx_priv->swr_clk_lock);
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002714 trace_printk("%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2715 __func__,
2716 (enable ? "enable" : "disable"),
2717 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302718 dev_dbg(tx_priv->dev,
2719 "%s: swrm clock %s tx_swr_clk_cnt: %d va_swr_clk_cnt: %d\n",
2720 __func__, (enable ? "enable" : "disable"),
2721 tx_priv->tx_swr_clk_cnt, tx_priv->va_swr_clk_cnt);
Sudheer Papothia7397942019-03-19 03:14:23 +05302722
2723 if (enable) {
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302724 pm_runtime_get_sync(tx_priv->dev);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302725 if (tx_priv->va_swr_clk_cnt && !tx_priv->tx_swr_clk_cnt) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302726 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2727 VA_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002728 if (ret) {
2729 pm_runtime_mark_last_busy(tx_priv->dev);
2730 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302731 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002732 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302733 tx_priv->va_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302734 } else {
Sudheer Papothia7397942019-03-19 03:14:23 +05302735 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2736 TX_MCLK, enable);
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002737 if (ret) {
2738 pm_runtime_mark_last_busy(tx_priv->dev);
2739 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302740 goto done;
Karthikeyan Mani8d40a062019-09-05 16:44:49 -07002741 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302742 tx_priv->tx_clk_status++;
Sudheer Papothia7397942019-03-19 03:14:23 +05302743 }
Sudheer Papothi7601cc62019-03-30 03:00:52 +05302744 pm_runtime_mark_last_busy(tx_priv->dev);
2745 pm_runtime_put_autosuspend(tx_priv->dev);
Sudheer Papothia7397942019-03-19 03:14:23 +05302746 } else {
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302747 if (tx_priv->va_clk_status && !tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302748 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2749 VA_MCLK, enable);
2750 if (ret)
2751 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302752 --tx_priv->va_clk_status;
2753 } else if (!tx_priv->va_clk_status && tx_priv->tx_clk_status) {
Sudheer Papothia7397942019-03-19 03:14:23 +05302754 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2755 TX_MCLK, enable);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302756 if (ret)
2757 goto done;
2758 --tx_priv->tx_clk_status;
2759 } else if (tx_priv->va_clk_status && tx_priv->tx_clk_status) {
2760 if (!tx_priv->va_swr_clk_cnt && tx_priv->tx_swr_clk_cnt) {
2761 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2762 VA_MCLK, enable);
Sudheer Papothia7397942019-03-19 03:14:23 +05302763 if (ret)
2764 goto done;
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302765 --tx_priv->va_clk_status;
2766 } else {
2767 ret = tx_macro_tx_va_mclk_enable(tx_priv, regmap,
2768 TX_MCLK, enable);
2769 if (ret)
2770 goto done;
2771 --tx_priv->tx_clk_status;
Sudheer Papothia7397942019-03-19 03:14:23 +05302772 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302773
2774 } else {
2775 dev_dbg(tx_priv->dev,
2776 "%s: Both clocks are disabled\n", __func__);
Sudheer Papothia7397942019-03-19 03:14:23 +05302777 }
2778 }
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302779
Aditya Bavanarif500a1d2019-09-16 18:27:51 -07002780 trace_printk("%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2781 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2782 tx_priv->va_clk_status);
Sudheer Papothicf3b4062019-05-10 10:48:43 +05302783 dev_dbg(tx_priv->dev,
2784 "%s: swrm clock users %d tx_clk_sts_cnt: %d va_clk_sts_cnt: %d\n",
2785 __func__, tx_priv->swr_clk_users, tx_priv->tx_clk_status,
2786 tx_priv->va_clk_status);
Sudheer Papothia7397942019-03-19 03:14:23 +05302787done:
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302788 mutex_unlock(&tx_priv->swr_clk_lock);
2789 return ret;
2790}
2791
2792static int tx_macro_validate_dmic_sample_rate(u32 dmic_sample_rate,
2793 struct tx_macro_priv *tx_priv)
2794{
2795 u32 div_factor = TX_MACRO_CLK_DIV_2;
2796 u32 mclk_rate = TX_MACRO_MCLK_FREQ;
2797
2798 if (dmic_sample_rate == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED ||
2799 mclk_rate % dmic_sample_rate != 0)
2800 goto undefined_rate;
2801
2802 div_factor = mclk_rate / dmic_sample_rate;
2803
2804 switch (div_factor) {
2805 case 2:
2806 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
2807 break;
2808 case 3:
2809 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_3;
2810 break;
2811 case 4:
2812 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_4;
2813 break;
2814 case 6:
2815 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_6;
2816 break;
2817 case 8:
2818 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_8;
2819 break;
2820 case 16:
2821 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_16;
2822 break;
2823 default:
2824 /* Any other DIV factor is invalid */
2825 goto undefined_rate;
2826 }
2827
2828 /* Valid dmic DIV factors */
2829 dev_dbg(tx_priv->dev, "%s: DMIC_DIV = %u, mclk_rate = %u\n",
2830 __func__, div_factor, mclk_rate);
2831
2832 return dmic_sample_rate;
2833
2834undefined_rate:
2835 dev_dbg(tx_priv->dev, "%s: Invalid rate %d, for mclk %d\n",
2836 __func__, dmic_sample_rate, mclk_rate);
2837 dmic_sample_rate = TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED;
2838
2839 return dmic_sample_rate;
2840}
2841
Sudheer Papothi72fef482019-08-30 11:00:20 +05302842static const struct tx_macro_reg_mask_val tx_macro_reg_init[] = {
Vatsal Bucha116ac372020-01-14 12:55:18 +05302843 {BOLERO_CDC_TX0_TX_PATH_SEC7, 0x3F, 0x0A},
Sudheer Papothi72fef482019-08-30 11:00:20 +05302844};
2845
Meng Wang15c825d2018-09-06 10:49:18 +08002846static int tx_macro_init(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302847{
Meng Wang15c825d2018-09-06 10:49:18 +08002848 struct snd_soc_dapm_context *dapm =
2849 snd_soc_component_get_dapm(component);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302850 int ret = 0, i = 0;
2851 struct device *tx_dev = NULL;
2852 struct tx_macro_priv *tx_priv = NULL;
2853
Meng Wang15c825d2018-09-06 10:49:18 +08002854 tx_dev = bolero_get_device_ptr(component->dev, TX_MACRO);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302855 if (!tx_dev) {
Meng Wang15c825d2018-09-06 10:49:18 +08002856 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302857 "%s: null device for macro!\n", __func__);
2858 return -EINVAL;
2859 }
2860 tx_priv = dev_get_drvdata(tx_dev);
2861 if (!tx_priv) {
Meng Wang15c825d2018-09-06 10:49:18 +08002862 dev_err(component->dev,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302863 "%s: priv is null for macro!\n", __func__);
2864 return -EINVAL;
2865 }
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302866 tx_priv->version = bolero_get_version(tx_dev);
2867 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2868 ret = snd_soc_dapm_new_controls(dapm,
2869 tx_macro_dapm_widgets_common,
2870 ARRAY_SIZE(tx_macro_dapm_widgets_common));
2871 if (ret < 0) {
2872 dev_err(tx_dev, "%s: Failed to add controls\n",
2873 __func__);
2874 return ret;
2875 }
2876 if (tx_priv->version == BOLERO_VERSION_2_1)
2877 ret = snd_soc_dapm_new_controls(dapm,
2878 tx_macro_dapm_widgets_v2,
2879 ARRAY_SIZE(tx_macro_dapm_widgets_v2));
2880 else if (tx_priv->version == BOLERO_VERSION_2_0)
2881 ret = snd_soc_dapm_new_controls(dapm,
2882 tx_macro_dapm_widgets_v3,
2883 ARRAY_SIZE(tx_macro_dapm_widgets_v3));
2884 if (ret < 0) {
2885 dev_err(tx_dev, "%s: Failed to add controls\n",
2886 __func__);
2887 return ret;
2888 }
2889 } else {
2890 ret = snd_soc_dapm_new_controls(dapm, tx_macro_dapm_widgets,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302891 ARRAY_SIZE(tx_macro_dapm_widgets));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302892 if (ret < 0) {
2893 dev_err(tx_dev, "%s: Failed to add controls\n",
2894 __func__);
2895 return ret;
2896 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302897 }
2898
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302899 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2900 ret = snd_soc_dapm_add_routes(dapm,
2901 tx_audio_map_common,
2902 ARRAY_SIZE(tx_audio_map_common));
2903 if (ret < 0) {
2904 dev_err(tx_dev, "%s: Failed to add routes\n",
2905 __func__);
2906 return ret;
2907 }
2908 if (tx_priv->version == BOLERO_VERSION_2_0)
2909 ret = snd_soc_dapm_add_routes(dapm,
2910 tx_audio_map_v3,
2911 ARRAY_SIZE(tx_audio_map_v3));
2912 if (ret < 0) {
2913 dev_err(tx_dev, "%s: Failed to add routes\n",
2914 __func__);
2915 return ret;
2916 }
2917 } else {
2918 ret = snd_soc_dapm_add_routes(dapm, tx_audio_map,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302919 ARRAY_SIZE(tx_audio_map));
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302920 if (ret < 0) {
2921 dev_err(tx_dev, "%s: Failed to add routes\n",
2922 __func__);
2923 return ret;
2924 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302925 }
2926
2927 ret = snd_soc_dapm_new_widgets(dapm->card);
2928 if (ret < 0) {
2929 dev_err(tx_dev, "%s: Failed to add widgets\n", __func__);
2930 return ret;
2931 }
2932
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302933 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2934 ret = snd_soc_add_component_controls(component,
2935 tx_macro_snd_controls_common,
2936 ARRAY_SIZE(tx_macro_snd_controls_common));
2937 if (ret < 0) {
2938 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2939 __func__);
2940 return ret;
2941 }
2942 if (tx_priv->version == BOLERO_VERSION_2_0)
2943 ret = snd_soc_add_component_controls(component,
2944 tx_macro_snd_controls_v3,
2945 ARRAY_SIZE(tx_macro_snd_controls_v3));
2946 if (ret < 0) {
2947 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2948 __func__);
2949 return ret;
2950 }
2951 } else {
2952 ret = snd_soc_add_component_controls(component,
2953 tx_macro_snd_controls,
2954 ARRAY_SIZE(tx_macro_snd_controls));
2955 if (ret < 0) {
2956 dev_err(tx_dev, "%s: Failed to add snd_ctls\n",
2957 __func__);
2958 return ret;
2959 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302960 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302961
2962 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF1 Capture");
2963 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF2 Capture");
Karthikeyan Manif3bb8182019-07-11 14:38:54 -07002964 snd_soc_dapm_ignore_suspend(dapm, "TX_AIF3 Capture");
Laxminath Kasam4651dcb2019-10-10 23:45:21 +05302965 if (tx_priv->version >= BOLERO_VERSION_2_0) {
2966 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC0");
2967 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC1");
2968 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC2");
2969 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC3");
2970 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC4");
2971 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC5");
2972 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC6");
2973 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC7");
2974 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC8");
2975 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC9");
2976 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC10");
2977 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_MIC11");
2978 } else {
2979 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC0");
2980 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC1");
2981 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC2");
2982 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_ADC3");
2983 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC0");
2984 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC1");
2985 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC2");
2986 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC3");
2987 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC4");
2988 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC5");
2989 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC6");
2990 snd_soc_dapm_ignore_suspend(dapm, "TX SWR_DMIC7");
2991 }
Laxminath Kasam638b5602018-09-24 13:19:52 +05302992 snd_soc_dapm_sync(dapm);
2993
Laxminath Kasam989fccf2018-06-15 16:53:31 +05302994 for (i = 0; i < NUM_DECIMATORS; i++) {
2995 tx_priv->tx_hpf_work[i].tx_priv = tx_priv;
2996 tx_priv->tx_hpf_work[i].decimator = i;
2997 INIT_DELAYED_WORK(&tx_priv->tx_hpf_work[i].dwork,
2998 tx_macro_tx_hpf_corner_freq_callback);
2999 }
3000
3001 for (i = 0; i < NUM_DECIMATORS; i++) {
3002 tx_priv->tx_mute_dwork[i].tx_priv = tx_priv;
3003 tx_priv->tx_mute_dwork[i].decimator = i;
3004 INIT_DELAYED_WORK(&tx_priv->tx_mute_dwork[i].dwork,
3005 tx_macro_mute_update_callback);
3006 }
Meng Wang15c825d2018-09-06 10:49:18 +08003007 tx_priv->component = component;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303008
Sudheer Papothi72fef482019-08-30 11:00:20 +05303009 for (i = 0; i < ARRAY_SIZE(tx_macro_reg_init); i++)
3010 snd_soc_component_update_bits(component,
3011 tx_macro_reg_init[i].reg,
3012 tx_macro_reg_init[i].mask,
3013 tx_macro_reg_init[i].val);
3014
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05303015 if (tx_priv->version == BOLERO_VERSION_2_1)
3016 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05303017 BOLERO_CDC_VA_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05303018 else if (tx_priv->version == BOLERO_VERSION_2_0)
3019 snd_soc_component_update_bits(component,
Laxminath Kasam696b14b2019-12-03 22:07:34 +05303020 BOLERO_CDC_TX_TOP_CSR_SWR_CTRL, 0x0F, 0x0A);
Laxminath Kasamfbd95ed2019-11-05 22:07:06 +05303021
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303022 return 0;
3023}
3024
Meng Wang15c825d2018-09-06 10:49:18 +08003025static int tx_macro_deinit(struct snd_soc_component *component)
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303026{
3027 struct device *tx_dev = NULL;
3028 struct tx_macro_priv *tx_priv = NULL;
3029
Meng Wang15c825d2018-09-06 10:49:18 +08003030 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303031 return -EINVAL;
3032
Meng Wang15c825d2018-09-06 10:49:18 +08003033 tx_priv->component = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303034 return 0;
3035}
3036
3037static void tx_macro_add_child_devices(struct work_struct *work)
3038{
3039 struct tx_macro_priv *tx_priv = NULL;
3040 struct platform_device *pdev = NULL;
3041 struct device_node *node = NULL;
3042 struct tx_macro_swr_ctrl_data *swr_ctrl_data = NULL, *temp = NULL;
3043 int ret = 0;
3044 u16 count = 0, ctrl_num = 0;
3045 struct tx_macro_swr_ctrl_platform_data *platdata = NULL;
3046 char plat_dev_name[TX_MACRO_SWR_STRING_LEN] = "";
3047 bool tx_swr_master_node = false;
3048
3049 tx_priv = container_of(work, struct tx_macro_priv,
3050 tx_macro_add_child_devices_work);
3051 if (!tx_priv) {
3052 pr_err("%s: Memory for tx_priv does not exist\n",
3053 __func__);
3054 return;
3055 }
3056
3057 if (!tx_priv->dev) {
3058 pr_err("%s: tx dev does not exist\n", __func__);
3059 return;
3060 }
3061
3062 if (!tx_priv->dev->of_node) {
3063 dev_err(tx_priv->dev,
3064 "%s: DT node for tx_priv does not exist\n", __func__);
3065 return;
3066 }
3067
3068 platdata = &tx_priv->swr_plat_data;
3069 tx_priv->child_count = 0;
3070
3071 for_each_available_child_of_node(tx_priv->dev->of_node, node) {
3072 tx_swr_master_node = false;
3073 if (strnstr(node->name, "tx_swr_master",
3074 strlen("tx_swr_master")) != NULL)
3075 tx_swr_master_node = true;
3076
3077 if (tx_swr_master_node)
3078 strlcpy(plat_dev_name, "tx_swr_ctrl",
3079 (TX_MACRO_SWR_STRING_LEN - 1));
3080 else
3081 strlcpy(plat_dev_name, node->name,
3082 (TX_MACRO_SWR_STRING_LEN - 1));
3083
3084 pdev = platform_device_alloc(plat_dev_name, -1);
3085 if (!pdev) {
3086 dev_err(tx_priv->dev, "%s: pdev memory alloc failed\n",
3087 __func__);
3088 ret = -ENOMEM;
3089 goto err;
3090 }
3091 pdev->dev.parent = tx_priv->dev;
3092 pdev->dev.of_node = node;
3093
3094 if (tx_swr_master_node) {
3095 ret = platform_device_add_data(pdev, platdata,
3096 sizeof(*platdata));
3097 if (ret) {
3098 dev_err(&pdev->dev,
3099 "%s: cannot add plat data ctrl:%d\n",
3100 __func__, ctrl_num);
3101 goto fail_pdev_add;
3102 }
3103 }
3104
3105 ret = platform_device_add(pdev);
3106 if (ret) {
3107 dev_err(&pdev->dev,
3108 "%s: Cannot add platform device\n",
3109 __func__);
3110 goto fail_pdev_add;
3111 }
3112
3113 if (tx_swr_master_node) {
3114 temp = krealloc(swr_ctrl_data,
3115 (ctrl_num + 1) * sizeof(
3116 struct tx_macro_swr_ctrl_data),
3117 GFP_KERNEL);
3118 if (!temp) {
3119 ret = -ENOMEM;
3120 goto fail_pdev_add;
3121 }
3122 swr_ctrl_data = temp;
3123 swr_ctrl_data[ctrl_num].tx_swr_pdev = pdev;
3124 ctrl_num++;
3125 dev_dbg(&pdev->dev,
3126 "%s: Added soundwire ctrl device(s)\n",
3127 __func__);
3128 tx_priv->swr_ctrl_data = swr_ctrl_data;
3129 }
3130 if (tx_priv->child_count < TX_MACRO_CHILD_DEVICES_MAX)
3131 tx_priv->pdev_child_devices[
3132 tx_priv->child_count++] = pdev;
3133 else
3134 goto err;
3135 }
3136 return;
3137fail_pdev_add:
3138 for (count = 0; count < tx_priv->child_count; count++)
3139 platform_device_put(tx_priv->pdev_child_devices[count]);
3140err:
3141 return;
3142}
3143
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303144static int tx_macro_set_port_map(struct snd_soc_component *component,
3145 u32 usecase, u32 size, void *data)
3146{
3147 struct device *tx_dev = NULL;
3148 struct tx_macro_priv *tx_priv = NULL;
3149 struct swrm_port_config port_cfg;
3150 int ret = 0;
3151
3152 if (!tx_macro_get_data(component, &tx_dev, &tx_priv, __func__))
3153 return -EINVAL;
3154
3155 memset(&port_cfg, 0, sizeof(port_cfg));
3156 port_cfg.uc = usecase;
3157 port_cfg.size = size;
3158 port_cfg.params = data;
3159
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003160 if (tx_priv->swr_ctrl_data)
3161 ret = swrm_wcd_notify(
3162 tx_priv->swr_ctrl_data[0].tx_swr_pdev,
3163 SWR_SET_PORT_MAP, &port_cfg);
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303164
3165 return ret;
3166}
3167
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303168static void tx_macro_init_ops(struct macro_ops *ops,
3169 char __iomem *tx_io_base)
3170{
3171 memset(ops, 0, sizeof(struct macro_ops));
3172 ops->init = tx_macro_init;
3173 ops->exit = tx_macro_deinit;
3174 ops->io_base = tx_io_base;
3175 ops->dai_ptr = tx_macro_dai;
3176 ops->num_dais = ARRAY_SIZE(tx_macro_dai);
Laxminath Kasamfb0d6832018-09-22 01:49:52 +05303177 ops->event_handler = tx_macro_event_handler;
Aditya Bavanaric4e96122018-11-14 14:46:38 +05303178 ops->reg_wake_irq = tx_macro_reg_wake_irq;
Sudheer Papothia3e969d2018-10-27 06:22:10 +05303179 ops->set_port_map = tx_macro_set_port_map;
Sudheer Papothid50a5812019-11-21 07:24:42 +05303180 ops->clk_div_get = tx_macro_clk_div_get;
Sudheer Papothi6cc7f522019-06-28 11:04:03 +05303181 ops->clk_switch = tx_macro_clk_switch;
Sudheer Papothi06a4c642019-08-08 05:17:46 +05303182 ops->reg_evt_listener = tx_macro_register_event_listener;
Sudheer Papothifc3adb02019-11-24 10:14:21 +05303183 ops->clk_enable = __tx_macro_mclk_enable;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303184}
3185
3186static int tx_macro_probe(struct platform_device *pdev)
3187{
3188 struct macro_ops ops = {0};
3189 struct tx_macro_priv *tx_priv = NULL;
3190 u32 tx_base_addr = 0, sample_rate = 0;
3191 char __iomem *tx_io_base = NULL;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303192 int ret = 0;
3193 const char *dmic_sample_rate = "qcom,tx-dmic-sample-rate";
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003194 u32 is_used_tx_swr_gpio = 1;
3195 const char *is_used_tx_swr_gpio_dt = "qcom,is-used-swr-gpio";
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303196
Laxminath Kasam251ce992020-07-01 23:37:33 +05303197 if (!bolero_is_va_macro_registered(&pdev->dev)) {
3198 dev_err(&pdev->dev,
3199 "%s: va-macro not registered yet, defer\n", __func__);
3200 return -EPROBE_DEFER;
3201 }
3202
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303203 tx_priv = devm_kzalloc(&pdev->dev, sizeof(struct tx_macro_priv),
3204 GFP_KERNEL);
3205 if (!tx_priv)
3206 return -ENOMEM;
3207 platform_set_drvdata(pdev, tx_priv);
3208
3209 tx_priv->dev = &pdev->dev;
3210 ret = of_property_read_u32(pdev->dev.of_node, "reg",
3211 &tx_base_addr);
3212 if (ret) {
3213 dev_err(&pdev->dev, "%s: could not find %s entry in dt\n",
3214 __func__, "reg");
3215 return ret;
3216 }
3217 dev_set_drvdata(&pdev->dev, tx_priv);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003218 if (of_find_property(pdev->dev.of_node, is_used_tx_swr_gpio_dt,
3219 NULL)) {
3220 ret = of_property_read_u32(pdev->dev.of_node,
3221 is_used_tx_swr_gpio_dt,
3222 &is_used_tx_swr_gpio);
3223 if (ret) {
3224 dev_err(&pdev->dev, "%s: error reading %s in dt\n",
3225 __func__, is_used_tx_swr_gpio_dt);
3226 is_used_tx_swr_gpio = 1;
3227 }
3228 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303229 tx_priv->tx_swr_gpio_p = of_parse_phandle(pdev->dev.of_node,
3230 "qcom,tx-swr-gpios", 0);
Karthikeyan Mani3bd80a52019-06-04 23:40:16 -07003231 if (!tx_priv->tx_swr_gpio_p && is_used_tx_swr_gpio) {
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303232 dev_err(&pdev->dev, "%s: swr_gpios handle not provided!\n",
3233 __func__);
3234 return -EINVAL;
3235 }
Karthikeyan Manib44e4552019-09-09 23:06:04 -07003236 if (msm_cdc_pinctrl_get_state(tx_priv->tx_swr_gpio_p) < 0 &&
3237 is_used_tx_swr_gpio) {
Karthikeyan Mani326536d2019-06-03 13:29:43 -07003238 dev_err(&pdev->dev, "%s: failed to get swr pin state\n",
3239 __func__);
3240 return -EPROBE_DEFER;
3241 }
3242
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303243 tx_io_base = devm_ioremap(&pdev->dev,
3244 tx_base_addr, TX_MACRO_MAX_OFFSET);
3245 if (!tx_io_base) {
3246 dev_err(&pdev->dev, "%s: ioremap failed\n", __func__);
3247 return -ENOMEM;
3248 }
3249 tx_priv->tx_io_base = tx_io_base;
3250 ret = of_property_read_u32(pdev->dev.of_node, dmic_sample_rate,
3251 &sample_rate);
3252 if (ret) {
3253 dev_err(&pdev->dev,
3254 "%s: could not find sample_rate entry in dt\n",
3255 __func__);
3256 tx_priv->dmic_clk_div = TX_MACRO_CLK_DIV_2;
3257 } else {
3258 if (tx_macro_validate_dmic_sample_rate(
3259 sample_rate, tx_priv) == TX_MACRO_DMIC_SAMPLE_RATE_UNDEFINED)
3260 return -EINVAL;
3261 }
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303262 if (is_used_tx_swr_gpio) {
3263 tx_priv->reset_swr = true;
3264 INIT_WORK(&tx_priv->tx_macro_add_child_devices_work,
3265 tx_macro_add_child_devices);
3266 tx_priv->swr_plat_data.handle = (void *) tx_priv;
3267 tx_priv->swr_plat_data.read = NULL;
3268 tx_priv->swr_plat_data.write = NULL;
3269 tx_priv->swr_plat_data.bulk_write = NULL;
3270 tx_priv->swr_plat_data.clk = tx_macro_swrm_clock;
3271 tx_priv->swr_plat_data.core_vote = tx_macro_core_vote;
3272 tx_priv->swr_plat_data.handle_irq = NULL;
3273 mutex_init(&tx_priv->swr_clk_lock);
3274 }
3275 tx_priv->is_used_tx_swr_gpio = is_used_tx_swr_gpio;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303276 mutex_init(&tx_priv->mclk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303277 tx_macro_init_ops(&ops, tx_io_base);
Vidyakumar Athota5d45f4c2019-03-10 22:35:07 -07003278 ops.clk_id_req = TX_CORE_CLK;
3279 ops.default_clk_id = TX_CORE_CLK;
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303280 ret = bolero_register_macro(&pdev->dev, TX_MACRO, &ops);
3281 if (ret) {
3282 dev_err(&pdev->dev,
3283 "%s: register macro failed\n", __func__);
3284 goto err_reg_macro;
3285 }
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303286 pm_runtime_set_autosuspend_delay(&pdev->dev, AUTO_SUSPEND_DELAY);
3287 pm_runtime_use_autosuspend(&pdev->dev);
3288 pm_runtime_set_suspended(&pdev->dev);
Sudheer Papothi296867b2019-06-20 09:24:09 +05303289 pm_suspend_ignore_children(&pdev->dev, true);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303290 pm_runtime_enable(&pdev->dev);
Vangala, Amarnath0a0c7182020-12-03 14:14:56 +05303291 if (is_used_tx_swr_gpio)
3292 schedule_work(&tx_priv->tx_macro_add_child_devices_work);
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303293
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303294 return 0;
3295err_reg_macro:
3296 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303297 if (is_used_tx_swr_gpio)
3298 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303299 return ret;
3300}
3301
3302static int tx_macro_remove(struct platform_device *pdev)
3303{
3304 struct tx_macro_priv *tx_priv = NULL;
3305 u16 count = 0;
3306
3307 tx_priv = platform_get_drvdata(pdev);
3308
3309 if (!tx_priv)
3310 return -EINVAL;
3311
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303312 if (tx_priv->is_used_tx_swr_gpio) {
3313 if (tx_priv->swr_ctrl_data)
3314 kfree(tx_priv->swr_ctrl_data);
3315 for (count = 0; count < tx_priv->child_count &&
3316 count < TX_MACRO_CHILD_DEVICES_MAX; count++)
3317 platform_device_unregister(
3318 tx_priv->pdev_child_devices[count]);
3319 }
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303320
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303321 pm_runtime_disable(&pdev->dev);
3322 pm_runtime_set_suspended(&pdev->dev);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303323 mutex_destroy(&tx_priv->mclk_lock);
Laxminath Kasam2e13d642019-10-12 01:36:30 +05303324 if (tx_priv->is_used_tx_swr_gpio)
3325 mutex_destroy(&tx_priv->swr_clk_lock);
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303326 bolero_unregister_macro(&pdev->dev, TX_MACRO);
3327 return 0;
3328}
3329
3330
3331static const struct of_device_id tx_macro_dt_match[] = {
3332 {.compatible = "qcom,tx-macro"},
3333 {}
3334};
3335
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303336static const struct dev_pm_ops bolero_dev_pm_ops = {
Aditya Bavanari4460ed22020-02-20 12:46:51 +05303337 SET_SYSTEM_SLEEP_PM_OPS(
3338 pm_runtime_force_suspend,
3339 pm_runtime_force_resume
3340 )
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303341 SET_RUNTIME_PM_OPS(
3342 bolero_runtime_suspend,
3343 bolero_runtime_resume,
3344 NULL
3345 )
3346};
3347
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303348static struct platform_driver tx_macro_driver = {
3349 .driver = {
3350 .name = "tx_macro",
3351 .owner = THIS_MODULE,
Sudheer Papothi7601cc62019-03-30 03:00:52 +05303352 .pm = &bolero_dev_pm_ops,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303353 .of_match_table = tx_macro_dt_match,
Xiaojun Sang53cd13a2018-06-29 15:14:37 +08003354 .suppress_bind_attrs = true,
Laxminath Kasam989fccf2018-06-15 16:53:31 +05303355 },
3356 .probe = tx_macro_probe,
3357 .remove = tx_macro_remove,
3358};
3359
3360module_platform_driver(tx_macro_driver);
3361
3362MODULE_DESCRIPTION("TX macro driver");
3363MODULE_LICENSE("GPL v2");