wsa881x-analog.c 40 KB

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