blob: 2ef9e0a6047880ed92616b86cc86220f9ec7575b [file] [log] [blame]
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301/*
2 * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13
14#include <linux/module.h>
15#include <linux/init.h>
16#include <linux/slab.h>
17#include <linux/platform_device.h>
18#include <linux/device.h>
19#include <linux/printk.h>
20#include <linux/bitops.h>
21#include <linux/regulator/consumer.h>
22#include <linux/pm_runtime.h>
23#include <linux/delay.h>
24#include <linux/kernel.h>
25#include <linux/gpio.h>
26#include <linux/of_gpio.h>
27#include <linux/regmap.h>
28#include <linux/debugfs.h>
Laxminath Kasam605b42f2017-08-01 22:02:15 +053029#include <soc/soundwire.h>
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053030#include <sound/pcm.h>
31#include <sound/pcm_params.h>
32#include <sound/soc.h>
33#include <sound/soc-dapm.h>
34#include <sound/tlv.h>
Laxminath Kasam605b42f2017-08-01 22:02:15 +053035#include "msm-cdc-pinctrl.h"
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053036#include "wsa881x.h"
37#include "wsa881x-temp-sensor.h"
38
39#define WSA881X_NUM_RETRY 5
40
41enum {
42 G_18DB = 0,
43 G_16P5DB,
44 G_15DB,
45 G_13P5DB,
46 G_12DB,
47 G_10P5DB,
48 G_9DB,
49 G_7P5DB,
50 G_6DB,
51 G_4P5DB,
52 G_3DB,
53 G_1P5DB,
54 G_0DB,
55};
56
57enum {
58 DISABLE = 0,
59 ENABLE,
60};
61
62enum {
63 SWR_DAC_PORT,
64 SWR_COMP_PORT,
65 SWR_BOOST_PORT,
66 SWR_VISENSE_PORT,
67};
68
69struct swr_port {
70 u8 port_id;
71 u8 ch_mask;
72 u32 ch_rate;
73 u8 num_ch;
74};
75
76enum {
77 WSA881X_DEV_DOWN,
78 WSA881X_DEV_UP,
79};
80
81/*
82 * Private data Structure for wsa881x. All parameters related to
83 * WSA881X codec needs to be defined here.
84 */
85struct wsa881x_priv {
86 struct regmap *regmap;
87 struct device *dev;
88 struct swr_device *swr_slave;
89 struct snd_soc_codec *codec;
90 bool comp_enable;
91 bool boost_enable;
92 bool visense_enable;
93 u8 pa_gain;
94 struct swr_port port[WSA881X_MAX_SWR_PORTS];
95 int pd_gpio;
96 struct wsa881x_tz_priv tz_pdata;
97 int bg_cnt;
98 int clk_cnt;
99 int version;
100 struct mutex bg_lock;
101 struct mutex res_lock;
102 struct snd_info_entry *entry;
103 struct snd_info_entry *version_entry;
104 int state;
105 struct delayed_work ocp_ctl_work;
106 struct device_node *wsa_rst_np;
107 int pa_mute;
108};
109
110#define SWR_SLV_MAX_REG_ADDR 0x390
111#define SWR_SLV_START_REG_ADDR 0x40
112#define SWR_SLV_MAX_BUF_LEN 20
113#define BYTES_PER_LINE 12
114#define SWR_SLV_RD_BUF_LEN 8
115#define SWR_SLV_WR_BUF_LEN 32
116#define SWR_SLV_MAX_DEVICES 2
117
118#define WSA881X_VERSION_ENTRY_SIZE 27
119#define WSA881X_OCP_CTL_TIMER_SEC 2
120#define WSA881X_OCP_CTL_TEMP_CELSIUS 25
121#define WSA881X_OCP_CTL_POLL_TIMER_SEC 60
122
123static int wsa881x_ocp_poll_timer_sec = WSA881X_OCP_CTL_POLL_TIMER_SEC;
124module_param(wsa881x_ocp_poll_timer_sec, int, 0664);
125MODULE_PARM_DESC(wsa881x_ocp_poll_timer_sec, "timer for ocp ctl polling");
126
127static struct wsa881x_priv *dbgwsa881x;
128static struct dentry *debugfs_wsa881x_dent;
129static struct dentry *debugfs_peek;
130static struct dentry *debugfs_poke;
131static struct dentry *debugfs_reg_dump;
132static unsigned int read_data;
133static unsigned int devnum;
134
135static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec,
136 bool enable);
137
138static const char * const wsa_pa_gain_text[] = {
139 "G_18_DB", "G_16P5_DB", "G_15_DB", "G_13P5_DB", "G_12_DB", "G_10P5_DB",
140 "G_9_DB", "G_7P5_DB", "G_6_DB", "G_4P5_DB", "G_3_DB", "G_1P5_DB",
141 "G_0_DB"
142};
143
144static const struct soc_enum wsa_pa_gain_enum =
145 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wsa_pa_gain_text), wsa_pa_gain_text);
146
147static int wsa_pa_gain_get(struct snd_kcontrol *kcontrol,
148 struct snd_ctl_elem_value *ucontrol)
149{
150 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
151 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
152
153 ucontrol->value.integer.value[0] = wsa881x->pa_gain;
154
155 dev_dbg(codec->dev, "%s: PA gain = 0x%x\n", __func__, wsa881x->pa_gain);
156
157 return 0;
158}
159
160static int wsa_pa_gain_put(struct snd_kcontrol *kcontrol,
161 struct snd_ctl_elem_value *ucontrol)
162{
163 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
164 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
165
166 dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
167 __func__, ucontrol->value.integer.value[0]);
168
169 wsa881x->pa_gain = ucontrol->value.integer.value[0];
170
171 return 0;
172}
173
174static int wsa881x_get_mute(struct snd_kcontrol *kcontrol,
175 struct snd_ctl_elem_value *ucontrol)
176{
177
178 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
179 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
180
181 ucontrol->value.integer.value[0] = wsa881x->pa_mute;
182
183 return 0;
184}
185
186static int wsa881x_set_mute(struct snd_kcontrol *kcontrol,
187 struct snd_ctl_elem_value *ucontrol)
188{
189 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
190 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
191 int value = ucontrol->value.integer.value[0];
192
193 dev_dbg(codec->dev, "%s: mute current %d, new %d\n",
194 __func__, wsa881x->pa_mute, value);
195
196 if (value)
197 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x80, 0x00);
198 wsa881x->pa_mute = value;
199
200 return 0;
201}
202
Sudheer Papothic9dd3be2018-04-06 00:51:48 +0530203static int wsa881x_get_t0_init(struct snd_kcontrol *kcontrol,
204 struct snd_ctl_elem_value *ucontrol)
205{
206
207 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
208 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
209 struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata;
210
211 ucontrol->value.integer.value[0] = pdata->t0_init;
212 dev_dbg(codec->dev, "%s: t0 init %d\n", __func__, pdata->t0_init);
213
214 return 0;
215}
216
217static int wsa881x_set_t0_init(struct snd_kcontrol *kcontrol,
218 struct snd_ctl_elem_value *ucontrol)
219{
220 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
221 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
222 struct wsa881x_tz_priv *pdata = &wsa881x->tz_pdata;
223
224 pdata->t0_init = ucontrol->value.integer.value[0];
225 dev_dbg(codec->dev, "%s: t0 init %d\n", __func__, pdata->t0_init);
226
227 return 0;
228}
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530229
230static const struct snd_kcontrol_new wsa_snd_controls[] = {
231 SOC_ENUM_EXT("WSA PA Gain", wsa_pa_gain_enum,
232 wsa_pa_gain_get, wsa_pa_gain_put),
233 SOC_SINGLE_EXT("WSA PA Mute", SND_SOC_NOPM, 0, 1, 0,
234 wsa881x_get_mute, wsa881x_set_mute),
Sudheer Papothic9dd3be2018-04-06 00:51:48 +0530235 SOC_SINGLE_EXT("WSA T0 Init", SND_SOC_NOPM, 0, 1, 0,
236 wsa881x_get_t0_init, wsa881x_set_t0_init),
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530237};
238
239static int codec_debug_open(struct inode *inode, struct file *file)
240{
241 file->private_data = inode->i_private;
242 return 0;
243}
244
245static int get_parameters(char *buf, u32 *param1, int num_of_par)
246{
247 char *token;
248 int base, cnt;
249
250 token = strsep(&buf, " ");
251 for (cnt = 0; cnt < num_of_par; cnt++) {
252 if (token) {
253 if ((token[1] == 'x') || (token[1] == 'X'))
254 base = 16;
255 else
256 base = 10;
257
258 if (kstrtou32(token, base, &param1[cnt]) != 0)
259 return -EINVAL;
260
261 token = strsep(&buf, " ");
262 } else
263 return -EINVAL;
264 }
265 return 0;
266}
267
268static ssize_t wsa881x_codec_version_read(struct snd_info_entry *entry,
269 void *file_private_data, struct file *file,
270 char __user *buf, size_t count, loff_t pos)
271{
272 struct wsa881x_priv *wsa881x;
273 char buffer[WSA881X_VERSION_ENTRY_SIZE];
274 int len;
275
276 wsa881x = (struct wsa881x_priv *) entry->private_data;
277 if (!wsa881x) {
278 pr_err("%s: wsa881x priv is null\n", __func__);
279 return -EINVAL;
280 }
281
282 len = snprintf(buffer, sizeof(buffer), "WSA881X-SOUNDWIRE_2_0\n");
283
284 return simple_read_from_buffer(buf, count, &pos, buffer, len);
285}
286
287static struct snd_info_entry_ops wsa881x_codec_info_ops = {
288 .read = wsa881x_codec_version_read,
289};
290
291/*
292 * wsa881x_codec_info_create_codec_entry - creates wsa881x module
293 * @codec_root: The parent directory
294 * @codec: Codec instance
295 *
296 * Creates wsa881x module and version entry under the given
297 * parent directory.
298 *
299 * Return: 0 on success or negative error code on failure.
300 */
301int wsa881x_codec_info_create_codec_entry(struct snd_info_entry *codec_root,
302 struct snd_soc_codec *codec)
303{
304 struct snd_info_entry *version_entry;
305 struct wsa881x_priv *wsa881x;
306 struct snd_soc_card *card;
307 char name[80];
308
309 if (!codec_root || !codec)
310 return -EINVAL;
311
312 wsa881x = snd_soc_codec_get_drvdata(codec);
313 card = codec->component.card;
314 snprintf(name, sizeof(name), "%s.%x", "wsa881x",
315 (u32)wsa881x->swr_slave->addr);
316
317 wsa881x->entry = snd_info_create_subdir(codec_root->module,
318 (const char *)name,
319 codec_root);
320 if (!wsa881x->entry) {
321 dev_dbg(codec->dev, "%s: failed to create wsa881x entry\n",
322 __func__);
323 return -ENOMEM;
324 }
325
326 version_entry = snd_info_create_card_entry(card->snd_card,
327 "version",
328 wsa881x->entry);
329 if (!version_entry) {
330 dev_dbg(codec->dev, "%s: failed to create wsa881x version entry\n",
331 __func__);
332 return -ENOMEM;
333 }
334
335 version_entry->private_data = wsa881x;
336 version_entry->size = WSA881X_VERSION_ENTRY_SIZE;
337 version_entry->content = SNDRV_INFO_CONTENT_DATA;
338 version_entry->c.ops = &wsa881x_codec_info_ops;
339
340 if (snd_info_register(version_entry) < 0) {
341 snd_info_free_entry(version_entry);
342 return -ENOMEM;
343 }
344 wsa881x->version_entry = version_entry;
345
346 return 0;
347}
348EXPORT_SYMBOL(wsa881x_codec_info_create_codec_entry);
349
350static bool is_swr_slv_reg_readable(int reg)
351{
352 bool ret = true;
353
354 if (((reg > 0x46) && (reg < 0x4A)) ||
355 ((reg > 0x4A) && (reg < 0x50)) ||
356 ((reg > 0x55) && (reg < 0xE0)) ||
357 ((reg > 0xE0) && (reg < 0xF0)) ||
358 ((reg > 0xF0) && (reg < 0x100)) ||
359 ((reg > 0x105) && (reg < 0x120)) ||
360 ((reg > 0x128) && (reg < 0x130)) ||
361 ((reg > 0x138) && (reg < 0x200)) ||
362 ((reg > 0x205) && (reg < 0x220)) ||
363 ((reg > 0x228) && (reg < 0x230)) ||
364 ((reg > 0x238) && (reg < 0x300)) ||
365 ((reg > 0x305) && (reg < 0x320)) ||
366 ((reg > 0x328) && (reg < 0x330)) ||
367 ((reg > 0x338) && (reg < 0x400)) ||
368 ((reg > 0x405) && (reg < 0x420)))
369 ret = false;
370
371 return ret;
372}
373
374static ssize_t wsa881x_swrslave_reg_show(char __user *ubuf, size_t count,
375 loff_t *ppos)
376{
377 int i, reg_val, len;
378 ssize_t total = 0;
379 char tmp_buf[SWR_SLV_MAX_BUF_LEN];
380
381 if (!ubuf || !ppos || (devnum == 0))
382 return 0;
383
384 for (i = (((int) *ppos / BYTES_PER_LINE) + SWR_SLV_START_REG_ADDR);
385 i <= SWR_SLV_MAX_REG_ADDR; i++) {
386 if (!is_swr_slv_reg_readable(i))
387 continue;
388 swr_read(dbgwsa881x->swr_slave, devnum,
389 i, &reg_val, 1);
390 len = snprintf(tmp_buf, 25, "0x%.3x: 0x%.2x\n", i,
391 (reg_val & 0xFF));
392 if ((total + len) >= count - 1)
393 break;
394 if (copy_to_user((ubuf + total), tmp_buf, len)) {
395 pr_err("%s: fail to copy reg dump\n", __func__);
396 total = -EFAULT;
397 goto copy_err;
398 }
399 *ppos += len;
400 total += len;
401 }
402
403copy_err:
404 return total;
405}
406
407static ssize_t codec_debug_read(struct file *file, char __user *ubuf,
408 size_t count, loff_t *ppos)
409{
410 char lbuf[SWR_SLV_RD_BUF_LEN];
411 char *access_str;
412 ssize_t ret_cnt;
413
414 if (!count || !file || !ppos || !ubuf)
415 return -EINVAL;
416
417 access_str = file->private_data;
418 if (*ppos < 0)
419 return -EINVAL;
420
421 if (!strcmp(access_str, "swrslave_peek")) {
422 snprintf(lbuf, sizeof(lbuf), "0x%x\n", (read_data & 0xFF));
423 ret_cnt = simple_read_from_buffer(ubuf, count, ppos, lbuf,
424 strnlen(lbuf, 7));
425 } else if (!strcmp(access_str, "swrslave_reg_dump")) {
426 ret_cnt = wsa881x_swrslave_reg_show(ubuf, count, ppos);
427 } else {
428 pr_err("%s: %s not permitted to read\n", __func__, access_str);
429 ret_cnt = -EPERM;
430 }
431 return ret_cnt;
432}
433
434static ssize_t codec_debug_write(struct file *filp,
435 const char __user *ubuf, size_t cnt, loff_t *ppos)
436{
437 char lbuf[SWR_SLV_WR_BUF_LEN];
438 int rc;
439 u32 param[5];
440 char *access_str;
441
442 if (!filp || !ppos || !ubuf)
443 return -EINVAL;
444
445 access_str = filp->private_data;
446 if (cnt > sizeof(lbuf) - 1)
447 return -EINVAL;
448
449 rc = copy_from_user(lbuf, ubuf, cnt);
450 if (rc)
451 return -EFAULT;
452
453 lbuf[cnt] = '\0';
454 if (!strcmp(access_str, "swrslave_poke")) {
455 /* write */
456 rc = get_parameters(lbuf, param, 3);
457 if ((param[0] <= SWR_SLV_MAX_REG_ADDR) && (param[1] <= 0xFF) &&
458 (rc == 0))
459 swr_write(dbgwsa881x->swr_slave, param[2],
460 param[0], &param[1]);
461 else
462 rc = -EINVAL;
463 } else if (!strcmp(access_str, "swrslave_peek")) {
464 /* read */
465 rc = get_parameters(lbuf, param, 2);
466 if ((param[0] <= SWR_SLV_MAX_REG_ADDR) && (rc == 0))
467 swr_read(dbgwsa881x->swr_slave, param[1],
468 param[0], &read_data, 1);
469 else
470 rc = -EINVAL;
471 } else if (!strcmp(access_str, "swrslave_reg_dump")) {
472 /* reg dump */
473 rc = get_parameters(lbuf, param, 1);
474 if ((rc == 0) && (param[0] > 0) &&
475 (param[0] <= SWR_SLV_MAX_DEVICES))
476 devnum = param[0];
477 else
478 rc = -EINVAL;
479 }
480 if (rc == 0)
481 rc = cnt;
482 else
483 pr_err("%s: rc = %d\n", __func__, rc);
484
485 return rc;
486}
487
488static const struct file_operations codec_debug_ops = {
489 .open = codec_debug_open,
490 .write = codec_debug_write,
491 .read = codec_debug_read,
492};
493
494static const struct reg_sequence wsa881x_pre_pmu_pa[] = {
495 {WSA881X_SPKR_DRV_GAIN, 0x41, 0},
496 {WSA881X_SPKR_MISC_CTL1, 0x01, 0},
497 {WSA881X_ADC_EN_DET_TEST_I, 0x01, 0},
498 {WSA881X_ADC_EN_MODU_V, 0x02, 0},
499 {WSA881X_ADC_EN_DET_TEST_V, 0x10, 0},
500 {WSA881X_SPKR_PWRSTG_DBG, 0xA0, 0},
501};
502
503static const struct reg_sequence wsa881x_pre_pmu_pa_2_0[] = {
504 {WSA881X_SPKR_DRV_GAIN, 0x41, 0},
505 {WSA881X_SPKR_MISC_CTL1, 0x87, 0},
506};
507
508static const struct reg_sequence wsa881x_post_pmu_pa[] = {
509 {WSA881X_SPKR_PWRSTG_DBG, 0x00, 0},
510 {WSA881X_ADC_EN_DET_TEST_V, 0x00, 0},
511 {WSA881X_ADC_EN_MODU_V, 0x00, 0},
512 {WSA881X_ADC_EN_DET_TEST_I, 0x00, 0},
513};
514
515static const struct reg_sequence wsa881x_vi_txfe_en[] = {
516 {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x85, 0},
517 {WSA881X_SPKR_PROT_ATEST2, 0x0A, 0},
518 {WSA881X_SPKR_PROT_FE_GAIN, 0xCF, 0},
519};
520
521static const struct reg_sequence wsa881x_vi_txfe_en_2_0[] = {
522 {WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x85, 0},
523 {WSA881X_SPKR_PROT_ATEST2, 0x0A, 0},
524 {WSA881X_SPKR_PROT_FE_GAIN, 0x47, 0},
525};
526
527static int wsa881x_boost_ctrl(struct snd_soc_codec *codec, bool enable)
528{
529 dev_dbg(codec->dev, "%s: enable:%d\n", __func__, enable);
530 if (enable)
531 snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, 0x80, 0x80);
532 else
533 snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, 0x80, 0x00);
534 /*
535 * 1.5ms sleep is needed after boost enable/disable as per
536 * HW requirement
537 */
538 usleep_range(1500, 1510);
539 return 0;
540}
541
542static int wsa881x_visense_txfe_ctrl(struct snd_soc_codec *codec, bool enable,
543 u8 isense1_gain, u8 isense2_gain,
544 u8 vsense_gain)
545{
546 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
547
548 dev_dbg(codec->dev,
549 "%s: enable:%d, isense1 gain: %d, isense2 gain: %d, vsense_gain %d\n",
550 __func__, enable, isense1_gain, isense2_gain, vsense_gain);
551
552 if (enable) {
553 regmap_multi_reg_write(wsa881x->regmap,
554 wsa881x_vi_txfe_en_2_0,
555 ARRAY_SIZE(wsa881x_vi_txfe_en_2_0));
556 } else {
557 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_VSENSE_VCM,
558 0x08, 0x08);
559 /*
560 * 200us sleep is needed after visense txfe disable as per
561 * HW requirement.
562 */
563 usleep_range(200, 210);
564 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN,
565 0x01, 0x00);
566 }
567 return 0;
568}
569
570static int wsa881x_visense_adc_ctrl(struct snd_soc_codec *codec, bool enable)
571{
572
573 dev_dbg(codec->dev, "%s: enable:%d\n", __func__, enable);
574 snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, (0x01 << 7),
575 (enable << 7));
576 snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_I, (0x01 << 7),
577 (enable << 7));
578 return 0;
579}
580
581static void wsa881x_bandgap_ctrl(struct snd_soc_codec *codec, bool enable)
582{
583 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
584
585 dev_dbg(codec->dev, "%s: enable:%d, bg_count:%d\n", __func__,
586 enable, wsa881x->bg_cnt);
587 mutex_lock(&wsa881x->bg_lock);
588 if (enable) {
589 ++wsa881x->bg_cnt;
590 if (wsa881x->bg_cnt == 1) {
591 snd_soc_update_bits(codec, WSA881X_TEMP_OP,
592 0x08, 0x08);
593 /* 400usec sleep is needed as per HW requirement */
594 usleep_range(400, 410);
595 snd_soc_update_bits(codec, WSA881X_TEMP_OP,
596 0x04, 0x04);
597 }
598 } else {
599 --wsa881x->bg_cnt;
600 if (wsa881x->bg_cnt <= 0) {
601 WARN_ON(wsa881x->bg_cnt < 0);
602 wsa881x->bg_cnt = 0;
603 snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x04, 0x00);
604 snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x08, 0x00);
605 }
606 }
607 mutex_unlock(&wsa881x->bg_lock);
608}
609
610static void wsa881x_clk_ctrl(struct snd_soc_codec *codec, bool enable)
611{
612 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
613
614 dev_dbg(codec->dev, "%s: enable:%d, clk_count:%d\n", __func__,
615 enable, wsa881x->clk_cnt);
616 mutex_lock(&wsa881x->res_lock);
617 if (enable) {
618 ++wsa881x->clk_cnt;
619 if (wsa881x->clk_cnt == 1) {
620 snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x01);
621 snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x01);
622 }
623 } else {
624 --wsa881x->clk_cnt;
625 if (wsa881x->clk_cnt <= 0) {
626 WARN_ON(wsa881x->clk_cnt < 0);
627 wsa881x->clk_cnt = 0;
628 snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x00);
629 snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x00);
630 }
631 }
632 mutex_unlock(&wsa881x->res_lock);
633}
634
635static int wsa881x_get_compander(struct snd_kcontrol *kcontrol,
636 struct snd_ctl_elem_value *ucontrol)
637{
638
639 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
640 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
641
642 ucontrol->value.integer.value[0] = wsa881x->comp_enable;
643 return 0;
644}
645
646static int wsa881x_set_compander(struct snd_kcontrol *kcontrol,
647 struct snd_ctl_elem_value *ucontrol)
648{
649 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
650 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
651 int value = ucontrol->value.integer.value[0];
652
653 dev_dbg(codec->dev, "%s: Compander enable current %d, new %d\n",
654 __func__, wsa881x->comp_enable, value);
655 wsa881x->comp_enable = value;
656 return 0;
657}
658
659static int wsa881x_get_boost(struct snd_kcontrol *kcontrol,
660 struct snd_ctl_elem_value *ucontrol)
661{
662
663 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
664 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
665
666 ucontrol->value.integer.value[0] = wsa881x->boost_enable;
667 return 0;
668}
669
670static int wsa881x_set_boost(struct snd_kcontrol *kcontrol,
671 struct snd_ctl_elem_value *ucontrol)
672{
673 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
674 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
675 int value = ucontrol->value.integer.value[0];
676
677 dev_dbg(codec->dev, "%s: Boost enable current %d, new %d\n",
678 __func__, wsa881x->boost_enable, value);
679 wsa881x->boost_enable = value;
680 return 0;
681}
682
683static int wsa881x_get_visense(struct snd_kcontrol *kcontrol,
684 struct snd_ctl_elem_value *ucontrol)
685{
686
687 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
688 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
689
690 ucontrol->value.integer.value[0] = wsa881x->visense_enable;
691 return 0;
692}
693
694static int wsa881x_set_visense(struct snd_kcontrol *kcontrol,
695 struct snd_ctl_elem_value *ucontrol)
696{
697 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
698 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
699 int value = ucontrol->value.integer.value[0];
700
701 dev_dbg(codec->dev, "%s: VIsense enable current %d, new %d\n",
702 __func__, wsa881x->visense_enable, value);
703 wsa881x->visense_enable = value;
704 return 0;
705}
706
Xiaojun Sangfa21d8c2017-09-22 17:05:02 +0800707static int wsa881x_set_boost_level(struct snd_kcontrol *kcontrol,
708 struct snd_ctl_elem_value *ucontrol)
709{
710 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
711 u8 wsa_boost_level = 0;
712
713 dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
714 __func__, ucontrol->value.integer.value[0]);
715
716 wsa_boost_level = ucontrol->value.integer.value[0];
717 snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1,
718 0xff, wsa_boost_level);
719
720 return 0;
721}
722
723static int wsa881x_get_boost_level(struct snd_kcontrol *kcontrol,
724 struct snd_ctl_elem_value *ucontrol)
725{
726 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
727 u8 wsa_boost_level = 0;
728
729 wsa_boost_level = snd_soc_read(codec, WSA881X_BOOST_PRESET_OUT1);
730 ucontrol->value.integer.value[0] = wsa_boost_level;
731 dev_dbg(codec->dev, "%s: boost level = 0x%x\n", __func__,
732 wsa_boost_level);
733
734 return 0;
735}
736
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530737static const struct snd_kcontrol_new wsa881x_snd_controls[] = {
738 SOC_SINGLE_EXT("COMP Switch", SND_SOC_NOPM, 0, 1, 0,
739 wsa881x_get_compander, wsa881x_set_compander),
740
741 SOC_SINGLE_EXT("BOOST Switch", SND_SOC_NOPM, 0, 1, 0,
742 wsa881x_get_boost, wsa881x_set_boost),
743
744 SOC_SINGLE_EXT("VISENSE Switch", SND_SOC_NOPM, 0, 1, 0,
745 wsa881x_get_visense, wsa881x_set_visense),
Xiaojun Sangfa21d8c2017-09-22 17:05:02 +0800746
747 SOC_SINGLE_EXT("Boost Level", SND_SOC_NOPM, 0, 0xff, 0,
748 wsa881x_get_boost_level, wsa881x_set_boost_level),
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +0530749};
750
751static const struct snd_kcontrol_new swr_dac_port[] = {
752 SOC_DAPM_SINGLE("Switch", SND_SOC_NOPM, 0, 1, 0)
753};
754
755static int wsa881x_set_port(struct snd_soc_codec *codec, int port_idx,
756 u8 *port_id, u8 *num_ch, u8 *ch_mask, u32 *ch_rate)
757{
758 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
759
760 *port_id = wsa881x->port[port_idx].port_id;
761 *num_ch = wsa881x->port[port_idx].num_ch;
762 *ch_mask = wsa881x->port[port_idx].ch_mask;
763 *ch_rate = wsa881x->port[port_idx].ch_rate;
764 return 0;
765}
766
767static int wsa881x_enable_swr_dac_port(struct snd_soc_dapm_widget *w,
768 struct snd_kcontrol *kcontrol, int event)
769{
770 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
771 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
772 u8 port_id[WSA881X_MAX_SWR_PORTS];
773 u8 num_ch[WSA881X_MAX_SWR_PORTS];
774 u8 ch_mask[WSA881X_MAX_SWR_PORTS];
775 u32 ch_rate[WSA881X_MAX_SWR_PORTS];
776 u8 num_port = 0;
777
778 dev_dbg(codec->dev, "%s: event %d name %s\n", __func__,
779 event, w->name);
780 if (wsa881x == NULL)
781 return -EINVAL;
782
783 switch (event) {
784 case SND_SOC_DAPM_PRE_PMU:
785 wsa881x_set_port(codec, SWR_DAC_PORT,
786 &port_id[num_port], &num_ch[num_port],
787 &ch_mask[num_port], &ch_rate[num_port]);
788 ++num_port;
789
790 if (wsa881x->comp_enable) {
791 wsa881x_set_port(codec, SWR_COMP_PORT,
792 &port_id[num_port], &num_ch[num_port],
793 &ch_mask[num_port], &ch_rate[num_port]);
794 ++num_port;
795 }
796 if (wsa881x->boost_enable) {
797 wsa881x_set_port(codec, SWR_BOOST_PORT,
798 &port_id[num_port], &num_ch[num_port],
799 &ch_mask[num_port], &ch_rate[num_port]);
800 ++num_port;
801 }
802 if (wsa881x->visense_enable) {
803 wsa881x_set_port(codec, SWR_VISENSE_PORT,
804 &port_id[num_port], &num_ch[num_port],
805 &ch_mask[num_port], &ch_rate[num_port]);
806 ++num_port;
807 }
808 swr_connect_port(wsa881x->swr_slave, &port_id[0], num_port,
809 &ch_mask[0], &ch_rate[0], &num_ch[0]);
810 break;
811 case SND_SOC_DAPM_POST_PMU:
812 break;
813 case SND_SOC_DAPM_PRE_PMD:
814 break;
815 case SND_SOC_DAPM_POST_PMD:
816 port_id[num_port] = wsa881x->port[SWR_DAC_PORT].port_id;
817 ++num_port;
818 if (wsa881x->comp_enable) {
819 port_id[num_port] =
820 wsa881x->port[SWR_COMP_PORT].port_id;
821 ++num_port;
822 }
823 if (wsa881x->boost_enable) {
824 port_id[num_port] =
825 wsa881x->port[SWR_BOOST_PORT].port_id;
826 ++num_port;
827 }
828 if (wsa881x->visense_enable) {
829 port_id[num_port] =
830 wsa881x->port[SWR_VISENSE_PORT].port_id;
831 ++num_port;
832 }
833 swr_disconnect_port(wsa881x->swr_slave, &port_id[0], num_port);
834 break;
835 default:
836 break;
837 }
838 return 0;
839}
840
841static int wsa881x_rdac_event(struct snd_soc_dapm_widget *w,
842 struct snd_kcontrol *kcontrol, int event)
843{
844 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
845 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
846
847 dev_dbg(codec->dev, "%s: %s %d boost %d visense %d\n", __func__,
848 w->name, event, wsa881x->boost_enable,
849 wsa881x->visense_enable);
850
851 switch (event) {
852 case SND_SOC_DAPM_PRE_PMU:
853 wsa881x_resource_acquire(codec, ENABLE);
854 wsa881x_boost_ctrl(codec, ENABLE);
855 break;
856 case SND_SOC_DAPM_POST_PMD:
857 swr_slvdev_datapath_control(wsa881x->swr_slave,
858 wsa881x->swr_slave->dev_num,
859 false);
860 wsa881x_boost_ctrl(codec, DISABLE);
861 wsa881x_resource_acquire(codec, DISABLE);
862 break;
863 }
864 return 0;
865}
866
867static int wsa881x_ramp_pa_gain(struct snd_soc_codec *codec,
868 int min_gain, int max_gain, int udelay)
869{
870 int val;
871
872 for (val = min_gain; max_gain <= val; val--) {
873 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN,
874 0xF0, val << 4);
875 /*
876 * 1ms delay is needed for every step change in gain as per
877 * HW requirement.
878 */
879 usleep_range(udelay, udelay+10);
880 }
881 return 0;
882}
883
884static void wsa881x_ocp_ctl_work(struct work_struct *work)
885{
886 struct wsa881x_priv *wsa881x;
887 struct delayed_work *dwork;
888 struct snd_soc_codec *codec;
889 int temp_val;
890
891 dwork = to_delayed_work(work);
892 wsa881x = container_of(dwork, struct wsa881x_priv, ocp_ctl_work);
893
894 codec = wsa881x->codec;
895 wsa881x_get_temp(wsa881x->tz_pdata.tz_dev, &temp_val);
896 dev_dbg(codec->dev, " temp = %d\n", temp_val);
897
898 if (temp_val <= WSA881X_OCP_CTL_TEMP_CELSIUS)
899 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x00);
900 else
901 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0);
902
903 schedule_delayed_work(&wsa881x->ocp_ctl_work,
904 msecs_to_jiffies(wsa881x_ocp_poll_timer_sec * 1000));
905}
906
907static int wsa881x_spkr_pa_event(struct snd_soc_dapm_widget *w,
908 struct snd_kcontrol *kcontrol, int event)
909{
910 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
911 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
912 int min_gain, max_gain;
913
914 dev_dbg(codec->dev, "%s: %s %d\n", __func__, w->name, event);
915 switch (event) {
916 case SND_SOC_DAPM_PRE_PMU:
917 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x80);
918 regmap_multi_reg_write(wsa881x->regmap,
919 wsa881x_pre_pmu_pa_2_0,
920 ARRAY_SIZE(wsa881x_pre_pmu_pa_2_0));
921 swr_slvdev_datapath_control(wsa881x->swr_slave,
922 wsa881x->swr_slave->dev_num,
923 true);
924 /* Set register mode if compander is not enabled */
925 if (!wsa881x->comp_enable)
926 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN,
927 0x08, 0x08);
928 else
929 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN,
930 0x08, 0x00);
931
932 break;
933 case SND_SOC_DAPM_POST_PMU:
934 if (!wsa881x->comp_enable) {
935 max_gain = wsa881x->pa_gain;
936 /*
937 * Gain has to set incrementally in 4 steps
938 * as per HW sequence
939 */
940 if (max_gain > G_4P5DB)
941 min_gain = G_0DB;
942 else
943 min_gain = max_gain + 3;
944 /*
945 * 1ms delay is needed before change in gain
946 * as per HW requirement.
947 */
948 usleep_range(1000, 1010);
949 wsa881x_ramp_pa_gain(codec, min_gain, max_gain, 1000);
950 }
951 if (wsa881x->visense_enable) {
952 wsa881x_visense_txfe_ctrl(codec, ENABLE,
953 0x00, 0x03, 0x01);
954 snd_soc_update_bits(codec, WSA881X_ADC_EN_SEL_IBAIS,
955 0x07, 0x01);
956 wsa881x_visense_adc_ctrl(codec, ENABLE);
957 }
958 schedule_delayed_work(&wsa881x->ocp_ctl_work,
959 msecs_to_jiffies(WSA881X_OCP_CTL_TIMER_SEC * 1000));
960 /* Force remove group */
961 swr_remove_from_group(wsa881x->swr_slave,
962 wsa881x->swr_slave->dev_num);
963 break;
964 case SND_SOC_DAPM_POST_PMD:
965 if (wsa881x->visense_enable) {
966 wsa881x_visense_adc_ctrl(codec, DISABLE);
967 wsa881x_visense_txfe_ctrl(codec, DISABLE,
968 0x00, 0x01, 0x01);
969 }
970 cancel_delayed_work_sync(&wsa881x->ocp_ctl_work);
971 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0);
972 break;
973 }
974 return 0;
975}
976
977static const struct snd_soc_dapm_widget wsa881x_dapm_widgets[] = {
978 SND_SOC_DAPM_INPUT("IN"),
979
980 SND_SOC_DAPM_MIXER_E("SWR DAC_Port", SND_SOC_NOPM, 0, 0, swr_dac_port,
981 ARRAY_SIZE(swr_dac_port), wsa881x_enable_swr_dac_port,
982 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
983 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
984
985 SND_SOC_DAPM_DAC_E("RDAC", NULL, WSA881X_SPKR_DAC_CTL, 7, 0,
986 wsa881x_rdac_event,
987 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMD),
988
989 SND_SOC_DAPM_PGA_E("SPKR PGA", WSA881X_SPKR_DRV_EN, 7, 0, NULL, 0,
990 wsa881x_spkr_pa_event, SND_SOC_DAPM_PRE_PMU |
991 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
992
993 SND_SOC_DAPM_OUTPUT("SPKR"),
994};
995
996static const struct snd_soc_dapm_route wsa881x_audio_map[] = {
997 {"SWR DAC_Port", "Switch", "IN"},
998 {"RDAC", NULL, "SWR DAC_Port"},
999 {"SPKR PGA", NULL, "RDAC"},
1000 {"SPKR", NULL, "SPKR PGA"},
1001};
1002
1003int wsa881x_set_channel_map(struct snd_soc_codec *codec, u8 *port, u8 num_port,
1004 unsigned int *ch_mask, unsigned int *ch_rate)
1005{
1006 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
1007 int i;
1008
1009 if (!port || !ch_mask || !ch_rate ||
1010 (num_port > WSA881X_MAX_SWR_PORTS)) {
1011 dev_err(codec->dev,
1012 "%s: Invalid port=%pK, ch_mask=%pK, ch_rate=%pK\n",
1013 __func__, port, ch_mask, ch_rate);
1014 return -EINVAL;
1015 }
1016 for (i = 0; i < num_port; i++) {
1017 wsa881x->port[i].port_id = port[i];
1018 wsa881x->port[i].ch_mask = ch_mask[i];
1019 wsa881x->port[i].ch_rate = ch_rate[i];
1020 wsa881x->port[i].num_ch = __sw_hweight8(ch_mask[i]);
1021 }
1022 return 0;
1023}
1024EXPORT_SYMBOL(wsa881x_set_channel_map);
1025
1026static void wsa881x_init(struct snd_soc_codec *codec)
1027{
1028 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
1029
1030 wsa881x->version = snd_soc_read(codec, WSA881X_CHIP_ID1);
1031 wsa881x_regmap_defaults(wsa881x->regmap, wsa881x->version);
Vatsal Bucha83716b92017-09-14 12:13:13 +05301032 /* Enable software reset output from soundwire slave */
1033 snd_soc_update_bits(codec, WSA881X_SWR_RESET_EN, 0x07, 0x07);
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301034 /* Bring out of analog reset */
1035 snd_soc_update_bits(codec, WSA881X_CDC_RST_CTL, 0x02, 0x02);
1036 /* Bring out of digital reset */
1037 snd_soc_update_bits(codec, WSA881X_CDC_RST_CTL, 0x01, 0x01);
1038
1039 snd_soc_update_bits(codec, WSA881X_CLOCK_CONFIG, 0x10, 0x10);
1040 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x02, 0x02);
1041 snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0xC0, 0x80);
1042 snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0x06, 0x06);
1043 snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_INT, 0xFF, 0x00);
1044 snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, 0xF0, 0x40);
1045 snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, 0x0E, 0x0E);
1046 snd_soc_update_bits(codec, WSA881X_BOOST_LOOP_STABILITY,
1047 0x03, 0x03);
1048 snd_soc_update_bits(codec, WSA881X_BOOST_MISC2_CTL, 0xFF, 0x14);
1049 snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL, 0x80, 0x80);
1050 snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL, 0x03, 0x00);
1051 snd_soc_update_bits(codec, WSA881X_BOOST_SLOPE_COMP_ISENSE_FB,
1052 0x0C, 0x04);
1053 snd_soc_update_bits(codec, WSA881X_BOOST_SLOPE_COMP_ISENSE_FB,
1054 0x03, 0x00);
1055 if (snd_soc_read(codec, WSA881X_OTP_REG_0))
1056 snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1,
1057 0xF0, 0x70);
1058 snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT2,
1059 0xF0, 0x30);
1060 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x08, 0x08);
1061 snd_soc_update_bits(codec, WSA881X_BOOST_CURRENT_LIMIT,
1062 0x0F, 0x08);
1063 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x30, 0x30);
1064 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0x0C, 0x00);
1065 snd_soc_update_bits(codec, WSA881X_OTP_REG_28, 0x3F, 0x3A);
1066 snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG1,
1067 0xFF, 0xB2);
1068 snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG2,
1069 0xFF, 0x05);
1070}
1071
1072static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec,
1073 bool enable)
1074{
1075 wsa881x_clk_ctrl(codec, enable);
1076 wsa881x_bandgap_ctrl(codec, enable);
1077 return 0;
1078}
1079
1080static int32_t wsa881x_temp_reg_read(struct snd_soc_codec *codec,
1081 struct wsa_temp_register *wsa_temp_reg)
1082{
1083 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
1084 struct swr_device *dev;
1085 u8 retry = WSA881X_NUM_RETRY;
1086 u8 devnum = 0;
1087
1088 if (!wsa881x) {
1089 dev_err(codec->dev, "%s: wsa881x is NULL\n", __func__);
1090 return -EINVAL;
1091 }
1092 dev = wsa881x->swr_slave;
1093 if (dev && (wsa881x->state == WSA881X_DEV_DOWN)) {
1094 while (swr_get_logical_dev_num(dev, dev->addr, &devnum) &&
1095 retry--) {
1096 /* Retry after 1 msec delay */
1097 usleep_range(1000, 1100);
1098 }
1099 if (retry == 0) {
1100 dev_err(codec->dev,
1101 "%s get devnum %d for dev addr %lx failed\n",
1102 __func__, devnum, dev->addr);
1103 return -EINVAL;
1104 }
1105 }
1106 mutex_lock(&wsa881x->res_lock);
1107 if (!wsa881x->clk_cnt) {
1108 regcache_mark_dirty(wsa881x->regmap);
1109 regcache_sync(wsa881x->regmap);
1110 }
1111 mutex_unlock(&wsa881x->res_lock);
1112
1113 wsa881x_resource_acquire(codec, ENABLE);
1114
1115 snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x00);
1116 wsa_temp_reg->dmeas_msb = snd_soc_read(codec, WSA881X_TEMP_MSB);
1117 wsa_temp_reg->dmeas_lsb = snd_soc_read(codec, WSA881X_TEMP_LSB);
1118 snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x01);
1119 wsa_temp_reg->d1_msb = snd_soc_read(codec, WSA881X_OTP_REG_1);
1120 wsa_temp_reg->d1_lsb = snd_soc_read(codec, WSA881X_OTP_REG_2);
1121 wsa_temp_reg->d2_msb = snd_soc_read(codec, WSA881X_OTP_REG_3);
1122 wsa_temp_reg->d2_lsb = snd_soc_read(codec, WSA881X_OTP_REG_4);
1123
1124 wsa881x_resource_acquire(codec, DISABLE);
1125
1126 return 0;
1127}
1128
1129static int wsa881x_probe(struct snd_soc_codec *codec)
1130{
1131 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
1132 struct swr_device *dev;
1133
1134 if (!wsa881x)
1135 return -EINVAL;
1136
1137 dev = wsa881x->swr_slave;
1138 wsa881x->codec = codec;
1139 mutex_init(&wsa881x->bg_lock);
1140 mutex_init(&wsa881x->res_lock);
1141 wsa881x_init(codec);
1142 snprintf(wsa881x->tz_pdata.name, sizeof(wsa881x->tz_pdata.name),
1143 "%s.%x", "wsatz", (u8)dev->addr);
1144 wsa881x->bg_cnt = 0;
1145 wsa881x->clk_cnt = 0;
1146 wsa881x->tz_pdata.codec = codec;
1147 wsa881x->tz_pdata.wsa_temp_reg_read = wsa881x_temp_reg_read;
1148 wsa881x_init_thermal(&wsa881x->tz_pdata);
1149 snd_soc_add_codec_controls(codec, wsa_snd_controls,
1150 ARRAY_SIZE(wsa_snd_controls));
1151 INIT_DELAYED_WORK(&wsa881x->ocp_ctl_work, wsa881x_ocp_ctl_work);
1152 return 0;
1153}
1154
1155static int wsa881x_remove(struct snd_soc_codec *codec)
1156{
1157 struct wsa881x_priv *wsa881x = snd_soc_codec_get_drvdata(codec);
1158
1159 if (wsa881x->tz_pdata.tz_dev)
1160 wsa881x_deinit_thermal(wsa881x->tz_pdata.tz_dev);
1161 mutex_destroy(&wsa881x->bg_lock);
1162 mutex_destroy(&wsa881x->res_lock);
1163
1164 return 0;
1165}
1166
1167static struct regmap *wsa881x_get_regmap(struct device *dev)
1168{
1169 struct wsa881x_priv *control = swr_get_dev_data(to_swr_device(dev));
1170
1171 if (!control)
1172 return NULL;
1173
1174 return control->regmap;
1175}
1176
1177static struct snd_soc_codec_driver soc_codec_dev_wsa881x = {
1178 .probe = wsa881x_probe,
1179 .remove = wsa881x_remove,
1180 .get_regmap = wsa881x_get_regmap,
1181 .component_driver = {
1182 .controls = wsa881x_snd_controls,
1183 .num_controls = ARRAY_SIZE(wsa881x_snd_controls),
1184 .dapm_widgets = wsa881x_dapm_widgets,
1185 .num_dapm_widgets = ARRAY_SIZE(wsa881x_dapm_widgets),
1186 .dapm_routes = wsa881x_audio_map,
1187 .num_dapm_routes = ARRAY_SIZE(wsa881x_audio_map),
1188 },
1189};
1190
1191static int wsa881x_gpio_ctrl(struct wsa881x_priv *wsa881x, bool enable)
1192{
1193 int ret = 0;
1194
1195 if (wsa881x->pd_gpio < 0) {
1196 dev_err(wsa881x->dev, "%s: gpio is not valid %d\n",
1197 __func__, wsa881x->pd_gpio);
1198 return -EINVAL;
1199 }
1200
1201 if (wsa881x->wsa_rst_np) {
1202 if (enable)
1203 ret = msm_cdc_pinctrl_select_active_state(
1204 wsa881x->wsa_rst_np);
1205 else
1206 ret = msm_cdc_pinctrl_select_sleep_state(
1207 wsa881x->wsa_rst_np);
1208 if (ret != 0)
1209 dev_err(wsa881x->dev,
1210 "%s: Failed to turn state %d; ret=%d\n",
1211 __func__, enable, ret);
1212 } else {
1213 if (gpio_is_valid(wsa881x->pd_gpio))
1214 gpio_direction_output(wsa881x->pd_gpio, enable);
1215 }
1216
1217 return ret;
1218}
1219
1220static int wsa881x_gpio_init(struct swr_device *pdev)
1221{
1222 int ret = 0;
1223 struct wsa881x_priv *wsa881x;
1224
1225 wsa881x = swr_get_dev_data(pdev);
1226 if (!wsa881x) {
1227 dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__);
1228 return -EINVAL;
1229 }
1230 dev_dbg(&pdev->dev, "%s: gpio %d request with name %s\n",
1231 __func__, wsa881x->pd_gpio, dev_name(&pdev->dev));
1232 ret = gpio_request(wsa881x->pd_gpio, dev_name(&pdev->dev));
1233 if (ret) {
1234 if (ret == -EBUSY) {
1235 /* GPIO was already requested */
1236 dev_dbg(&pdev->dev,
1237 "%s: gpio %d is already set to high\n",
1238 __func__, wsa881x->pd_gpio);
1239 ret = 0;
1240 } else {
1241 dev_err(&pdev->dev, "%s: Failed to request gpio %d, err: %d\n",
1242 __func__, wsa881x->pd_gpio, ret);
1243 }
1244 }
1245 return ret;
1246}
1247
1248static int wsa881x_swr_probe(struct swr_device *pdev)
1249{
1250 int ret = 0;
1251 struct wsa881x_priv *wsa881x;
1252 u8 devnum = 0;
1253 bool pin_state_current = false;
1254
1255 wsa881x = devm_kzalloc(&pdev->dev, sizeof(struct wsa881x_priv),
1256 GFP_KERNEL);
1257 if (!wsa881x)
1258 return -ENOMEM;
1259 wsa881x->wsa_rst_np = of_parse_phandle(pdev->dev.of_node,
1260 "qcom,spkr-sd-n-node", 0);
1261 if (!wsa881x->wsa_rst_np) {
1262 dev_dbg(&pdev->dev, "%s: Not using pinctrl, fallback to gpio\n",
1263 __func__);
1264 wsa881x->pd_gpio = of_get_named_gpio(pdev->dev.of_node,
1265 "qcom,spkr-sd-n-gpio", 0);
1266 if (wsa881x->pd_gpio < 0) {
1267 dev_err(&pdev->dev, "%s: %s property is not found %d\n",
1268 __func__, "qcom,spkr-sd-n-gpio",
1269 wsa881x->pd_gpio);
1270 goto err;
1271 }
1272 dev_dbg(&pdev->dev, "%s: reset gpio %d\n", __func__,
1273 wsa881x->pd_gpio);
1274 }
1275 swr_set_dev_data(pdev, wsa881x);
1276
1277 wsa881x->swr_slave = pdev;
1278
1279 if (!wsa881x->wsa_rst_np) {
1280 ret = wsa881x_gpio_init(pdev);
1281 if (ret)
1282 goto err;
1283 }
1284 if (wsa881x->wsa_rst_np)
1285 pin_state_current = msm_cdc_pinctrl_get_state(
1286 wsa881x->wsa_rst_np);
1287 wsa881x_gpio_ctrl(wsa881x, true);
1288 wsa881x->state = WSA881X_DEV_UP;
1289
1290 if (!debugfs_wsa881x_dent) {
1291 dbgwsa881x = wsa881x;
1292 debugfs_wsa881x_dent = debugfs_create_dir(
1293 "wsa881x_swr_slave", 0);
1294 if (!IS_ERR(debugfs_wsa881x_dent)) {
1295 debugfs_peek = debugfs_create_file("swrslave_peek",
1296 S_IFREG | 0444, debugfs_wsa881x_dent,
1297 (void *) "swrslave_peek",
1298 &codec_debug_ops);
1299
1300 debugfs_poke = debugfs_create_file("swrslave_poke",
1301 S_IFREG | 0444, debugfs_wsa881x_dent,
1302 (void *) "swrslave_poke",
1303 &codec_debug_ops);
1304
1305 debugfs_reg_dump = debugfs_create_file(
1306 "swrslave_reg_dump",
1307 S_IFREG | 0444,
1308 debugfs_wsa881x_dent,
1309 (void *) "swrslave_reg_dump",
1310 &codec_debug_ops);
1311 }
1312 }
1313
1314 /*
1315 * Add 5msec delay to provide sufficient time for
1316 * soundwire auto enumeration of slave devices as
1317 * as per HW requirement.
1318 */
1319 usleep_range(5000, 5010);
1320 ret = swr_get_logical_dev_num(pdev, pdev->addr, &devnum);
1321 if (ret) {
1322 dev_dbg(&pdev->dev,
1323 "%s get devnum %d for dev addr %lx failed\n",
1324 __func__, devnum, pdev->addr);
1325 goto dev_err;
1326 }
1327 pdev->dev_num = devnum;
1328
1329 wsa881x->regmap = devm_regmap_init_swr(pdev,
1330 &wsa881x_regmap_config);
1331 if (IS_ERR(wsa881x->regmap)) {
1332 ret = PTR_ERR(wsa881x->regmap);
1333 dev_err(&pdev->dev, "%s: regmap_init failed %d\n",
1334 __func__, ret);
1335 goto dev_err;
1336 }
1337
1338 ret = snd_soc_register_codec(&pdev->dev, &soc_codec_dev_wsa881x,
1339 NULL, 0);
1340 if (ret) {
1341 dev_err(&pdev->dev, "%s: Codec registration failed\n",
1342 __func__);
1343 goto dev_err;
1344 }
1345
1346 return 0;
1347
1348dev_err:
1349 if (pin_state_current == false)
1350 wsa881x_gpio_ctrl(wsa881x, false);
1351 swr_remove_device(pdev);
1352err:
1353 return ret;
1354}
1355
1356static int wsa881x_swr_remove(struct swr_device *pdev)
1357{
1358 struct wsa881x_priv *wsa881x;
1359
1360 wsa881x = swr_get_dev_data(pdev);
1361 if (!wsa881x) {
1362 dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__);
1363 return -EINVAL;
1364 }
1365 debugfs_remove_recursive(debugfs_wsa881x_dent);
1366 debugfs_wsa881x_dent = NULL;
1367 snd_soc_unregister_codec(&pdev->dev);
1368 if (wsa881x->pd_gpio)
1369 gpio_free(wsa881x->pd_gpio);
1370 swr_set_dev_data(pdev, NULL);
1371 return 0;
1372}
1373
1374static int wsa881x_swr_up(struct swr_device *pdev)
1375{
1376 int ret;
1377 struct wsa881x_priv *wsa881x;
1378
1379 wsa881x = swr_get_dev_data(pdev);
1380 if (!wsa881x) {
1381 dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__);
1382 return -EINVAL;
1383 }
1384 ret = wsa881x_gpio_ctrl(wsa881x, true);
1385 if (ret)
1386 dev_err(&pdev->dev, "%s: Failed to enable gpio\n", __func__);
1387 else
1388 wsa881x->state = WSA881X_DEV_UP;
1389
1390 return ret;
1391}
1392
1393static int wsa881x_swr_down(struct swr_device *pdev)
1394{
1395 struct wsa881x_priv *wsa881x;
1396 int ret;
1397
1398 wsa881x = swr_get_dev_data(pdev);
1399 if (!wsa881x) {
1400 dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__);
1401 return -EINVAL;
1402 }
1403 if (delayed_work_pending(&wsa881x->ocp_ctl_work))
1404 cancel_delayed_work_sync(&wsa881x->ocp_ctl_work);
1405 ret = wsa881x_gpio_ctrl(wsa881x, false);
1406 if (ret)
1407 dev_err(&pdev->dev, "%s: Failed to disable gpio\n", __func__);
1408 else
1409 wsa881x->state = WSA881X_DEV_DOWN;
1410
1411 return ret;
1412}
1413
1414static int wsa881x_swr_reset(struct swr_device *pdev)
1415{
1416 struct wsa881x_priv *wsa881x;
1417 u8 retry = WSA881X_NUM_RETRY;
1418 u8 devnum = 0;
1419
1420 wsa881x = swr_get_dev_data(pdev);
1421 if (!wsa881x) {
1422 dev_err(&pdev->dev, "%s: wsa881x is NULL\n", __func__);
1423 return -EINVAL;
1424 }
1425 wsa881x->bg_cnt = 0;
1426 wsa881x->clk_cnt = 0;
1427 while (swr_get_logical_dev_num(pdev, pdev->addr, &devnum) && retry--) {
1428 /* Retry after 1 msec delay */
1429 usleep_range(1000, 1100);
1430 }
1431 pdev->dev_num = devnum;
1432 regcache_mark_dirty(wsa881x->regmap);
1433 regcache_sync(wsa881x->regmap);
1434 return 0;
1435}
1436
1437#ifdef CONFIG_PM_SLEEP
1438static int wsa881x_swr_suspend(struct device *dev)
1439{
1440 dev_dbg(dev, "%s: system suspend\n", __func__);
1441 return 0;
1442}
1443
1444static int wsa881x_swr_resume(struct device *dev)
1445{
1446 struct wsa881x_priv *wsa881x = swr_get_dev_data(to_swr_device(dev));
1447
1448 if (!wsa881x) {
1449 dev_err(dev, "%s: wsa881x private data is NULL\n", __func__);
1450 return -EINVAL;
1451 }
1452 dev_dbg(dev, "%s: system resume\n", __func__);
1453 return 0;
1454}
1455#endif /* CONFIG_PM_SLEEP */
1456
1457static const struct dev_pm_ops wsa881x_swr_pm_ops = {
1458 SET_SYSTEM_SLEEP_PM_OPS(wsa881x_swr_suspend, wsa881x_swr_resume)
1459};
1460
1461static const struct swr_device_id wsa881x_swr_id[] = {
1462 {"wsa881x", 0},
1463 {}
1464};
1465
1466static const struct of_device_id wsa881x_swr_dt_match[] = {
1467 {
1468 .compatible = "qcom,wsa881x",
1469 },
1470 {}
1471};
1472
1473static struct swr_driver wsa881x_codec_driver = {
1474 .driver = {
1475 .name = "wsa881x",
1476 .owner = THIS_MODULE,
1477 .pm = &wsa881x_swr_pm_ops,
1478 .of_match_table = wsa881x_swr_dt_match,
1479 },
1480 .probe = wsa881x_swr_probe,
1481 .remove = wsa881x_swr_remove,
1482 .id_table = wsa881x_swr_id,
1483 .device_up = wsa881x_swr_up,
1484 .device_down = wsa881x_swr_down,
1485 .reset_device = wsa881x_swr_reset,
1486};
1487
1488static int __init wsa881x_codec_init(void)
1489{
1490 return swr_driver_register(&wsa881x_codec_driver);
1491}
1492
1493static void __exit wsa881x_codec_exit(void)
1494{
1495 swr_driver_unregister(&wsa881x_codec_driver);
1496}
1497
1498module_init(wsa881x_codec_init);
1499module_exit(wsa881x_codec_exit);
1500
1501MODULE_DESCRIPTION("WSA881x Codec driver");
1502MODULE_LICENSE("GPL v2");