cs40l26-tables.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. // SPDX-License-Identifier: GPL-2.0
  2. //
  3. // cs40l26-tables.c -- CS40L26 Boosted Haptic Driver with Integrated DSP and
  4. // Waveform Memory with Advanced Closed Loop Algorithms and LRA protection
  5. //
  6. // Copyright 2022 Cirrus Logic, Inc.
  7. //
  8. // Author: Fred Treven <[email protected]>
  9. //
  10. // This program is free software; you can redistribute it and/or modify
  11. // it under the terms of the GNU General Public License version 2 as
  12. // published by the Free Software Foundation.
  13. #ifdef CONFIG_CS40L26_SAMSUNG_FEATURE
  14. #include <linux/vibrator/cs40l26.h>
  15. #else
  16. #include <linux/mfd/cs40l26.h>
  17. #endif
  18. const struct regmap_config cs40l26_regmap = {
  19. .reg_bits = 32,
  20. .val_bits = 32,
  21. .reg_stride = 4,
  22. .reg_format_endian = REGMAP_ENDIAN_BIG,
  23. .val_format_endian = REGMAP_ENDIAN_BIG,
  24. .max_register = CS40L26_LASTREG,
  25. .num_reg_defaults = 0,
  26. .precious_reg = cs40l26_precious_reg,
  27. .readable_reg = cs40l26_readable_reg,
  28. .volatile_reg = cs40l26_volatile_reg,
  29. .cache_type = REGCACHE_NONE,
  30. };
  31. EXPORT_SYMBOL_GPL(cs40l26_regmap);
  32. const struct cs40l26_dbc cs40l26_dbc_params[CS40L26_DBC_NUM_CONTROLS] = {
  33. {
  34. .type = CS40L26_DBC_ENV_REL_COEF,
  35. .name = CS40L26_DBC_ENV_REL_COEF_NAME,
  36. .max = CS40L26_DBC_CONTROLS_MAX,
  37. .min = CS40L26_DBC_ENV_REL_COEF_MIN,
  38. },
  39. {
  40. .type = CS40L26_DBC_RISE_HEADROOM,
  41. .name = CS40L26_DBC_RISE_HEADROOM_NAME,
  42. .max = CS40L26_DBC_CONTROLS_MAX,
  43. .min = CS40L26_DBC_RISE_HEADROOM_MIN,
  44. },
  45. {
  46. .type = CS40L26_DBC_FALL_HEADROOM,
  47. .name = CS40L26_DBC_FALL_HEADROOM_NAME,
  48. .max = CS40L26_DBC_CONTROLS_MAX,
  49. .min = CS40L26_DBC_FALL_HEADROOM_MIN,
  50. },
  51. {
  52. .type = CS40L26_DBC_TX_LVL_THRESH_FS,
  53. .name = CS40L26_DBC_TX_LVL_THRESH_FS_NAME,
  54. .max = CS40L26_DBC_CONTROLS_MAX,
  55. .min = CS40L26_DBC_TX_LVL_THRESH_FS_MIN,
  56. },
  57. {
  58. .type = CS40L26_DBC_TX_LVL_HOLD_OFF_MS,
  59. .name = CS40L26_DBC_TX_LVL_HOLD_OFF_MS_NAME,
  60. .max = CS40L26_DBC_TX_LVL_HOLD_OFF_MS_MAX,
  61. .min = CS40L26_DBC_TX_LVL_HOLD_OFF_MS_MIN,
  62. },
  63. };
  64. EXPORT_SYMBOL_GPL(cs40l26_dbc_params);
  65. const struct reg_sequence cs40l26_a1_errata[CS40L26_ERRATA_A1_NUM_WRITES] = {
  66. { CS40L26_PLL_REFCLK_DETECT_0, 0x00000000 },
  67. { CS40L26_TEST_KEY_CTRL, CS40L26_TEST_KEY_UNLOCK_CODE1 },
  68. { CS40L26_TEST_KEY_CTRL, CS40L26_TEST_KEY_UNLOCK_CODE2 },
  69. { CS40L26_TEST_LBST, CS40L26_DISABLE_EXPL_MODE },
  70. { CS40L26_TEST_KEY_CTRL, CS40L26_TEST_KEY_LOCK_CODE },
  71. };
  72. const u8 cs40l26_pseq_op_sizes[CS40L26_PSEQ_NUM_OPS][2] = {
  73. { CS40L26_PSEQ_OP_WRITE_FULL, CS40L26_PSEQ_OP_WRITE_FULL_WORDS },
  74. { CS40L26_PSEQ_OP_WRITE_FIELD, CS40L26_PSEQ_OP_WRITE_FIELD_WORDS },
  75. { CS40L26_PSEQ_OP_WRITE_ADDR8, CS40L26_PSEQ_OP_WRITE_ADDR8_WORDS },
  76. { CS40L26_PSEQ_OP_WRITE_INCR, CS40L26_PSEQ_OP_WRITE_INCR_WORDS },
  77. { CS40L26_PSEQ_OP_WRITE_L16, CS40L26_PSEQ_OP_WRITE_X16_WORDS },
  78. { CS40L26_PSEQ_OP_WRITE_H16, CS40L26_PSEQ_OP_WRITE_X16_WORDS },
  79. { CS40L26_PSEQ_OP_DELAY, CS40L26_PSEQ_OP_DELAY_WORDS },
  80. { CS40L26_PSEQ_OP_END, CS40L26_PSEQ_OP_END_WORDS },
  81. };
  82. struct regulator_bulk_data cs40l26_supplies[CS40L26_NUM_SUPPLIES] = {
  83. { .supply = CS40L26_VP_SUPPLY_NAME },
  84. { .supply = CS40L26_VA_SUPPLY_NAME },
  85. };
  86. const struct mfd_cell cs40l26_devs[CS40L26_NUM_MFD_DEVS] = {
  87. { .name = "cs40l26-codec" },
  88. };
  89. const u32 cs40l26_attn_q21_2_vals[CS40L26_NUM_PCT_MAP_VALUES] = {
  90. 400, /* MUTE */
  91. 160, /* 1% */
  92. 136,
  93. 122,
  94. 112,
  95. 104,
  96. 98,
  97. 92,
  98. 88,
  99. 84,
  100. 80,
  101. 77,
  102. 74,
  103. 71,
  104. 68,
  105. 66,
  106. 64,
  107. 62,
  108. 60,
  109. 58,
  110. 56,
  111. 54,
  112. 53,
  113. 51,
  114. 50,
  115. 48, /* 25% */
  116. 47,
  117. 45,
  118. 44,
  119. 43,
  120. 42,
  121. 41,
  122. 40,
  123. 39,
  124. 37,
  125. 36,
  126. 35,
  127. 35,
  128. 34,
  129. 33,
  130. 32,
  131. 31,
  132. 30,
  133. 29,
  134. 29,
  135. 28,
  136. 27,
  137. 26,
  138. 26,
  139. 25,
  140. 24, /* 50 % */
  141. 23,
  142. 23,
  143. 22,
  144. 21,
  145. 21,
  146. 20,
  147. 20,
  148. 19,
  149. 18,
  150. 18,
  151. 17,
  152. 17,
  153. 16,
  154. 16,
  155. 15,
  156. 14,
  157. 14,
  158. 13,
  159. 13,
  160. 12,
  161. 12,
  162. 11,
  163. 11,
  164. 10,
  165. 10, /* 75% */
  166. 10,
  167. 9,
  168. 9,
  169. 8,
  170. 8,
  171. 7,
  172. 7,
  173. 6,
  174. 6,
  175. 6,
  176. 5,
  177. 5,
  178. 4,
  179. 4,
  180. 4,
  181. 3,
  182. 3,
  183. 3,
  184. 2,
  185. 2,
  186. 1,
  187. 1,
  188. 1,
  189. 0,
  190. 0, /* 100% */
  191. };
  192. bool cs40l26_precious_reg(struct device *dev, unsigned int reg)
  193. {
  194. return false;
  195. }
  196. EXPORT_SYMBOL_GPL(cs40l26_precious_reg);
  197. bool cs40l26_volatile_reg(struct device *dev, unsigned int reg)
  198. {
  199. return false;
  200. }
  201. EXPORT_SYMBOL_GPL(cs40l26_volatile_reg);
  202. bool cs40l26_readable_reg(struct device *dev, unsigned int reg)
  203. {
  204. switch (reg) {
  205. case CS40L26_DEVID:
  206. case CS40L26_REVID:
  207. case CS40L26_TEST_KEY_CTRL:
  208. case CS40L26_GLOBAL_ENABLES:
  209. case CS40L26_BLOCK_ENABLES2:
  210. case CS40L26_ERROR_RELEASE:
  211. case CS40L26_PWRMGT_CTL:
  212. case CS40L26_PWRMGT_STS:
  213. case CS40L26_REFCLK_INPUT:
  214. case CS40L26_GLOBAL_SAMPLE_RATE:
  215. case CS40L26_PLL_REFCLK_DETECT_0:
  216. case CS40L26_VBST_CTL_1:
  217. case CS40L26_VBST_CTL_2:
  218. case CS40L26_BST_IPK_CTL:
  219. case CS40L26_BST_DCM_CTL:
  220. case CS40L26_TEST_LBST:
  221. case CS40L26_MONITOR_FILT:
  222. case CS40L26_SPKMON_VMON_DEC_OUT_DATA:
  223. case CS40L26_ENABLES_AND_CODES_DIG:
  224. case CS40L26_ASP_ENABLES1:
  225. case CS40L26_ASP_CONTROL2:
  226. case CS40L26_ASP_FRAME_CONTROL5:
  227. case CS40L26_ASP_DATA_CONTROL5:
  228. case CS40L26_DACPCM1_INPUT:
  229. case CS40L26_ASPTX1_INPUT:
  230. case CS40L26_DSP1RX1_INPUT:
  231. case CS40L26_DSP1RX5_INPUT:
  232. case CS40L26_NGATE1_INPUT:
  233. case CS40L26_VPBR_CONFIG:
  234. case CS40L26_VBBR_CONFIG:
  235. case CS40L26_VPBR_STATUS:
  236. case CS40L26_VBBR_STATUS:
  237. case CS40L26_DIGPWM_CONFIG2:
  238. case CS40L26_TST_DAC_MSM_CONFIG:
  239. case CS40L26_IRQ1_CFG:
  240. case CS40L26_IRQ1_STATUS:
  241. case CS40L26_IRQ1_EINT_1:
  242. case CS40L26_IRQ1_EINT_2:
  243. case CS40L26_IRQ1_STS_1:
  244. case CS40L26_IRQ1_STS_2:
  245. case CS40L26_IRQ1_MASK_1:
  246. case CS40L26_IRQ1_MASK_2:
  247. case CS40L26_MIXER_NGATE_CH1_CFG:
  248. case CS40L26_DSP_MBOX_1 ... CS40L26_DSP_VIRTUAL1_MBOX_1:
  249. case CS40L26_DSP1_XMEM_PACKED_0 ... CS40L26_DSP1_XMEM_PACKED_6143:
  250. case CS40L26_DSP1_XROM_PACKED_0 ... CS40L26_DSP1_XROM_PACKED_4604:
  251. case CS40L26_DSP1_XMEM_UNPACKED32_0 ... CS40L26_DSP1_XROM_UNPACKED32_3070:
  252. case CS40L26_DSP1_XMEM_UNPACKED24_0 ... CS40L26_DSP1_XMEM_UNPACKED24_8191:
  253. case CS40L26_DSP1_XROM_UNPACKED24_0 ... CS40L26_DSP1_XROM_UNPACKED24_6141:
  254. case CS40L26_DSP1_CCM_CORE_CONTROL:
  255. case CS40L26_DSP1_YMEM_PACKED_0 ... CS40L26_DSP1_YMEM_PACKED_1532:
  256. case CS40L26_DSP1_YMEM_UNPACKED32_0 ... CS40L26_DSP1_YMEM_UNPACKED32_1022:
  257. case CS40L26_DSP1_YMEM_UNPACKED24_0 ... CS40L26_DSP1_YMEM_UNPACKED24_2045:
  258. case CS40L26_DSP1_PMEM_0 ... CS40L26_DSP1_PMEM_5114:
  259. case CS40L26_DSP1_PROM_0 ... CS40L26_DSP1_PROM_30714:
  260. return true;
  261. default:
  262. return false;
  263. }
  264. }
  265. EXPORT_SYMBOL_GPL(cs40l26_readable_reg);