sp_params.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * Copyright (c) 2019-2020, The Linux Foundation. All rights reserved.
  4. */
  5. #include <dsp/q6audio-v2.h>
  6. #include <dsp/q6afe-v2.h>
  7. #include <audio/linux/msm_audio_calibration.h>
  8. #include <dsp/sp_params.h>
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/device.h>
  12. /* export or show spk params at /sys/class/spk_params/cal_data */
  13. #define SPK_PARAMS "spk_params"
  14. #define CLASS_NAME "cal_data"
  15. #define BUF_SZ 20
  16. #define Q22 (1<<22)
  17. #define Q13 (1<<13)
  18. #define Q7 (1<<7)
  19. struct afe_spk_ctl {
  20. struct class *p_class;
  21. struct device *p_dev;
  22. struct afe_sp_rx_tmax_xmax_logging_param xt_logging;
  23. int32_t max_temperature_rd[SP_V2_NUM_MAX_SPKR];
  24. };
  25. struct afe_spk_ctl this_afe_spk;
  26. static ssize_t sp_count_exceeded_temperature_l_show(struct device *dev,
  27. struct device_attribute *attr,
  28. char *buf)
  29. {
  30. ssize_t ret = 0;
  31. ret = snprintf(buf, BUF_SZ, "%d\n",
  32. this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1]);
  33. this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] = 0;
  34. return ret;
  35. }
  36. static DEVICE_ATTR(count_exceeded_temperature, 0644,
  37. sp_count_exceeded_temperature_l_show, NULL);
  38. static ssize_t sp_count_exceeded_temperature_r_show(struct device *dev,
  39. struct device_attribute *attr,
  40. char *buf)
  41. {
  42. ssize_t ret = 0;
  43. ret = snprintf(buf, BUF_SZ, "%d\n",
  44. this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2]);
  45. this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] = 0;
  46. return ret;
  47. }
  48. static DEVICE_ATTR(count_exceeded_temperature_r, 0644,
  49. sp_count_exceeded_temperature_r_show, NULL);
  50. static ssize_t sp_count_exceeded_excursion_l_show(struct device *dev,
  51. struct device_attribute *attr,
  52. char *buf)
  53. {
  54. ssize_t ret = 0;
  55. ret = snprintf(buf, BUF_SZ, "%d\n",
  56. this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1]);
  57. this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] = 0;
  58. return ret;
  59. }
  60. static DEVICE_ATTR(count_exceeded_excursion, 0644,
  61. sp_count_exceeded_excursion_l_show, NULL);
  62. static ssize_t sp_count_exceeded_excursion_r_show(struct device *dev,
  63. struct device_attribute *attr,
  64. char *buf)
  65. {
  66. ssize_t ret = 0;
  67. ret = snprintf(buf, BUF_SZ, "%d\n",
  68. this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2]);
  69. this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] = 0;
  70. return ret;
  71. }
  72. static DEVICE_ATTR(count_exceeded_excursion_r, 0644,
  73. sp_count_exceeded_excursion_r_show, NULL);
  74. static ssize_t sp_max_excursion_l_show(struct device *dev,
  75. struct device_attribute *attr,
  76. char *buf)
  77. {
  78. ssize_t ret = 0;
  79. int32_t ex_val_frac;
  80. int32_t ex_q27 = this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1];
  81. ex_val_frac = ex_q27/Q13;
  82. ex_val_frac = (ex_val_frac * 10000)/(Q7 * Q7);
  83. ex_val_frac /= 100;
  84. ret = snprintf(buf, BUF_SZ, "%d.%02d\n", 0, ex_val_frac);
  85. this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] = 0;
  86. return ret;
  87. }
  88. static DEVICE_ATTR(max_excursion, 0644, sp_max_excursion_l_show, NULL);
  89. static ssize_t sp_max_excursion_r_show(struct device *dev,
  90. struct device_attribute *attr,
  91. char *buf)
  92. {
  93. ssize_t ret = 0;
  94. int32_t ex_val_frac;
  95. int32_t ex_q27 = this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2];
  96. ex_val_frac = ex_q27/Q13;
  97. ex_val_frac = (ex_val_frac * 10000)/(Q7 * Q7);
  98. ex_val_frac /= 100;
  99. ret = snprintf(buf, BUF_SZ, "%d.%02d\n", 0, ex_val_frac);
  100. this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] = 0;
  101. return ret;
  102. }
  103. static DEVICE_ATTR(max_excursion_r, 0644, sp_max_excursion_r_show, NULL);
  104. static ssize_t sp_max_temperature_l_show(struct device *dev,
  105. struct device_attribute *attr,
  106. char *buf)
  107. {
  108. ssize_t ret = 0;
  109. ret = snprintf(buf, BUF_SZ, "%d\n",
  110. this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1]/Q22);
  111. this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] = 0;
  112. return ret;
  113. }
  114. static DEVICE_ATTR(max_temperature, 0644, sp_max_temperature_l_show, NULL);
  115. static ssize_t sp_max_temperature_r_show(struct device *dev,
  116. struct device_attribute *attr,
  117. char *buf)
  118. {
  119. ssize_t ret = 0;
  120. ret = snprintf(buf, BUF_SZ, "%d\n",
  121. this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2]/Q22);
  122. this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] = 0;
  123. return ret;
  124. }
  125. static DEVICE_ATTR(max_temperature_r, 0644, sp_max_temperature_r_show, NULL);
  126. static ssize_t sp_max_temperature_rd_l_show(struct device *dev,
  127. struct device_attribute *attr,
  128. char *buf)
  129. {
  130. return snprintf(buf, BUF_SZ, "%d\n",
  131. this_afe_spk.max_temperature_rd[SP_V2_SPKR_1]/Q22);
  132. }
  133. static DEVICE_ATTR(max_temperature_rd, 0644,
  134. sp_max_temperature_rd_l_show, NULL);
  135. static ssize_t sp_max_temperature_rd_r_show(struct device *dev,
  136. struct device_attribute *attr,
  137. char *buf)
  138. {
  139. return snprintf(buf, BUF_SZ, "%d\n",
  140. this_afe_spk.max_temperature_rd[SP_V2_SPKR_2]/Q22);
  141. }
  142. static DEVICE_ATTR(max_temperature_rd_r, 0644,
  143. sp_max_temperature_rd_r_show, NULL);
  144. static ssize_t q6afe_initial_cal_show(struct device *dev,
  145. struct device_attribute *attr,
  146. char *buf)
  147. {
  148. return snprintf(buf, BUF_SZ, "%d\n", afe_get_spk_initial_cal());
  149. }
  150. static ssize_t q6afe_initial_cal_store(struct device *dev,
  151. struct device_attribute *attr,
  152. const char *buf, size_t size)
  153. {
  154. int initial_cal = 0;
  155. if (!kstrtou32(buf, 0, &initial_cal)) {
  156. initial_cal = initial_cal > 0 ? 1 : 0;
  157. if (initial_cal == afe_get_spk_initial_cal())
  158. dev_dbg(dev, "%s: same value already present\n",
  159. __func__);
  160. else
  161. afe_set_spk_initial_cal(initial_cal);
  162. }
  163. return size;
  164. }
  165. static DEVICE_ATTR(initial_cal, 0644,
  166. q6afe_initial_cal_show, q6afe_initial_cal_store);
  167. static ssize_t q6afe_v_vali_flag_show(struct device *dev,
  168. struct device_attribute *attr,
  169. char *buf)
  170. {
  171. return snprintf(buf, BUF_SZ, "%d\n", afe_get_spk_v_vali_flag());
  172. }
  173. static ssize_t q6afe_v_vali_flag_store(struct device *dev,
  174. struct device_attribute *attr,
  175. const char *buf, size_t size)
  176. {
  177. int v_vali_flag = 0;
  178. if (!kstrtou32(buf, 0, &v_vali_flag)) {
  179. v_vali_flag = v_vali_flag > 0 ? 1 : 0;
  180. if (v_vali_flag == afe_get_spk_v_vali_flag())
  181. dev_dbg(dev, "%s: same value already present\n",
  182. __func__);
  183. else
  184. afe_set_spk_v_vali_flag(v_vali_flag);
  185. }
  186. return size;
  187. }
  188. static DEVICE_ATTR(v_vali_flag, 0644,
  189. q6afe_v_vali_flag_show, q6afe_v_vali_flag_store);
  190. static ssize_t q6afe_spk_r0_l_show(struct device *dev,
  191. struct device_attribute *attr,
  192. char *buf)
  193. {
  194. int r0[SP_V2_NUM_MAX_SPKRS];
  195. afe_get_spk_r0(r0);
  196. return snprintf(buf, BUF_SZ, "%d\n", r0[SP_V2_SPKR_1]);
  197. }
  198. static DEVICE_ATTR(spk_r0, 0644, q6afe_spk_r0_l_show, NULL);
  199. static ssize_t q6afe_spk_t0_l_show(struct device *dev,
  200. struct device_attribute *attr,
  201. char *buf)
  202. {
  203. int t0[SP_V2_NUM_MAX_SPKRS];
  204. afe_get_spk_t0(t0);
  205. return snprintf(buf, BUF_SZ, "%d\n", t0[SP_V2_SPKR_1]);
  206. }
  207. static DEVICE_ATTR(spk_t0, 0644, q6afe_spk_t0_l_show, NULL);
  208. static ssize_t q6afe_spk_r0_r_show(struct device *dev,
  209. struct device_attribute *attr,
  210. char *buf)
  211. {
  212. int r0[SP_V2_NUM_MAX_SPKRS];
  213. afe_get_spk_r0(r0);
  214. return snprintf(buf, BUF_SZ, "%d\n", r0[SP_V2_SPKR_2]);
  215. }
  216. static DEVICE_ATTR(spk_r0_r, 0644, q6afe_spk_r0_r_show, NULL);
  217. static ssize_t q6afe_spk_t0_r_show(struct device *dev,
  218. struct device_attribute *attr,
  219. char *buf)
  220. {
  221. int t0[SP_V2_NUM_MAX_SPKRS];
  222. afe_get_spk_t0(t0);
  223. return snprintf(buf, BUF_SZ, "%d\n", t0[SP_V2_SPKR_2]);
  224. }
  225. static DEVICE_ATTR(spk_t0_r, 0644, q6afe_spk_t0_r_show, NULL);
  226. static ssize_t q6afe_spk_v_vali_l_show(struct device *dev,
  227. struct device_attribute *attr,
  228. char *buf)
  229. {
  230. int v_vali_sts[SP_V2_NUM_MAX_SPKRS];
  231. afe_get_spk_v_vali_sts(v_vali_sts);
  232. return snprintf(buf, BUF_SZ, "%d\n", v_vali_sts[SP_V2_SPKR_1]);
  233. }
  234. static DEVICE_ATTR(spk_v_vali_status, 0644, q6afe_spk_v_vali_l_show, NULL);
  235. static ssize_t q6afe_spk_v_vali_r_show(struct device *dev,
  236. struct device_attribute *attr,
  237. char *buf)
  238. {
  239. int v_vali_sts[SP_V2_NUM_MAX_SPKRS];
  240. afe_get_spk_v_vali_sts(v_vali_sts);
  241. return snprintf(buf, BUF_SZ, "%d\n", v_vali_sts[SP_V2_SPKR_2]);
  242. }
  243. static DEVICE_ATTR(spk_v_vali_r_status, 0644, q6afe_spk_v_vali_r_show, NULL);
  244. static struct attribute *afe_spk_cal_attr[] = {
  245. &dev_attr_max_excursion.attr,
  246. &dev_attr_max_excursion_r.attr,
  247. &dev_attr_max_temperature.attr,
  248. &dev_attr_max_temperature_r.attr,
  249. &dev_attr_count_exceeded_excursion.attr,
  250. &dev_attr_count_exceeded_excursion_r.attr,
  251. &dev_attr_count_exceeded_temperature.attr,
  252. &dev_attr_count_exceeded_temperature_r.attr,
  253. &dev_attr_max_temperature_rd.attr,
  254. &dev_attr_max_temperature_rd_r.attr,
  255. &dev_attr_initial_cal.attr,
  256. &dev_attr_spk_r0.attr,
  257. &dev_attr_spk_t0.attr,
  258. &dev_attr_spk_r0_r.attr,
  259. &dev_attr_spk_t0_r.attr,
  260. &dev_attr_v_vali_flag.attr,
  261. &dev_attr_spk_v_vali_status.attr,
  262. &dev_attr_spk_v_vali_r_status.attr,
  263. NULL,
  264. };
  265. static struct attribute_group afe_spk_cal_attr_grp = {
  266. .attrs = afe_spk_cal_attr,
  267. };
  268. /**
  269. * afe_get_sp_xt_logging_data -
  270. * to get excursion logging data from DSP
  271. *
  272. * @port: AFE port ID
  273. *
  274. * Returns 0 on success or error on failure
  275. */
  276. int afe_get_sp_xt_logging_data(u16 port_id)
  277. {
  278. int ret = 0;
  279. struct afe_sp_rx_tmax_xmax_logging_param xt_logging_data;
  280. ret = afe_get_sp_rx_tmax_xmax_logging_data(&xt_logging_data, port_id);
  281. if (ret) {
  282. pr_err("%s Excursion logging fail\n", __func__);
  283. return ret;
  284. }
  285. /* storing max sp param value */
  286. if (this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] <
  287. xt_logging_data.max_temperature[SP_V2_SPKR_1])
  288. this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] =
  289. xt_logging_data.max_temperature[SP_V2_SPKR_1];
  290. if (this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] <
  291. xt_logging_data.max_temperature[SP_V2_SPKR_2])
  292. this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] =
  293. xt_logging_data.max_temperature[SP_V2_SPKR_2];
  294. /* update temp for max_temperature_rd node */
  295. if (this_afe_spk.max_temperature_rd[SP_V2_SPKR_1] <
  296. xt_logging_data.max_temperature[SP_V2_SPKR_1])
  297. this_afe_spk.max_temperature_rd[SP_V2_SPKR_1] =
  298. xt_logging_data.max_temperature[SP_V2_SPKR_1];
  299. if (this_afe_spk.max_temperature_rd[SP_V2_SPKR_2] <
  300. xt_logging_data.max_temperature[SP_V2_SPKR_2])
  301. this_afe_spk.max_temperature_rd[SP_V2_SPKR_2] =
  302. xt_logging_data.max_temperature[SP_V2_SPKR_2];
  303. if (this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] <
  304. xt_logging_data.max_excursion[SP_V2_SPKR_1])
  305. this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] =
  306. xt_logging_data.max_excursion[SP_V2_SPKR_1];
  307. if (this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] <
  308. xt_logging_data.max_excursion[SP_V2_SPKR_2])
  309. this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] =
  310. xt_logging_data.max_excursion[SP_V2_SPKR_2];
  311. if (this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] <
  312. xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_1])
  313. this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1]
  314. += xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_1];
  315. if (this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] <
  316. xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_2])
  317. this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2]
  318. += xt_logging_data.count_exceeded_temperature[SP_V2_SPKR_2];
  319. if (this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] <
  320. xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_1])
  321. this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1]
  322. += xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_1];
  323. if (this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] <
  324. xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_2])
  325. this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2]
  326. += xt_logging_data.count_exceeded_excursion[SP_V2_SPKR_2];
  327. return ret;
  328. }
  329. EXPORT_SYMBOL(afe_get_sp_xt_logging_data);
  330. int __init spk_params_init(void)
  331. {
  332. /* initialize xt param value with 0 */
  333. this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_1] = 0;
  334. this_afe_spk.xt_logging.max_temperature[SP_V2_SPKR_2] = 0;
  335. this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_1] = 0;
  336. this_afe_spk.xt_logging.max_excursion[SP_V2_SPKR_2] = 0;
  337. this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_1] = 0;
  338. this_afe_spk.xt_logging.count_exceeded_temperature[SP_V2_SPKR_2] = 0;
  339. this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_1] = 0;
  340. this_afe_spk.xt_logging.count_exceeded_excursion[SP_V2_SPKR_2] = 0;
  341. this_afe_spk.p_class = class_create(THIS_MODULE, SPK_PARAMS);
  342. if (this_afe_spk.p_class) {
  343. this_afe_spk.p_dev = device_create(this_afe_spk.p_class, NULL,
  344. 1, NULL, CLASS_NAME);
  345. if (!IS_ERR(this_afe_spk.p_dev)) {
  346. if (sysfs_create_group(&this_afe_spk.p_dev->kobj,
  347. &afe_spk_cal_attr_grp))
  348. pr_err("%s: Failed to create sysfs group\n",
  349. __func__);
  350. }
  351. }
  352. return 0;
  353. }
  354. void spk_params_exit(void)
  355. {
  356. pr_debug("%s\n", __func__);
  357. }