msm_common.c 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900
  1. /* Copyright (c) 2020-2021, 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. #include <linux/gpio.h>
  13. #include <linux/of_gpio.h>
  14. #include <linux/platform_device.h>
  15. #include <linux/slab.h>
  16. #include <linux/of_device.h>
  17. #include <sound/control.h>
  18. #include <sound/core.h>
  19. #include <sound/soc.h>
  20. #include <sound/pcm_params.h>
  21. #include <asoc/msm-cdc-pinctrl.h>
  22. #include <dsp/spf-core.h>
  23. #include <dsp/msm_audio_ion.h>
  24. #include <sound/info.h>
  25. #include <dsp/audio_prm.h>
  26. #include <dsp/digital-cdc-rsc-mgr.h>
  27. #include "msm_common.h"
  28. struct snd_card_pdata {
  29. struct kobject snd_card_kobj;
  30. int card_status;
  31. }*snd_card_pdata;
  32. #define to_asoc_mach_common_pdata(kobj) \
  33. container_of((kobj), struct msm_common_pdata, aud_dev_kobj)
  34. #define DEVICE_ENABLE 1
  35. #define DEVICE_DISABLE 0
  36. #define ARRAY_SZ 21
  37. #define BUF_SZ 32
  38. #define DIR_SZ 10
  39. #define MAX_CODEC_DAI 8
  40. #define TDM_SLOT_WIDTH_BITS 32
  41. #define TDM_MAX_SLOTS 8
  42. #define MI2S_NUM_CHANNELS 2
  43. #define SAMPLING_RATE_44P1KHZ 44100
  44. #define SAMPLING_RATE_88P2KHZ 88200
  45. #define SAMPLING_RATE_176P4KHZ 176400
  46. #define SAMPLING_RATE_352P8KHZ 352800
  47. static struct attribute device_state_attr = {
  48. .name = "state",
  49. .mode = 0660,
  50. };
  51. static struct attribute card_state_attr = {
  52. .name = "card_state",
  53. .mode = 0660,
  54. };
  55. #define MAX_PORT 20
  56. #define CODEC_CHMAP "Channel Map"
  57. enum backend_id {
  58. SLIM = 1,
  59. CODEC_DMA,
  60. };
  61. struct chmap_pdata {
  62. int id;
  63. uint32_t num_codec_dai;
  64. struct snd_soc_dai *dai[MAX_CODEC_DAI];
  65. };
  66. #define MAX_USR_INPUT 10
  67. static ssize_t aud_dev_sysfs_store(struct kobject *kobj,
  68. struct attribute *attr,
  69. const char *buf, size_t count)
  70. {
  71. ssize_t ret = -EINVAL;
  72. struct msm_common_pdata *pdata = to_asoc_mach_common_pdata(kobj);
  73. uint32_t pcm_id, state = 0;
  74. if (count > MAX_USR_INPUT) {
  75. pr_err("%s: invalid string written", __func__);
  76. goto done;
  77. }
  78. sscanf(buf, "%d %d", &pcm_id, &state);
  79. if ((pcm_id > pdata->num_aud_devs) || (pcm_id < 0)) {
  80. pr_err("%s: invalid pcm id %d \n", __func__, pcm_id);
  81. goto done;
  82. }
  83. if ((state > DEVICE_ENABLE) || (state < DEVICE_DISABLE)) {
  84. pr_err("%s: invalid state %d \n", __func__, state);
  85. goto done;
  86. }
  87. pr_debug("%s: pcm_id %d state %d \n", __func__, pcm_id, state);
  88. pdata->aud_dev_state[pcm_id] = state;
  89. if ( state == DEVICE_ENABLE && (pdata->dsp_sessions_closed != 0))
  90. pdata->dsp_sessions_closed = 0;
  91. ret = count;
  92. done:
  93. return ret;
  94. }
  95. static const struct sysfs_ops aud_dev_sysfs_ops = {
  96. .store = aud_dev_sysfs_store,
  97. };
  98. static struct kobj_type aud_dev_ktype = {
  99. .sysfs_ops = &aud_dev_sysfs_ops,
  100. };
  101. static int aud_dev_sysfs_init(struct msm_common_pdata *pdata)
  102. {
  103. int ret = 0;
  104. char dir[10] = "aud_dev";
  105. ret = kobject_init_and_add(&pdata->aud_dev_kobj, &aud_dev_ktype,
  106. kernel_kobj, dir);
  107. if (ret < 0) {
  108. pr_err("%s: Failed to add kobject %s, err = %d\n",
  109. __func__, dir, ret);
  110. goto done;
  111. }
  112. ret = sysfs_create_file(&pdata->aud_dev_kobj, &device_state_attr);
  113. if (ret < 0) {
  114. pr_err("%s: Failed to add wdsp_boot sysfs entry to %s\n",
  115. __func__, dir);
  116. goto fail_create_file;
  117. }
  118. return ret;
  119. fail_create_file:
  120. kobject_put(&pdata->aud_dev_kobj);
  121. done:
  122. return ret;
  123. }
  124. int snd_card_notify_user(int card_status)
  125. {
  126. snd_card_pdata->card_status = card_status;
  127. sysfs_notify(&snd_card_pdata->snd_card_kobj, NULL, "card_state");
  128. return 0;
  129. }
  130. static ssize_t snd_card_sysfs_show(struct kobject *kobj,
  131. struct attribute *attr, char *buf)
  132. {
  133. return snprintf(buf, BUF_SZ, "%d", snd_card_pdata->card_status);
  134. }
  135. static ssize_t snd_card_sysfs_store(struct kobject *kobj,
  136. struct attribute *attr, const char *buf, size_t count)
  137. {
  138. sscanf(buf, "%d", &snd_card_pdata->card_status);
  139. sysfs_notify(&snd_card_pdata->snd_card_kobj, NULL, "card_state");
  140. return 0;
  141. }
  142. static const struct sysfs_ops snd_card_sysfs_ops = {
  143. .show = snd_card_sysfs_show,
  144. .store = snd_card_sysfs_store,
  145. };
  146. static struct kobj_type snd_card_ktype = {
  147. .sysfs_ops = &snd_card_sysfs_ops,
  148. };
  149. int snd_card_sysfs_init(void)
  150. {
  151. int ret = 0;
  152. char dir[DIR_SZ] = "snd_card";
  153. snd_card_pdata = kcalloc(1, sizeof(struct snd_card_pdata), GFP_KERNEL);
  154. ret = kobject_init_and_add(&snd_card_pdata->snd_card_kobj, &snd_card_ktype,
  155. kernel_kobj, dir);
  156. if (ret < 0) {
  157. pr_err("%s: Failed to add kobject %s, err = %d\n",
  158. __func__, dir, ret);
  159. goto done;
  160. }
  161. ret = sysfs_create_file(&snd_card_pdata->snd_card_kobj, &card_state_attr);
  162. if (ret < 0) {
  163. pr_err("%s: Failed to add snd_card sysfs entry to %s\n",
  164. __func__, dir);
  165. goto fail_create_file;
  166. }
  167. return ret;
  168. fail_create_file:
  169. kobject_put(&snd_card_pdata->snd_card_kobj);
  170. done:
  171. return ret;
  172. }
  173. static void check_userspace_service_state(struct snd_soc_pcm_runtime *rtd,
  174. struct msm_common_pdata *pdata)
  175. {
  176. dev_info(rtd->card->dev,"%s: pcm_id %d state %d\n", __func__,
  177. rtd->num, pdata->aud_dev_state[rtd->num]);
  178. if (pdata->aud_dev_state[rtd->num] == DEVICE_ENABLE) {
  179. dev_info(rtd->card->dev, "%s userspace service crashed\n",
  180. __func__);
  181. if (pdata->dsp_sessions_closed == 0) {
  182. /*Issue close all graph cmd to DSP*/
  183. spf_core_apm_close_all();
  184. /*unmap all dma mapped buffers*/
  185. msm_audio_ion_crash_handler();
  186. pdata->dsp_sessions_closed = 1;
  187. }
  188. /*Reset the state as sysfs node wont be triggred*/
  189. pdata->aud_dev_state[rtd->num] = 0;
  190. }
  191. }
  192. static int get_intf_index(const char *stream_name)
  193. {
  194. if (strnstr(stream_name, "LPAIF_RXTX", strlen(stream_name)))
  195. return QUAT_MI2S_TDM_AUXPCM;
  196. else if (strnstr(stream_name, "LPAIF_WSA", strlen(stream_name)))
  197. return SEN_MI2S_TDM_AUXPCM;
  198. else if (strnstr(stream_name, "LPAIF_VA", strlen(stream_name)))
  199. return QUIN_MI2S_TDM_AUXPCM;
  200. else if (strnstr(stream_name, "LPAIF_AUD", strlen(stream_name)))
  201. return SEC_MI2S_TDM_AUXPCM;
  202. else if (strnstr(stream_name, "LPAIF", strlen(stream_name))) {
  203. if (strnstr(stream_name, "PRIMARY", strlen(stream_name)))
  204. return PRI_MI2S_TDM_AUXPCM;
  205. else if (strnstr(stream_name, "TERTIARY", strlen(stream_name)))
  206. return TER_MI2S_TDM_AUXPCM;
  207. }
  208. pr_debug("%s: stream name %s does not match\n", __func__, stream_name);
  209. return -EINVAL;
  210. }
  211. static bool is_fractional_sample_rate(unsigned int sample_rate)
  212. {
  213. switch (sample_rate) {
  214. case SAMPLING_RATE_44P1KHZ:
  215. case SAMPLING_RATE_88P2KHZ:
  216. case SAMPLING_RATE_176P4KHZ:
  217. case SAMPLING_RATE_352P8KHZ:
  218. return true;
  219. default:
  220. return false;
  221. }
  222. return false;
  223. }
  224. static int get_mi2s_clk_id(int index)
  225. {
  226. int clk_id;
  227. switch(index) {
  228. case PRI_MI2S_TDM_AUXPCM:
  229. clk_id = CLOCK_ID_PRI_MI2S_IBIT;
  230. break;
  231. case SEC_MI2S_TDM_AUXPCM:
  232. clk_id = CLOCK_ID_SEP_MI2S_IBIT;
  233. break;
  234. case TER_MI2S_TDM_AUXPCM:
  235. clk_id = CLOCK_ID_TER_MI2S_IBIT;
  236. break;
  237. case QUAT_MI2S_TDM_AUXPCM:
  238. clk_id = CLOCK_ID_QUAD_MI2S_IBIT;
  239. break;
  240. case QUIN_MI2S_TDM_AUXPCM:
  241. clk_id = CLOCK_ID_QUI_MI2S_IBIT;
  242. break;
  243. case SEN_MI2S_TDM_AUXPCM:
  244. clk_id = CLOCK_ID_SEN_MI2S_IBIT;
  245. break;
  246. default:
  247. pr_err("%s: Invalid interface index: %d\n", __func__, index);
  248. clk_id = -EINVAL;
  249. }
  250. pr_debug("%s: clk id: %d\n", __func__, clk_id);
  251. return clk_id;
  252. }
  253. static int get_tdm_clk_id(int index)
  254. {
  255. int clk_id;
  256. switch(index) {
  257. case PRI_MI2S_TDM_AUXPCM:
  258. clk_id = CLOCK_ID_PRI_TDM_IBIT;
  259. break;
  260. case SEC_MI2S_TDM_AUXPCM:
  261. clk_id = CLOCK_ID_SEP_TDM_IBIT;
  262. break;
  263. case TER_MI2S_TDM_AUXPCM:
  264. clk_id = CLOCK_ID_TER_TDM_IBIT;
  265. break;
  266. case QUAT_MI2S_TDM_AUXPCM:
  267. clk_id = CLOCK_ID_QUAD_TDM_IBIT;
  268. break;
  269. case QUIN_MI2S_TDM_AUXPCM:
  270. clk_id = CLOCK_ID_QUI_TDM_IBIT;
  271. break;
  272. case SEN_MI2S_TDM_AUXPCM:
  273. clk_id = CLOCK_ID_SEN_TDM_IBIT;
  274. break;
  275. default:
  276. pr_err("%s: Invalid interface index: %d\n", __func__, index);
  277. clk_id = -EINVAL;
  278. }
  279. pr_debug("%s: clk id: %d\n", __func__, clk_id);
  280. return clk_id;
  281. }
  282. int mi2s_tdm_hw_vote_req(struct msm_common_pdata *pdata, int enable)
  283. {
  284. int ret = 0;
  285. if (!pdata || (pdata->lpass_audio_hw_vote == NULL)) {
  286. pr_err("%s: pdata or lpass audio hw vote node NULL", __func__);
  287. return -EINVAL;
  288. }
  289. pr_debug("%s: lpass audio hw vote for fractional sample rate enable: %d\n",
  290. __func__, enable);
  291. if (enable) {
  292. if (atomic_read(&pdata->lpass_audio_hw_vote_ref_cnt) == 0) {
  293. ret = digital_cdc_rsc_mgr_hw_vote_enable(pdata->lpass_audio_hw_vote);
  294. if (ret < 0) {
  295. pr_err("%s lpass audio hw vote enable failed %d\n",
  296. __func__, ret);
  297. return ret;
  298. }
  299. }
  300. atomic_inc(&pdata->lpass_audio_hw_vote_ref_cnt);
  301. } else {
  302. atomic_dec(&pdata->lpass_audio_hw_vote_ref_cnt);
  303. if (atomic_read(&pdata->lpass_audio_hw_vote_ref_cnt) == 0)
  304. digital_cdc_rsc_mgr_hw_vote_disable(pdata->lpass_audio_hw_vote);
  305. else if (atomic_read(&pdata->lpass_audio_hw_vote_ref_cnt) < 0)
  306. atomic_set(&pdata->lpass_audio_hw_vote_ref_cnt, 0);
  307. }
  308. return ret;
  309. }
  310. int msm_common_snd_hw_params(struct snd_pcm_substream *substream,
  311. struct snd_pcm_hw_params *params)
  312. {
  313. int ret = 0;
  314. int slot_width = TDM_SLOT_WIDTH_BITS;
  315. int slots;
  316. int sample_width;
  317. unsigned int rate;
  318. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  319. const char *stream_name = rtd->dai_link->stream_name;
  320. struct snd_soc_card *card = rtd->card;
  321. struct msm_common_pdata *pdata = msm_common_get_pdata(card);
  322. int index = get_intf_index(stream_name);
  323. struct clk_cfg intf_clk_cfg;
  324. dev_dbg(rtd->card->dev,
  325. "%s: substream = %s stream = %d\n",
  326. __func__, substream->name, substream->stream);
  327. if (!pdata) {
  328. dev_err(rtd->card->dev, "%s: pdata is NULL\n", __func__);
  329. return -EINVAL;
  330. }
  331. if (index >= 0) {
  332. mutex_lock(&pdata->lock[index]);
  333. if (atomic_read(&pdata->lpass_intf_clk_ref_cnt[index]) == 0) {
  334. if ((strnstr(stream_name, "TDM", strlen(stream_name)))) {
  335. slots = pdata->tdm_max_slots;
  336. rate = params_rate(params);
  337. intf_clk_cfg.clk_id = get_tdm_clk_id(index);
  338. if (intf_clk_cfg.clk_id < 0) {
  339. ret = -EINVAL;
  340. pr_err("%s: Invalid tdm clk id %d", __func__,
  341. intf_clk_cfg.clk_id);
  342. goto done;
  343. }
  344. intf_clk_cfg.clk_freq_in_hz = rate * slot_width * slots;
  345. intf_clk_cfg.clk_attri = CLOCK_ATTRIBUTE_COUPLE_NO;
  346. intf_clk_cfg.clk_root = 0;
  347. if (pdata->is_audio_hw_vote_required[index] &&
  348. is_fractional_sample_rate(rate)) {
  349. ret = mi2s_tdm_hw_vote_req(pdata, 1);
  350. if (ret < 0) {
  351. pr_err("%s lpass audio hw vote enable failed %d\n",
  352. __func__, ret);
  353. goto done;
  354. }
  355. }
  356. pr_debug("%s: clk_id :%d clk freq %d\n", __func__,
  357. intf_clk_cfg.clk_id, intf_clk_cfg.clk_freq_in_hz);
  358. ret = audio_prm_set_lpass_clk_cfg(&intf_clk_cfg, 1);
  359. if (ret < 0) {
  360. pr_err("%s: prm lpass clk cfg set failed ret %d\n",
  361. __func__, ret);
  362. goto done;
  363. }
  364. } else if ((strnstr(stream_name, "MI2S", strlen(stream_name)))) {
  365. intf_clk_cfg.clk_id = get_mi2s_clk_id(index);
  366. if (intf_clk_cfg.clk_id < 0) {
  367. ret = -EINVAL;
  368. pr_err("%s: Invalid mi2s clk id %d", __func__,
  369. intf_clk_cfg.clk_id);
  370. goto done;
  371. }
  372. rate = params_rate(params);
  373. switch (params_format(params)) {
  374. case SNDRV_PCM_FORMAT_S24_LE:
  375. case SNDRV_PCM_FORMAT_S24_3LE:
  376. case SNDRV_PCM_FORMAT_S32_LE:
  377. sample_width = 32;
  378. break;
  379. case SNDRV_PCM_FORMAT_S16_LE:
  380. default:
  381. sample_width = 16;
  382. pr_debug("%s: bitwidth set to default : %d\n",
  383. __func__, sample_width);
  384. }
  385. intf_clk_cfg.clk_freq_in_hz = rate *
  386. MI2S_NUM_CHANNELS * sample_width;
  387. intf_clk_cfg.clk_attri = CLOCK_ATTRIBUTE_COUPLE_NO;
  388. intf_clk_cfg.clk_root = CLOCK_ROOT_DEFAULT;
  389. if (pdata->is_audio_hw_vote_required[index] &&
  390. is_fractional_sample_rate(rate)) {
  391. ret = mi2s_tdm_hw_vote_req(pdata, 1);
  392. if (ret < 0) {
  393. pr_err("%s lpass audio hw vote enable failed %d\n",
  394. __func__, ret);
  395. goto done;
  396. }
  397. }
  398. pr_debug("%s: mi2s clk_id :%d clk freq %d\n", __func__,
  399. intf_clk_cfg.clk_id, intf_clk_cfg.clk_freq_in_hz);
  400. ret = audio_prm_set_lpass_clk_cfg(&intf_clk_cfg, 1);
  401. if (ret < 0) {
  402. pr_err("%s: prm lpass mi2s clk cfg set failed ret %d\n",
  403. __func__, ret);
  404. goto done;
  405. }
  406. } else {
  407. pr_err("%s: invalid stream name: %s\n", __func__,
  408. stream_name);
  409. }
  410. }
  411. atomic_inc(&pdata->lpass_intf_clk_ref_cnt[index]);
  412. done:
  413. mutex_unlock(&pdata->lock[index]);
  414. }
  415. return ret;
  416. }
  417. int msm_common_snd_startup(struct snd_pcm_substream *substream)
  418. {
  419. int ret = 0;
  420. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  421. struct snd_soc_card *card = rtd->card;
  422. struct msm_common_pdata *pdata = msm_common_get_pdata(card);
  423. const char *stream_name = rtd->dai_link->stream_name;
  424. int index = get_intf_index(stream_name);
  425. dev_dbg(rtd->card->dev,
  426. "%s: substream = %s stream = %d\n",
  427. __func__, substream->name, substream->stream);
  428. if (!pdata) {
  429. dev_err(rtd->card->dev, "%s: pdata is NULL\n", __func__);
  430. return -EINVAL;
  431. }
  432. if (index >= 0) {
  433. mutex_lock(&pdata->lock[index]);
  434. if (pdata->mi2s_gpio_p[index]) {
  435. if (atomic_read(&(pdata->mi2s_gpio_ref_cnt[index])) == 0) {
  436. ret = msm_cdc_pinctrl_select_active_state(
  437. pdata->mi2s_gpio_p[index]);
  438. if (ret) {
  439. pr_err("%s:pinctrl set actve fail with %d\n",
  440. __func__, ret);
  441. goto done;
  442. }
  443. }
  444. atomic_inc(&(pdata->mi2s_gpio_ref_cnt[index]));
  445. }
  446. done:
  447. mutex_unlock(&pdata->lock[index]);
  448. }
  449. return ret;
  450. }
  451. void msm_common_snd_shutdown(struct snd_pcm_substream *substream)
  452. {
  453. int ret;
  454. struct snd_soc_pcm_runtime *rtd = substream->private_data;
  455. struct snd_soc_card *card = rtd->card;
  456. struct msm_common_pdata *pdata = msm_common_get_pdata(card);
  457. struct snd_pcm_runtime *runtime = substream->runtime;
  458. const char *stream_name = rtd->dai_link->stream_name;
  459. int index = get_intf_index(stream_name);
  460. struct clk_cfg intf_clk_cfg;
  461. unsigned int rate = runtime->rate;
  462. memset(&intf_clk_cfg, 0, sizeof(struct clk_cfg));
  463. pr_debug("%s(): substream = %s stream = %d\n", __func__,
  464. substream->name, substream->stream);
  465. if (!pdata) {
  466. dev_err(card->dev, "%s: pdata is NULL\n", __func__);
  467. return;
  468. }
  469. check_userspace_service_state(rtd, pdata);
  470. if (index >= 0) {
  471. mutex_lock(&pdata->lock[index]);
  472. atomic_dec(&pdata->lpass_intf_clk_ref_cnt[index]);
  473. if (atomic_read(&pdata->lpass_intf_clk_ref_cnt[index]) == 0) {
  474. if ((strnstr(stream_name, "TDM", strlen(stream_name)))) {
  475. intf_clk_cfg.clk_id = get_tdm_clk_id(index);
  476. pr_debug("%s: Disable clock ID: %d\n", __func__, intf_clk_cfg.clk_id);
  477. ret = audio_prm_set_lpass_clk_cfg(&intf_clk_cfg, 0);
  478. if (ret < 0)
  479. pr_err("%s: prm clk cfg set failed ret %d\n",
  480. __func__, ret);
  481. } else if((strnstr(stream_name, "MI2S", strlen(stream_name)))) {
  482. intf_clk_cfg.clk_id = get_mi2s_clk_id(index);
  483. pr_debug("%s: Disable clock ID: %d\n", __func__, intf_clk_cfg.clk_id);
  484. ret = audio_prm_set_lpass_clk_cfg(&intf_clk_cfg, 0);
  485. if (ret < 0)
  486. pr_err("%s: prm mi2s clk cfg disable failed ret %d\n",
  487. __func__, ret);
  488. } else {
  489. pr_err("%s: invalid stream name: %s\n",
  490. __func__, stream_name);
  491. }
  492. if (pdata->is_audio_hw_vote_required[index] &&
  493. is_fractional_sample_rate(rate)) {
  494. ret = mi2s_tdm_hw_vote_req(pdata, 0);
  495. }
  496. } else if (atomic_read(&pdata->lpass_intf_clk_ref_cnt[index]) < 0) {
  497. atomic_set(&pdata->lpass_intf_clk_ref_cnt[index], 0);
  498. }
  499. if (pdata->mi2s_gpio_p[index]) {
  500. atomic_dec(&pdata->mi2s_gpio_ref_cnt[index]);
  501. if (atomic_read(&pdata->mi2s_gpio_ref_cnt[index]) == 0) {
  502. ret = msm_cdc_pinctrl_select_sleep_state(
  503. pdata->mi2s_gpio_p[index]);
  504. if (ret)
  505. dev_err(card->dev,
  506. "%s: pinctrl set actv fail %d\n",
  507. __func__, ret);
  508. } else if (atomic_read(&pdata->mi2s_gpio_ref_cnt[index]) < 0) {
  509. atomic_set(&pdata->mi2s_gpio_ref_cnt[index], 0);
  510. }
  511. }
  512. mutex_unlock(&pdata->lock[index]);
  513. }
  514. }
  515. int msm_common_snd_init(struct platform_device *pdev, struct snd_soc_card *card)
  516. {
  517. struct msm_common_pdata *common_pdata = NULL;
  518. int count, ret = 0;
  519. uint32_t lpass_audio_hw_vote_required[MI2S_TDM_AUXPCM_MAX] = {0};
  520. struct clk *lpass_audio_hw_vote = NULL;
  521. common_pdata = kcalloc(1, sizeof(struct msm_common_pdata), GFP_KERNEL);
  522. if (!common_pdata)
  523. return -ENOMEM;
  524. for (count = 0; count < MI2S_TDM_AUXPCM_MAX; count++) {
  525. mutex_init(&common_pdata->lock[count]);
  526. atomic_set(&common_pdata->mi2s_gpio_ref_cnt[count], 0);
  527. }
  528. ret = of_property_read_u32(pdev->dev.of_node, "qcom,tdm-max-slots",
  529. &common_pdata->tdm_max_slots);
  530. if (ret) {
  531. dev_info(&pdev->dev, "%s: No DT match for tdm max slots\n",
  532. __func__);
  533. }
  534. if ((common_pdata->tdm_max_slots <= 0) || (common_pdata->tdm_max_slots >
  535. TDM_MAX_SLOTS)) {
  536. common_pdata->tdm_max_slots = TDM_MAX_SLOTS;
  537. dev_info(&pdev->dev, "%s: Using default tdm max slot: %d\n",
  538. __func__, common_pdata->tdm_max_slots);
  539. }
  540. /* Register LPASS audio hw vote */
  541. lpass_audio_hw_vote = devm_clk_get(&pdev->dev, "lpass_audio_hw_vote");
  542. if (IS_ERR(lpass_audio_hw_vote)) {
  543. ret = PTR_ERR(lpass_audio_hw_vote);
  544. dev_dbg(&pdev->dev, "%s: clk get %s failed %d\n",
  545. __func__, "lpass_audio_hw_vote", ret);
  546. lpass_audio_hw_vote = NULL;
  547. ret = 0;
  548. }
  549. common_pdata->lpass_audio_hw_vote = lpass_audio_hw_vote;
  550. ret = of_property_read_u32_array(pdev->dev.of_node,
  551. "qcom,mi2s-tdm-is-hw-vote-needed",
  552. lpass_audio_hw_vote_required, MI2S_TDM_AUXPCM_MAX);
  553. if (ret) {
  554. dev_dbg(&pdev->dev, "%s:no qcom,mi2s-tdm-is-hw-vote-needed in DT node\n",
  555. __func__);
  556. } else {
  557. for (count = 0; count < MI2S_TDM_AUXPCM_MAX; count++) {
  558. common_pdata->is_audio_hw_vote_required[count] =
  559. lpass_audio_hw_vote_required[count];
  560. }
  561. }
  562. common_pdata->mi2s_gpio_p[PRI_MI2S_TDM_AUXPCM] = of_parse_phandle(pdev->dev.of_node,
  563. "qcom,pri-mi2s-gpios", 0);
  564. common_pdata->mi2s_gpio_p[SEC_MI2S_TDM_AUXPCM] = of_parse_phandle(pdev->dev.of_node,
  565. "qcom,sec-mi2s-gpios", 0);
  566. common_pdata->mi2s_gpio_p[TER_MI2S_TDM_AUXPCM] = of_parse_phandle(pdev->dev.of_node,
  567. "qcom,tert-mi2s-gpios", 0);
  568. common_pdata->mi2s_gpio_p[QUAT_MI2S_TDM_AUXPCM] = of_parse_phandle(pdev->dev.of_node,
  569. "qcom,quat-mi2s-gpios", 0);
  570. common_pdata->mi2s_gpio_p[QUIN_MI2S_TDM_AUXPCM] = of_parse_phandle(pdev->dev.of_node,
  571. "qcom,quin-mi2s-gpios", 0);
  572. common_pdata->mi2s_gpio_p[SEN_MI2S_TDM_AUXPCM] = of_parse_phandle(pdev->dev.of_node,
  573. "qcom,sen-mi2s-gpios", 0);
  574. common_pdata->aud_dev_state = devm_kcalloc(&pdev->dev, card->num_links,
  575. sizeof(uint8_t), GFP_KERNEL);
  576. dev_info(&pdev->dev, "num_links %d \n", card->num_links);
  577. common_pdata->num_aud_devs = card->num_links;
  578. aud_dev_sysfs_init(common_pdata);
  579. msm_common_set_pdata(card, common_pdata);
  580. return 0;
  581. };
  582. void msm_common_snd_deinit(struct msm_common_pdata *common_pdata)
  583. {
  584. int count;
  585. if (!common_pdata)
  586. return;
  587. for (count = 0; count < MI2S_TDM_AUXPCM_MAX; count++) {
  588. mutex_destroy(&common_pdata->lock[count]);
  589. }
  590. }
  591. int msm_channel_map_info(struct snd_kcontrol *kcontrol,
  592. struct snd_ctl_elem_info *uinfo)
  593. {
  594. uinfo->type = SNDRV_CTL_ELEM_TYPE_BYTES;
  595. uinfo->count = sizeof(uint32_t) * MAX_PORT;
  596. return 0;
  597. }
  598. int msm_channel_map_get(struct snd_kcontrol *kcontrol,
  599. struct snd_ctl_elem_value *ucontrol)
  600. {
  601. struct chmap_pdata *kctl_pdata =
  602. (struct chmap_pdata *)kcontrol->private_data;
  603. struct snd_soc_dai *codec_dai = NULL;
  604. int backend_id = 0;
  605. uint32_t rx_ch[MAX_PORT] = {0}, tx_ch[MAX_PORT] = {0};
  606. uint32_t rx_ch_cnt = 0, tx_ch_cnt = 0;
  607. uint32_t *chmap_data = NULL;
  608. int ret = 0, len = 0, i = 0;
  609. if (kctl_pdata == NULL) {
  610. pr_debug("%s: chmap_pdata is not initialized\n", __func__);
  611. return -EINVAL;
  612. }
  613. codec_dai = kctl_pdata->dai[0];
  614. backend_id = kctl_pdata->id;
  615. switch (backend_id) {
  616. case SLIM: {
  617. uint32_t *chmap;
  618. uint32_t ch_cnt;
  619. ret = snd_soc_dai_get_channel_map(codec_dai,
  620. &tx_ch_cnt, tx_ch, &rx_ch_cnt, rx_ch);
  621. if (ret || (tx_ch_cnt == 0 && rx_ch_cnt == 0)) {
  622. pr_debug("%s: got incorrect channel map for backend_id:%d\n",
  623. __func__, backend_id);
  624. return ret;
  625. }
  626. if (rx_ch_cnt) {
  627. chmap = rx_ch;
  628. ch_cnt = rx_ch_cnt;
  629. } else {
  630. chmap = tx_ch;
  631. ch_cnt = tx_ch_cnt;
  632. }
  633. len = sizeof(uint32_t) * (ch_cnt + 1);
  634. chmap_data = kzalloc(len, GFP_KERNEL);
  635. if (!chmap_data)
  636. return -ENOMEM;
  637. chmap_data[0] = ch_cnt;
  638. for (i = 0; i < ch_cnt; i++)
  639. chmap_data[i+1] = chmap[i];
  640. memcpy(ucontrol->value.bytes.data, chmap_data, len);
  641. break;
  642. }
  643. case CODEC_DMA: {
  644. uint32_t cur_rx_ch = 0, cur_tx_ch = 0;
  645. uint32_t cur_rx_ch_cnt = 0, cur_tx_ch_cnt = 0;
  646. for (i = 0; i < kctl_pdata->num_codec_dai; ++i) {
  647. codec_dai = kctl_pdata->dai[i];
  648. if(!codec_dai) {
  649. continue;
  650. }
  651. cur_rx_ch_cnt = 0;
  652. cur_tx_ch_cnt = 0;
  653. cur_tx_ch = 0;
  654. cur_rx_ch = 0;
  655. ret = snd_soc_dai_get_channel_map(codec_dai,
  656. &cur_tx_ch_cnt, &cur_tx_ch,
  657. &cur_rx_ch_cnt, &cur_rx_ch);
  658. /* DAIs that not supports get_channel_map should pass */
  659. if (ret && (ret != -ENOTSUPP)) {
  660. pr_err("%s: get channel map failed for backend_id:%d,"
  661. " ret:%d\n",
  662. __func__, backend_id, ret);
  663. return ret;
  664. }
  665. rx_ch_cnt += cur_rx_ch_cnt;
  666. tx_ch_cnt += cur_tx_ch_cnt;
  667. rx_ch[0] |= cur_rx_ch;
  668. tx_ch[0] |= cur_tx_ch;
  669. }
  670. /* reset return value from the loop above */
  671. ret = 0;
  672. if (rx_ch_cnt == 0 && tx_ch_cnt == 0) {
  673. pr_debug("%s: got incorrect channel map for backend_id:%d, ",
  674. "RX Channel Count:%d,"
  675. "TX Channel Count:%d\n",
  676. __func__, backend_id, rx_ch_cnt, tx_ch_cnt);
  677. return ret;
  678. }
  679. chmap_data = kzalloc(sizeof(uint32_t) * 2, GFP_KERNEL);
  680. if (!chmap_data)
  681. return -ENOMEM;
  682. if (rx_ch_cnt) {
  683. chmap_data[0] = rx_ch_cnt;
  684. chmap_data[1] = rx_ch[0];
  685. } else {
  686. chmap_data[0] = tx_ch_cnt;
  687. chmap_data[1] = tx_ch[0];
  688. }
  689. memcpy(ucontrol->value.bytes.data, chmap_data,
  690. sizeof(uint32_t) * 2);
  691. break;
  692. }
  693. default:
  694. pr_err("%s, Invalid backend %d\n", __func__, backend_id);
  695. ret = -EINVAL;
  696. break;
  697. }
  698. kfree(chmap_data);
  699. return ret;
  700. }
  701. void msm_common_get_backend_name(const char *stream_name, char **backend_name)
  702. {
  703. char arg[ARRAY_SZ] = {0};
  704. char value[61] = {0};
  705. sscanf(stream_name, "%20[^-]-%60s", arg, value);
  706. *backend_name = kzalloc(ARRAY_SZ, GFP_KERNEL);
  707. if (!(*backend_name))
  708. return;
  709. strlcpy(*backend_name, arg, ARRAY_SZ);
  710. }
  711. int msm_common_dai_link_init(struct snd_soc_pcm_runtime *rtd)
  712. {
  713. struct snd_soc_dai *codec_dai = asoc_rtd_to_codec(rtd, 0);
  714. struct snd_soc_component *component = NULL;
  715. struct snd_soc_dai_link *dai_link = rtd->dai_link;
  716. struct device *dev = rtd->card->dev;
  717. int ret = 0;
  718. int index = 0;
  719. const char *mixer_ctl_name = CODEC_CHMAP;
  720. char *mixer_str = NULL;
  721. char *backend_name = NULL;
  722. uint32_t ctl_len = 0;
  723. struct chmap_pdata *pdata;
  724. struct snd_kcontrol *kctl;
  725. struct snd_kcontrol_new msm_common_channel_map[1] = {
  726. {
  727. .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
  728. .name = "?",
  729. .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
  730. .info = msm_channel_map_info,
  731. .get = msm_channel_map_get,
  732. .private_value = 0,
  733. }
  734. };
  735. if (!codec_dai) {
  736. pr_err("%s: failed to get codec dai", __func__);
  737. return -EINVAL;
  738. }
  739. component = codec_dai->component;
  740. msm_common_get_backend_name(dai_link->stream_name, &backend_name);
  741. if (!backend_name) {
  742. pr_err("%s: failed to get backend name", __func__);
  743. return -EINVAL;
  744. }
  745. pdata = devm_kzalloc(dev, sizeof(struct chmap_pdata), GFP_KERNEL);
  746. if (!pdata)
  747. return -ENOMEM;
  748. if ((!strncmp(backend_name, "SLIM", strlen("SLIM"))) ||
  749. (!strncmp(backend_name, "CODEC_DMA", strlen("CODEC_DMA")))) {
  750. ctl_len = strlen(dai_link->stream_name) + 1 +
  751. strlen(mixer_ctl_name) + 1;
  752. mixer_str = kzalloc(ctl_len, GFP_KERNEL);
  753. if (!mixer_str)
  754. return -ENOMEM;
  755. snprintf(mixer_str, ctl_len, "%s %s", dai_link->stream_name,
  756. mixer_ctl_name);
  757. msm_common_channel_map[0].name = mixer_str;
  758. msm_common_channel_map[0].private_value = 0;
  759. pr_debug("Registering new mixer ctl %s\n", mixer_str);
  760. ret = snd_soc_add_component_controls(component,
  761. msm_common_channel_map,
  762. ARRAY_SIZE(msm_common_channel_map));
  763. kctl = snd_soc_card_get_kcontrol(rtd->card, mixer_str);
  764. if (!kctl) {
  765. pr_err("failed to get kctl %s\n", mixer_str);
  766. ret = -EINVAL;
  767. goto free_mixer_str;
  768. }
  769. pdata->dai[0] = codec_dai;
  770. pdata->num_codec_dai = 1;
  771. if (!strncmp(backend_name, "SLIM", strlen("SLIM"))) {
  772. pdata->id = SLIM;
  773. } else {
  774. pdata->id = CODEC_DMA;
  775. if (rtd->num_codecs <= MAX_CODEC_DAI) {
  776. pdata->num_codec_dai = rtd->num_codecs;
  777. for_each_rtd_codec_dais(rtd, index, codec_dai) {
  778. pdata->dai[index] = codec_dai;
  779. }
  780. }
  781. }
  782. kctl->private_data = pdata;
  783. free_mixer_str:
  784. kfree(backend_name);
  785. kfree(mixer_str);
  786. }
  787. return ret;
  788. }