blob: 9e720a3cdb58b63f3ccafe35f5c9e567fdb740ef [file] [log] [blame]
Soumya Managoli7a258f02018-02-23 12:57:32 +05301/* Copyright (c) 2015-2016, 2018, The Linux Foundation. All rights reserved.
2 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
13#include <linux/module.h>
14#include <linux/init.h>
15#include <linux/slab.h>
16#include <linux/of_gpio.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 <soc/soundwire.h>
24#include <sound/pcm.h>
25#include <sound/pcm_params.h>
26#include <sound/soc.h>
27#include <sound/soc-dapm.h>
28#include <sound/tlv.h>
29#include <dsp/q6afe-v2.h>
30#include <linux/delay.h>
31#include <linux/i2c.h>
32#include <linux/kernel.h>
33#include <linux/gpio.h>
34#include <soc/internal.h>
35#include <linux/regmap.h>
36#include "msm-cdc-pinctrl.h"
37#include "wsa881x-analog.h"
38#include "wsa881x-temp-sensor.h"
39
40#define SPK_GAIN_12DB 4
41#define WIDGET_NAME_MAX_SIZE 80
42
43/*
44 * Private data Structure for wsa881x. All parameters related to
45 * WSA881X codec needs to be defined here.
46 */
47struct wsa881x_pdata {
48 struct regmap *regmap[2];
49 struct i2c_client *client[2];
50 struct snd_soc_codec *codec;
51
52 /* track wsa881x status during probe */
53 int status;
54 bool boost_enable;
55 bool visense_enable;
56 int spk_pa_gain;
57 struct i2c_msg xfer_msg[2];
58 struct mutex xfer_lock;
59 bool regmap_flag;
60 bool wsa_active;
61 int index;
62 int (*enable_mclk)(struct snd_soc_card *, bool);
63 struct wsa881x_tz_priv tz_pdata;
64 int bg_cnt;
65 int clk_cnt;
66 int enable_cnt;
67 int version;
68 struct mutex bg_lock;
69 struct mutex res_lock;
70 struct delayed_work ocp_ctl_work;
71 struct device_node *wsa_vi_gpio_p;
72 struct device_node *wsa_clk_gpio_p;
73 struct device_node *wsa_reset_gpio_p;
74};
75
76enum {
77 WSA881X_STATUS_PROBING,
78 WSA881X_STATUS_I2C,
79};
80
81#define WSA881X_OCP_CTL_TIMER_SEC 2
82#define WSA881X_OCP_CTL_TEMP_CELSIUS 25
83#define WSA881X_OCP_CTL_POLL_TIMER_SEC 60
84
85static int wsa881x_ocp_poll_timer_sec = WSA881X_OCP_CTL_POLL_TIMER_SEC;
86module_param(wsa881x_ocp_poll_timer_sec, int, 0664);
87MODULE_PARM_DESC(wsa881x_ocp_poll_timer_sec, "timer for ocp ctl polling");
88
89static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec,
90 bool enable);
91
92const char *wsa_tz_names[] = {"wsa881x.0e", "wsa881x.0f"};
93
94struct wsa881x_pdata wsa_pdata[MAX_WSA881X_DEVICE];
95
96static bool pinctrl_init;
97
98static int wsa881x_populate_dt_pdata(struct device *dev, int wsa881x_index);
99static int wsa881x_reset(struct wsa881x_pdata *pdata, bool enable);
100static int wsa881x_startup(struct wsa881x_pdata *pdata);
101static int wsa881x_shutdown(struct wsa881x_pdata *pdata);
102
103static int delay_array_msec[] = {10, 20, 30, 40, 50};
104
105static int wsa881x_i2c_addr = -1;
106static int wsa881x_probing_count;
107static int wsa881x_presence_count;
108
109static const char * const wsa881x_spk_pa_gain_text[] = {
110"POS_13P5_DB", "POS_12_DB", "POS_10P5_DB", "POS_9_DB", "POS_7P5_DB",
111"POS_6_DB", "POS_4P5_DB", "POS_3_DB", "POS_1P5_DB", "POS_0_DB"};
112
113static const struct soc_enum wsa881x_spk_pa_gain_enum[] = {
114 SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(wsa881x_spk_pa_gain_text),
115 wsa881x_spk_pa_gain_text),
116};
117
118static int wsa881x_spk_pa_gain_get(struct snd_kcontrol *kcontrol,
119 struct snd_ctl_elem_value *ucontrol)
120{
121 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
122 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
123
124 ucontrol->value.integer.value[0] = wsa881x->spk_pa_gain;
125
126 dev_dbg(codec->dev, "%s: spk_pa_gain = %ld\n", __func__,
127 ucontrol->value.integer.value[0]);
128
129 return 0;
130}
131
132static int wsa881x_spk_pa_gain_put(struct snd_kcontrol *kcontrol,
133 struct snd_ctl_elem_value *ucontrol)
134{
135 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
136 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
137
138 if (ucontrol->value.integer.value[0] < 0 ||
139 ucontrol->value.integer.value[0] > 0xC) {
140 dev_err(codec->dev, "%s: Unsupported gain val %ld\n",
141 __func__, ucontrol->value.integer.value[0]);
142 return -EINVAL;
143 }
144 wsa881x->spk_pa_gain = ucontrol->value.integer.value[0];
145 dev_dbg(codec->dev, "%s: ucontrol->value.integer.value[0] = %ld\n",
146 __func__, ucontrol->value.integer.value[0]);
147
148 return 0;
149}
150
151static int get_i2c_wsa881x_device_index(u16 reg)
152{
153 u16 mask = 0x0f00;
154 int value = 0;
155
156 value = ((reg & mask) >> 8) & 0x000f;
157
158 switch (value) {
159 case 0:
160 return 0;
161 case 1:
162 return 1;
163 default:
164 break;
165 }
166 return -EINVAL;
167}
168
169static int wsa881x_i2c_write_device(struct wsa881x_pdata *wsa881x,
170 unsigned int reg, unsigned int val)
171{
172 int i = 0, rc = 0;
173 int wsa881x_index;
174 struct i2c_msg *msg;
175 int ret = 0;
176 int bytes = 1;
177 u8 reg_addr = 0;
178 u8 data[bytes + 1];
179
180 wsa881x_index = get_i2c_wsa881x_device_index(reg);
181 if (wsa881x_index < 0) {
182 pr_err_ratelimited("%s:invalid register to write\n", __func__);
183 return -EINVAL;
184 }
185 if (wsa881x->regmap_flag) {
186 rc = regmap_write(wsa881x->regmap[wsa881x_index], reg, val);
187 for (i = 0; rc && i < ARRAY_SIZE(delay_array_msec); i++) {
188 pr_err_ratelimited("Failed writing reg=%u-retry(%d)\n",
189 reg, i);
190 /* retry after delay of increasing order */
191 msleep(delay_array_msec[i]);
192 rc = regmap_write(wsa881x->regmap[wsa881x_index],
193 reg, val);
194 }
195 if (rc)
196 pr_err_ratelimited("Failed writing reg=%u rc=%d\n",
197 reg, rc);
198 else
199 pr_debug("write success register = %x val = %x\n",
200 reg, val);
201 } else {
202 reg_addr = (u8)reg;
203 msg = &wsa881x->xfer_msg[0];
204 msg->addr = wsa881x->client[wsa881x_index]->addr;
205 msg->len = bytes + 1;
206 msg->flags = 0;
207 data[0] = reg;
208 data[1] = (u8)val;
209 msg->buf = data;
210 ret = i2c_transfer(wsa881x->client[wsa881x_index]->adapter,
211 wsa881x->xfer_msg, 1);
212 /* Try again if the write fails */
213 if (ret != 1) {
214 ret = i2c_transfer(
215 wsa881x->client[wsa881x_index]->adapter,
216 wsa881x->xfer_msg, 1);
217 if (ret != 1) {
218 pr_err_ratelimited("failed to write the device\n");
219 return ret;
220 }
221 }
222 pr_debug("write success reg = %x val = %x\n", reg, data[1]);
223 }
224 return rc;
225}
226
227static int wsa881x_i2c_read_device(struct wsa881x_pdata *wsa881x,
228 unsigned int reg)
229{
230 int wsa881x_index;
231 int i = 0, rc = 0;
232 unsigned int val;
233 struct i2c_msg *msg;
234 int ret = 0;
235 u8 reg_addr = 0;
Vaishnavi Kommarajudf03d942018-04-03 12:57:08 +0530236 u8 dest[5] = {0};
Soumya Managoli7a258f02018-02-23 12:57:32 +0530237
238 wsa881x_index = get_i2c_wsa881x_device_index(reg);
239 if (wsa881x_index < 0) {
240 pr_err_ratelimited("%s:invalid register to read\n", __func__);
241 return -EINVAL;
242 }
243 if (wsa881x->regmap_flag) {
244 rc = regmap_read(wsa881x->regmap[wsa881x_index], reg, &val);
245 for (i = 0; rc && i < ARRAY_SIZE(delay_array_msec); i++) {
246 pr_err_ratelimited("Failed reading reg=%u - retry(%d)\n",
247 reg, i);
248 /* retry after delay of increasing order */
249 msleep(delay_array_msec[i]);
250 rc = regmap_read(wsa881x->regmap[wsa881x_index],
251 reg, &val);
252 }
253 if (rc) {
254 pr_err_ratelimited("Failed reading reg=%u rc=%d\n",
255 reg, rc);
256 return rc;
257 }
258 pr_debug("read success reg = %x val = %x\n",
259 reg, val);
260 } else {
261 reg_addr = (u8)reg;
262 msg = &wsa881x->xfer_msg[0];
263 msg->addr = wsa881x->client[wsa881x_index]->addr;
264 msg->len = 1;
265 msg->flags = 0;
266 msg->buf = &reg_addr;
267
268 msg = &wsa881x->xfer_msg[1];
269 msg->addr = wsa881x->client[wsa881x_index]->addr;
270 msg->len = 1;
271 msg->flags = I2C_M_RD;
272 msg->buf = dest;
273 ret = i2c_transfer(wsa881x->client[wsa881x_index]->adapter,
274 wsa881x->xfer_msg, 2);
275
276 /* Try again if read fails first time */
277 if (ret != 2) {
278 ret = i2c_transfer(
279 wsa881x->client[wsa881x_index]->adapter,
280 wsa881x->xfer_msg, 2);
281 if (ret != 2) {
282 pr_err_ratelimited("failed to read wsa register:%d\n",
283 reg);
284 return ret;
285 }
286 }
287 val = dest[0];
288 }
289 return val;
290}
291
292static unsigned int wsa881x_i2c_read(struct snd_soc_codec *codec,
293 unsigned int reg)
294{
295 struct wsa881x_pdata *wsa881x;
296 int wsa881x_index;
297
298 if (codec == NULL) {
299 pr_err_ratelimited("%s: invalid codec\n", __func__);
300 return -EINVAL;
301 }
302 wsa881x = snd_soc_codec_get_drvdata(codec);
Soumya Managolia6456772018-04-20 13:27:17 +0530303 if (!wsa881x->wsa_active)
304 return 0;
Soumya Managoli7a258f02018-02-23 12:57:32 +0530305
306 wsa881x_index = get_i2c_wsa881x_device_index(reg);
307 if (wsa881x_index < 0) {
308 pr_err_ratelimited("%s:invalid register to read\n", __func__);
309 return -EINVAL;
310 }
311 return wsa881x_i2c_read_device(wsa881x, reg);
312}
313
314static int wsa881x_i2c_write(struct snd_soc_codec *codec, unsigned int reg,
315 unsigned int val)
316{
317 struct wsa881x_pdata *wsa881x;
318 int wsa881x_index;
319
320 if (codec == NULL) {
321 pr_err_ratelimited("%s: invalid codec\n", __func__);
322 return -EINVAL;
323 }
324 wsa881x = snd_soc_codec_get_drvdata(codec);
Soumya Managolia6456772018-04-20 13:27:17 +0530325 if (!wsa881x->wsa_active)
326 return 0;
327
Soumya Managoli7a258f02018-02-23 12:57:32 +0530328 wsa881x_index = get_i2c_wsa881x_device_index(reg);
329 if (wsa881x_index < 0) {
330 pr_err_ratelimited("%s:invalid register to read\n", __func__);
331 return -EINVAL;
332 }
333 return wsa881x_i2c_write_device(wsa881x, reg, val);
334}
335
336static int wsa881x_i2c_get_client_index(struct i2c_client *client,
337 int *wsa881x_index)
338{
339 int ret = 0;
340
341 switch (client->addr) {
342 case WSA881X_I2C_SPK0_SLAVE0_ADDR:
343 case WSA881X_I2C_SPK0_SLAVE1_ADDR:
344 *wsa881x_index = WSA881X_I2C_SPK0_SLAVE0;
345 break;
346 case WSA881X_I2C_SPK1_SLAVE0_ADDR:
347 case WSA881X_I2C_SPK1_SLAVE1_ADDR:
348 *wsa881x_index = WSA881X_I2C_SPK1_SLAVE0;
349 break;
350 default:
351 ret = -EINVAL;
352 break;
353 }
354 return ret;
355}
356
357static int wsa881x_boost_ctrl(struct snd_soc_codec *codec, bool enable)
358{
359 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
360
361 pr_debug("%s: enable:%d\n", __func__, enable);
362 if (enable) {
363 if (!WSA881X_IS_2_0(wsa881x->version)) {
364 snd_soc_update_bits(codec, WSA881X_ANA_CTL,
365 0x01, 0x01);
366 snd_soc_update_bits(codec, WSA881X_ANA_CTL,
367 0x04, 0x04);
368 snd_soc_update_bits(codec, WSA881X_BOOST_PS_CTL,
369 0x40, 0x00);
370 snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1,
371 0xF0, 0xB0);
372 snd_soc_update_bits(codec, WSA881X_BOOST_ZX_CTL,
373 0x20, 0x00);
374 snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL,
375 0x80, 0x80);
376 } else {
377 snd_soc_update_bits(codec, WSA881X_BOOST_LOOP_STABILITY,
378 0x03, 0x03);
379 snd_soc_update_bits(codec, WSA881X_BOOST_MISC2_CTL,
380 0xFF, 0x14);
381 snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL,
382 0x80, 0x80);
383 snd_soc_update_bits(codec, WSA881X_BOOST_START_CTL,
384 0x03, 0x00);
385 snd_soc_update_bits(codec,
386 WSA881X_BOOST_SLOPE_COMP_ISENSE_FB,
387 0x0C, 0x04);
388 snd_soc_update_bits(codec,
389 WSA881X_BOOST_SLOPE_COMP_ISENSE_FB,
390 0x03, 0x00);
391 snd_soc_update_bits(codec, WSA881X_BOOST_PRESET_OUT1,
392 0xF0, 0x70);
393 snd_soc_update_bits(codec, WSA881X_ANA_CTL, 0x03, 0x01);
394 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN,
395 0x08, 0x08);
396 snd_soc_update_bits(codec, WSA881X_ANA_CTL, 0x04, 0x04);
397 snd_soc_update_bits(codec, WSA881X_BOOST_CURRENT_LIMIT,
398 0x0F, 0x08);
399 snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL,
400 0x80, 0x80);
401 }
402 /* For WSA8810, start-up time is 1500us as per qcrg sequence */
403 usleep_range(1500, 1510);
404 } else {
405 /* ENSURE: Class-D amp is shutdown. CLK is still on */
406 snd_soc_update_bits(codec, WSA881X_BOOST_EN_CTL, 0x80, 0x00);
407 /* boost settle time is 1500us as per qcrg sequence */
408 usleep_range(1500, 1510);
409 }
410 return 0;
411}
412
413static int wsa881x_visense_txfe_ctrl(struct snd_soc_codec *codec, bool enable,
414 u8 isense1_gain, u8 isense2_gain,
415 u8 vsense_gain)
416{
417 u8 value = 0;
418 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
419
420 pr_debug("%s: enable:%d\n", __func__, enable);
421
422 if (enable) {
423 if (WSA881X_IS_2_0(wsa881x->version)) {
424 snd_soc_update_bits(codec, WSA881X_OTP_REG_28,
425 0x3F, 0x3A);
426 snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG1,
427 0xFF, 0xB2);
428 snd_soc_update_bits(codec, WSA881X_BONGO_RESRV_REG2,
429 0xFF, 0x05);
430 }
431 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_VSENSE_VCM,
432 0x08, 0x00);
433 if (WSA881X_IS_2_0(wsa881x->version)) {
434 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_ATEST2,
435 0x1C, 0x04);
436 } else {
437 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_ATEST2,
438 0x08, 0x08);
439 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_ATEST2,
440 0x02, 0x02);
441 }
442 value = ((isense2_gain << 6) | (isense1_gain << 4) |
443 (vsense_gain << 3));
444 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN,
445 0xF8, value);
446 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN,
447 0x01, 0x01);
448 } else {
449 if (WSA881X_IS_2_0(wsa881x->version))
450 snd_soc_update_bits(codec,
451 WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x10, 0x10);
452 else
453 snd_soc_update_bits(codec,
454 WSA881X_SPKR_PROT_FE_VSENSE_VCM, 0x08, 0x08);
455 /*
456 * 200us sleep is needed after visense txfe disable as per
457 * HW requirement.
458 */
459 usleep_range(200, 210);
460
461 snd_soc_update_bits(codec, WSA881X_SPKR_PROT_FE_GAIN,
462 0x01, 0x00);
463 }
464 return 0;
465}
466
467static int wsa881x_visense_adc_ctrl(struct snd_soc_codec *codec, bool enable)
468{
469 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
470
471 pr_debug("%s: enable:%d\n", __func__, enable);
472 if (enable) {
473 if (!WSA881X_IS_2_0(wsa881x->version))
474 snd_soc_update_bits(codec, WSA881X_ADC_SEL_IBIAS,
475 0x70, 0x40);
476 snd_soc_update_bits(codec, WSA881X_ADC_EN_SEL_IBIAS,
477 0x07, 0x04);
478 snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, 0x80, 0x80);
479 snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_I, 0x80, 0x80);
480 } else {
481 /* Ensure: Speaker Protection has been stopped */
482 snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V, 0x80, 0x00);
483 snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_I, 0x80, 0x00);
484 }
485
486 return 0;
487}
488
489static void wsa881x_bandgap_ctrl(struct snd_soc_codec *codec, bool enable)
490{
491 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
492
493 dev_dbg(codec->dev, "%s: enable:%d, bg_count:%d\n", __func__,
494 enable, wsa881x->bg_cnt);
495 mutex_lock(&wsa881x->bg_lock);
496 if (enable) {
497 ++wsa881x->bg_cnt;
498 if (wsa881x->bg_cnt == 1) {
499 snd_soc_update_bits(codec, WSA881X_TEMP_OP,
500 0x08, 0x08);
501 /* 400usec sleep is needed as per HW requirement */
502 usleep_range(400, 410);
503 snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x04, 0x04);
504 }
505 } else {
506 --wsa881x->bg_cnt;
507 if (wsa881x->bg_cnt <= 0) {
508 WARN_ON(wsa881x->bg_cnt < 0);
509 wsa881x->bg_cnt = 0;
510 snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x04, 0x00);
511 snd_soc_update_bits(codec, WSA881X_TEMP_OP, 0x08, 0x00);
512 }
513 }
514 mutex_unlock(&wsa881x->bg_lock);
515}
516
517static void wsa881x_clk_ctrl(struct snd_soc_codec *codec, bool enable)
518{
519 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
520
521 dev_dbg(codec->dev, "%s:ss enable:%d, clk_count:%d\n", __func__,
522 enable, wsa881x->clk_cnt);
523 mutex_lock(&wsa881x->res_lock);
524 if (enable) {
525 ++wsa881x->clk_cnt;
526 if (wsa881x->clk_cnt == 1) {
527 snd_soc_write(codec, WSA881X_CDC_RST_CTL, 0x02);
528 snd_soc_write(codec, WSA881X_CDC_RST_CTL, 0x03);
529 snd_soc_write(codec, WSA881X_CLOCK_CONFIG, 0x01);
530
531 snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x01);
532 snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x01);
533
534 }
535 } else {
536 --wsa881x->clk_cnt;
537 if (wsa881x->clk_cnt <= 0) {
538 WARN_ON(wsa881x->clk_cnt < 0);
539 wsa881x->clk_cnt = 0;
540 snd_soc_write(codec, WSA881X_CDC_ANA_CLK_CTL, 0x00);
541 snd_soc_write(codec, WSA881X_CDC_DIG_CLK_CTL, 0x00);
542 if (WSA881X_IS_2_0(wsa881x->version))
543 snd_soc_update_bits(codec,
544 WSA881X_CDC_TOP_CLK_CTL, 0x01, 0x00);
545 }
546 }
547 mutex_unlock(&wsa881x->res_lock);
548}
549
550static int wsa881x_rdac_ctrl(struct snd_soc_codec *codec, bool enable)
551{
552 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
553
554 pr_debug("%s: enable:%d\n", __func__, enable);
555 if (enable) {
556 snd_soc_update_bits(codec, WSA881X_ANA_CTL, 0x08, 0x00);
557 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, 0x08, 0x08);
558 snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x20, 0x20);
559 snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x20, 0x00);
560 snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x40, 0x40);
561 snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x80, 0x80);
562 if (WSA881X_IS_2_0(wsa881x->version)) {
563 snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_CAL,
564 0x01, 0x01);
565 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL,
566 0x30, 0x30);
567 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL,
568 0x0C, 0x00);
569 }
570 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, 0xF0, 0x40);
571 snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0x01, 0x01);
572 } else {
573 /* Ensure class-D amp is off */
574 snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x80, 0x00);
575 }
576 return 0;
577}
578
579static int wsa881x_spkr_pa_ctrl(struct snd_soc_codec *codec, bool enable)
580{
581 int ret = 0;
582 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
583
584 pr_debug("%s: enable:%d\n", __func__, enable);
585 if (enable) {
586 /*
587 * Ensure: Boost is enabled and stable, Analog input is up
588 * and outputting silence
589 */
590 if (!WSA881X_IS_2_0(wsa881x->version)) {
591 snd_soc_update_bits(codec, WSA881X_ADC_EN_DET_TEST_I,
592 0xFF, 0x01);
593 snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V,
594 0x02, 0x02);
595 snd_soc_update_bits(codec, WSA881X_ADC_EN_DET_TEST_V,
596 0xFF, 0x10);
597 snd_soc_update_bits(codec, WSA881X_SPKR_PWRSTG_DBG,
598 0xA0, 0xA0);
599 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN,
600 0x80, 0x80);
601 usleep_range(700, 710);
602 snd_soc_update_bits(codec, WSA881X_SPKR_PWRSTG_DBG,
603 0x00, 0x00);
604 snd_soc_update_bits(codec, WSA881X_ADC_EN_DET_TEST_V,
605 0xFF, 0x00);
606 snd_soc_update_bits(codec, WSA881X_ADC_EN_MODU_V,
607 0x02, 0x00);
608 snd_soc_update_bits(codec, WSA881X_ADC_EN_DET_TEST_I,
609 0xFF, 0x00);
610 } else
611 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN,
612 0x80, 0x80);
613 /* add 1000us delay as per qcrg */
614 usleep_range(1000, 1010);
615 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x01, 0x01);
616 if (WSA881X_IS_2_0(wsa881x->version))
617 snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_CAL,
618 0x01, 0x00);
619 usleep_range(1000, 1010);
620 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_GAIN, 0xF0,
621 (wsa881x->spk_pa_gain << 4));
622 if (wsa881x->visense_enable) {
623 ret = msm_cdc_pinctrl_select_active_state(
624 wsa881x->wsa_vi_gpio_p);
625 if (ret) {
626 pr_err("%s: gpio set cannot be activated %s\n",
627 __func__, "wsa_vi");
628 return ret;
629 }
630 wsa881x_visense_txfe_ctrl(codec, true,
631 0x00, 0x01, 0x00);
632 wsa881x_visense_adc_ctrl(codec, true);
633 }
634 } else {
635 /*
636 * Ensure: Boost is still on, Stream from Analog input and
637 * Speaker Protection has been stopped and input is at 0V
638 */
639 if (WSA881X_IS_2_0(wsa881x->version)) {
640 snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_CAL,
641 0x01, 0x01);
642 usleep_range(1000, 1010);
643 snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_CAL,
644 0x01, 0x00);
645 msleep(20);
646 snd_soc_update_bits(codec, WSA881X_ANA_CTL,
647 0x03, 0x00);
648 usleep_range(200, 210);
649 }
650 snd_soc_update_bits(codec, WSA881X_SPKR_DRV_EN, 0x80, 0x00);
651 }
652 return 0;
653}
654
655static int wsa881x_get_boost(struct snd_kcontrol *kcontrol,
656 struct snd_ctl_elem_value *ucontrol)
657{
658
659 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
660 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
661
662 ucontrol->value.integer.value[0] = wsa881x->boost_enable;
663 return 0;
664}
665
666static int wsa881x_set_boost(struct snd_kcontrol *kcontrol,
667 struct snd_ctl_elem_value *ucontrol)
668{
669 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
670 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
671 int value = ucontrol->value.integer.value[0];
672
673 dev_dbg(codec->dev, "%s: Boost enable current %d, new %d\n",
674 __func__, wsa881x->boost_enable, value);
675 wsa881x->boost_enable = value;
676 return 0;
677}
678
679static int wsa881x_get_visense(struct snd_kcontrol *kcontrol,
680 struct snd_ctl_elem_value *ucontrol)
681{
682
683 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
684 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
685
686 ucontrol->value.integer.value[0] = wsa881x->visense_enable;
687 return 0;
688}
689
690static int wsa881x_set_visense(struct snd_kcontrol *kcontrol,
691 struct snd_ctl_elem_value *ucontrol)
692{
693 struct snd_soc_codec *codec = snd_soc_kcontrol_codec(kcontrol);
694 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
695 int value = ucontrol->value.integer.value[0];
696
697 dev_dbg(codec->dev, "%s: VIsense enable current %d, new %d\n",
698 __func__, wsa881x->visense_enable, value);
699 wsa881x->visense_enable = value;
700 return 0;
701}
702
703static const struct snd_kcontrol_new wsa881x_snd_controls[] = {
704 SOC_SINGLE_EXT("BOOST Switch", SND_SOC_NOPM, 0, 1, 0,
705 wsa881x_get_boost, wsa881x_set_boost),
706
707 SOC_SINGLE_EXT("VISENSE Switch", SND_SOC_NOPM, 0, 1, 0,
708 wsa881x_get_visense, wsa881x_set_visense),
709
710 SOC_ENUM_EXT("WSA_SPK PA Gain", wsa881x_spk_pa_gain_enum[0],
711 wsa881x_spk_pa_gain_get, wsa881x_spk_pa_gain_put),
712};
713
714static const char * const rdac_text[] = {
715 "ZERO", "Switch",
716};
717
718static const struct soc_enum rdac_enum =
719 SOC_ENUM_SINGLE(0, 0, ARRAY_SIZE(rdac_text), rdac_text);
720
721static const struct snd_kcontrol_new rdac_mux[] = {
722 SOC_DAPM_ENUM("RDAC", rdac_enum)
723};
724
725static int wsa881x_rdac_event(struct snd_soc_dapm_widget *w,
726 struct snd_kcontrol *kcontrol, int event)
727{
728 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
729 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
730 int ret = 0;
731
732 dev_dbg(codec->dev, "%s: %s %d boost %d visense %d\n",
733 __func__, w->name, event,
734 wsa881x->boost_enable, wsa881x->visense_enable);
735
736 switch (event) {
737 case SND_SOC_DAPM_PRE_PMU:
738 ret = wsa881x_startup(wsa881x);
739 if (ret) {
740 pr_err("%s: wsa startup failed ret: %d", __func__, ret);
741 return ret;
742 }
743 wsa881x_clk_ctrl(codec, true);
744 snd_soc_update_bits(codec, WSA881X_SPKR_DAC_CTL, 0x02, 0x02);
745 if (!WSA881X_IS_2_0(wsa881x->version))
746 snd_soc_update_bits(codec, WSA881X_BIAS_REF_CTRL,
747 0x0F, 0x08);
748 wsa881x_bandgap_ctrl(codec, true);
749 if (!WSA881X_IS_2_0(wsa881x->version))
750 snd_soc_update_bits(codec, WSA881X_SPKR_BBM_CTL,
751 0x02, 0x02);
752 snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0xC0, 0x80);
753 snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL1, 0x06, 0x06);
754 if (!WSA881X_IS_2_0(wsa881x->version)) {
755 snd_soc_update_bits(codec, WSA881X_SPKR_MISC_CTL2,
756 0x04, 0x04);
757 snd_soc_update_bits(codec, WSA881X_SPKR_BIAS_INT,
758 0x09, 0x09);
759 }
760 snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT, 0xF0, 0x20);
761 if (WSA881X_IS_2_0(wsa881x->version))
762 snd_soc_update_bits(codec, WSA881X_SPKR_PA_INT,
763 0x0E, 0x0E);
764 if (wsa881x->boost_enable)
765 wsa881x_boost_ctrl(codec, true);
766 break;
767 case SND_SOC_DAPM_POST_PMU:
768 wsa881x_rdac_ctrl(codec, true);
769 break;
770 case SND_SOC_DAPM_PRE_PMD:
771 wsa881x_rdac_ctrl(codec, false);
772 if (wsa881x->visense_enable) {
773 wsa881x_visense_adc_ctrl(codec, false);
774 wsa881x_visense_txfe_ctrl(codec, false,
775 0x00, 0x01, 0x00);
776 ret = msm_cdc_pinctrl_select_sleep_state(
777 wsa881x->wsa_vi_gpio_p);
778 if (ret) {
779 pr_err("%s: gpio set cannot be suspended %s\n",
780 __func__, "wsa_vi");
781 return ret;
782 }
783 }
784 break;
785 case SND_SOC_DAPM_POST_PMD:
786 if (wsa881x->boost_enable)
787 wsa881x_boost_ctrl(codec, false);
788 wsa881x_clk_ctrl(codec, false);
789 wsa881x_bandgap_ctrl(codec, false);
790 ret = wsa881x_shutdown(wsa881x);
791 if (ret < 0) {
792 pr_err("%s: wsa shutdown failed ret: %d",
793 __func__, ret);
794 return ret;
795 }
796 break;
797 default:
798 pr_err("%s: invalid event:%d\n", __func__, event);
799 return -EINVAL;
800 }
801 return 0;
802}
803
804static void wsa881x_ocp_ctl_work(struct work_struct *work)
805{
806 struct wsa881x_pdata *wsa881x;
807 struct delayed_work *dwork;
808 struct snd_soc_codec *codec;
809 int temp_val;
810
811 dwork = to_delayed_work(work);
812 wsa881x = container_of(dwork, struct wsa881x_pdata, ocp_ctl_work);
813
814 if (!wsa881x)
815 return;
816
817 codec = wsa881x->codec;
818 wsa881x_get_temp(wsa881x->tz_pdata.tz_dev, &temp_val);
819 dev_dbg(codec->dev, " temp = %d\n", temp_val);
820
821 if (temp_val <= WSA881X_OCP_CTL_TEMP_CELSIUS)
822 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x00);
823 else
824 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0);
825
Sachin Mohan Gadag1afa1bb2018-03-20 20:23:44 +0530826 schedule_delayed_work(&wsa881x->ocp_ctl_work,
Soumya Managoli7a258f02018-02-23 12:57:32 +0530827 msecs_to_jiffies(wsa881x_ocp_poll_timer_sec * 1000));
828}
829
830static int wsa881x_spkr_pa_event(struct snd_soc_dapm_widget *w,
831 struct snd_kcontrol *kcontrol, int event)
832{
833 struct snd_soc_codec *codec = snd_soc_dapm_to_codec(w->dapm);
834 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
835
836 pr_debug("%s: %s %d\n", __func__, w->name, event);
837
838 switch (event) {
839 case SND_SOC_DAPM_PRE_PMU:
840 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0x80);
841 break;
842 case SND_SOC_DAPM_POST_PMU:
843 wsa881x_spkr_pa_ctrl(codec, true);
844 schedule_delayed_work(&wsa881x->ocp_ctl_work,
845 msecs_to_jiffies(WSA881X_OCP_CTL_TIMER_SEC * 1000));
846 break;
847 case SND_SOC_DAPM_PRE_PMD:
848 wsa881x_spkr_pa_ctrl(codec, false);
849 break;
850 case SND_SOC_DAPM_POST_PMD:
851 cancel_delayed_work_sync(&wsa881x->ocp_ctl_work);
852 snd_soc_update_bits(codec, WSA881X_SPKR_OCP_CTL, 0xC0, 0xC0);
853 break;
854 default:
855 pr_err("%s: invalid event:%d\n", __func__, event);
856 return -EINVAL;
857 }
858 return 0;
859}
860
861
862static const struct snd_soc_dapm_widget wsa881x_dapm_widgets[] = {
863 SND_SOC_DAPM_INPUT("WSA_IN"),
864
865 SND_SOC_DAPM_DAC_E("RDAC Analog", NULL, SND_SOC_NOPM, 0, 0,
866 wsa881x_rdac_event,
867 SND_SOC_DAPM_PRE_PMU | SND_SOC_DAPM_POST_PMU |
868 SND_SOC_DAPM_PRE_PMD | SND_SOC_DAPM_POST_PMD),
869
870 SND_SOC_DAPM_MUX("WSA_RDAC", SND_SOC_NOPM, 0, 0,
871 rdac_mux),
872
873 SND_SOC_DAPM_PGA_S("WSA_SPKR PGA", 1, SND_SOC_NOPM, 0, 0,
874 wsa881x_spkr_pa_event,
875 SND_SOC_DAPM_PRE_PMU |
876 SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_PRE_PMD |
877 SND_SOC_DAPM_POST_PMD),
878
879 SND_SOC_DAPM_OUTPUT("WSA_SPKR"),
880};
881
882static const struct snd_soc_dapm_route wsa881x_audio_map[] = {
883 {"WSA_RDAC", "Switch", "WSA_IN"},
884 {"RDAC Analog", NULL, "WSA_RDAC"},
885 {"WSA_SPKR PGA", NULL, "RDAC Analog"},
886 {"WSA_SPKR", NULL, "WSA_SPKR PGA"},
887};
888
889
890static int wsa881x_startup(struct wsa881x_pdata *pdata)
891{
892 int ret = 0;
893 struct snd_soc_codec *codec = pdata->codec;
894 struct snd_soc_card *card = codec->component.card;
895
896 pr_debug("%s(): wsa startup, enable_cnt:%d\n", __func__,
897 pdata->enable_cnt);
898
899 if (pdata->enable_cnt++ > 0)
900 return 0;
901 ret = msm_cdc_pinctrl_select_active_state(pdata->wsa_clk_gpio_p);
902 if (ret) {
903 pr_err("%s: gpio set cannot be activated %s\n",
904 __func__, "wsa_clk");
905 return ret;
906 }
907 if (pdata->enable_mclk) {
908 ret = pdata->enable_mclk(card, true);
909 if (ret < 0) {
910 dev_err_ratelimited(codec->dev,
911 "%s: mclk enable failed %d\n",
912 __func__, ret);
913 return ret;
914 }
915 }
916 ret = wsa881x_reset(pdata, true);
917 return ret;
918}
919
920static int wsa881x_shutdown(struct wsa881x_pdata *pdata)
921{
922 int ret = 0;
923 struct snd_soc_codec *codec = pdata->codec;
924 struct snd_soc_card *card = codec->component.card;
925
926 pr_debug("%s(): wsa shutdown, enable_cnt:%d\n", __func__,
927 pdata->enable_cnt);
928 if (--pdata->enable_cnt > 0)
929 return 0;
930 ret = wsa881x_reset(pdata, false);
931 if (ret) {
932 pr_err("%s: wsa reset failed suspend %d\n",
933 __func__, ret);
934 return ret;
935 }
936
937 if (pdata->enable_mclk) {
938 ret = pdata->enable_mclk(card, false);
939 if (ret < 0) {
940 pr_err("%s: mclk disable failed %d\n",
941 __func__, ret);
942 return ret;
943 }
944 }
945
946 ret = msm_cdc_pinctrl_select_sleep_state(pdata->wsa_clk_gpio_p);
947 if (ret) {
948 pr_err("%s: gpio set cannot be suspended %s\n",
949 __func__, "wsa_clk");
950 return ret;
951 }
952
953 return 0;
954}
955
956static int32_t wsa881x_resource_acquire(struct snd_soc_codec *codec,
957 bool enable)
958{
959 int ret = 0;
960 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
961
962 if (enable) {
963 ret = wsa881x_startup(wsa881x);
964 if (ret < 0) {
965 dev_err_ratelimited(codec->dev,
966 "%s: failed to startup\n", __func__);
967 return ret;
968 }
969 }
970 wsa881x_clk_ctrl(codec, enable);
971 wsa881x_bandgap_ctrl(codec, enable);
972 if (!enable) {
973 ret = wsa881x_shutdown(wsa881x);
974 if (ret < 0)
975 dev_err_ratelimited(codec->dev,
976 "%s: failed to shutdown\n", __func__);
977 }
978 return ret;
979}
980
981static int32_t wsa881x_temp_reg_read(struct snd_soc_codec *codec,
982 struct wsa_temp_register *wsa_temp_reg)
983{
984 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
985 int ret = 0;
986
987 if (!wsa881x) {
988 dev_err(codec->dev, "%s: wsa881x is NULL\n", __func__);
989 return -EINVAL;
990 }
991 ret = wsa881x_resource_acquire(codec, true);
992 if (ret) {
993 dev_err_ratelimited(codec->dev,
994 "%s: resource acquire fail\n", __func__);
995 return ret;
996 }
997
998 if (WSA881X_IS_2_0(wsa881x->version)) {
999 snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x00);
1000 wsa_temp_reg->dmeas_msb = snd_soc_read(codec, WSA881X_TEMP_MSB);
1001 wsa_temp_reg->dmeas_lsb = snd_soc_read(codec, WSA881X_TEMP_LSB);
1002 snd_soc_update_bits(codec, WSA881X_TADC_VALUE_CTL, 0x01, 0x01);
1003 } else {
1004 wsa_temp_reg->dmeas_msb = snd_soc_read(codec,
1005 WSA881X_TEMP_DOUT_MSB);
1006 wsa_temp_reg->dmeas_lsb = snd_soc_read(codec,
1007 WSA881X_TEMP_DOUT_LSB);
1008 }
1009 wsa_temp_reg->d1_msb = snd_soc_read(codec, WSA881X_OTP_REG_1);
1010 wsa_temp_reg->d1_lsb = snd_soc_read(codec, WSA881X_OTP_REG_2);
1011 wsa_temp_reg->d2_msb = snd_soc_read(codec, WSA881X_OTP_REG_3);
1012 wsa_temp_reg->d2_lsb = snd_soc_read(codec, WSA881X_OTP_REG_4);
1013
1014 ret = wsa881x_resource_acquire(codec, false);
1015 if (ret)
1016 dev_err_ratelimited(codec->dev,
1017 "%s: resource release fail\n", __func__);
1018
1019 return ret;
1020}
1021
1022static int wsa881x_probe(struct snd_soc_codec *codec)
1023{
1024 struct i2c_client *client;
1025 int ret = 0;
1026 int wsa881x_index = 0;
1027 struct snd_soc_dapm_context *dapm = snd_soc_codec_get_dapm(codec);
1028 char *widget_name = NULL;
1029 struct snd_soc_card *card = codec->component.card;
1030 struct snd_soc_codec_conf *codec_conf = card->codec_conf;
1031
1032 client = dev_get_drvdata(codec->dev);
1033 ret = wsa881x_i2c_get_client_index(client, &wsa881x_index);
1034 if (ret != 0) {
1035 dev_err(&client->dev, "%s: I2C get codec I2C\n"
1036 "client failed\n", __func__);
1037 return ret;
1038 }
1039 mutex_init(&wsa_pdata[wsa881x_index].bg_lock);
1040 mutex_init(&wsa_pdata[wsa881x_index].res_lock);
1041 snprintf(wsa_pdata[wsa881x_index].tz_pdata.name, 100, "%s",
1042 wsa_tz_names[wsa881x_index]);
1043 wsa_pdata[wsa881x_index].codec = codec;
1044 wsa_pdata[wsa881x_index].spk_pa_gain = SPK_GAIN_12DB;
1045 wsa_pdata[wsa881x_index].codec = codec;
1046 wsa_pdata[wsa881x_index].tz_pdata.codec = codec;
1047 wsa_pdata[wsa881x_index].tz_pdata.wsa_temp_reg_read =
1048 wsa881x_temp_reg_read;
1049 snd_soc_codec_set_drvdata(codec, &wsa_pdata[wsa881x_index]);
1050 wsa881x_init_thermal(&wsa_pdata[wsa881x_index].tz_pdata);
1051 INIT_DELAYED_WORK(&wsa_pdata[wsa881x_index].ocp_ctl_work,
1052 wsa881x_ocp_ctl_work);
1053
1054 if (codec_conf->name_prefix) {
1055 widget_name = kcalloc(WIDGET_NAME_MAX_SIZE, sizeof(char),
1056 GFP_KERNEL);
1057 if (!widget_name)
1058 return -ENOMEM;
1059
1060 snprintf(widget_name, WIDGET_NAME_MAX_SIZE,
1061 "%s WSA_SPKR", codec_conf->name_prefix);
1062 snd_soc_dapm_ignore_suspend(dapm, widget_name);
1063 snprintf(widget_name, WIDGET_NAME_MAX_SIZE,
1064 "%s WSA_IN", codec_conf->name_prefix);
1065 snd_soc_dapm_ignore_suspend(dapm, widget_name);
1066 kfree(widget_name);
1067 } else {
1068 snd_soc_dapm_ignore_suspend(dapm, "WSA_SPKR");
1069 snd_soc_dapm_ignore_suspend(dapm, "WSA_IN");
1070 }
1071
1072 snd_soc_dapm_sync(dapm);
1073 return 0;
1074}
1075
1076static int wsa881x_remove(struct snd_soc_codec *codec)
1077{
1078 struct wsa881x_pdata *wsa881x = snd_soc_codec_get_drvdata(codec);
1079
1080 if (wsa881x->tz_pdata.tz_dev)
1081 wsa881x_deinit_thermal(wsa881x->tz_pdata.tz_dev);
1082
1083 mutex_destroy(&wsa881x->bg_lock);
1084 mutex_destroy(&wsa881x->res_lock);
1085 return 0;
1086}
1087
1088static struct snd_soc_codec_driver soc_codec_dev_wsa881x = {
1089 .probe = wsa881x_probe,
1090 .remove = wsa881x_remove,
1091
1092 .read = wsa881x_i2c_read,
1093 .write = wsa881x_i2c_write,
1094
1095 .reg_cache_size = WSA881X_CACHE_SIZE,
1096 .reg_cache_default = wsa881x_ana_reg_defaults,
1097 .reg_word_size = 1,
1098
1099 .component_driver = {
1100 .controls = wsa881x_snd_controls,
1101 .num_controls = ARRAY_SIZE(wsa881x_snd_controls),
1102 .dapm_widgets = wsa881x_dapm_widgets,
1103 .num_dapm_widgets = ARRAY_SIZE(wsa881x_dapm_widgets),
1104 .dapm_routes = wsa881x_audio_map,
1105 .num_dapm_routes = ARRAY_SIZE(wsa881x_audio_map),
1106 },
1107};
1108
1109static int wsa881x_reset(struct wsa881x_pdata *pdata, bool enable)
1110{
1111 int ret = 0;
1112
1113 /*
1114 * shutdown the GPIOs WSA_EN, WSA_MCLK, regulators
1115 * and restore defaults in soc cache when shutdown.
1116 * Enable regulators, GPIOs WSA_MCLK, WSA_EN when powerup.
1117 */
1118 if (enable) {
1119 if (pdata->wsa_active)
1120 return 0;
1121 ret = msm_cdc_pinctrl_select_active_state(
1122 pdata->wsa_reset_gpio_p);
1123 if (ret) {
1124 pr_err("%s: gpio set cannot be activated %s\n",
1125 __func__, "wsa_reset");
1126 return ret;
1127 }
1128 ret = msm_cdc_pinctrl_select_sleep_state(
1129 pdata->wsa_reset_gpio_p);
1130 if (ret) {
1131 pr_err("%s: gpio set cannot be suspended(powerup) %s\n",
1132 __func__, "wsa_reset");
1133 return ret;
1134 }
1135 ret = msm_cdc_pinctrl_select_active_state(
1136 pdata->wsa_reset_gpio_p);
1137 if (ret) {
1138 pr_err("%s: gpio set cannot be activated %s\n",
1139 __func__, "wsa_reset");
1140 return ret;
1141 }
1142 pdata->wsa_active = true;
1143 } else {
1144 if (!pdata->wsa_active)
1145 return 0;
1146 ret = msm_cdc_pinctrl_select_sleep_state(
1147 pdata->wsa_reset_gpio_p);
1148 if (ret) {
1149 pr_err("%s: gpio set cannot be suspended %s\n",
1150 __func__, "wsa_reset");
1151 return ret;
1152 }
1153 pdata->wsa_active = false;
1154 }
1155 return ret;
1156}
1157
1158int wsa881x_get_client_index(void)
1159{
1160 return wsa881x_i2c_addr;
1161}
1162EXPORT_SYMBOL(wsa881x_get_client_index);
1163
1164int wsa881x_get_probing_count(void)
1165{
1166 return wsa881x_probing_count;
1167}
1168EXPORT_SYMBOL(wsa881x_get_probing_count);
1169
1170int wsa881x_get_presence_count(void)
1171{
1172 return wsa881x_presence_count;
1173}
1174EXPORT_SYMBOL(wsa881x_get_presence_count);
1175
1176int wsa881x_set_mclk_callback(
1177 int (*enable_mclk_callback)(struct snd_soc_card *, bool))
1178{
1179 int i;
1180
1181 for (i = 0; i < MAX_WSA881X_DEVICE; i++) {
1182 if (wsa_pdata[i].status == WSA881X_STATUS_I2C)
1183 wsa_pdata[i].enable_mclk = enable_mclk_callback;
1184 }
1185 return 0;
1186}
1187EXPORT_SYMBOL(wsa881x_set_mclk_callback);
1188
1189static int check_wsa881x_presence(struct i2c_client *client)
1190{
1191 int ret = 0;
1192 int wsa881x_index = 0;
1193
1194 ret = wsa881x_i2c_get_client_index(client, &wsa881x_index);
1195 if (ret != 0) {
1196 dev_err(&client->dev, "%s: I2C get codec I2C\n"
1197 "client failed\n", __func__);
1198 return ret;
1199 }
1200 ret = wsa881x_i2c_read_device(&wsa_pdata[wsa881x_index],
1201 WSA881X_CDC_RST_CTL);
1202 if (ret < 0) {
1203 dev_err(&client->dev, "failed to read wsa881x with addr %x\n",
1204 client->addr);
1205 return ret;
1206 }
1207 ret = wsa881x_i2c_write_device(&wsa_pdata[wsa881x_index],
1208 WSA881X_CDC_RST_CTL, 0x01);
1209 if (ret < 0) {
1210 dev_err(&client->dev, "failed write addr %x reg:0x5 val:0x1\n",
1211 client->addr);
1212 return ret;
1213 }
1214 /* allow 20ms before trigger next write to verify wsa881x presence */
1215 msleep(20);
1216 ret = wsa881x_i2c_write_device(&wsa_pdata[wsa881x_index],
1217 WSA881X_CDC_RST_CTL, 0x00);
1218 if (ret < 0) {
1219 dev_err(&client->dev, "failed write addr %x reg:0x5 val:0x0\n",
1220 client->addr);
1221 return ret;
1222 }
1223 return ret;
1224}
1225
1226static int wsa881x_populate_dt_pdata(struct device *dev, int wsa881x_index)
1227{
1228 int ret = 0;
1229 struct wsa881x_pdata *pdata = &wsa_pdata[wsa881x_index];
1230 /* reading the gpio configurations from dtsi file */
1231 pdata->wsa_vi_gpio_p = of_parse_phandle(dev->of_node,
1232 "qcom,wsa-analog-vi-gpio", 0);
1233 pdata->wsa_clk_gpio_p = of_parse_phandle(dev->of_node,
1234 "qcom,wsa-analog-clk-gpio", 0);
1235 pdata->wsa_reset_gpio_p = of_parse_phandle(dev->of_node,
1236 "qcom,wsa-analog-reset-gpio", 0);
1237 pinctrl_init = true;
1238 return ret;
1239}
1240
1241static int wsa881x_i2c_probe(struct i2c_client *client,
1242 const struct i2c_device_id *id)
1243{
1244 int ret = 0;
1245 int wsa881x_index = 0;
1246 struct wsa881x_pdata *pdata = NULL;
1247
1248 ret = wsa881x_i2c_get_client_index(client, &wsa881x_index);
1249 if (ret != 0) {
1250 dev_err(&client->dev, "%s: I2C get codec I2C\n"
1251 "client failed\n", __func__);
1252 return ret;
1253 }
1254
1255 pdata = &wsa_pdata[wsa881x_index];
1256 if ((client->addr == WSA881X_I2C_SPK0_SLAVE1_ADDR ||
1257 client->addr == WSA881X_I2C_SPK1_SLAVE1_ADDR) &&
1258 (pdata->status == WSA881X_STATUS_PROBING)) {
1259 wsa881x_probing_count++;
1260 return ret;
1261 }
1262
1263 if (pdata->status == WSA881X_STATUS_I2C) {
1264 dev_dbg(&client->dev, "%s:probe for other slaves\n"
1265 "devices of codec I2C slave Addr = %x\n",
1266 __func__, client->addr);
1267 dev_dbg(&client->dev, "%s:wsa_idx = %d SLAVE = %d\n",
1268 __func__, wsa881x_index, WSA881X_ANALOG_SLAVE);
1269 pdata->regmap[WSA881X_ANALOG_SLAVE] =
1270 devm_regmap_init_i2c(
1271 client,
1272 &wsa881x_ana_regmap_config[WSA881X_ANALOG_SLAVE]);
1273 regcache_cache_bypass(pdata->regmap[WSA881X_ANALOG_SLAVE],
1274 true);
1275 if (IS_ERR(pdata->regmap[WSA881X_ANALOG_SLAVE])) {
1276 ret = PTR_ERR(pdata->regmap[WSA881X_ANALOG_SLAVE]);
1277 dev_err(&client->dev,
1278 "%s: regmap_init failed %d\n",
1279 __func__, ret);
1280 }
1281 client->dev.platform_data = pdata;
1282 i2c_set_clientdata(client, pdata);
1283 pdata->client[WSA881X_ANALOG_SLAVE] = client;
1284 if (pdata->version == WSA881X_2_0)
1285 wsa881x_update_regmap_2_0(
1286 pdata->regmap[WSA881X_ANALOG_SLAVE],
1287 WSA881X_ANALOG_SLAVE);
1288
1289 wsa881x_probing_count++;
1290 return ret;
1291 } else if (pdata->status == WSA881X_STATUS_PROBING) {
1292 pdata->index = wsa881x_index;
1293 if (client->dev.of_node) {
1294 dev_dbg(&client->dev, "%s:Platform data\n"
1295 "from device tree\n", __func__);
1296 ret = wsa881x_populate_dt_pdata(
1297 &client->dev, wsa881x_index);
1298 if (ret < 0) {
1299 dev_err(&client->dev,
1300 "%s: Fail to obtain pdata from device tree\n",
1301 __func__);
1302 ret = -EINVAL;
1303 goto err;
1304 }
1305 client->dev.platform_data = pdata;
1306 } else {
1307 dev_dbg(&client->dev, "%s:Platform data from\n"
1308 "board file\n", __func__);
1309 pdata = client->dev.platform_data;
1310 }
1311 if (!pdata) {
1312 dev_dbg(&client->dev, "no platform data?\n");
1313 ret = -EINVAL;
1314 goto err;
1315 }
1316 dev_set_drvdata(&client->dev, client);
1317
1318 pdata->regmap[WSA881X_DIGITAL_SLAVE] =
1319 devm_regmap_init_i2c(
1320 client,
1321 &wsa881x_ana_regmap_config[WSA881X_DIGITAL_SLAVE]);
1322 regcache_cache_bypass(pdata->regmap[WSA881X_DIGITAL_SLAVE],
1323 true);
1324 if (IS_ERR(pdata->regmap[WSA881X_DIGITAL_SLAVE])) {
1325 ret = PTR_ERR(pdata->regmap[WSA881X_DIGITAL_SLAVE]);
1326 dev_err(&client->dev, "%s: regmap_init failed %d\n",
1327 __func__, ret);
1328 goto err;
1329 }
1330 /* bus reset sequence */
1331 ret = wsa881x_reset(pdata, true);
1332 if (ret < 0) {
1333 wsa881x_probing_count++;
1334 dev_err(&client->dev, "%s: WSA enable Failed %d\n",
1335 __func__, ret);
1336 goto err;
1337 }
1338 pdata->client[WSA881X_DIGITAL_SLAVE] = client;
1339 pdata->regmap_flag = true;
1340 ret = check_wsa881x_presence(client);
1341 if (ret < 0) {
1342 dev_err(&client->dev,
1343 "failed to ping wsa with addr:%x, ret = %d\n",
1344 client->addr, ret);
1345 wsa881x_probing_count++;
1346 goto err1;
1347 }
1348 pdata->version = wsa881x_i2c_read_device(pdata,
1349 WSA881X_CHIP_ID1);
1350 pr_debug("%s: wsa881x version: %d\n", __func__, pdata->version);
1351 if (pdata->version == WSA881X_2_0) {
1352 wsa881x_update_reg_defaults_2_0();
1353 wsa881x_update_regmap_2_0(
1354 pdata->regmap[WSA881X_DIGITAL_SLAVE],
1355 WSA881X_DIGITAL_SLAVE);
1356 }
1357 wsa881x_presence_count++;
1358 wsa881x_probing_count++;
1359 ret = snd_soc_register_codec(&client->dev,
1360 &soc_codec_dev_wsa881x,
1361 NULL, 0);
1362 if (ret < 0)
1363 goto err1;
1364 pdata->status = WSA881X_STATUS_I2C;
1365 }
1366err1:
1367 wsa881x_reset(pdata, false);
1368err:
1369 return 0;
1370}
1371
1372static int wsa881x_i2c_remove(struct i2c_client *client)
1373{
1374 struct wsa881x_pdata *wsa881x = client->dev.platform_data;
1375
1376 snd_soc_unregister_codec(&client->dev);
1377 i2c_set_clientdata(client, NULL);
1378 kfree(wsa881x);
1379 return 0;
1380}
1381
1382#ifdef CONFIG_PM_SLEEP
1383static int wsa881x_i2c_suspend(struct device *dev)
1384{
1385 pr_debug("%s: system suspend\n", __func__);
1386 return 0;
1387}
1388
1389static int wsa881x_i2c_resume(struct device *dev)
1390{
1391 pr_debug("%s: system resume\n", __func__);
1392 return 0;
1393}
1394
1395static const struct dev_pm_ops wsa881x_i2c_pm_ops = {
1396 SET_SYSTEM_SLEEP_PM_OPS(wsa881x_i2c_suspend, wsa881x_i2c_resume)
1397};
1398#endif /* CONFIG_PM_SLEEP */
1399
1400static const struct i2c_device_id wsa881x_i2c_id[] = {
1401 {"wsa881x-i2c-dev", WSA881X_I2C_SPK0_SLAVE0_ADDR},
1402 {"wsa881x-i2c-dev", WSA881X_I2C_SPK0_SLAVE1_ADDR},
1403 {"wsa881x-i2c-dev", WSA881X_I2C_SPK1_SLAVE0_ADDR},
1404 {"wsa881x-i2c-dev", WSA881X_I2C_SPK1_SLAVE1_ADDR},
1405 {}
1406};
1407
1408MODULE_DEVICE_TABLE(i2c, wsa881x_i2c_id);
1409
1410
1411static const struct of_device_id msm_match_table[] = {
1412 {.compatible = "qcom,wsa881x-i2c-codec"},
1413 {}
1414};
1415MODULE_DEVICE_TABLE(of, msm_match_table);
1416
1417static struct i2c_driver wsa881x_codec_driver = {
1418 .driver = {
1419 .name = "wsa881x-i2c-codec",
1420 .owner = THIS_MODULE,
1421 .probe_type = PROBE_PREFER_ASYNCHRONOUS,
1422#ifdef CONFIG_PM_SLEEP
1423 .pm = &wsa881x_i2c_pm_ops,
1424#endif
1425 .of_match_table = msm_match_table,
1426 },
1427 .id_table = wsa881x_i2c_id,
1428 .probe = wsa881x_i2c_probe,
1429 .remove = wsa881x_i2c_remove,
1430};
1431
1432static int __init wsa881x_codec_init(void)
1433{
1434 int i = 0;
1435
1436 for (i = 0; i < MAX_WSA881X_DEVICE; i++)
1437 wsa_pdata[i].status = WSA881X_STATUS_PROBING;
1438 return i2c_add_driver(&wsa881x_codec_driver);
1439}
1440module_init(wsa881x_codec_init);
1441
1442static void __exit wsa881x_codec_exit(void)
1443{
1444 i2c_del_driver(&wsa881x_codec_driver);
1445}
1446
1447module_exit(wsa881x_codec_exit);
1448
1449MODULE_DESCRIPTION("WSA881x Codec driver");
1450MODULE_LICENSE("GPL v2");