max98927.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * max98927.c -- MAX98927 ALSA Soc Audio driver
  4. *
  5. * Copyright (C) 2016-2017 Maxim Integrated Products
  6. * Author: Ryan Lee <[email protected]>
  7. */
  8. #include <linux/acpi.h>
  9. #include <linux/i2c.h>
  10. #include <linux/module.h>
  11. #include <linux/regmap.h>
  12. #include <linux/slab.h>
  13. #include <linux/cdev.h>
  14. #include <sound/pcm.h>
  15. #include <sound/pcm_params.h>
  16. #include <sound/soc.h>
  17. #include <linux/gpio.h>
  18. #include <linux/gpio/consumer.h>
  19. #include <linux/of_gpio.h>
  20. #include <sound/tlv.h>
  21. #include "max98927.h"
  22. static struct reg_default max98927_reg[] = {
  23. {MAX98927_R0001_INT_RAW1, 0x00},
  24. {MAX98927_R0002_INT_RAW2, 0x00},
  25. {MAX98927_R0003_INT_RAW3, 0x00},
  26. {MAX98927_R0004_INT_STATE1, 0x00},
  27. {MAX98927_R0005_INT_STATE2, 0x00},
  28. {MAX98927_R0006_INT_STATE3, 0x00},
  29. {MAX98927_R0007_INT_FLAG1, 0x00},
  30. {MAX98927_R0008_INT_FLAG2, 0x00},
  31. {MAX98927_R0009_INT_FLAG3, 0x00},
  32. {MAX98927_R000A_INT_EN1, 0x00},
  33. {MAX98927_R000B_INT_EN2, 0x00},
  34. {MAX98927_R000C_INT_EN3, 0x00},
  35. {MAX98927_R000D_INT_FLAG_CLR1, 0x00},
  36. {MAX98927_R000E_INT_FLAG_CLR2, 0x00},
  37. {MAX98927_R000F_INT_FLAG_CLR3, 0x00},
  38. {MAX98927_R0010_IRQ_CTRL, 0x00},
  39. {MAX98927_R0011_CLK_MON, 0x00},
  40. {MAX98927_R0012_WDOG_CTRL, 0x00},
  41. {MAX98927_R0013_WDOG_RST, 0x00},
  42. {MAX98927_R0014_MEAS_ADC_THERM_WARN_THRESH, 0x75},
  43. {MAX98927_R0015_MEAS_ADC_THERM_SHDN_THRESH, 0x8c},
  44. {MAX98927_R0016_MEAS_ADC_THERM_HYSTERESIS, 0x08},
  45. {MAX98927_R0017_PIN_CFG, 0x55},
  46. {MAX98927_R0018_PCM_RX_EN_A, 0x00},
  47. {MAX98927_R0019_PCM_RX_EN_B, 0x00},
  48. {MAX98927_R001A_PCM_TX_EN_A, 0x00},
  49. {MAX98927_R001B_PCM_TX_EN_B, 0x00},
  50. {MAX98927_R001C_PCM_TX_HIZ_CTRL_A, 0x00},
  51. {MAX98927_R001D_PCM_TX_HIZ_CTRL_B, 0x00},
  52. {MAX98927_R001E_PCM_TX_CH_SRC_A, 0x00},
  53. {MAX98927_R001F_PCM_TX_CH_SRC_B, 0x00},
  54. {MAX98927_R0020_PCM_MODE_CFG, 0x40},
  55. {MAX98927_R0021_PCM_MASTER_MODE, 0x00},
  56. {MAX98927_R0022_PCM_CLK_SETUP, 0x22},
  57. {MAX98927_R0023_PCM_SR_SETUP1, 0x00},
  58. {MAX98927_R0024_PCM_SR_SETUP2, 0x00},
  59. {MAX98927_R0025_PCM_TO_SPK_MONOMIX_A, 0x00},
  60. {MAX98927_R0026_PCM_TO_SPK_MONOMIX_B, 0x00},
  61. {MAX98927_R0027_ICC_RX_EN_A, 0x00},
  62. {MAX98927_R0028_ICC_RX_EN_B, 0x00},
  63. {MAX98927_R002B_ICC_TX_EN_A, 0x00},
  64. {MAX98927_R002C_ICC_TX_EN_B, 0x00},
  65. {MAX98927_R002E_ICC_HIZ_MANUAL_MODE, 0x00},
  66. {MAX98927_R002F_ICC_TX_HIZ_EN_A, 0x00},
  67. {MAX98927_R0030_ICC_TX_HIZ_EN_B, 0x00},
  68. {MAX98927_R0031_ICC_LNK_EN, 0x00},
  69. {MAX98927_R0032_PDM_TX_EN, 0x00},
  70. {MAX98927_R0033_PDM_TX_HIZ_CTRL, 0x00},
  71. {MAX98927_R0034_PDM_TX_CTRL, 0x00},
  72. {MAX98927_R0035_PDM_RX_CTRL, 0x00},
  73. {MAX98927_R0036_AMP_VOL_CTRL, 0x00},
  74. {MAX98927_R0037_AMP_DSP_CFG, 0x02},
  75. {MAX98927_R0038_TONE_GEN_DC_CFG, 0x00},
  76. {MAX98927_R0039_DRE_CTRL, 0x01},
  77. {MAX98927_R003A_AMP_EN, 0x00},
  78. {MAX98927_R003B_SPK_SRC_SEL, 0x00},
  79. {MAX98927_R003C_SPK_GAIN, 0x00},
  80. {MAX98927_R003D_SSM_CFG, 0x04},
  81. {MAX98927_R003E_MEAS_EN, 0x00},
  82. {MAX98927_R003F_MEAS_DSP_CFG, 0x04},
  83. {MAX98927_R0040_BOOST_CTRL0, 0x00},
  84. {MAX98927_R0041_BOOST_CTRL3, 0x00},
  85. {MAX98927_R0042_BOOST_CTRL1, 0x00},
  86. {MAX98927_R0043_MEAS_ADC_CFG, 0x00},
  87. {MAX98927_R0044_MEAS_ADC_BASE_MSB, 0x01},
  88. {MAX98927_R0045_MEAS_ADC_BASE_LSB, 0x00},
  89. {MAX98927_R0046_ADC_CH0_DIVIDE, 0x00},
  90. {MAX98927_R0047_ADC_CH1_DIVIDE, 0x00},
  91. {MAX98927_R0048_ADC_CH2_DIVIDE, 0x00},
  92. {MAX98927_R0049_ADC_CH0_FILT_CFG, 0x00},
  93. {MAX98927_R004A_ADC_CH1_FILT_CFG, 0x00},
  94. {MAX98927_R004B_ADC_CH2_FILT_CFG, 0x00},
  95. {MAX98927_R004C_MEAS_ADC_CH0_READ, 0x00},
  96. {MAX98927_R004D_MEAS_ADC_CH1_READ, 0x00},
  97. {MAX98927_R004E_MEAS_ADC_CH2_READ, 0x00},
  98. {MAX98927_R0051_BROWNOUT_STATUS, 0x00},
  99. {MAX98927_R0052_BROWNOUT_EN, 0x00},
  100. {MAX98927_R0053_BROWNOUT_INFINITE_HOLD, 0x00},
  101. {MAX98927_R0054_BROWNOUT_INFINITE_HOLD_CLR, 0x00},
  102. {MAX98927_R0055_BROWNOUT_LVL_HOLD, 0x00},
  103. {MAX98927_R005A_BROWNOUT_LVL1_THRESH, 0x00},
  104. {MAX98927_R005B_BROWNOUT_LVL2_THRESH, 0x00},
  105. {MAX98927_R005C_BROWNOUT_LVL3_THRESH, 0x00},
  106. {MAX98927_R005D_BROWNOUT_LVL4_THRESH, 0x00},
  107. {MAX98927_R005E_BROWNOUT_THRESH_HYSTERYSIS, 0x00},
  108. {MAX98927_R005F_BROWNOUT_AMP_LIMITER_ATK_REL, 0x00},
  109. {MAX98927_R0060_BROWNOUT_AMP_GAIN_ATK_REL, 0x00},
  110. {MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE, 0x00},
  111. {MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT, 0x00},
  112. {MAX98927_R0073_BROWNOUT_LVL1_AMP1_CTRL1, 0x00},
  113. {MAX98927_R0074_BROWNOUT_LVL1_AMP1_CTRL2, 0x00},
  114. {MAX98927_R0075_BROWNOUT_LVL1_AMP1_CTRL3, 0x00},
  115. {MAX98927_R0076_BROWNOUT_LVL2_CUR_LIMIT, 0x00},
  116. {MAX98927_R0077_BROWNOUT_LVL2_AMP1_CTRL1, 0x00},
  117. {MAX98927_R0078_BROWNOUT_LVL2_AMP1_CTRL2, 0x00},
  118. {MAX98927_R0079_BROWNOUT_LVL2_AMP1_CTRL3, 0x00},
  119. {MAX98927_R007A_BROWNOUT_LVL3_CUR_LIMIT, 0x00},
  120. {MAX98927_R007B_BROWNOUT_LVL3_AMP1_CTRL1, 0x00},
  121. {MAX98927_R007C_BROWNOUT_LVL3_AMP1_CTRL2, 0x00},
  122. {MAX98927_R007D_BROWNOUT_LVL3_AMP1_CTRL3, 0x00},
  123. {MAX98927_R007E_BROWNOUT_LVL4_CUR_LIMIT, 0x00},
  124. {MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1, 0x00},
  125. {MAX98927_R0080_BROWNOUT_LVL4_AMP1_CTRL2, 0x00},
  126. {MAX98927_R0081_BROWNOUT_LVL4_AMP1_CTRL3, 0x00},
  127. {MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM, 0x00},
  128. {MAX98927_R0083_ENV_TRACK_BOOST_VOUT_DELAY, 0x00},
  129. {MAX98927_R0084_ENV_TRACK_REL_RATE, 0x00},
  130. {MAX98927_R0085_ENV_TRACK_HOLD_RATE, 0x00},
  131. {MAX98927_R0086_ENV_TRACK_CTRL, 0x00},
  132. {MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ, 0x00},
  133. {MAX98927_R00FF_GLOBAL_SHDN, 0x00},
  134. {MAX98927_R0100_SOFT_RESET, 0x00},
  135. {MAX98927_R01FF_REV_ID, 0x40},
  136. };
  137. static int max98927_dai_set_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt)
  138. {
  139. struct snd_soc_component *component = codec_dai->component;
  140. struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
  141. unsigned int mode = 0;
  142. unsigned int format = 0;
  143. bool use_pdm = false;
  144. unsigned int invert = 0;
  145. dev_dbg(component->dev, "%s: fmt 0x%08X\n", __func__, fmt);
  146. switch (fmt & SND_SOC_DAIFMT_CLOCK_PROVIDER_MASK) {
  147. case SND_SOC_DAIFMT_CBC_CFC:
  148. max98927->provider = false;
  149. mode = MAX98927_PCM_MASTER_MODE_SLAVE;
  150. break;
  151. case SND_SOC_DAIFMT_CBP_CFP:
  152. max98927->provider = true;
  153. mode = MAX98927_PCM_MASTER_MODE_MASTER;
  154. break;
  155. default:
  156. dev_err(component->dev, "DAI clock mode unsupported\n");
  157. return -EINVAL;
  158. }
  159. regmap_update_bits(max98927->regmap,
  160. MAX98927_R0021_PCM_MASTER_MODE,
  161. MAX98927_PCM_MASTER_MODE_MASK,
  162. mode);
  163. switch (fmt & SND_SOC_DAIFMT_INV_MASK) {
  164. case SND_SOC_DAIFMT_NB_NF:
  165. break;
  166. case SND_SOC_DAIFMT_IB_NF:
  167. invert = MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE;
  168. break;
  169. default:
  170. dev_err(component->dev, "DAI invert mode unsupported\n");
  171. return -EINVAL;
  172. }
  173. regmap_update_bits(max98927->regmap,
  174. MAX98927_R0020_PCM_MODE_CFG,
  175. MAX98927_PCM_MODE_CFG_PCM_BCLKEDGE,
  176. invert);
  177. /* interface format */
  178. switch (fmt & SND_SOC_DAIFMT_FORMAT_MASK) {
  179. case SND_SOC_DAIFMT_I2S:
  180. format = MAX98927_PCM_FORMAT_I2S;
  181. break;
  182. case SND_SOC_DAIFMT_LEFT_J:
  183. format = MAX98927_PCM_FORMAT_LJ;
  184. break;
  185. case SND_SOC_DAIFMT_DSP_A:
  186. format = MAX98927_PCM_FORMAT_TDM_MODE1;
  187. break;
  188. case SND_SOC_DAIFMT_DSP_B:
  189. format = MAX98927_PCM_FORMAT_TDM_MODE0;
  190. break;
  191. case SND_SOC_DAIFMT_PDM:
  192. use_pdm = true;
  193. break;
  194. default:
  195. return -EINVAL;
  196. }
  197. max98927->iface = fmt & SND_SOC_DAIFMT_FORMAT_MASK;
  198. if (!use_pdm) {
  199. /* pcm channel configuration */
  200. regmap_update_bits(max98927->regmap,
  201. MAX98927_R0018_PCM_RX_EN_A,
  202. MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN,
  203. MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN);
  204. regmap_update_bits(max98927->regmap,
  205. MAX98927_R0020_PCM_MODE_CFG,
  206. MAX98927_PCM_MODE_CFG_FORMAT_MASK,
  207. format << MAX98927_PCM_MODE_CFG_FORMAT_SHIFT);
  208. regmap_update_bits(max98927->regmap,
  209. MAX98927_R003B_SPK_SRC_SEL,
  210. MAX98927_SPK_SRC_MASK, 0);
  211. regmap_update_bits(max98927->regmap,
  212. MAX98927_R0035_PDM_RX_CTRL,
  213. MAX98927_PDM_RX_EN_MASK, 0);
  214. } else {
  215. /* pdm channel configuration */
  216. regmap_update_bits(max98927->regmap,
  217. MAX98927_R0035_PDM_RX_CTRL,
  218. MAX98927_PDM_RX_EN_MASK, 1);
  219. regmap_update_bits(max98927->regmap,
  220. MAX98927_R003B_SPK_SRC_SEL,
  221. MAX98927_SPK_SRC_MASK, 3);
  222. regmap_update_bits(max98927->regmap,
  223. MAX98927_R0018_PCM_RX_EN_A,
  224. MAX98927_PCM_RX_CH0_EN | MAX98927_PCM_RX_CH1_EN, 0);
  225. }
  226. return 0;
  227. }
  228. /* codec MCLK rate in master mode */
  229. static const int rate_table[] = {
  230. 5644800, 6000000, 6144000, 6500000,
  231. 9600000, 11289600, 12000000, 12288000,
  232. 13000000, 19200000,
  233. };
  234. /* BCLKs per LRCLK */
  235. static const int bclk_sel_table[] = {
  236. 32, 48, 64, 96, 128, 192, 256, 384, 512,
  237. };
  238. static int max98927_get_bclk_sel(int bclk)
  239. {
  240. int i;
  241. /* match BCLKs per LRCLK */
  242. for (i = 0; i < ARRAY_SIZE(bclk_sel_table); i++) {
  243. if (bclk_sel_table[i] == bclk)
  244. return i + 2;
  245. }
  246. return 0;
  247. }
  248. static int max98927_set_clock(struct max98927_priv *max98927,
  249. struct snd_pcm_hw_params *params)
  250. {
  251. struct snd_soc_component *component = max98927->component;
  252. /* BCLK/LRCLK ratio calculation */
  253. int blr_clk_ratio = params_channels(params) * max98927->ch_size;
  254. int value;
  255. if (max98927->provider) {
  256. int i;
  257. /* match rate to closest value */
  258. for (i = 0; i < ARRAY_SIZE(rate_table); i++) {
  259. if (rate_table[i] >= max98927->sysclk)
  260. break;
  261. }
  262. if (i == ARRAY_SIZE(rate_table)) {
  263. dev_err(component->dev, "failed to find proper clock rate.\n");
  264. return -EINVAL;
  265. }
  266. regmap_update_bits(max98927->regmap,
  267. MAX98927_R0021_PCM_MASTER_MODE,
  268. MAX98927_PCM_MASTER_MODE_MCLK_MASK,
  269. i << MAX98927_PCM_MASTER_MODE_MCLK_RATE_SHIFT);
  270. }
  271. if (!max98927->tdm_mode) {
  272. /* BCLK configuration */
  273. value = max98927_get_bclk_sel(blr_clk_ratio);
  274. if (!value) {
  275. dev_err(component->dev, "format unsupported %d\n",
  276. params_format(params));
  277. return -EINVAL;
  278. }
  279. regmap_update_bits(max98927->regmap,
  280. MAX98927_R0022_PCM_CLK_SETUP,
  281. MAX98927_PCM_CLK_SETUP_BSEL_MASK,
  282. value);
  283. }
  284. return 0;
  285. }
  286. static int max98927_dai_hw_params(struct snd_pcm_substream *substream,
  287. struct snd_pcm_hw_params *params,
  288. struct snd_soc_dai *dai)
  289. {
  290. struct snd_soc_component *component = dai->component;
  291. struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
  292. unsigned int sampling_rate = 0;
  293. unsigned int chan_sz = 0;
  294. /* pcm mode configuration */
  295. switch (snd_pcm_format_width(params_format(params))) {
  296. case 16:
  297. chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16;
  298. break;
  299. case 24:
  300. chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24;
  301. break;
  302. case 32:
  303. chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32;
  304. break;
  305. default:
  306. dev_err(component->dev, "format unsupported %d\n",
  307. params_format(params));
  308. goto err;
  309. }
  310. max98927->ch_size = snd_pcm_format_width(params_format(params));
  311. regmap_update_bits(max98927->regmap,
  312. MAX98927_R0020_PCM_MODE_CFG,
  313. MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
  314. dev_dbg(component->dev, "format supported %d",
  315. params_format(params));
  316. /* sampling rate configuration */
  317. switch (params_rate(params)) {
  318. case 8000:
  319. sampling_rate = MAX98927_PCM_SR_SET1_SR_8000;
  320. break;
  321. case 11025:
  322. sampling_rate = MAX98927_PCM_SR_SET1_SR_11025;
  323. break;
  324. case 12000:
  325. sampling_rate = MAX98927_PCM_SR_SET1_SR_12000;
  326. break;
  327. case 16000:
  328. sampling_rate = MAX98927_PCM_SR_SET1_SR_16000;
  329. break;
  330. case 22050:
  331. sampling_rate = MAX98927_PCM_SR_SET1_SR_22050;
  332. break;
  333. case 24000:
  334. sampling_rate = MAX98927_PCM_SR_SET1_SR_24000;
  335. break;
  336. case 32000:
  337. sampling_rate = MAX98927_PCM_SR_SET1_SR_32000;
  338. break;
  339. case 44100:
  340. sampling_rate = MAX98927_PCM_SR_SET1_SR_44100;
  341. break;
  342. case 48000:
  343. sampling_rate = MAX98927_PCM_SR_SET1_SR_48000;
  344. break;
  345. default:
  346. dev_err(component->dev, "rate %d not supported\n",
  347. params_rate(params));
  348. goto err;
  349. }
  350. /* set DAI_SR to correct LRCLK frequency */
  351. regmap_update_bits(max98927->regmap,
  352. MAX98927_R0023_PCM_SR_SETUP1,
  353. MAX98927_PCM_SR_SET1_SR_MASK,
  354. sampling_rate);
  355. regmap_update_bits(max98927->regmap,
  356. MAX98927_R0024_PCM_SR_SETUP2,
  357. MAX98927_PCM_SR_SET2_SR_MASK,
  358. sampling_rate << MAX98927_PCM_SR_SET2_SR_SHIFT);
  359. /* set sampling rate of IV */
  360. if (max98927->interleave_mode &&
  361. sampling_rate > MAX98927_PCM_SR_SET1_SR_16000)
  362. regmap_update_bits(max98927->regmap,
  363. MAX98927_R0024_PCM_SR_SETUP2,
  364. MAX98927_PCM_SR_SET2_IVADC_SR_MASK,
  365. sampling_rate - 3);
  366. else
  367. regmap_update_bits(max98927->regmap,
  368. MAX98927_R0024_PCM_SR_SETUP2,
  369. MAX98927_PCM_SR_SET2_IVADC_SR_MASK,
  370. sampling_rate);
  371. return max98927_set_clock(max98927, params);
  372. err:
  373. return -EINVAL;
  374. }
  375. static int max98927_dai_tdm_slot(struct snd_soc_dai *dai,
  376. unsigned int tx_mask, unsigned int rx_mask,
  377. int slots, int slot_width)
  378. {
  379. struct snd_soc_component *component = dai->component;
  380. struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
  381. int bsel = 0;
  382. unsigned int chan_sz = 0;
  383. max98927->tdm_mode = true;
  384. /* BCLK configuration */
  385. bsel = max98927_get_bclk_sel(slots * slot_width);
  386. if (bsel == 0) {
  387. dev_err(component->dev, "BCLK %d not supported\n",
  388. slots * slot_width);
  389. return -EINVAL;
  390. }
  391. regmap_update_bits(max98927->regmap,
  392. MAX98927_R0022_PCM_CLK_SETUP,
  393. MAX98927_PCM_CLK_SETUP_BSEL_MASK,
  394. bsel);
  395. /* Channel size configuration */
  396. switch (slot_width) {
  397. case 16:
  398. chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_16;
  399. break;
  400. case 24:
  401. chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_24;
  402. break;
  403. case 32:
  404. chan_sz = MAX98927_PCM_MODE_CFG_CHANSZ_32;
  405. break;
  406. default:
  407. dev_err(component->dev, "format unsupported %d\n",
  408. slot_width);
  409. return -EINVAL;
  410. }
  411. regmap_update_bits(max98927->regmap,
  412. MAX98927_R0020_PCM_MODE_CFG,
  413. MAX98927_PCM_MODE_CFG_CHANSZ_MASK, chan_sz);
  414. /* Rx slot configuration */
  415. regmap_write(max98927->regmap,
  416. MAX98927_R0018_PCM_RX_EN_A,
  417. rx_mask & 0xFF);
  418. regmap_write(max98927->regmap,
  419. MAX98927_R0019_PCM_RX_EN_B,
  420. (rx_mask & 0xFF00) >> 8);
  421. /* Tx slot configuration */
  422. regmap_write(max98927->regmap,
  423. MAX98927_R001A_PCM_TX_EN_A,
  424. tx_mask & 0xFF);
  425. regmap_write(max98927->regmap,
  426. MAX98927_R001B_PCM_TX_EN_B,
  427. (tx_mask & 0xFF00) >> 8);
  428. /* Tx slot Hi-Z configuration */
  429. regmap_write(max98927->regmap,
  430. MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
  431. ~tx_mask & 0xFF);
  432. regmap_write(max98927->regmap,
  433. MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
  434. (~tx_mask & 0xFF00) >> 8);
  435. return 0;
  436. }
  437. #define MAX98927_RATES SNDRV_PCM_RATE_8000_48000
  438. #define MAX98927_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | \
  439. SNDRV_PCM_FMTBIT_S24_LE | SNDRV_PCM_FMTBIT_S32_LE)
  440. static int max98927_dai_set_sysclk(struct snd_soc_dai *dai,
  441. int clk_id, unsigned int freq, int dir)
  442. {
  443. struct snd_soc_component *component = dai->component;
  444. struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
  445. max98927->sysclk = freq;
  446. return 0;
  447. }
  448. static const struct snd_soc_dai_ops max98927_dai_ops = {
  449. .set_sysclk = max98927_dai_set_sysclk,
  450. .set_fmt = max98927_dai_set_fmt,
  451. .hw_params = max98927_dai_hw_params,
  452. .set_tdm_slot = max98927_dai_tdm_slot,
  453. };
  454. static int max98927_dac_event(struct snd_soc_dapm_widget *w,
  455. struct snd_kcontrol *kcontrol, int event)
  456. {
  457. struct snd_soc_component *component = snd_soc_dapm_to_component(w->dapm);
  458. struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
  459. switch (event) {
  460. case SND_SOC_DAPM_PRE_PMU:
  461. max98927->tdm_mode = false;
  462. break;
  463. case SND_SOC_DAPM_POST_PMU:
  464. regmap_update_bits(max98927->regmap,
  465. MAX98927_R003A_AMP_EN,
  466. MAX98927_AMP_EN_MASK, 1);
  467. regmap_update_bits(max98927->regmap,
  468. MAX98927_R00FF_GLOBAL_SHDN,
  469. MAX98927_GLOBAL_EN_MASK, 1);
  470. break;
  471. case SND_SOC_DAPM_POST_PMD:
  472. regmap_update_bits(max98927->regmap,
  473. MAX98927_R00FF_GLOBAL_SHDN,
  474. MAX98927_GLOBAL_EN_MASK, 0);
  475. regmap_update_bits(max98927->regmap,
  476. MAX98927_R003A_AMP_EN,
  477. MAX98927_AMP_EN_MASK, 0);
  478. break;
  479. default:
  480. return 0;
  481. }
  482. return 0;
  483. }
  484. static const char * const max98927_switch_text[] = {
  485. "Left", "Right", "LeftRight"};
  486. static const struct soc_enum dai_sel_enum =
  487. SOC_ENUM_SINGLE(MAX98927_R0025_PCM_TO_SPK_MONOMIX_A,
  488. MAX98927_PCM_TO_SPK_MONOMIX_CFG_SHIFT,
  489. 3, max98927_switch_text);
  490. static const struct snd_kcontrol_new max98927_dai_controls =
  491. SOC_DAPM_ENUM("DAI Sel", dai_sel_enum);
  492. static const struct snd_kcontrol_new max98927_vi_control =
  493. SOC_DAPM_SINGLE("Switch", MAX98927_R003F_MEAS_DSP_CFG, 2, 1, 0);
  494. static const struct snd_soc_dapm_widget max98927_dapm_widgets[] = {
  495. SND_SOC_DAPM_DAC_E("Amp Enable", "HiFi Playback", MAX98927_R003A_AMP_EN,
  496. 0, 0, max98927_dac_event,
  497. SND_SOC_DAPM_POST_PMU | SND_SOC_DAPM_POST_PMD),
  498. SND_SOC_DAPM_MUX("DAI Sel Mux", SND_SOC_NOPM, 0, 0,
  499. &max98927_dai_controls),
  500. SND_SOC_DAPM_OUTPUT("BE_OUT"),
  501. SND_SOC_DAPM_AIF_OUT("Voltage Sense", "HiFi Capture", 0,
  502. MAX98927_R003E_MEAS_EN, 0, 0),
  503. SND_SOC_DAPM_AIF_OUT("Current Sense", "HiFi Capture", 0,
  504. MAX98927_R003E_MEAS_EN, 1, 0),
  505. SND_SOC_DAPM_SWITCH("VI Sense", SND_SOC_NOPM, 0, 0,
  506. &max98927_vi_control),
  507. SND_SOC_DAPM_SIGGEN("VMON"),
  508. SND_SOC_DAPM_SIGGEN("IMON"),
  509. };
  510. static DECLARE_TLV_DB_SCALE(max98927_spk_tlv, 300, 300, 0);
  511. static DECLARE_TLV_DB_SCALE(max98927_digital_tlv, -1600, 25, 0);
  512. static bool max98927_readable_register(struct device *dev, unsigned int reg)
  513. {
  514. switch (reg) {
  515. case MAX98927_R0001_INT_RAW1 ... MAX98927_R0028_ICC_RX_EN_B:
  516. case MAX98927_R002B_ICC_TX_EN_A ... MAX98927_R002C_ICC_TX_EN_B:
  517. case MAX98927_R002E_ICC_HIZ_MANUAL_MODE
  518. ... MAX98927_R004E_MEAS_ADC_CH2_READ:
  519. case MAX98927_R0051_BROWNOUT_STATUS
  520. ... MAX98927_R0055_BROWNOUT_LVL_HOLD:
  521. case MAX98927_R005A_BROWNOUT_LVL1_THRESH
  522. ... MAX98927_R0061_BROWNOUT_AMP1_CLIP_MODE:
  523. case MAX98927_R0072_BROWNOUT_LVL1_CUR_LIMIT
  524. ... MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ:
  525. case MAX98927_R00FF_GLOBAL_SHDN:
  526. case MAX98927_R0100_SOFT_RESET:
  527. case MAX98927_R01FF_REV_ID:
  528. return true;
  529. default:
  530. return false;
  531. }
  532. };
  533. static bool max98927_volatile_reg(struct device *dev, unsigned int reg)
  534. {
  535. switch (reg) {
  536. case MAX98927_R0001_INT_RAW1 ... MAX98927_R0009_INT_FLAG3:
  537. case MAX98927_R004C_MEAS_ADC_CH0_READ:
  538. case MAX98927_R004D_MEAS_ADC_CH1_READ:
  539. case MAX98927_R004E_MEAS_ADC_CH2_READ:
  540. case MAX98927_R0051_BROWNOUT_STATUS:
  541. case MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ:
  542. case MAX98927_R01FF_REV_ID:
  543. case MAX98927_R0100_SOFT_RESET:
  544. return true;
  545. default:
  546. return false;
  547. }
  548. }
  549. static const char * const max98927_boost_voltage_text[] = {
  550. "6.5V", "6.625V", "6.75V", "6.875V", "7V", "7.125V", "7.25V", "7.375V",
  551. "7.5V", "7.625V", "7.75V", "7.875V", "8V", "8.125V", "8.25V", "8.375V",
  552. "8.5V", "8.625V", "8.75V", "8.875V", "9V", "9.125V", "9.25V", "9.375V",
  553. "9.5V", "9.625V", "9.75V", "9.875V", "10V"
  554. };
  555. static SOC_ENUM_SINGLE_DECL(max98927_boost_voltage,
  556. MAX98927_R0040_BOOST_CTRL0, 0,
  557. max98927_boost_voltage_text);
  558. static const char * const max98927_current_limit_text[] = {
  559. "1.00A", "1.10A", "1.20A", "1.30A", "1.40A", "1.50A", "1.60A", "1.70A",
  560. "1.80A", "1.90A", "2.00A", "2.10A", "2.20A", "2.30A", "2.40A", "2.50A",
  561. "2.60A", "2.70A", "2.80A", "2.90A", "3.00A", "3.10A", "3.20A", "3.30A",
  562. "3.40A", "3.50A", "3.60A", "3.70A", "3.80A", "3.90A", "4.00A", "4.10A"
  563. };
  564. static SOC_ENUM_SINGLE_DECL(max98927_current_limit,
  565. MAX98927_R0042_BOOST_CTRL1, 1,
  566. max98927_current_limit_text);
  567. static const struct snd_kcontrol_new max98927_snd_controls[] = {
  568. SOC_SINGLE_TLV("Speaker Volume", MAX98927_R003C_SPK_GAIN,
  569. 0, 6, 0,
  570. max98927_spk_tlv),
  571. SOC_SINGLE_TLV("Digital Volume", MAX98927_R0036_AMP_VOL_CTRL,
  572. 0, (1<<MAX98927_AMP_VOL_WIDTH)-1, 0,
  573. max98927_digital_tlv),
  574. SOC_SINGLE("Amp DSP Switch", MAX98927_R0052_BROWNOUT_EN,
  575. MAX98927_BROWNOUT_DSP_SHIFT, 1, 0),
  576. SOC_SINGLE("Ramp Switch", MAX98927_R0037_AMP_DSP_CFG,
  577. MAX98927_AMP_DSP_CFG_RMP_SHIFT, 1, 0),
  578. SOC_SINGLE("DRE Switch", MAX98927_R0039_DRE_CTRL,
  579. MAX98927_DRE_EN_SHIFT, 1, 0),
  580. SOC_SINGLE("Volume Location Switch", MAX98927_R0036_AMP_VOL_CTRL,
  581. MAX98927_AMP_VOL_SEL_SHIFT, 1, 0),
  582. SOC_ENUM("Boost Output Voltage", max98927_boost_voltage),
  583. SOC_ENUM("Current Limit", max98927_current_limit),
  584. };
  585. static const struct snd_soc_dapm_route max98927_audio_map[] = {
  586. /* Plabyack */
  587. {"DAI Sel Mux", "Left", "Amp Enable"},
  588. {"DAI Sel Mux", "Right", "Amp Enable"},
  589. {"DAI Sel Mux", "LeftRight", "Amp Enable"},
  590. {"BE_OUT", NULL, "DAI Sel Mux"},
  591. /* Capture */
  592. { "VI Sense", "Switch", "VMON" },
  593. { "VI Sense", "Switch", "IMON" },
  594. { "Voltage Sense", NULL, "VI Sense" },
  595. { "Current Sense", NULL, "VI Sense" },
  596. };
  597. static struct snd_soc_dai_driver max98927_dai[] = {
  598. {
  599. .name = "max98927-aif1",
  600. .playback = {
  601. .stream_name = "HiFi Playback",
  602. .channels_min = 1,
  603. .channels_max = 2,
  604. .rates = MAX98927_RATES,
  605. .formats = MAX98927_FORMATS,
  606. },
  607. .capture = {
  608. .stream_name = "HiFi Capture",
  609. .channels_min = 1,
  610. .channels_max = 2,
  611. .rates = MAX98927_RATES,
  612. .formats = MAX98927_FORMATS,
  613. },
  614. .ops = &max98927_dai_ops,
  615. }
  616. };
  617. static int max98927_probe(struct snd_soc_component *component)
  618. {
  619. struct max98927_priv *max98927 = snd_soc_component_get_drvdata(component);
  620. max98927->component = component;
  621. /* Software Reset */
  622. regmap_write(max98927->regmap,
  623. MAX98927_R0100_SOFT_RESET, MAX98927_SOFT_RESET);
  624. /* IV default slot configuration */
  625. regmap_write(max98927->regmap,
  626. MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
  627. 0xFF);
  628. regmap_write(max98927->regmap,
  629. MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
  630. 0xFF);
  631. regmap_write(max98927->regmap,
  632. MAX98927_R0025_PCM_TO_SPK_MONOMIX_A,
  633. 0x80);
  634. regmap_write(max98927->regmap,
  635. MAX98927_R0026_PCM_TO_SPK_MONOMIX_B,
  636. 0x1);
  637. /* Set inital volume (+13dB) */
  638. regmap_write(max98927->regmap,
  639. MAX98927_R0036_AMP_VOL_CTRL,
  640. 0x38);
  641. regmap_write(max98927->regmap,
  642. MAX98927_R003C_SPK_GAIN,
  643. 0x05);
  644. /* Enable DC blocker */
  645. regmap_write(max98927->regmap,
  646. MAX98927_R0037_AMP_DSP_CFG,
  647. 0x03);
  648. /* Enable IMON VMON DC blocker */
  649. regmap_write(max98927->regmap,
  650. MAX98927_R003F_MEAS_DSP_CFG,
  651. 0xF7);
  652. /* Boost Output Voltage & Current limit */
  653. regmap_write(max98927->regmap,
  654. MAX98927_R0040_BOOST_CTRL0,
  655. 0x1C);
  656. regmap_write(max98927->regmap,
  657. MAX98927_R0042_BOOST_CTRL1,
  658. 0x3E);
  659. /* Measurement ADC config */
  660. regmap_write(max98927->regmap,
  661. MAX98927_R0043_MEAS_ADC_CFG,
  662. 0x04);
  663. regmap_write(max98927->regmap,
  664. MAX98927_R0044_MEAS_ADC_BASE_MSB,
  665. 0x00);
  666. regmap_write(max98927->regmap,
  667. MAX98927_R0045_MEAS_ADC_BASE_LSB,
  668. 0x24);
  669. /* Brownout Level */
  670. regmap_write(max98927->regmap,
  671. MAX98927_R007F_BROWNOUT_LVL4_AMP1_CTRL1,
  672. 0x06);
  673. /* Envelope Tracking configuration */
  674. regmap_write(max98927->regmap,
  675. MAX98927_R0082_ENV_TRACK_VOUT_HEADROOM,
  676. 0x08);
  677. regmap_write(max98927->regmap,
  678. MAX98927_R0086_ENV_TRACK_CTRL,
  679. 0x01);
  680. regmap_write(max98927->regmap,
  681. MAX98927_R0087_ENV_TRACK_BOOST_VOUT_READ,
  682. 0x10);
  683. /* voltage, current slot configuration */
  684. regmap_write(max98927->regmap,
  685. MAX98927_R001E_PCM_TX_CH_SRC_A,
  686. (max98927->i_l_slot<<MAX98927_PCM_TX_CH_SRC_A_I_SHIFT|
  687. max98927->v_l_slot)&0xFF);
  688. if (max98927->v_l_slot < 8) {
  689. regmap_update_bits(max98927->regmap,
  690. MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
  691. 1 << max98927->v_l_slot, 0);
  692. regmap_update_bits(max98927->regmap,
  693. MAX98927_R001A_PCM_TX_EN_A,
  694. 1 << max98927->v_l_slot,
  695. 1 << max98927->v_l_slot);
  696. } else {
  697. regmap_update_bits(max98927->regmap,
  698. MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
  699. 1 << (max98927->v_l_slot - 8), 0);
  700. regmap_update_bits(max98927->regmap,
  701. MAX98927_R001B_PCM_TX_EN_B,
  702. 1 << (max98927->v_l_slot - 8),
  703. 1 << (max98927->v_l_slot - 8));
  704. }
  705. if (max98927->i_l_slot < 8) {
  706. regmap_update_bits(max98927->regmap,
  707. MAX98927_R001C_PCM_TX_HIZ_CTRL_A,
  708. 1 << max98927->i_l_slot, 0);
  709. regmap_update_bits(max98927->regmap,
  710. MAX98927_R001A_PCM_TX_EN_A,
  711. 1 << max98927->i_l_slot,
  712. 1 << max98927->i_l_slot);
  713. } else {
  714. regmap_update_bits(max98927->regmap,
  715. MAX98927_R001D_PCM_TX_HIZ_CTRL_B,
  716. 1 << (max98927->i_l_slot - 8), 0);
  717. regmap_update_bits(max98927->regmap,
  718. MAX98927_R001B_PCM_TX_EN_B,
  719. 1 << (max98927->i_l_slot - 8),
  720. 1 << (max98927->i_l_slot - 8));
  721. }
  722. /* Set interleave mode */
  723. if (max98927->interleave_mode)
  724. regmap_update_bits(max98927->regmap,
  725. MAX98927_R001F_PCM_TX_CH_SRC_B,
  726. MAX98927_PCM_TX_CH_INTERLEAVE_MASK,
  727. MAX98927_PCM_TX_CH_INTERLEAVE_MASK);
  728. return 0;
  729. }
  730. #ifdef CONFIG_PM_SLEEP
  731. static int max98927_suspend(struct device *dev)
  732. {
  733. struct max98927_priv *max98927 = dev_get_drvdata(dev);
  734. regcache_cache_only(max98927->regmap, true);
  735. regcache_mark_dirty(max98927->regmap);
  736. return 0;
  737. }
  738. static int max98927_resume(struct device *dev)
  739. {
  740. struct max98927_priv *max98927 = dev_get_drvdata(dev);
  741. regmap_write(max98927->regmap,
  742. MAX98927_R0100_SOFT_RESET, MAX98927_SOFT_RESET);
  743. regcache_cache_only(max98927->regmap, false);
  744. regcache_sync(max98927->regmap);
  745. return 0;
  746. }
  747. #endif
  748. static const struct dev_pm_ops max98927_pm = {
  749. SET_SYSTEM_SLEEP_PM_OPS(max98927_suspend, max98927_resume)
  750. };
  751. static const struct snd_soc_component_driver soc_component_dev_max98927 = {
  752. .probe = max98927_probe,
  753. .controls = max98927_snd_controls,
  754. .num_controls = ARRAY_SIZE(max98927_snd_controls),
  755. .dapm_widgets = max98927_dapm_widgets,
  756. .num_dapm_widgets = ARRAY_SIZE(max98927_dapm_widgets),
  757. .dapm_routes = max98927_audio_map,
  758. .num_dapm_routes = ARRAY_SIZE(max98927_audio_map),
  759. .idle_bias_on = 1,
  760. .use_pmdown_time = 1,
  761. .endianness = 1,
  762. };
  763. static const struct regmap_config max98927_regmap = {
  764. .reg_bits = 16,
  765. .val_bits = 8,
  766. .max_register = MAX98927_R01FF_REV_ID,
  767. .reg_defaults = max98927_reg,
  768. .num_reg_defaults = ARRAY_SIZE(max98927_reg),
  769. .readable_reg = max98927_readable_register,
  770. .volatile_reg = max98927_volatile_reg,
  771. .cache_type = REGCACHE_RBTREE,
  772. };
  773. static void max98927_slot_config(struct i2c_client *i2c,
  774. struct max98927_priv *max98927)
  775. {
  776. int value;
  777. struct device *dev = &i2c->dev;
  778. if (!device_property_read_u32(dev, "vmon-slot-no", &value))
  779. max98927->v_l_slot = value & 0xF;
  780. else
  781. max98927->v_l_slot = 0;
  782. if (!device_property_read_u32(dev, "imon-slot-no", &value))
  783. max98927->i_l_slot = value & 0xF;
  784. else
  785. max98927->i_l_slot = 1;
  786. }
  787. static int max98927_i2c_probe(struct i2c_client *i2c)
  788. {
  789. int ret = 0, value;
  790. int reg = 0;
  791. struct max98927_priv *max98927 = NULL;
  792. max98927 = devm_kzalloc(&i2c->dev,
  793. sizeof(*max98927), GFP_KERNEL);
  794. if (!max98927) {
  795. ret = -ENOMEM;
  796. return ret;
  797. }
  798. i2c_set_clientdata(i2c, max98927);
  799. /* update interleave mode info */
  800. if (!of_property_read_u32(i2c->dev.of_node,
  801. "interleave_mode", &value)) {
  802. if (value > 0)
  803. max98927->interleave_mode = true;
  804. else
  805. max98927->interleave_mode = false;
  806. } else
  807. max98927->interleave_mode = false;
  808. /* regmap initialization */
  809. max98927->regmap
  810. = devm_regmap_init_i2c(i2c, &max98927_regmap);
  811. if (IS_ERR(max98927->regmap)) {
  812. ret = PTR_ERR(max98927->regmap);
  813. dev_err(&i2c->dev,
  814. "Failed to allocate regmap: %d\n", ret);
  815. return ret;
  816. }
  817. max98927->reset_gpio
  818. = devm_gpiod_get_optional(&i2c->dev, "reset", GPIOD_OUT_HIGH);
  819. if (IS_ERR(max98927->reset_gpio)) {
  820. ret = PTR_ERR(max98927->reset_gpio);
  821. return dev_err_probe(&i2c->dev, ret, "failed to request GPIO reset pin");
  822. }
  823. if (max98927->reset_gpio) {
  824. gpiod_set_value_cansleep(max98927->reset_gpio, 0);
  825. /* Wait for i2c port to be ready */
  826. usleep_range(5000, 6000);
  827. }
  828. /* Check Revision ID */
  829. ret = regmap_read(max98927->regmap,
  830. MAX98927_R01FF_REV_ID, &reg);
  831. if (ret < 0) {
  832. dev_err(&i2c->dev,
  833. "Failed to read: 0x%02X\n", MAX98927_R01FF_REV_ID);
  834. return ret;
  835. }
  836. dev_info(&i2c->dev, "MAX98927 revisionID: 0x%02X\n", reg);
  837. /* voltage/current slot configuration */
  838. max98927_slot_config(i2c, max98927);
  839. /* codec registeration */
  840. ret = devm_snd_soc_register_component(&i2c->dev,
  841. &soc_component_dev_max98927,
  842. max98927_dai, ARRAY_SIZE(max98927_dai));
  843. if (ret < 0)
  844. dev_err(&i2c->dev, "Failed to register component: %d\n", ret);
  845. return ret;
  846. }
  847. static void max98927_i2c_remove(struct i2c_client *i2c)
  848. {
  849. struct max98927_priv *max98927 = i2c_get_clientdata(i2c);
  850. if (max98927->reset_gpio) {
  851. gpiod_set_value_cansleep(max98927->reset_gpio, 1);
  852. }
  853. }
  854. static const struct i2c_device_id max98927_i2c_id[] = {
  855. { "max98927", 0},
  856. { },
  857. };
  858. MODULE_DEVICE_TABLE(i2c, max98927_i2c_id);
  859. #if defined(CONFIG_OF)
  860. static const struct of_device_id max98927_of_match[] = {
  861. { .compatible = "maxim,max98927", },
  862. { }
  863. };
  864. MODULE_DEVICE_TABLE(of, max98927_of_match);
  865. #endif
  866. #ifdef CONFIG_ACPI
  867. static const struct acpi_device_id max98927_acpi_match[] = {
  868. { "MX98927", 0 },
  869. {},
  870. };
  871. MODULE_DEVICE_TABLE(acpi, max98927_acpi_match);
  872. #endif
  873. static struct i2c_driver max98927_i2c_driver = {
  874. .driver = {
  875. .name = "max98927",
  876. .of_match_table = of_match_ptr(max98927_of_match),
  877. .acpi_match_table = ACPI_PTR(max98927_acpi_match),
  878. .pm = &max98927_pm,
  879. },
  880. .probe_new = max98927_i2c_probe,
  881. .remove = max98927_i2c_remove,
  882. .id_table = max98927_i2c_id,
  883. };
  884. module_i2c_driver(max98927_i2c_driver)
  885. MODULE_DESCRIPTION("ALSA SoC MAX98927 driver");
  886. MODULE_AUTHOR("Ryan Lee <[email protected]>");
  887. MODULE_LICENSE("GPL");