mt6630_fm_config.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. #include <linux/string.h>
  2. #include <linux/slab.h>
  3. #include "fm_typedef.h"
  4. #include "fm_rds.h"
  5. #include "fm_dbg.h"
  6. #include "fm_err.h"
  7. #include "fm_stdlib.h"
  8. #include "fm_patch.h"
  9. #include "fm_config.h"
  10. /* #include "fm_cust_cfg.h" */
  11. #include "mt6630_fm_cust_cfg.h"
  12. fm_cust_cfg mt6630_fm_config;
  13. /* static fm_s32 fm_index = 0; */
  14. static fm_s32 MT6630fm_cust_config_print(fm_cust_cfg *cfg)
  15. {
  16. WCN_DBG(FM_NTC | MAIN, "MT6630 rssi_l:\t%d\n", cfg->rx_cfg.long_ana_rssi_th);
  17. WCN_DBG(FM_NTC | MAIN, "MT6630 rssi_s:\t%d\n", cfg->rx_cfg.short_ana_rssi_th);
  18. WCN_DBG(FM_NTC | MAIN, "MT6630 pamd_th:\t%d\n", cfg->rx_cfg.pamd_th);
  19. WCN_DBG(FM_NTC | MAIN, "MT6630 mr_th:\t%d\n", cfg->rx_cfg.mr_th);
  20. WCN_DBG(FM_NTC | MAIN, "MT6630 atdc_th:\t%d\n", cfg->rx_cfg.atdc_th);
  21. WCN_DBG(FM_NTC | MAIN, "MT6630 prx_th:\t%d\n", cfg->rx_cfg.prx_th);
  22. WCN_DBG(FM_NTC | MAIN, "MT6630 atdev_th:\t%d\n", cfg->rx_cfg.atdev_th);
  23. WCN_DBG(FM_NTC | MAIN, "MT6630 smg_th:\t%d\n", cfg->rx_cfg.smg_th);
  24. WCN_DBG(FM_NTC | MAIN, "de_emphasis:\t%d\n", cfg->rx_cfg.deemphasis);
  25. WCN_DBG(FM_NTC | MAIN, "osc_freq:\t%d\n", cfg->rx_cfg.osc_freq);
  26. WCN_DBG(FM_NTC | MAIN, "aud path[%d]I2S state[%d]mode[%d]rate[%d]\n", cfg->aud_cfg.aud_path,
  27. cfg->aud_cfg.i2s_info.status, cfg->aud_cfg.i2s_info.mode, cfg->aud_cfg.i2s_info.rate);
  28. return 0;
  29. }
  30. static fm_s32 MT6630cfg_item_handler(fm_s8 *grp, fm_s8 *key, fm_s8 *val, fm_cust_cfg *cfg)
  31. {
  32. fm_s32 ret = 0;
  33. struct fm_rx_cust_cfg *rx_cfg = &cfg->rx_cfg;
  34. ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_LONG_MT6630", &rx_cfg->long_ana_rssi_th);
  35. if (0 <= ret)
  36. return ret;
  37. ret = cfg_item_match(key, val, "FM_RX_RSSI_TH_SHORT_MT6630", &rx_cfg->short_ana_rssi_th);
  38. if (0 <= ret)
  39. return ret;
  40. ret = cfg_item_match(key, val, "FM_RX_DESENSE_RSSI_MT6630", &rx_cfg->desene_rssi_th);
  41. if (0 <= ret)
  42. return ret;
  43. ret = cfg_item_match(key, val, "FM_RX_PAMD_TH_MT6630", &rx_cfg->pamd_th);
  44. if (0 <= ret)
  45. return ret;
  46. ret = cfg_item_match(key, val, "FM_RX_MR_TH_MT6630", &rx_cfg->mr_th);
  47. if (0 <= ret)
  48. return ret;
  49. ret = cfg_item_match(key, val, "FM_RX_ATDC_TH_MT6630", &rx_cfg->atdc_th);
  50. if (0 <= ret)
  51. return ret;
  52. ret = cfg_item_match(key, val, "FM_RX_PRX_TH_MT6630", &rx_cfg->prx_th);
  53. if (0 <= ret)
  54. return ret;
  55. ret = cfg_item_match(key, val, "FM_RX_SMG_TH_MT6630", &rx_cfg->smg_th);
  56. if (0 <= ret)
  57. return ret;
  58. ret = cfg_item_match(key, val, "FM_RX_DEEMPHASIS_MT6630", &rx_cfg->deemphasis);
  59. if (0 <= ret)
  60. return ret;
  61. ret = cfg_item_match(key, val, "FM_RX_OSC_FREQ_MT6630", &rx_cfg->osc_freq);
  62. if (0 <= ret)
  63. return ret;
  64. WCN_DBG(FM_WAR | MAIN, "MT6630 invalid key\n");
  65. return -1;
  66. }
  67. static fm_s32 MT6630fm_cust_config_default(fm_cust_cfg *cfg)
  68. {
  69. if (cfg == NULL) {
  70. pr_err("%s,invalid pointer\n", __func__);
  71. return -FM_EPARA;
  72. }
  73. cfg->rx_cfg.long_ana_rssi_th = FM_RX_RSSI_TH_LONG_MT6630;
  74. cfg->rx_cfg.short_ana_rssi_th = FM_RX_RSSI_TH_SHORT_MT6630;
  75. cfg->rx_cfg.desene_rssi_th = FM_RX_DESENSE_RSSI_MT6630;
  76. cfg->rx_cfg.pamd_th = FM_RX_PAMD_TH_MT6630;
  77. cfg->rx_cfg.mr_th = FM_RX_MR_TH_MT6630;
  78. cfg->rx_cfg.atdc_th = FM_RX_ATDC_TH_MT6630;
  79. cfg->rx_cfg.prx_th = FM_RX_PRX_TH_MT6630;
  80. cfg->rx_cfg.smg_th = FM_RX_SMG_TH_MT6630;
  81. cfg->rx_cfg.deemphasis = FM_RX_DEEMPHASIS_MT6630;
  82. cfg->rx_cfg.osc_freq = FM_RX_OSC_FREQ_MT6630;
  83. cfg->tx_cfg.pamd_th = FM_TX_PAMD_TH_MT6630;
  84. cfg->tx_cfg.mr_th = FM_TX_MR_TH_MT6630;
  85. cfg->tx_cfg.smg_th = FM_TX_SMG_TH_MT6630;
  86. #ifdef CONFIG_MTK_MERGE_INTERFACE_SUPPORT
  87. cfg->aud_cfg.aud_path = FM_AUD_MRGIF;
  88. cfg->aud_cfg.i2s_info.status = FM_I2S_OFF;
  89. cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
  90. cfg->aud_cfg.i2s_info.rate = FM_I2S_44K;
  91. cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO;
  92. #elif defined FM_DIGITAL_INPUT
  93. cfg->aud_cfg.aud_path = FM_AUD_I2S;
  94. cfg->aud_cfg.i2s_info.status = FM_I2S_OFF;
  95. cfg->aud_cfg.i2s_info.mode = FM_I2S_SLAVE;
  96. cfg->aud_cfg.i2s_info.rate = FM_I2S_44K;
  97. cfg->aud_cfg.i2s_pad = FM_I2S_PAD_IO;
  98. #elif defined FM_ANALOG_INPUT
  99. cfg->aud_cfg.aud_path = FM_AUD_ANALOG;
  100. cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR;
  101. cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR;
  102. cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR;
  103. cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR;
  104. #else
  105. cfg->aud_cfg.aud_path = FM_AUD_ERR;
  106. cfg->aud_cfg.i2s_info.status = FM_I2S_STATE_ERR;
  107. cfg->aud_cfg.i2s_info.mode = FM_I2S_MODE_ERR;
  108. cfg->aud_cfg.i2s_info.rate = FM_I2S_SR_ERR;
  109. cfg->aud_cfg.i2s_pad = FM_I2S_PAD_ERR;
  110. #endif
  111. return 0;
  112. }
  113. static fm_s32 MT6630fm_cust_config_file(const fm_s8 *filename, fm_cust_cfg *cfg)
  114. {
  115. fm_s32 ret = 0;
  116. fm_s8 *buf = NULL;
  117. fm_s32 file_len = 0;
  118. buf = fm_zalloc(4096);
  119. if (!buf) {
  120. WCN_DBG(FM_ALT | MAIN, "-ENOMEM\n");
  121. return -ENOMEM;
  122. }
  123. /* fm_index = 0; */
  124. file_len = fm_file_read(filename, buf, 4096, 0);
  125. if (file_len <= 0) {
  126. ret = -1;
  127. goto out;
  128. }
  129. ret = cfg_parser(buf, MT6630cfg_item_handler, cfg);
  130. out:
  131. if (buf)
  132. fm_free(buf);
  133. return ret;
  134. }
  135. #define MT6630_FM_CUST_CFG_PATH "etc/fmr/mt6630_fm_cust.cfg"
  136. fm_s32 MT6630fm_cust_config_setup(const fm_s8 *filepath)
  137. {
  138. fm_s32 ret = 0;
  139. fm_s8 *filep = NULL;
  140. fm_s8 file_path[51] = { 0 };
  141. MT6630fm_cust_config_default(&mt6630_fm_config);
  142. WCN_DBG(FM_NTC | MAIN, "MT6630 FM default config\n");
  143. MT6630fm_cust_config_print(&mt6630_fm_config);
  144. if (!filepath) {
  145. filep = MT6630_FM_CUST_CFG_PATH;
  146. } else {
  147. memcpy(file_path, filepath, (strlen(filepath) > 50) ? 50 : strlen(filepath));
  148. filep = file_path;
  149. trim_path(&filep);
  150. }
  151. ret = MT6630fm_cust_config_file(filep, &mt6630_fm_config);
  152. WCN_DBG(FM_NTC | MAIN, "MT6630 FM cust config\n");
  153. MT6630fm_cust_config_print(&mt6630_fm_config);
  154. return ret;
  155. }