cs40l26.h 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248
  1. /* SPDX-License-Identifier: GPL-2.0
  2. *
  3. * cs40l26.h -- 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. #ifndef __CS40L26_H__
  11. #define __CS40L26_H__
  12. #include <linux/input.h>
  13. #include <linux/regmap.h>
  14. #include <linux/mfd/core.h>
  15. #include <linux/module.h>
  16. #include <linux/moduleparam.h>
  17. #include <linux/init.h>
  18. #include <linux/version.h>
  19. #include <linux/kernel.h>
  20. #include <linux/i2c.h>
  21. #include <linux/spi/spi.h>
  22. #include <linux/string.h>
  23. #include <linux/gpio.h>
  24. #include <linux/gpio/consumer.h>
  25. #include <linux/interrupt.h>
  26. #include <linux/of_device.h>
  27. #include <linux/platform_device.h>
  28. #include <linux/uaccess.h>
  29. #include <linux/regulator/consumer.h>
  30. #include <linux/delay.h>
  31. #include <linux/completion.h>
  32. #include <linux/firmware.h>
  33. #include <linux/sysfs.h>
  34. #include <linux/bitops.h>
  35. #include <linux/pm_runtime.h>
  36. #include <linux/debugfs.h>
  37. #include <linux/timer.h>
  38. #include <sound/core.h>
  39. #include <sound/pcm.h>
  40. #include <sound/pcm_params.h>
  41. #include <sound/soc.h>
  42. #include <sound/initval.h>
  43. #include <sound/tlv.h>
  44. #include <linux/firmware/cirrus/cl_dsp.h>
  45. #ifdef CONFIG_CS40L26_SAMSUNG_FEATURE
  46. #include <linux/of_gpio.h>
  47. #include <linux/vibrator/sec_vibrator_inputff.h>
  48. #endif
  49. #define CS40L26_LASTREG 0x3C7DFE8
  50. #define CS40L26_DEVID 0x0
  51. #define CS40L26_REVID 0x4
  52. #define CS40L26_TEST_KEY_CTRL 0x40
  53. #define CS40L26_GLOBAL_ENABLES 0x2014
  54. #define CS40L26_BLOCK_ENABLES2 0x201C
  55. #define CS40L26_ERROR_RELEASE 0x2034
  56. #define CS40L26_PWRMGT_CTL 0x2900
  57. #define CS40L26_PWRMGT_STS 0x290C
  58. #define CS40L26_REFCLK_INPUT 0x2C04
  59. #define CS40L26_GLOBAL_SAMPLE_RATE 0x2C0C
  60. #define CS40L26_PLL_REFCLK_DETECT_0 0x2C28
  61. #define CS40L26_VBST_CTL_1 0x3800
  62. #define CS40L26_VBST_CTL_2 0x3804
  63. #define CS40L26_BST_IPK_CTL 0x3808
  64. #define CS40L26_BST_DCM_CTL 0x381C
  65. #define CS40L26_TEST_LBST 0x391C
  66. #define CS40L26_MONITOR_FILT 0x4008
  67. #define CS40L26_SPKMON_VMON_DEC_OUT_DATA 0x41B4
  68. #define CS40L26_ENABLES_AND_CODES_DIG 0x4308
  69. #define CS40L26_ASP_ENABLES1 0x4800
  70. #define CS40L26_ASP_CONTROL2 0x4808
  71. #define CS40L26_ASP_FRAME_CONTROL5 0x4820
  72. #define CS40L26_ASP_DATA_CONTROL5 0x4840
  73. #define CS40L26_DACPCM1_INPUT 0x4C00
  74. #define CS40L26_ASPTX1_INPUT 0x4C20
  75. #define CS40L26_DSP1RX1_INPUT 0x4C40
  76. #define CS40L26_DSP1RX5_INPUT 0x4C50
  77. #define CS40L26_NGATE1_INPUT 0x4C60
  78. #define CS40L26_VPBR_CONFIG 0x6404
  79. #define CS40L26_VBBR_CONFIG 0x6408
  80. #define CS40L26_VPBR_STATUS 0x640C
  81. #define CS40L26_VBBR_STATUS 0x6410
  82. #define CS40L26_NG_CONFIG 0x6808
  83. #define CS40L26_DIGPWM_CONFIG2 0x7068
  84. #define CS40L26_TST_DAC_MSM_CONFIG 0x7404
  85. #define CS40L26_IRQ1_CFG 0x10000
  86. #define CS40L26_IRQ1_STATUS 0x10004
  87. #define CS40L26_IRQ1_EINT_1 0x10010
  88. #define CS40L26_IRQ1_EINT_2 0x10014
  89. #define CS40L26_IRQ1_STS_1 0x10090
  90. #define CS40L26_IRQ1_STS_2 0x10094
  91. #define CS40L26_IRQ1_MASK_1 0x10110
  92. #define CS40L26_IRQ1_MASK_2 0x10114
  93. #define CS40L26_MIXER_NGATE_CH1_CFG 0x12004
  94. #define CS40L26_DSP_MBOX_1 0x13000
  95. #define CS40L26_DSP_MBOX_2 0x13004
  96. #define CS40L26_DSP_MBOX_3 0x13008
  97. #define CS40L26_DSP_MBOX_4 0x1300C
  98. #define CS40L26_DSP_MBOX_5 0x13010
  99. #define CS40L26_DSP_MBOX_6 0x13014
  100. #define CS40L26_DSP_MBOX_7 0x13018
  101. #define CS40L26_DSP_MBOX_8 0x1301C
  102. #define CS40L26_DSP_VIRTUAL1_MBOX_1 0x13020
  103. #define CS40L26_DSP1_XMEM_PACKED_0 0x2000000
  104. #define CS40L26_DSP1_XMEM_PACKED_6143 0x2005FFC
  105. #define CS40L26_DSP1_XROM_PACKED_0 0x2006000
  106. #define CS40L26_DSP1_XROM_PACKED_4604 0x200A7F0
  107. #define CS40L26_DSP1_XMEM_UNPACKED32_0 0x2400000
  108. #define CS40L26_DSP1_XROM_UNPACKED32_3070 0x2406FF8
  109. #define CS40L26_DSP1_XMEM_UNPACKED24_0 0x2800000
  110. #define CS40L26_DSP1_XMEM_UNPACKED24_8191 0x2807FFC
  111. #define CS40L26_DSP1_XROM_UNPACKED24_0 0x2808000
  112. #define CS40L26_DSP1_XROM_UNPACKED24_6141 0x280DFF4
  113. #define CS40L26_DSP1_CCM_CORE_CONTROL 0x2BC1000
  114. #define CS40L26_DSP1_YMEM_PACKED_0 0x2C00000
  115. #define CS40L26_DSP1_YMEM_PACKED_1532 0x2C017F0
  116. #define CS40L26_DSP1_YMEM_UNPACKED32_0 0x3000000
  117. #define CS40L26_DSP1_YMEM_UNPACKED32_1022 0x3000FF8
  118. #define CS40L26_DSP1_YMEM_UNPACKED24_0 0x3400000
  119. #define CS40L26_DSP1_YMEM_UNPACKED24_2045 0x3401FF4
  120. #define CS40L26_DSP1_PMEM_0 0x3800000
  121. #define CS40L26_DSP1_PMEM_5114 0x3804FE8
  122. #define CS40L26_DSP1_PROM_0 0x3C60000
  123. #define CS40L26_DSP1_PROM_30714 0x3C7DFE8
  124. #ifndef CONFIG_CS40L26_SAMSUNG_USE_MAX_DATA_TX_SIZE
  125. /* this is not a CS40L26 restriction and modified by samsung for i3c */
  126. #define CS40L26_MAX_I2C_READ_SIZE_WORDS 16
  127. #else
  128. #define CS40L26_MAX_I2C_READ_SIZE_WORDS 32
  129. #endif
  130. /* Register default changes */
  131. #define CS40L26_TST_DAC_MSM_CONFIG_DEFAULT_CHANGE_VALUE_FULL 0x11330000
  132. #define CS40L26_TST_DAC_MSM_CONFIG_DEFAULT_CHANGE_VALUE_H16 (\
  133. CS40L26_TST_DAC_MSM_CONFIG_DEFAULT_CHANGE_VALUE_FULL >> 16)
  134. #define CS40L26_SPK_DEFAULT_HIZ_MASK BIT(28)
  135. #define CS40L26_SPK_DEFAULT_HIZ_SHIFT 28
  136. /* Device */
  137. #define CS40L26_DEV_NAME "CS40L26"
  138. #define CS40L26_DEVID_A 0x40A260
  139. #define CS40L26_DEVID_B 0x40A26B
  140. #define CS40L26_DEVID_L27_A 0x40A270
  141. #define CS40L26_DEVID_L27_B 0x40A27B
  142. #define CS40L26_DEVID_MASK GENMASK(23, 0)
  143. #define CS40L26_NUM_DEVS 4
  144. #define CS40L26_REVID_A1 0xA1
  145. #define CS40L26_REVID_B0 0xB0
  146. #define CS40L26_REVID_B1 0xB1
  147. #define CS40L26_REVID_B2 0xB2
  148. #define CS40L26_REVID_MASK GENMASK(7, 0)
  149. #define CS40L26_ID_L26A_A1 ((CS40L26_DEVID_A << 8) | CS40L26_REVID_A1)
  150. #define CS40L26_ID_L26B_A1 ((CS40L26_DEVID_B << 8) | CS40L26_REVID_A1)
  151. #define CS40L26_ID_L27A_A1 ((CS40L26_DEVID_L27_A << 8) | CS40L26_REVID_A1)
  152. #define CS40L26_ID_L27B_A1 ((CS40L26_DEVID_L27_B << 8) | CS40L26_REVID_A1)
  153. #define CS40L26_ID_L26A_B0 ((CS40L26_DEVID_A << 8) | CS40L26_REVID_B0)
  154. #define CS40L26_ID_L26B_B0 ((CS40L26_DEVID_B << 8) | CS40L26_REVID_B0)
  155. #define CS40L26_ID_L27A_B0 ((CS40L26_DEVID_L27_A << 8) | CS40L26_REVID_B0)
  156. #define CS40L26_ID_L27B_B0 ((CS40L26_DEVID_L27_B << 8) | CS40L26_REVID_B0)
  157. #define CS40L26_ID_L27A_B1 ((CS40L26_DEVID_L27_A << 8) | CS40L26_REVID_B1)
  158. #define CS40L26_ID_L27A_B2 ((CS40L26_DEVID_L27_A << 8) | CS40L26_REVID_B2)
  159. #define CS40L26_GLOBAL_EN_MASK BIT(0)
  160. #define CS40L26_DSP_CCM_CORE_KILL 0x00000080
  161. #define CS40L26_DSP_CCM_CORE_RESET 0x00000281
  162. #define CS40L26_GLOBAL_FS_MASK GENMASK(4, 0)
  163. #define CS40L26_GLOBAL_FS_48K 0x03
  164. #define CS40L26_GLOBAL_FS_96K 0x04
  165. #define CS40L26_MEM_RDY_MASK BIT(1)
  166. #define CS40L26_MEM_RDY_SHIFT 1
  167. #define CS40L26_DSP_HALO_STATE_RUN 2
  168. #define CS40L26_NUM_PCT_MAP_VALUES 101
  169. #define CS40L26_TEST_KEY_UNLOCK_CODE1 0x00000055
  170. #define CS40L26_TEST_KEY_UNLOCK_CODE2 0x000000AA
  171. #define CS40L26_TEST_KEY_LOCK_CODE 0x00000000
  172. /* DSP State */
  173. #define CS40L26_DSP_STATE_HIBERNATE 0
  174. #define CS40L26_DSP_STATE_SHUTDOWN 1
  175. #define CS40L26_DSP_STATE_STANDBY 2
  176. #define CS40L26_DSP_STATE_ACTIVE 3
  177. #define CS40L26_DSP_STATE_MASK GENMASK(7, 0)
  178. #define CS40L26_DSP_STATE_ATTEMPTS 5
  179. #define CS40L26_DSP_LOCK3_OFFSET 8
  180. #define CS40L26_DSP_LOCK3_MASK BIT(1)
  181. #define CS40L26_DSP_SHUTDOWN_MAX_ATTEMPTS 10
  182. /* Algorithms */
  183. #define CS40L26_A2H_ALGO_ID 0x00040110
  184. #define CS40L26_BUZZGEN_ALGO_ID 0x0001F202
  185. #define CS40L26_DYNAMIC_F0_ALGO_ID 0x0001F21B
  186. #define CS40L26_EVENT_HANDLER_ALGO_ID 0x0001F200
  187. #define CS40L26_F0_EST_ALGO_ID 0x0001F20C
  188. #define CS40L26_GPIO_ALGO_ID 0x0001F201
  189. #define CS40L26_MAILBOX_ALGO_ID 0x0001F203
  190. #define CS40L26_MDSYNC_ALGO_ID 0x0001F20F
  191. #define CS40L26_PM_ALGO_ID 0x0001F206
  192. #define CS40L26_SVC_ALGO_ID 0x0001F207
  193. #define CS40L26_VIBEGEN_ALGO_ID 0x000100BD
  194. #define CS40L26_LOGGER_ALGO_ID 0x0004013D
  195. #define CS40L26_EVENT_LOGGER_ALGO_ID 0x0004F222
  196. #define CS40L26_EXT_ALGO_ID 0x0004013C
  197. #define CS40L26_DVL_ALGO_ID 0x00040140
  198. #define CS40L26_EP_ALGO_ID 0x00040141
  199. #define CS40L26_LF0T_ALGO_ID 0x00040143
  200. /* DebugFS */
  201. #define CS40L26_ALGO_ID_MAX_STR_LEN 12
  202. #define CS40L26_NUM_DEBUGFS 3
  203. /* Power management */
  204. #define CS40L26_PSEQ_MAX_WORDS 129
  205. #define CS40L26_PSEQ_NUM_OPS 8
  206. #define CS40L26_PSEQ_OP_MASK GENMASK(23, 16)
  207. #define CS40L26_PSEQ_OP_SHIFT 16
  208. #define CS40L26_PSEQ_OP_WRITE_FULL 0x00
  209. #define CS40L26_PSEQ_OP_WRITE_FULL_WORDS 3
  210. #define CS40L26_PSEQ_OP_WRITE_FIELD 0x01
  211. #define CS40L26_PSEQ_OP_WRITE_FIELD_WORDS 4
  212. #define CS40L26_PSEQ_OP_WRITE_ADDR8 0x02
  213. #define CS40L26_PSEQ_OP_WRITE_ADDR8_WORDS 2
  214. #define CS40L26_PSEQ_OP_WRITE_INCR 0x03
  215. #define CS40L26_PSEQ_OP_WRITE_INCR_WORDS 2
  216. #define CS40L26_PSEQ_OP_WRITE_L16 0x04
  217. #define CS40L26_PSEQ_OP_WRITE_H16 0x05
  218. #define CS40L26_PSEQ_OP_WRITE_X16_WORDS 2
  219. #define CS40L26_PSEQ_OP_DELAY 0xFE
  220. #define CS40L26_PSEQ_OP_DELAY_WORDS 1
  221. #define CS40L26_PSEQ_OP_END 0xFF
  222. #define CS40L26_PSEQ_OP_END_WORDS 1
  223. #define CS40L26_PSEQ_OP_END_ADDR 0xFFFFFF
  224. #define CS40L26_PSEQ_OP_END_DATA 0xFFFFFF
  225. #define CS40L26_PSEQ_INVALID_ADDR 0xFF000000
  226. #define CS40L26_PSEQ_WRITE_FULL_LOWER_ADDR_SHIFT 8
  227. #define CS40L26_PSEQ_WRITE_FULL_UPPER_ADDR_SHIFT 16
  228. #define CS40L26_PSEQ_WRITE_FULL_LOWER_ADDR_MASK GENMASK(15, 0)
  229. #define CS40L26_PSEQ_WRITE_FULL_UPPER_ADDR_MASK GENMASK(31, 0)
  230. #define CS40L26_PSEQ_WRITE_FULL_UPPER_DATA_SHIFT 24
  231. #define CS40L26_PSEQ_WRITE_FULL_LOWER_DATA_MASK GENMASK(23, 0)
  232. #define CS40L26_PSEQ_WRITE_FULL_UPPER_DATA_MASK GENMASK(31, 24)
  233. #define CS40L26_PSEQ_WRITE_X16_LOWER_ADDR_SHIFT 16
  234. #define CS40L26_PSEQ_WRITE_X16_LOWER_ADDR_MASK GENMASK(7, 0)
  235. #define CS40L26_PSEQ_WRITE_X16_UPPER_ADDR_SHIFT 8
  236. #define CS40L26_PSEQ_WRITE_X16_UPPER_ADDR_MASK GENMASK(23, 8)
  237. #define CS40L26_PSEQ_WRITE_X16_UPPER_DATA_SHIFT 0
  238. #define CS40L26_PSEQ_WRITE_X16_UPPER_DATA_MASK GENMASK(31, 0)
  239. #define CS40L26_PSEQ_WRITE_ADDR8_ADDR_SHIFT 8
  240. #define CS40L26_PSEQ_WRITE_ADDR8_ADDR_MASK GENMASK(7, 0)
  241. #define CS40L26_PSEQ_WRITE_ADDR8_UPPER_DATA_SHIFT 24
  242. #define CS40L26_PSEQ_WRITE_ADDR8_UPPER_DATA_MASK GENMASK(31, 24)
  243. #define CS40L26_PSEQ_WRITE_ADDR8_LOWER_DATA_MASK GENMASK(23, 0)
  244. #define CS40L26_PM_STDBY_TIMEOUT_OFFSET 16
  245. #define CS40L26_PM_STDBY_TIMEOUT_MS_MIN 100
  246. #define CS40L26_PM_TIMEOUT_MS_MAX 10000
  247. #define CS40L26_PM_ACTIVE_TIMEOUT_OFFSET 24
  248. #define CS40L26_PM_ACTIVE_TIMEOUT_MS_DEFAULT 250
  249. #define CS40L26_PM_ACTIVE_TIMEOUT_MS_MIN 0
  250. #define CS40L26_PM_TIMEOUT_TICKS_LOWER_MASK GENMASK(23, 0)
  251. #define CS40L26_PM_TIMEOUT_TICKS_UPPER_MASK GENMASK(7, 0)
  252. #define CS40L26_PM_TIMEOUT_TICKS_UPPER_SHIFT 24
  253. #define CS40L26_PM_TICKS_PER_MS 32
  254. #define CS40L26_AUTOSUSPEND_DELAY_MS 2000
  255. #define CS40L26_WKSRC_STS_MASK GENMASK(9, 4)
  256. #define CS40L26_WKSRC_STS_SHIFT 4
  257. #define CS40L26_WKSRC_GPIO_POL_MASK GENMASK(3, 0)
  258. #define CS40L26_WKSRC_STS_EN BIT(7)
  259. #define CS40L26_NG_THRESHOLD_MASK GENMASK(2, 0)
  260. #define CS40L26_NG_DELAY_MASK GENMASK(6, 4)
  261. #define CS40L26_NG_ENABLE_MASK GENMASK(13, 8)
  262. #define CS40L26_NG_THRESHOLD_DEFAULT 3
  263. #define CS40L26_NG_THRESHOLD_MIN 0
  264. #define CS40L26_NG_THRESHOLD_MAX 7
  265. #define CS40L26_NG_DELAY_DEFAULT 3
  266. #define CS40L26_NG_DELAY_MIN 0
  267. #define CS40L26_NG_DELAY_MAX 7
  268. #define CS40L26_AUX_NG_THLD_MASK GENMASK(2, 0)
  269. #define CS40L26_AUX_NG_HOLD_MASK GENMASK(11, 8)
  270. #define CS40L26_AUX_NG_EN_MASK BIT(16)
  271. #define CS40L26_AUX_NG_THLD_DEFAULT 3
  272. #define CS40L26_AUX_NG_THLD_MAX 7
  273. #define CS40L26_AUX_NG_HOLD_DEFAULT 3
  274. #define CS40L26_AUX_NG_HOLD_MAX 15
  275. /* DSP mailbox controls */
  276. #define CS40L26_DSP_TIMEOUT_US_MIN 1000
  277. #define CS40L26_DSP_TIMEOUT_US_MAX 1100
  278. #define CS40L26_DSP_TIMEOUT_COUNT 100
  279. #define CS40L26_DSP_MBOX_CMD_HIBER 0x02000001
  280. #define CS40L26_DSP_MBOX_CMD_WAKEUP 0x02000002
  281. #define CS40L26_DSP_MBOX_CMD_PREVENT_HIBER 0x02000003
  282. #define CS40L26_DSP_MBOX_CMD_ALLOW_HIBER 0x02000004
  283. #define CS40L26_DSP_MBOX_CMD_SHUTDOWN 0x02000005
  284. #define CS40L26_DSP_MBOX_PM_CMD_BASE CS40L26_DSP_MBOX_CMD_HIBER
  285. #define CS40L26_DSP_MBOX_CMD_START_I2S 0x03000002
  286. #define CS40L26_DSP_MBOX_CMD_STOP_I2S 0x03000003
  287. #define CS40L26_DSP_MBOX_CMD_LOGGER_MAX_RESET 0x03000004
  288. #define CS40L26_DSP_MBOX_CMD_A2H_REINIT 0x03000007
  289. #define CS40L26_DSP_MBOX_CMD_OWT_PUSH 0x03000008
  290. #define CS40L26_DSP_MBOX_CMD_OWT_RESET 0x03000009
  291. #define CS40L26_DSP_MBOX_CMD_LE_EST 0x07000004
  292. #define CS40L26_DSP_MBOX_CMD_OWT_DELETE_BASE 0x0D000000
  293. #define CS40L26_DSP_MBOX_CMD_HE_TIME_BASE 0x0E000000
  294. #define CS40L26_DSP_MBOX_CMD_INDEX_MASK GENMASK(28, 24)
  295. #define CS40L26_DSP_MBOX_CMD_INDEX_SHIFT 24
  296. #define CS40L26_DSP_MBOX_CMD_PAYLOAD_MASK GENMASK(23, 0)
  297. #define CS40L26_DSP_MBOX_CMD_INDEX_CALIBRATION_CONTROL 0x7
  298. #define CS40L26_DSP_MBOX_BUFFER_NUM_REGS 4
  299. #define CS40L26_DSP_MBOX_COMPLETE_MBOX 0x01000000
  300. #define CS40L26_DSP_MBOX_COMPLETE_GPIO 0x01000001
  301. #define CS40L26_DSP_MBOX_COMPLETE_I2S 0x01000002
  302. #define CS40L26_DSP_MBOX_TRIGGER_CP 0x01000010
  303. #define CS40L26_DSP_MBOX_TRIGGER_GPIO 0x01000011
  304. #define CS40L26_DSP_MBOX_TRIGGER_I2S 0x01000012
  305. #define CS40L26_DSP_MBOX_PM_AWAKE 0x02000002
  306. #define CS40L26_DSP_MBOX_F0_EST_START 0x07000011
  307. #define CS40L26_DSP_MBOX_F0_EST_DONE 0x07000021
  308. #define CS40L26_DSP_MBOX_REDC_EST_START 0x07000012
  309. #define CS40L26_DSP_MBOX_REDC_EST_DONE 0x07000022
  310. #define CS40L26_DSP_MBOX_LE_EST_START 0x07000014
  311. #define CS40L26_DSP_MBOX_LE_EST_DONE 0x07000024
  312. #define CS40L26_DSP_MBOX_PEQ_CALCULATION_START 0x07000018
  313. #define CS40L26_DSP_MBOX_PEQ_CALCULATION_DONE 0x07000028
  314. #define CS40L26_DSP_MBOX_LS_CALIBRATION_START 0x07000010
  315. #define CS40L26_DSP_MBOX_LS_CALIBRATION_DONE 0x07000030
  316. #define CS40L26_DSP_MBOX_LS_CALIBRATION_ERROR 0x07000040
  317. #define CS40L26_DSP_MBOX_SYS_ACK 0x0A000000
  318. #define CS40L26_DSP_MBOX_PANIC 0x0C000000
  319. #define CS40L26_DSP_MBOX_WATERMARK 0x0D000000
  320. #define CS40L26_DSP_MBOX_HE_PAYLOAD_MAX_MS GENMASK(22, 0)
  321. #define CS40L26_DSP_MBOX_HE_PAYLOAD_OVERFLOW BIT(23)
  322. /* Firmware Mode */
  323. #define CS40L26_FW_FILE_NAME "cs40l26.wmfw"
  324. #define CS40L26_FW_CALIB_NAME "cs40l26-calib.wmfw"
  325. #define CS40L26_MAX_TUNING_FILES 6
  326. #define CS40L26_WT_FILE_NAME "cs40l26.bin"
  327. #define CS40L26_WT_FILE_PREFIX "cs40l26-wt"
  328. #define CS40L26_WT_FILE_PREFIX_LEN 11
  329. #define CS40L26_SVC_TUNING_FILE_PREFIX "cs40l26-svc"
  330. #define CS40L26_SVC_TUNING_FILE_PREFIX_LEN 12
  331. #define CS40L26_SVC_TUNING_FILE_NAME "cs40l26-svc.bin"
  332. #define CS40L26_A2H_TUNING_FILE_NAME "cs40l26-a2h.bin"
  333. #define CS40L26_TUNING_FILE_NAME_MAX_LEN 20
  334. #define CS40L26_TUNING_FILE_SUFFIX ".bin"
  335. #define CS40L26_TUNING_FILE_SUFFIX_LEN 4
  336. #define CS40L26_DVL_FILE_NAME "cs40l26-dvl.bin"
  337. #define CS40L26_CALIB_BIN_FILE_NAME "cs40l26-calib.bin"
  338. #define CS40L26_EP_TUNING_FILE_NAME "cs40l26-ep.bin"
  339. #define CS40L26_LF0T_FILE_NAME "cs40l26-lf0t.bin"
  340. #define CS40L26_SVC_LE_EST_TIME_US 8000
  341. #define CS40L26_SVC_LE_MAX_ATTEMPTS 2
  342. #define CS40L26_SVC_DT_PREFIX "svc-le"
  343. #define CS40L26_FW_ID 0x1800D4
  344. #define CS40L26_FW_MIN_REV 0x07022B
  345. #define CS40L26_FW_BRANCH 0x07
  346. #define CS40L26_FW_CALIB_ID 0x1800DA
  347. #define CS40L26_FW_CALIB_MIN_REV 0x010123
  348. #define CS40L26_FW_CALIB_BRANCH 0x01
  349. #define CS40L26_FW_MAINT_MIN_REV 0x270216
  350. #define CS40L26_FW_MAINT_BRANCH 0x27
  351. #define CS40L26_FW_MAINT_CALIB_MIN_REV 0x21010D
  352. #define CS40L26_FW_MAINT_CALIB_BRANCH 0x21
  353. #define CS40L26_FW_B2_MIN_REV 0x080100
  354. #define CS40L26_FW_B2_BRANCH 0x08
  355. #define CS40L26_FW_GPI_TIMEOUT_MIN_REV 0x07022A
  356. #define CS40L26_FW_GPI_TIMEOUT_CALIB_MIN_REV 0x010122
  357. #define CS40L26_FW_BRANCH_MASK GENMASK(23, 21)
  358. #define CS40L26_CCM_CORE_RESET 0x00000200
  359. #define CS40L26_CCM_CORE_ENABLE 0x00000281
  360. /* Wavetable */
  361. #define CS40L26_WT_NAME_XM "WAVE_XM_TABLE"
  362. #define CS40L26_WT_NAME_YM "WAVE_YM_TABLE"
  363. /* Power supplies */
  364. #define CS40L26_VP_SUPPLY 0
  365. #define CS40L26_VA_SUPPLY 1
  366. #define CS40L26_NUM_SUPPLIES 2
  367. #define CS40L26_VP_SUPPLY_NAME "VP"
  368. #define CS40L26_VA_SUPPLY_NAME "VA"
  369. #define CS40L26_MIN_RESET_PULSE_WIDTH 1500
  370. #define CS40L26_CONTROL_PORT_READY_DELAY 6000
  371. /* Haptic triggering */
  372. #define CS40L26_STOP_PLAYBACK 0x05000000
  373. #define CS40L26_MAX_INDEX_MASK 0x0000FFFF
  374. #define CS40L26_CUSTOM_DATA_SIZE 2
  375. #define CS40L26_RAM_INDEX_START 0x01000000
  376. #define CS40L26_RAM_INDEX_END 0x0100007F
  377. #define CS40L26_ROM_INDEX_START 0x01800000
  378. #define CS40L26_ROM_INDEX_END 0x01800026
  379. #define CS40L26_OWT_INDEX_START 0x01400000
  380. #define CS40L26_OWT_INDEX_END 0x01400010
  381. #define CS40L26_RAM_BANK_ID 0
  382. #define CS40L26_ROM_BANK_ID 1
  383. #define CS40L26_OWT_BANK_ID 2
  384. #define CS40L26_BUZ_BANK_ID 3
  385. #define CS40L26_BUZZGEN_NUM_CONFIGS (CS40L26_BUZZGEN_INDEX_END - CS40L26_BUZZGEN_INDEX_START)
  386. #define CS40L26_BUZZGEN_INDEX_START 0x01800080
  387. #define CS40L26_BUZZGEN_INDEX_END 0x01800085
  388. #define CS40L26_BUZZGEN_PER_MAX 10 /* ms */
  389. #define CS40L26_BUZZGEN_PER_MIN 4
  390. #define CS40L26_BUZZGEN_LEVEL_MIN 0x00
  391. #define CS40L26_BUZZGEN_LEVEL_MAX 0xFF
  392. #define CS40L26_AMP_CTRL_VOL_PCM_MASK GENMASK(13, 3)
  393. #define CS40L26_AMP_CTRL_VOL_PCM_SHIFT 3
  394. #define CS40L26_AMP_VOL_PCM_MAX 0x07FF
  395. #define CS40L26_ERASE_BUFFER_MS 500
  396. #define CS40L26_MAX_WAIT_VIBE_COMPLETE_MS 10000
  397. /* GPI Triggering */
  398. #define CS40L26_GPIO1 1
  399. #define CS40L26_EVENT_MAP_INDEX_MASK GENMASK(8, 0)
  400. #define CS40L26_EVENT_MAP_NUM_GPI_REGS 4
  401. #define CS40L26_EVENT_MAP_GPI_DISABLE 0x1FF
  402. #define CS40L26_BTN_INDEX_MASK GENMASK(7, 0)
  403. #define CS40L26_BTN_BUZZ_MASK BIT(7)
  404. #define CS40L26_BTN_BUZZ_SHIFT 7
  405. #define CS40L26_BTN_BANK_MASK BIT(8)
  406. #define CS40L26_BTN_BANK_SHIFT 8
  407. #define CS40L26_BTN_NUM_MASK GENMASK(14, 12)
  408. #define CS40L26_BTN_NUM_SHIFT 12
  409. #define CS40L26_BTN_EDGE_MASK BIT(15)
  410. #define CS40L26_BTN_EDGE_SHIFT 15
  411. #define CS40L26_BTN_OWT_MASK BIT(16)
  412. #define CS40L26_BTN_OWT_SHIFT 16
  413. /* Interrupts */
  414. #define CS40L26_IRQ_STATUS_MASK BIT(0)
  415. #define CS40L26_GPIO1_RISE_MASK BIT(0)
  416. #define CS40L26_GPIO1_FALL_MASK BIT(1)
  417. #define CS40L26_GPIO2_RISE_MASK BIT(2)
  418. #define CS40L26_GPIO2_FALL_MASK BIT(3)
  419. #define CS40L26_GPIO3_RISE_MASK BIT(4)
  420. #define CS40L26_GPIO3_FALL_MASK BIT(5)
  421. #define CS40L26_GPIO4_RISE_MASK BIT(6)
  422. #define CS40L26_GPIO4_FALL_MASK BIT(7)
  423. #define CS40L26_WKSRC_STS_ANY_MASK BIT(8)
  424. #define CS40L26_WKSRC_STS_GPIO1_MASK BIT(9)
  425. #define CS40L26_WKSRC_STS_GPIO2_MASK BIT(10)
  426. #define CS40L26_WKSRC_STS_GPIO3_MASK BIT(11)
  427. #define CS40L26_WKSRC_STS_GPIO4_MASK BIT(12)
  428. #define CS40L26_WKSRC_STS_SPI_MASK BIT(13)
  429. #define CS40L26_WKSRC_STS_I2C_MASK BIT(14)
  430. #define CS40L26_BST_OVP_ERR_MASK BIT(20)
  431. #define CS40L26_BST_DCM_UVP_ERR_MASK BIT(21)
  432. #define CS40L26_BST_SHORT_ERR_MASK BIT(22)
  433. #define CS40L26_BST_IPK_FLAG_MASK BIT(23)
  434. #define CS40L26_TEMP_ERR_MASK BIT(26)
  435. #define CS40L26_AMP_ERR_MASK BIT(27)
  436. #define CS40L26_VIRTUAL2_MBOX_WR_MASK BIT(31)
  437. #define CS40L26_VPBR_FLAG_MASK BIT(17)
  438. #define CS40L26_VPBR_ATT_CLR_MASK BIT(18)
  439. #define CS40L26_VBBR_FLAG_MASK BIT(19)
  440. #define CS40L26_VBBR_ATT_CLR_MASK BIT(20)
  441. #define CS40L26_IRQ(_irq, _name, _hand) \
  442. { \
  443. .irq = CS40L26_ ## _irq ## _IRQ, \
  444. .name = _name, \
  445. .handler = _hand, \
  446. }
  447. #define CS40L26_REG_IRQ(_reg, _irq) \
  448. [CS40L26_ ## _irq ## _IRQ] = { \
  449. .reg_offset = (CS40L26_ ## _reg) - CS40L26_IRQ1_EINT_1, \
  450. .mask = CS40L26_ ## _irq ## _MASK \
  451. }
  452. /* temp monitoring */
  453. #define CS40L26_TEMP_RESULT_FILT_MASK GENMASK(24, 16)
  454. #define CS40L26_TEMP_RESULT_FILT_SHIFT 16
  455. /* BST */
  456. #define CS40L26_BST_DCM_EN_DEFAULT 1
  457. #define CS40L26_BST_DCM_EN_MASK BIT(0)
  458. #define CS40L26_BST_DCM_EN_SHIFT 0
  459. #define CS40L26_BST_IPK_UA_MAX 4800000
  460. #define CS40L26_BST_IPK_UA_MIN 800000
  461. #define CS40L26_BST_IPK_UA_STEP 50000
  462. #define CS40L26_BST_IPK_UA_DEFAULT 4500000
  463. #ifdef CONFIG_CS40L26_SAMSUNG_FEATURE
  464. #define CS40L26_BST_IPK_DEFAULT 0x40
  465. #else
  466. #define CS40L26_BST_IPK_DEFAULT 0x4A
  467. #endif
  468. #define CS40L26_BST_UV_MIN 2500000
  469. #define CS40L26_BST_UV_MAX 11000000
  470. #define CS40L26_BST_UV_STEP 50000
  471. #define CS40L26_BST_CTL_DEFAULT 0xAA
  472. #define CS40L26_BST_CTL_VP 0x00
  473. #define CS40L26_BST_CTL_MASK GENMASK(7, 0)
  474. #define CS40L26_BST_CTL_SEL_MASK GENMASK(1, 0)
  475. #define CS40L26_BST_CTL_SEL_FIXED 0x0
  476. #define CS40L26_CLIP_LVL_UV_MAX 11000000
  477. #define CS40L26_CLIP_LVL_UV_MIN 250000
  478. #define CS40L26_CLIP_LVL_UV_STEP 250000
  479. #define CS40L26_CLIP_LVL_DEFAULT 0x2C
  480. #define CS40L26_CLIP_LVL_MASK GENMASK(17, 12)
  481. #define CS40L26_CLIP_LVL_SHIFT 12
  482. #define CS40L26_BST_TIME_MIN_US 10000
  483. #define CS40L26_BST_TIME_MAX_US 10100
  484. #define CS40L26_BST_CTL_LIM_EN_MASK BIT(2)
  485. #define CS40L26_BST_CTL_LIM_EN_SHIFT 2
  486. #define CS40L26_OVERPROTECTION_GAIN_MIN BIT(20)
  487. #define CS40L26_BOOST_DISABLE_DELAY_MIN 0
  488. #define CS40L26_BOOST_DISABLE_DELAY_MAX 8388608
  489. /* Brownout prevention */
  490. #define CS40L26_VXBR_STATUS_DIV_STEP 625
  491. #define CS40L26_VXBR_STATUS_MASK GENMASK(7, 0)
  492. #define CS40L26_VXBR_DEFAULT_MASK GENMASK(31, 24)
  493. #define CS40L26_VBBR_EN_MASK BIT(13)
  494. #define CS40L26_VBBR_EN_SHIFT 13
  495. #define CS40L26_VPBR_EN_MASK BIT(12)
  496. #define CS40L26_VPBR_EN_SHIFT 12
  497. #define CS40L26_VPBR_THLD_MASK GENMASK(4, 0)
  498. #define CS40L26_VPBR_THLD_MIN 0x02
  499. #define CS40L26_VPBR_THLD_MAX 0x1F
  500. #define CS40L26_VPBR_THLD_UV_DIV 47000
  501. #define CS40L26_VPBR_THLD_UV_MIN 2497000
  502. #define CS40L26_VPBR_THLD_UV_MAX 3874000
  503. #define CS40L26_VPBR_THLD_UV_DEFAULT 2639000
  504. #define CS40L26_VBBR_THLD_MASK GENMASK(5, 0)
  505. #define CS40L26_VBBR_THLD_MIN 0x02
  506. #define CS40L26_VBBR_THLD_MAX 0x3F
  507. #define CS40L26_VBBR_THLD_UV_DIV 55000
  508. #define CS40L26_VBBR_THLD_UV_MIN 109000
  509. #define CS40L26_VBBR_THLD_UV_MAX 3445000
  510. #define CS40L26_VBBR_THLD_UV_DEFAULT 273000
  511. #define CS40L26_VXBR_MAX_ATT_MASK GENMASK(11, 8)
  512. #define CS40L26_VXBR_MAX_ATT_SHIFT 8
  513. #define CS40L26_VXBR_MAX_ATT_MAX 15
  514. #define CS40L26_VXBR_MAX_ATT_MIN 0
  515. #define CS40L26_VXBR_MAX_ATT_DEFAULT 9
  516. #define CS40L26_VXBR_ATK_STEP_MASK GENMASK(15, 12)
  517. #define CS40L26_VXBR_ATK_STEP_SHIFT 12
  518. #define CS40L26_VXBR_ATK_STEP_MIN 0
  519. #define CS40L26_VXBR_ATK_STEP_MAX 7
  520. #define CS40L26_VXBR_ATK_STEP_DEFAULT 1
  521. #define CS40L26_VXBR_ATK_RATE_MASK GENMASK(18, 16)
  522. #define CS40L26_VXBR_ATK_RATE_SHIFT 16
  523. #define CS40L26_VXBR_ATK_RATE_MIN 0
  524. #define CS40L26_VXBR_ATK_RATE_MAX 7
  525. #define CS40L26_VXBR_ATK_RATE_DEFAULT 2
  526. #define CS40L26_VXBR_WAIT_MASK GENMASK(20, 19)
  527. #define CS40L26_VXBR_WAIT_SHIFT 19
  528. #define CS40L26_VXBR_WAIT_MAX 3
  529. #define CS40L26_VXBR_WAIT_MIN 0
  530. #define CS40L26_VXBR_WAIT_DEFAULT 1
  531. #define CS40L26_VXBR_REL_RATE_MASK GENMASK(23, 21)
  532. #define CS40L26_VXBR_REL_RATE_SHIFT 21
  533. #define CS40L26_VXBR_REL_RATE_MAX 7
  534. #define CS40L26_VXBR_REL_RATE_MIN 0
  535. #define CS40L26_VXBR_REL_RATE_DEFAULT 5
  536. /* Mixer noise gate */
  537. #define CS40L26_MIXER_NGATE_CH1_CFG_DEFAULT_NEW 0x00010003
  538. /* Audio */
  539. #define CS40L26_PLL_CLK_CFG_32768 0x00
  540. #define CS40L26_PLL_CLK_CFG_1536000 0x1B
  541. #define CS40L26_PLL_CLK_CFG_3072000 0x21
  542. #define CS40L26_PLL_CLK_CFG_6144000 0x28
  543. #define CS40L26_PLL_CLK_CFG_9600000 0x30
  544. #define CS40L26_PLL_CLK_CFG_12288000 0x33
  545. #define CS40L26_PLL_CLK_FRQ_32768 32768
  546. #define CS40L26_PLL_CLK_FRQ_1536000 1536000
  547. #define CS40L26_PLL_CLK_FRQ_3072000 3072000
  548. #define CS40L26_PLL_CLK_FRQ_6144000 6144000
  549. #define CS40L26_PLL_CLK_FRQ_9600000 9600000
  550. #define CS40L26_PLL_CLK_FRQ_12288000 12288000
  551. #define CS40L26_PLL_CLK_SEL_BCLK 0x0
  552. #define CS40L26_PLL_CLK_SEL_FSYNC 0x1
  553. #define CS40L26_PLL_CLK_SEL_MCLK 0x5
  554. #define CS40L26_PLL_CLK_FREQ_MASK GENMASK(31, 0)
  555. #define CS40L26_PLL_CLK_CFG_MASK GENMASK(5, 0)
  556. #define CS40L26_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
  557. #define CS40L26_RATES (SNDRV_PCM_RATE_48000 | SNDRV_PCM_RATE_96000)
  558. #define CS40L26_ASP_RX_WIDTH_MASK GENMASK(31, 24)
  559. #define CS40L26_ASP_RX_WIDTH_SHIFT 24
  560. #define CS40L26_ASP_FMT_MASK GENMASK(10, 8)
  561. #define CS40L26_ASP_FMT_SHIFT 8
  562. #define CS40L26_ASP_BCLK_INV_MASK BIT(6)
  563. #define CS40L26_ASP_BCLK_INV_SHIFT 6
  564. #define CS40L26_ASP_FSYNC_INV_MASK BIT(2)
  565. #define CS40L26_ASP_FSYNC_INV_SHIFT 2
  566. #define CS40L26_ASP_FMT_TDM1_DSPA 0x0
  567. #define CS40L26_ASP_FMT_I2S 0x2
  568. #define CS40L26_ASP_FMT_TDM1P5 0x4
  569. #define CS40L26_ASP_START_TIMEOUT 50 /* milliseconds */
  570. #define CS40L26_PLL_REFCLK_BCLK 0x0
  571. #define CS40L26_PLL_REFCLK_FSYNC 0x1
  572. #define CS40L26_PLL_REFCLK_MCLK 0x5
  573. #define CS40L26_PLL_REFCLK_SEL_MASK GENMASK(2, 0)
  574. #define CS40L26_PLL_REFCLK_EN_MASK BIT(4)
  575. #define CS40L26_PLL_REFCLK_EN_SHIFT 4
  576. #define CS40L26_PLL_REFCLK_FREQ_MASK GENMASK(10, 5)
  577. #define CS40L26_PLL_REFCLK_FREQ_SHIFT 5
  578. #define CS40L26_PLL_REFCLK_LOOP_MASK BIT(11)
  579. #define CS40L26_PLL_REFCLK_LOOP_SHIFT 11
  580. #define CS40L26_PLL_REFCLK_SET_OPEN_LOOP 1
  581. #define CS40L26_PLL_REFCLK_SET_CLOSED_LOOP 0
  582. #define CS40L26_PLL_REFCLK_SET_ATTEMPTS 5
  583. #define CS40L26_PLL_REFCLK_FORCE_EN_MASK BIT(16)
  584. #define CS40L26_PLL_REFCLK_FORCE_EN_SHIFT 16
  585. #define CS40L26_ASP_RX_WL_MASK GENMASK(5, 0)
  586. #define CS40L26_DATA_SRC_ASPRX1 0x08
  587. #define CS40L26_DATA_SRC_ASPRX2 0x09
  588. #define CS40L26_DATA_SRC_VMON 0x18
  589. #define CS40L26_DATA_SRC_DSP1TX1 0x32
  590. #define CS40L26_DATA_SRC_DSP1TX2 0x33
  591. #define CS40L26_DATA_SRC_DSP1TX4 0x35
  592. #define CS40L26_DATA_SRC_MASK GENMASK(6, 0)
  593. #define CS40L26_ASP_TX1_EN_MASK BIT(0)
  594. #define CS40L26_ASP_TX2_EN_MASK BIT(1)
  595. #define CS40L26_ASP_TX2_EN_SHIFT 1
  596. #define CS40L26_ASP_TX3_EN_MASK BIT(2)
  597. #define CS40L26_ASP_TX3_EN_SHIFT 2
  598. #define CS40L26_ASP_TX4_EN_MASK BIT(3)
  599. #define CS40L26_ASP_TX4_EN_SHIFT 3
  600. #define CS40L26_ASP_RX1_EN_MASK BIT(16)
  601. #define CS40L26_ASP_RX1_EN_SHIFT 16
  602. #define CS40L26_ASP_RX2_EN_MASK BIT(17)
  603. #define CS40L26_ASP_RX2_EN_SHIFT 17
  604. #define CS40L26_ASP_RX3_EN_MASK BIT(18)
  605. #define CS40L26_ASP_RX3_EN_SHIFT 18
  606. #define CS40L26_ASP_RX1_SLOT_MASK GENMASK(5, 0)
  607. #define CS40L26_ASP_RX2_SLOT_MASK GENMASK(13, 8)
  608. #define CS40L26_ASP_RX2_SLOT_SHIFT 8
  609. #define CS40L26_A2H_MAX_TUNINGS 5
  610. #define CS40L26_A2H_LEVEL_MAX 0x7FFFFF
  611. #define CS40L26_A2H_LEVEL_MIN 0x000001
  612. #define CS40L26_A2H_DELAY_MAX 0x190
  613. #define CS40L26_VMON_DEC_OUT_DATA_MASK GENMASK(23, 0)
  614. #define CS40L26_VMON_OVFL_FLAG_MASK BIT(31)
  615. #define CS40L26_VMON_DEC_OUT_DATA_MAX CS40L26_VMON_DEC_OUT_DATA_MASK
  616. #ifdef CONFIG_CS40L26_SAMSUNG_FEATURE
  617. #define VMON_100_MV 0x10A68
  618. #define VMON_20_MV 0x3548
  619. #endif
  620. #define CS40L26_GAIN_FULL_SCALE 100
  621. #define CS40L26_VIMON_DUAL_RATE_MASK BIT(16)
  622. /* OWT */
  623. #define CS40L26_WT_HEADER_OFFSET 3
  624. #define CS40L26_WT_METADATA_OFFSET 3
  625. #define CS40L26_WT_HEADER_DEFAULT_FLAGS 0x0000
  626. #define CS40L26_WT_HEADER_PWLE_SIZE 12
  627. #define CS40L26_WT_HEADER_COMP_SIZE 20
  628. #define CS40L26_WT_SVC_METADATA BIT(10)
  629. #define CS40L26_WT_TYPE12_IDENTIFIER 0xC00
  630. #define CS40L26_WT_TYPE10_SECTION_BYTES_MIN 8
  631. #define CS40L26_WT_TYPE10_SECTION_BYTES_MAX 12
  632. #define CS40L26_WT_TYPE10_WAVELEN_MAX 0x3FFFFF
  633. #define CS40L26_WT_TYPE10_WAVELEN_INDEF 0x400000
  634. #define CS40L26_WT_TYPE10_WAVELEN_CALCULATED 0x800000
  635. #define CS40L26_WT_TYPE10_COMP_DURATION_FLAG 0x80
  636. #define CS40L26_WT_TYPE10_COMP_ROM_FLAG 0x40
  637. #define CS40L26_WT_TYPE10_COMP_BUFFER 0x0000
  638. /* F0 Offset represented as Q10.14 format */
  639. #define CS40L26_F0_OFFSET_MAX 0x190000 /* +100 Hz */
  640. #define CS40L26_F0_OFFSET_MIN 0xE70000 /* -100 Hz */
  641. /* Calibration */
  642. #define CS40L26_F0_EST_MIN 0xC8000
  643. #define CS40L26_F0_EST_MAX 0x7FC000
  644. #define CS40L26_Q_EST_MIN 0
  645. #define CS40L26_Q_EST_MAX 0x7FFFFF
  646. #define CS40L26_DVL_PEQ_COEFFICIENTS_NUM_REGS 6
  647. #define CS40L26_F0_EST_FREQ_FRAC_BITS 14
  648. #define CS40L26_SVC_INITIALIZATION_PERIOD_MS 6
  649. #define CS40L26_REDC_CALIBRATION_BUFFER_MS 10
  650. #define CS40L26_F0_AND_Q_CALIBRATION_MIN_MS 100
  651. #define CS40L26_F0_AND_Q_CALIBRATION_MAX_MS 1800
  652. #define CS40L26_F0_CHIRP_DURATION_FACTOR 3750
  653. #define CS40L26_F0_FREQ_SPAN_HZ_MAX 120
  654. #define CS40L26_F0_FREQ_SPAN_HZ_MIN 20
  655. #define CS40L26_F0_FREQ_SPAN_MAX (CS40L26_F0_FREQ_SPAN_HZ_MAX << CS40L26_F0_EST_FREQ_FRAC_BITS)
  656. #define CS40L26_F0_FREQ_SPAN_MIN (CS40L26_F0_FREQ_SPAN_HZ_MIN << CS40L26_F0_EST_FREQ_FRAC_BITS)
  657. #define CS40L26_F0_FREQ_CENTRE_HZ_MAX 511
  658. #define CS40L26_F0_FREQ_CENTRE_HZ_MIN 50
  659. #define CS40L26_F0_FREQ_CENTRE_MAX (CS40L26_F0_FREQ_CENTRE_HZ_MAX << CS40L26_F0_EST_FREQ_FRAC_BITS)
  660. #define CS40L26_F0_FREQ_CENTRE_MIN (CS40L26_F0_FREQ_CENTRE_HZ_MIN << CS40L26_F0_EST_FREQ_FRAC_BITS)
  661. #define CS40L26_LOGGER_EN_MASK BIT(0)
  662. #define CS40L26_LOGGER_SRC_ID_BEMF 1
  663. #define CS40L26_LOGGER_SRC_ID_VBST 2
  664. #define CS40L26_LOGGER_SRC_ID_VMON 3
  665. #define CS40L26_LOGGER_SRC_ID_EP 4
  666. #define CS40L26_LOGGER_SRC_TYPE_XM_TO_XM 1
  667. #define CS40L26_LOGGER_SRC_FF_OUT 2
  668. #define CS40L26_LOGGER_SRC_PROTECTION_OUT 3
  669. #define CS40L26_LOGGER_SRC_SIGN_MASK BIT(23)
  670. #define CS40L26_LOGGER_SRC_SIZE_MASK BIT(22)
  671. #define CS40L26_LOGGER_SRC_TYPE_MASK GENMASK(21, 20)
  672. #define CS40L26_LOGGER_SRC_ID_MASK GENMASK(19, 16)
  673. #define CS40L26_LOGGER_SRC_ADDR_MASK GENMASK(15, 0)
  674. #define CS40L26_LOGGER_DATA_MAX_STEP 12
  675. #define CS40L26_LOGGER_DATA_MAX_OFFSET 4
  676. #define CS40L26_UINT_24_BITS_MAX 16777215
  677. #define CS40L26_CALIBRATION_TIMEOUT_MS 2000
  678. /* Compensation */
  679. #define CS40L26_COMP_EN_REDC_SHIFT 1
  680. #define CS40L26_COMP_EN_F0_SHIFT 0
  681. /* FW EXT */
  682. #define CS40L26_SVC_EN_MASK BIT(0)
  683. /* DBC */
  684. #define CS40L26_DBC_ENABLE_MASK BIT(1)
  685. #define CS40L26_DBC_ENABLE_SHIFT 1
  686. #define CS40L26_DBC_CONTROLS_MAX 0x7FFFFF
  687. #define CS40L26_DBC_ENV_REL_COEF_MIN 8384414
  688. #define CS40L26_DBC_ENV_REL_COEF_NAME "DBC_ENV_REL_COEF"
  689. #define CS40L26_DBC_RISE_HEADROOM_MIN 1432204
  690. #define CS40L26_DBC_RISE_HEADROOM_NAME "DBC_RISE_HEADROOM"
  691. #define CS40L26_DBC_FALL_HEADROOM_MIN 750193
  692. #define CS40L26_DBC_FALL_HEADROOM_NAME "DBC_FALL_HEADROOM"
  693. #define CS40L26_DBC_TX_LVL_THRESH_FS_MIN 839
  694. #define CS40L26_DBC_TX_LVL_THRESH_FS_NAME "DBC_TX_LVL_THRESH_FS"
  695. #define CS40L26_DBC_TX_LVL_HOLD_OFF_MS_MAX 1000
  696. #define CS40L26_DBC_TX_LVL_HOLD_OFF_MS_MIN 10
  697. #define CS40L26_DBC_TX_LVL_HOLD_OFF_MS_NAME "DBC_TX_LVL_HOLD_OFF_MS"
  698. #define CS40L26_DBC_USE_DEFAULT 0xFFFFFFFF
  699. /* Errata */
  700. #define CS40L26_ERRATA_A1_NUM_WRITES 5
  701. #define CS40L26_ERRATA_A1_EXPL_EN_NUM_WRITES 1
  702. #define CS40L26_PLL_REFCLK_DET_EN 0x00000001
  703. #define CS40L26_DISABLE_EXPL_MODE 0x0100C080
  704. /* MFD */
  705. #define CS40L26_NUM_MFD_DEVS 1
  706. /* macros */
  707. #define CS40L26_MS_TO_US(n) ((n) * 1000)
  708. #ifdef CONFIG_CS40L26_SAMSUNG_FEATURE
  709. #define DELAY_BEFORE_STOP_PLAYBACK_US 8500
  710. /* defined by Samsung */
  711. #define CS40L26_SAMSUNG_DEFAULT_HIGH_TEMP INT_MAX
  712. #define CS40L26_SAMSUNG_DEFAULT_HIGH_TEMP_PERCENT 100
  713. #define CS40L26_SAMSUNG_F0_MIN 0x250000
  714. #define CS40L26_SAMSUNG_F0_MAX 0x2A0000
  715. #define CS40L26_SAMSUNG_F0_OFFSET 0x4000
  716. #endif
  717. /* enums */
  718. enum cs40l26_brwnout_type {
  719. CS40L26_VBBR_THLD,
  720. CS40L26_VPBR_THLD,
  721. CS40L26_VXBR_MAX_ATT,
  722. CS40L26_VXBR_ATK_STEP,
  723. CS40L26_VXBR_ATK_RATE,
  724. CS40L26_VXBR_WAIT,
  725. CS40L26_VXBR_REL_RATE,
  726. CS40L26_NUM_BRWNOUT_TYPES,
  727. };
  728. enum cs40l26_gpio_map {
  729. CS40L26_GPIO_MAP_A_PRESS,
  730. CS40L26_GPIO_MAP_A_RELEASE,
  731. CS40L26_GPIO_MAP_NUM_AVAILABLE,
  732. CS40L26_GPIO_MAP_INVALID,
  733. };
  734. enum cs40l26_dbc_type {
  735. CS40L26_DBC_ENV_REL_COEF, /* 0 */
  736. CS40L26_DBC_RISE_HEADROOM,
  737. CS40L26_DBC_FALL_HEADROOM,
  738. CS40L26_DBC_TX_LVL_THRESH_FS,
  739. CS40L26_DBC_TX_LVL_HOLD_OFF_MS,
  740. CS40L26_DBC_NUM_CONTROLS, /* 5 */
  741. };
  742. enum cs40l26_vibe_state {
  743. CS40L26_VIBE_STATE_STOPPED,
  744. CS40L26_VIBE_STATE_HAPTIC,
  745. CS40L26_VIBE_STATE_ASP,
  746. };
  747. enum cs40l26_vibe_state_event {
  748. CS40L26_VIBE_STATE_EVENT_MBOX_PLAYBACK,
  749. CS40L26_VIBE_STATE_EVENT_MBOX_COMPLETE,
  750. CS40L26_VIBE_STATE_EVENT_GPIO_TRIGGER,
  751. CS40L26_VIBE_STATE_EVENT_GPIO_COMPLETE,
  752. CS40L26_VIBE_STATE_EVENT_ASP_START,
  753. CS40L26_VIBE_STATE_EVENT_ASP_STOP,
  754. };
  755. enum cs40l26_err_rls {
  756. CS40L26_RSRVD_ERR_RLS,/* 0 */
  757. CS40L26_AMP_SHORT_ERR_RLS,/* 1 */
  758. CS40L26_BST_SHORT_ERR_RLS,/* 2 */
  759. CS40L26_BST_OVP_ERR_RLS,/* 3 */
  760. CS40L26_BST_UVP_ERR_RLS,/* 4 */
  761. CS40L26_TEMP_WARN_ERR_RLS,/* 5 */
  762. CS40L26_TEMP_ERR_RLS,/* 6 */
  763. };
  764. enum cs40l26_pm_state {
  765. CS40L26_PM_STATE_HIBERNATE,
  766. CS40L26_PM_STATE_WAKEUP,
  767. CS40L26_PM_STATE_PREVENT_HIBERNATE,
  768. CS40L26_PM_STATE_ALLOW_HIBERNATE,
  769. CS40L26_PM_STATE_SHUTDOWN,
  770. };
  771. enum cs40l26_calibration_control_request {
  772. CS40L26_CALIBRATION_CONTROL_REQUEST_F0_AND_Q = 0x1,
  773. CS40L26_CALIBRATION_CONTROL_REQUEST_REDC = 0x2,
  774. CS40L26_CALIBRATION_CONTROL_REQUEST_DVL_PEQ = 0x8,
  775. CS40L26_CALIBRATION_CONTROL_REQUEST_LS_CALIBRATION = 0x10,
  776. };
  777. enum cs40l26_irq_list {
  778. CS40L26_GPIO1_RISE_IRQ,
  779. CS40L26_GPIO1_FALL_IRQ,
  780. CS40L26_GPIO2_RISE_IRQ,
  781. CS40L26_GPIO2_FALL_IRQ,
  782. CS40L26_GPIO3_RISE_IRQ,
  783. CS40L26_GPIO3_FALL_IRQ,
  784. CS40L26_GPIO4_RISE_IRQ,
  785. CS40L26_GPIO4_FALL_IRQ,
  786. CS40L26_WKSRC_STS_ANY_IRQ,
  787. CS40L26_WKSRC_STS_GPIO1_IRQ,
  788. CS40L26_WKSRC_STS_GPIO2_IRQ,
  789. CS40L26_WKSRC_STS_GPIO3_IRQ,
  790. CS40L26_WKSRC_STS_GPIO4_IRQ,
  791. CS40L26_WKSRC_STS_I2C_IRQ,
  792. CS40L26_BST_OVP_ERR_IRQ,
  793. CS40L26_BST_DCM_UVP_ERR_IRQ,
  794. CS40L26_BST_SHORT_ERR_IRQ,
  795. CS40L26_BST_IPK_FLAG_IRQ,
  796. CS40L26_TEMP_ERR_IRQ,
  797. CS40L26_AMP_ERR_IRQ,
  798. CS40L26_VIRTUAL2_MBOX_WR_IRQ,
  799. CS40L26_VPBR_FLAG_IRQ,
  800. CS40L26_VPBR_ATT_CLR_IRQ,
  801. CS40L26_VBBR_FLAG_IRQ,
  802. CS40L26_VBBR_ATT_CLR_IRQ
  803. };
  804. /* structs */
  805. struct cs40l26_log_src {
  806. u8 sign;
  807. u8 size;
  808. u8 type;
  809. u8 id;
  810. u16 addr;
  811. };
  812. struct cs40l26_ls_cal_param {
  813. const char *calib_name;
  814. const char *runtime_name;
  815. int word_num;
  816. };
  817. struct cs40l26_irq {
  818. int irq;
  819. const char *name;
  820. irqreturn_t (*handler)(int irq, void *data);
  821. };
  822. struct cs40l26_brwnout_limits {
  823. u32 max;
  824. u32 min;
  825. };
  826. struct cs40l26_dbc {
  827. enum cs40l26_dbc_type type;
  828. const char *const name;
  829. u32 max;
  830. u32 min;
  831. };
  832. struct cs40l26_buzzgen_config {
  833. const char *duration_name;
  834. const char *freq_name;
  835. const char *level_name;
  836. int effect_id;
  837. };
  838. struct cs40l26_owt_section {
  839. u8 flags;
  840. u8 repeat;
  841. u8 amplitude;
  842. u8 index;
  843. u16 delay;
  844. u16 duration;
  845. u16 wvfrm_bank;
  846. };
  847. struct cs40l26_pseq_op {
  848. u8 size;
  849. u16 offset; /* offset in bytes from pseq_base */
  850. u8 operation;
  851. u32 words[3];
  852. struct list_head list;
  853. };
  854. struct cs40l26_svc_le {
  855. s32 gain_adjust;
  856. u32 min;
  857. u32 max;
  858. u32 n;
  859. };
  860. #ifdef CONFIG_CS40L26_SAMSUNG_FEATURE
  861. struct cs40l26_samsung_platform_data {
  862. bool is_f0_tracking;
  863. bool is_mv_support;
  864. int f0_offset;
  865. const char *owt_lib_compat_version;
  866. const char *ap_chipset;
  867. };
  868. #endif
  869. struct cs40l26_rom_regs {
  870. u32 pm_cur_state;
  871. u32 pm_state_locks;
  872. u32 pm_timeout_ticks;
  873. u32 dsp_halo_state;
  874. u32 event_map_table_event_data_packed;
  875. u32 p_vibegen_rom;
  876. u32 rom_pseq_end_of_script;
  877. };
  878. struct cs40l26_uploaded_effect {
  879. int id;
  880. u32 trigger_index;
  881. u16 wvfrm_bank;
  882. enum cs40l26_gpio_map mapping;
  883. struct list_head list;
  884. };
  885. struct cs40l26_brwnout {
  886. bool enable;
  887. u32 thld_uv;
  888. u32 max_att_db;
  889. u32 atk_step;
  890. u32 atk_rate;
  891. u32 wait;
  892. u32 rel_rate;
  893. };
  894. struct cs40l26_private {
  895. struct device *dev;
  896. struct regmap *regmap;
  897. u32 devid : 24;
  898. u8 revid;
  899. struct mutex lock;
  900. struct gpio_desc *reset_gpio;
  901. struct input_dev *input;
  902. struct cl_dsp *dsp;
  903. struct list_head effect_head;
  904. unsigned int cur_index;
  905. struct ff_effect *trigger_effect;
  906. struct ff_effect upload_effect;
  907. struct ff_effect *erase_effect;
  908. s16 *raw_custom_data;
  909. int raw_custom_data_len;
  910. struct work_struct vibe_start_work;
  911. struct work_struct vibe_stop_work;
  912. struct work_struct set_gain_work;
  913. struct work_struct upload_work;
  914. struct work_struct erase_work;
  915. struct workqueue_struct *vibe_workqueue;
  916. int irq;
  917. bool vibe_init_success;
  918. int pseq_num_ops;
  919. u32 pseq_base;
  920. struct list_head pseq_op_head;
  921. enum cs40l26_pm_state pm_state;
  922. u32 fw_id;
  923. bool fw_defer;
  924. bool fw_rom_only;
  925. bool fw_loaded;
  926. bool calib_fw;
  927. enum cs40l26_vibe_state vibe_state;
  928. bool vibe_state_reporting;
  929. bool asp_enable;
  930. u8 last_wksrc_pol;
  931. u8 wksrc_sts;
  932. int num_owt_effects;
  933. int cal_requested;
  934. u16 gain_pct;
  935. u16 gain_tmp;
  936. bool scaling_applied;
  937. u32 event_map_base;
  938. struct cs40l26_svc_le **svc_le_vals;
  939. int num_svc_le_vals;
  940. u32 delay_before_stop_playback_us;
  941. int upload_ret;
  942. int erase_ret;
  943. int effects_in_flight;
  944. bool comp_enable_pend;
  945. bool comp_enable_redc;
  946. bool comp_enable_f0;
  947. struct completion i2s_cont;
  948. struct completion erase_cont;
  949. struct completion cal_f0_cont;
  950. struct completion cal_redc_cont;
  951. struct completion cal_ls_cont;
  952. struct completion cal_dvl_peq_cont;
  953. unsigned int svc_le_est_stored;
  954. u32 *no_wait_ram_indices;
  955. ssize_t num_no_wait_ram_indices;
  956. struct timer_list hibernate_timer;
  957. ktime_t allow_hibernate_ts;
  958. bool allow_hibernate_sent;
  959. const struct cs40l26_rom_regs *rom_regs;
  960. #ifdef CONFIG_CS40L26_SAMSUNG_FEATURE
  961. struct cs40l26_samsung_platform_data pdata;
  962. unsigned int irq_gpio;
  963. struct sec_vib_inputff_drvdata sec_vib_ddata;
  964. u8 busy_state;
  965. bool use_sep_index;
  966. #endif
  967. #ifdef CONFIG_DEBUG_FS
  968. struct dentry *debugfs_root;
  969. char *dbg_fw_ctrl_name;
  970. u32 dbg_fw_algo_id;
  971. bool dbg_fw_ym;
  972. struct cl_dsp_debugfs *cl_dsp_db;
  973. #endif
  974. struct cs40l26_brwnout vbbr;
  975. struct cs40l26_brwnout vpbr;
  976. bool bst_dcm_en;
  977. u32 bst_ipk;
  978. u32 asp_scale_pct;
  979. u32 pm_active_timeout_ms;
  980. u32 pm_stdby_timeout_ms;
  981. u32 f0_default;
  982. u32 redc_default;
  983. u32 q_default;
  984. u32 bst_ctl;
  985. bool expl_mode_enabled;
  986. bool dbc_enable_default;
  987. u32 dbc_defaults[CS40L26_DBC_NUM_CONTROLS];
  988. bool pwle_zero_cross;
  989. u32 press_idx;
  990. u32 release_idx;
  991. u32 clip_lvl;
  992. struct regmap_irq_chip_data *irq_data;
  993. struct cs40l26_log_src *log_srcs;
  994. u32 num_log_srcs;
  995. u32 ng_thld;
  996. u32 ng_delay;
  997. bool ng_enable;
  998. u32 aux_ng_thld;
  999. u32 aux_ng_delay;
  1000. bool aux_ng_enable;
  1001. };
  1002. struct cs40l26_codec {
  1003. struct cs40l26_private *core;
  1004. struct device *dev;
  1005. struct regmap *regmap;
  1006. int sysclk_rate;
  1007. int tuning;
  1008. int tuning_prev;
  1009. char *bin_file;
  1010. u32 daifmt;
  1011. int tdm_width;
  1012. int tdm_slots;
  1013. int tdm_slot[2];
  1014. bool dsp_bypass;
  1015. };
  1016. struct cs40l26_pll_sysclk_config {
  1017. u32 freq;
  1018. u8 clk_cfg;
  1019. };
  1020. /* exported function prototypes */
  1021. int cs40l26_svc_le_estimate(struct cs40l26_private *cs40l26, unsigned int *le);
  1022. int cs40l26_set_pll_loop(struct cs40l26_private *cs40l26, unsigned int pll_loop);
  1023. int cs40l26_dbc_enable(struct cs40l26_private *cs40l26, u32 enable);
  1024. int cs40l26_dbc_get(struct cs40l26_private *cs40l26, enum cs40l26_dbc_type dbc, unsigned int *val);
  1025. int cs40l26_dbc_set(struct cs40l26_private *cs40l26, enum cs40l26_dbc_type dbc, u32 val);
  1026. int cs40l26_asp_start(struct cs40l26_private *cs40l26);
  1027. int cs40l26_get_num_waves(struct cs40l26_private *cs40l26, u32 *num_waves);
  1028. int cs40l26_fw_swap(struct cs40l26_private *cs40l26, const u32 id);
  1029. void cs40l26_vibe_state_update(struct cs40l26_private *cs40l26,
  1030. enum cs40l26_vibe_state_event event);
  1031. int cs40l26_pm_timeout_ms_set(struct cs40l26_private *cs40l26, unsigned int dsp_state,
  1032. u32 timeout_ms);
  1033. int cs40l26_pm_timeout_ms_get(struct cs40l26_private *cs40l26, unsigned int dsp_state,
  1034. u32 *timeout_ms);
  1035. int cs40l26_pm_state_transition(struct cs40l26_private *cs40l26, enum cs40l26_pm_state state);
  1036. int cs40l26_mailbox_write(struct cs40l26_private *cs40l26, u32 write_val);
  1037. int cs40l26_pm_enter(struct device *dev);
  1038. void cs40l26_pm_exit(struct device *dev);
  1039. void cs40l26_resume_error_handle(struct device *dev, int ret);
  1040. int cs40l26_resume(struct device *dev);
  1041. int cs40l26_sys_resume(struct device *dev);
  1042. int cs40l26_sys_resume_noirq(struct device *dev);
  1043. int cs40l26_suspend(struct device *dev);
  1044. int cs40l26_sys_suspend(struct device *dev);
  1045. int cs40l26_sys_suspend_noirq(struct device *dev);
  1046. int cs40l26_dsp_state_get(struct cs40l26_private *cs40l26, u8 *state);
  1047. int cs40l26_probe(struct cs40l26_private *cs40l26);
  1048. int cs40l26_remove(struct cs40l26_private *cs40l26);
  1049. bool cs40l26_precious_reg(struct device *dev, unsigned int ret);
  1050. bool cs40l26_readable_reg(struct device *dev, unsigned int reg);
  1051. bool cs40l26_volatile_reg(struct device *dev, unsigned int reg);
  1052. int cs40l26_pseq_write(struct cs40l26_private *cs40l26, u32 addr, u32 data, bool update,
  1053. u8 op_code);
  1054. int cs40l26_copy_f0_est_to_dvl(struct cs40l26_private *cs40l26);
  1055. /* external tables */
  1056. extern struct regulator_bulk_data cs40l26_supplies[CS40L26_NUM_SUPPLIES];
  1057. extern const struct dev_pm_ops cs40l26_pm_ops;
  1058. extern const struct regmap_config cs40l26_regmap;
  1059. extern const struct mfd_cell cs40l26_devs[CS40L26_NUM_MFD_DEVS];
  1060. extern const u8 cs40l26_pseq_op_sizes[CS40L26_PSEQ_NUM_OPS][2];
  1061. extern const u32 cs40l26_attn_q21_2_vals[CS40L26_NUM_PCT_MAP_VALUES];
  1062. extern const struct reg_sequence cs40l26_a1_errata[CS40L26_ERRATA_A1_NUM_WRITES];
  1063. extern const struct cs40l26_dbc cs40l26_dbc_params[CS40L26_DBC_NUM_CONTROLS];
  1064. /* sysfs */
  1065. extern struct attribute_group cs40l26_dev_attr_group;
  1066. extern struct attribute_group cs40l26_dev_attr_cal_group;
  1067. extern struct attribute_group cs40l26_dev_attr_dbc_group;
  1068. /* debugfs */
  1069. #ifdef CONFIG_DEBUG_FS
  1070. void cs40l26_debugfs_init(struct cs40l26_private *cs40l26);
  1071. void cs40l26_debugfs_cleanup(struct cs40l26_private *cs40l26);
  1072. #endif /* CONFIG_DEBUG_FS */
  1073. /* kunit test */
  1074. #ifdef CONFIG_SEC_KUNIT
  1075. #include <kunit/test.h>
  1076. #include <kunit/mock.h>
  1077. #include <linux/bitfield.h>
  1078. #ifdef CONFIG_CS40L26_SAMSUNG_FEATURE
  1079. __visible_for_testing bool samsung_is_valid_vmon(struct cs40l26_private *cs40l26, u32 vmon);
  1080. #endif /* CONFIG_CS40L26_SAMSUNG_FEATURE */
  1081. #endif /* CONFIG_SEC_KUNIT */
  1082. #endif /* __CS40L26_H__ */