max98090.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577
  1. /*
  2. * max98090.c -- MAX98090 ALSA SoC Audio driver
  3. * based on Rev0p8 datasheet
  4. *
  5. * Copyright (C) 2012 Renesas Solutions Corp.
  6. * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>
  7. *
  8. * Based on
  9. *
  10. * max98095.c
  11. * Copyright 2011 Maxim Integrated Products
  12. *
  13. * https://github.com/hardkernel/linux/commit/\
  14. * 3417d7166b17113b3b33b0a337c74d1c7cc313df#sound/soc/codecs/max98090.c
  15. * Copyright 2011 Maxim Integrated Products
  16. *
  17. * This program is free software; you can redistribute it and/or modify
  18. * it under the terms of the GNU General Public License version 2 as
  19. * published by the Free Software Foundation.
  20. */
  21. #include <linux/i2c.h>
  22. #include <linux/module.h>
  23. #include <linux/regmap.h>
  24. #include <sound/soc.h>
  25. #include <sound/tlv.h>
  26. /*
  27. *
  28. * MAX98090 Registers Definition
  29. *
  30. */
  31. /* RESET / STATUS / INTERRUPT REGISTERS */
  32. #define MAX98090_0x00_SW_RESET 0x00
  33. #define MAX98090_0x01_INT_STS 0x01
  34. #define MAX98090_0x02_JACK_STS 0x02
  35. #define MAX98090_0x03_INT_MASK 0x03
  36. /* QUICK SETUP REGISTERS */
  37. #define MAX98090_0x04_SYS_CLK 0x04
  38. #define MAX98090_0x05_SAMPLE_RATE 0x05
  39. #define MAX98090_0x06_DAI_IF 0x06
  40. #define MAX98090_0x07_DAC_PATH 0x07
  41. #define MAX98090_0x08_MIC_TO_ADC 0x08
  42. #define MAX98090_0x09_LINE_TO_ADC 0x09
  43. #define MAX98090_0x0A_ANALOG_MIC_LOOP 0x0A
  44. #define MAX98090_0x0B_ANALOG_LINE_LOOP 0x0B
  45. /* ANALOG INPUT CONFIGURATION REGISTERS */
  46. #define MAX98090_0x0D_INPUT_CONFIG 0x0D
  47. #define MAX98090_0x0E_LINE_IN_LVL 0x0E
  48. #define MAX98090_0x0F_LINI_IN_CFG 0x0F
  49. #define MAX98090_0x10_MIC1_IN_LVL 0x10
  50. #define MAX98090_0x11_MIC2_IN_LVL 0x11
  51. /* MICROPHONE CONFIGURATION REGISTERS */
  52. #define MAX98090_0x12_MIC_BIAS_VOL 0x12
  53. #define MAX98090_0x13_DIGITAL_MIC_CFG 0x13
  54. #define MAX98090_0x14_DIGITAL_MIC_MODE 0x14
  55. /* ADC PATH AND CONFIGURATION REGISTERS */
  56. #define MAX98090_0x15_L_ADC_MIX 0x15
  57. #define MAX98090_0x16_R_ADC_MIX 0x16
  58. #define MAX98090_0x17_L_ADC_LVL 0x17
  59. #define MAX98090_0x18_R_ADC_LVL 0x18
  60. #define MAX98090_0x19_ADC_BIQUAD_LVL 0x19
  61. #define MAX98090_0x1A_ADC_SIDETONE 0x1A
  62. /* CLOCK CONFIGURATION REGISTERS */
  63. #define MAX98090_0x1B_SYS_CLK 0x1B
  64. #define MAX98090_0x1C_CLK_MODE 0x1C
  65. #define MAX98090_0x1D_ANY_CLK1 0x1D
  66. #define MAX98090_0x1E_ANY_CLK2 0x1E
  67. #define MAX98090_0x1F_ANY_CLK3 0x1F
  68. #define MAX98090_0x20_ANY_CLK4 0x20
  69. #define MAX98090_0x21_MASTER_MODE 0x21
  70. /* INTERFACE CONTROL REGISTERS */
  71. #define MAX98090_0x22_DAI_IF_FMT 0x22
  72. #define MAX98090_0x23_DAI_TDM_FMT1 0x23
  73. #define MAX98090_0x24_DAI_TDM_FMT2 0x24
  74. #define MAX98090_0x25_DAI_IO_CFG 0x25
  75. #define MAX98090_0x26_FILTER_CFG 0x26
  76. #define MAX98090_0x27_DAI_PLAYBACK_LVL 0x27
  77. #define MAX98090_0x28_EQ_PLAYBACK_LVL 0x28
  78. /* HEADPHONE CONTROL REGISTERS */
  79. #define MAX98090_0x29_L_HP_MIX 0x29
  80. #define MAX98090_0x2A_R_HP_MIX 0x2A
  81. #define MAX98090_0x2B_HP_CTR 0x2B
  82. #define MAX98090_0x2C_L_HP_VOL 0x2C
  83. #define MAX98090_0x2D_R_HP_VOL 0x2D
  84. /* SPEAKER CONFIGURATION REGISTERS */
  85. #define MAX98090_0x2E_L_SPK_MIX 0x2E
  86. #define MAX98090_0x2F_R_SPK_MIX 0x2F
  87. #define MAX98090_0x30_SPK_CTR 0x30
  88. #define MAX98090_0x31_L_SPK_VOL 0x31
  89. #define MAX98090_0x32_R_SPK_VOL 0x32
  90. /* ALC CONFIGURATION REGISTERS */
  91. #define MAX98090_0x33_ALC_TIMING 0x33
  92. #define MAX98090_0x34_ALC_COMPRESSOR 0x34
  93. #define MAX98090_0x35_ALC_EXPANDER 0x35
  94. #define MAX98090_0x36_ALC_GAIN 0x36
  95. /* RECEIVER AND LINE_OUTPUT REGISTERS */
  96. #define MAX98090_0x37_RCV_LOUT_L_MIX 0x37
  97. #define MAX98090_0x38_RCV_LOUT_L_CNTL 0x38
  98. #define MAX98090_0x39_RCV_LOUT_L_VOL 0x39
  99. #define MAX98090_0x3A_LOUT_R_MIX 0x3A
  100. #define MAX98090_0x3B_LOUT_R_CNTL 0x3B
  101. #define MAX98090_0x3C_LOUT_R_VOL 0x3C
  102. /* JACK DETECT AND ENABLE REGISTERS */
  103. #define MAX98090_0x3D_JACK_DETECT 0x3D
  104. #define MAX98090_0x3E_IN_ENABLE 0x3E
  105. #define MAX98090_0x3F_OUT_ENABLE 0x3F
  106. #define MAX98090_0x40_LVL_CTR 0x40
  107. #define MAX98090_0x41_DSP_FILTER_ENABLE 0x41
  108. /* BIAS AND POWER MODE CONFIGURATION REGISTERS */
  109. #define MAX98090_0x42_BIAS_CTR 0x42
  110. #define MAX98090_0x43_DAC_CTR 0x43
  111. #define MAX98090_0x44_ADC_CTR 0x44
  112. #define MAX98090_0x45_DEV_SHUTDOWN 0x45
  113. /* REVISION ID REGISTER */
  114. #define MAX98090_0xFF_REV_ID 0xFF
  115. #define MAX98090_REG_MAX_CACHED 0x45
  116. #define MAX98090_REG_END 0xFF
  117. /*
  118. *
  119. * MAX98090 Registers Bit Fields
  120. *
  121. */
  122. /* MAX98090_0x06_DAI_IF */
  123. #define MAX98090_DAI_IF_MASK 0x3F
  124. #define MAX98090_RJ_M (1 << 5)
  125. #define MAX98090_RJ_S (1 << 4)
  126. #define MAX98090_LJ_M (1 << 3)
  127. #define MAX98090_LJ_S (1 << 2)
  128. #define MAX98090_I2S_M (1 << 1)
  129. #define MAX98090_I2S_S (1 << 0)
  130. /* MAX98090_0x45_DEV_SHUTDOWN */
  131. #define MAX98090_SHDNRUN (1 << 7)
  132. /* codec private data */
  133. struct max98090_priv {
  134. struct regmap *regmap;
  135. };
  136. static const struct reg_default max98090_reg_defaults[] = {
  137. /* RESET / STATUS / INTERRUPT REGISTERS */
  138. {MAX98090_0x00_SW_RESET, 0x00},
  139. {MAX98090_0x01_INT_STS, 0x00},
  140. {MAX98090_0x02_JACK_STS, 0x00},
  141. {MAX98090_0x03_INT_MASK, 0x04},
  142. /* QUICK SETUP REGISTERS */
  143. {MAX98090_0x04_SYS_CLK, 0x00},
  144. {MAX98090_0x05_SAMPLE_RATE, 0x00},
  145. {MAX98090_0x06_DAI_IF, 0x00},
  146. {MAX98090_0x07_DAC_PATH, 0x00},
  147. {MAX98090_0x08_MIC_TO_ADC, 0x00},
  148. {MAX98090_0x09_LINE_TO_ADC, 0x00},
  149. {MAX98090_0x0A_ANALOG_MIC_LOOP, 0x00},
  150. {MAX98090_0x0B_ANALOG_LINE_LOOP, 0x00},
  151. /* ANALOG INPUT CONFIGURATION REGISTERS */
  152. {MAX98090_0x0D_INPUT_CONFIG, 0x00},
  153. {MAX98090_0x0E_LINE_IN_LVL, 0x1B},
  154. {MAX98090_0x0F_LINI_IN_CFG, 0x00},
  155. {MAX98090_0x10_MIC1_IN_LVL, 0x11},
  156. {MAX98090_0x11_MIC2_IN_LVL, 0x11},
  157. /* MICROPHONE CONFIGURATION REGISTERS */
  158. {MAX98090_0x12_MIC_BIAS_VOL, 0x00},
  159. {MAX98090_0x13_DIGITAL_MIC_CFG, 0x00},
  160. {MAX98090_0x14_DIGITAL_MIC_MODE, 0x00},
  161. /* ADC PATH AND CONFIGURATION REGISTERS */
  162. {MAX98090_0x15_L_ADC_MIX, 0x00},
  163. {MAX98090_0x16_R_ADC_MIX, 0x00},
  164. {MAX98090_0x17_L_ADC_LVL, 0x03},
  165. {MAX98090_0x18_R_ADC_LVL, 0x03},
  166. {MAX98090_0x19_ADC_BIQUAD_LVL, 0x00},
  167. {MAX98090_0x1A_ADC_SIDETONE, 0x00},
  168. /* CLOCK CONFIGURATION REGISTERS */
  169. {MAX98090_0x1B_SYS_CLK, 0x00},
  170. {MAX98090_0x1C_CLK_MODE, 0x00},
  171. {MAX98090_0x1D_ANY_CLK1, 0x00},
  172. {MAX98090_0x1E_ANY_CLK2, 0x00},
  173. {MAX98090_0x1F_ANY_CLK3, 0x00},
  174. {MAX98090_0x20_ANY_CLK4, 0x00},
  175. {MAX98090_0x21_MASTER_MODE, 0x00},
  176. /* INTERFACE CONTROL REGISTERS */
  177. {MAX98090_0x22_DAI_IF_FMT, 0x00},
  178. {MAX98090_0x23_DAI_TDM_FMT1, 0x00},
  179. {MAX98090_0x24_DAI_TDM_FMT2, 0x00},
  180. {MAX98090_0x25_DAI_IO_CFG, 0x00},
  181. {MAX98090_0x26_FILTER_CFG, 0x80},
  182. {MAX98090_0x27_DAI_PLAYBACK_LVL, 0x00},
  183. {MAX98090_0x28_EQ_PLAYBACK_LVL, 0x00},
  184. /* HEADPHONE CONTROL REGISTERS */
  185. {MAX98090_0x29_L_HP_MIX, 0x00},
  186. {MAX98090_0x2A_R_HP_MIX, 0x00},
  187. {MAX98090_0x2B_HP_CTR, 0x00},
  188. {MAX98090_0x2C_L_HP_VOL, 0x1A},
  189. {MAX98090_0x2D_R_HP_VOL, 0x1A},
  190. /* SPEAKER CONFIGURATION REGISTERS */
  191. {MAX98090_0x2E_L_SPK_MIX, 0x00},
  192. {MAX98090_0x2F_R_SPK_MIX, 0x00},
  193. {MAX98090_0x30_SPK_CTR, 0x00},
  194. {MAX98090_0x31_L_SPK_VOL, 0x2C},
  195. {MAX98090_0x32_R_SPK_VOL, 0x2C},
  196. /* ALC CONFIGURATION REGISTERS */
  197. {MAX98090_0x33_ALC_TIMING, 0x00},
  198. {MAX98090_0x34_ALC_COMPRESSOR, 0x00},
  199. {MAX98090_0x35_ALC_EXPANDER, 0x00},
  200. {MAX98090_0x36_ALC_GAIN, 0x00},
  201. /* RECEIVER AND LINE_OUTPUT REGISTERS */
  202. {MAX98090_0x37_RCV_LOUT_L_MIX, 0x00},
  203. {MAX98090_0x38_RCV_LOUT_L_CNTL, 0x00},
  204. {MAX98090_0x39_RCV_LOUT_L_VOL, 0x15},
  205. {MAX98090_0x3A_LOUT_R_MIX, 0x00},
  206. {MAX98090_0x3B_LOUT_R_CNTL, 0x00},
  207. {MAX98090_0x3C_LOUT_R_VOL, 0x15},
  208. /* JACK DETECT AND ENABLE REGISTERS */
  209. {MAX98090_0x3D_JACK_DETECT, 0x00},
  210. {MAX98090_0x3E_IN_ENABLE, 0x00},
  211. {MAX98090_0x3F_OUT_ENABLE, 0x00},
  212. {MAX98090_0x40_LVL_CTR, 0x00},
  213. {MAX98090_0x41_DSP_FILTER_ENABLE, 0x00},
  214. /* BIAS AND POWER MODE CONFIGURATION REGISTERS */
  215. {MAX98090_0x42_BIAS_CTR, 0x00},
  216. {MAX98090_0x43_DAC_CTR, 0x00},
  217. {MAX98090_0x44_ADC_CTR, 0x06},
  218. {MAX98090_0x45_DEV_SHUTDOWN, 0x00},
  219. };
  220. static const unsigned int max98090_hp_tlv[] = {
  221. TLV_DB_RANGE_HEAD(5),
  222. 0x0, 0x6, TLV_DB_SCALE_ITEM(-6700, 400, 0),
  223. 0x7, 0xE, TLV_DB_SCALE_ITEM(-4000, 300, 0),
  224. 0xF, 0x15, TLV_DB_SCALE_ITEM(-1700, 200, 0),
  225. 0x16, 0x1B, TLV_DB_SCALE_ITEM(-400, 100, 0),
  226. 0x1C, 0x1F, TLV_DB_SCALE_ITEM(150, 50, 0),
  227. };
  228. static struct snd_kcontrol_new max98090_snd_controls[] = {
  229. SOC_DOUBLE_R_TLV("Headphone Volume", MAX98090_0x2C_L_HP_VOL,
  230. MAX98090_0x2D_R_HP_VOL, 0, 31, 0, max98090_hp_tlv),
  231. };
  232. /* Left HeadPhone Mixer Switch */
  233. static struct snd_kcontrol_new max98090_left_hp_mixer_controls[] = {
  234. SOC_DAPM_SINGLE("DACR Switch", MAX98090_0x29_L_HP_MIX, 1, 1, 0),
  235. SOC_DAPM_SINGLE("DACL Switch", MAX98090_0x29_L_HP_MIX, 0, 1, 0),
  236. };
  237. /* Right HeadPhone Mixer Switch */
  238. static struct snd_kcontrol_new max98090_right_hp_mixer_controls[] = {
  239. SOC_DAPM_SINGLE("DACR Switch", MAX98090_0x2A_R_HP_MIX, 1, 1, 0),
  240. SOC_DAPM_SINGLE("DACL Switch", MAX98090_0x2A_R_HP_MIX, 0, 1, 0),
  241. };
  242. static struct snd_soc_dapm_widget max98090_dapm_widgets[] = {
  243. /* Output */
  244. SND_SOC_DAPM_OUTPUT("HPL"),
  245. SND_SOC_DAPM_OUTPUT("HPR"),
  246. /* PGA */
  247. SND_SOC_DAPM_PGA("HPL Out", MAX98090_0x3F_OUT_ENABLE, 7, 0, NULL, 0),
  248. SND_SOC_DAPM_PGA("HPR Out", MAX98090_0x3F_OUT_ENABLE, 6, 0, NULL, 0),
  249. /* Mixer */
  250. SND_SOC_DAPM_MIXER("HPL Mixer", SND_SOC_NOPM, 0, 0,
  251. max98090_left_hp_mixer_controls,
  252. ARRAY_SIZE(max98090_left_hp_mixer_controls)),
  253. SND_SOC_DAPM_MIXER("HPR Mixer", SND_SOC_NOPM, 0, 0,
  254. max98090_right_hp_mixer_controls,
  255. ARRAY_SIZE(max98090_right_hp_mixer_controls)),
  256. /* DAC */
  257. SND_SOC_DAPM_DAC("DACL", "Hifi Playback", MAX98090_0x3F_OUT_ENABLE, 0, 0),
  258. SND_SOC_DAPM_DAC("DACR", "Hifi Playback", MAX98090_0x3F_OUT_ENABLE, 1, 0),
  259. };
  260. static struct snd_soc_dapm_route max98090_audio_map[] = {
  261. /* Output */
  262. {"HPL", NULL, "HPL Out"},
  263. {"HPR", NULL, "HPR Out"},
  264. /* PGA */
  265. {"HPL Out", NULL, "HPL Mixer"},
  266. {"HPR Out", NULL, "HPR Mixer"},
  267. /* Mixer*/
  268. {"HPL Mixer", "DACR Switch", "DACR"},
  269. {"HPL Mixer", "DACL Switch", "DACL"},
  270. {"HPR Mixer", "DACR Switch", "DACR"},
  271. {"HPR Mixer", "DACL Switch", "DACL"},
  272. };
  273. static bool max98090_volatile(struct device *dev, unsigned int reg)
  274. {
  275. if ((reg == MAX98090_0x01_INT_STS) ||
  276. (reg == MAX98090_0x02_JACK_STS) ||
  277. (reg > MAX98090_REG_MAX_CACHED))
  278. return true;
  279. return false;
  280. }
  281. static int max98090_dai_hw_params(struct snd_pcm_substream *substream,
  282. struct snd_pcm_hw_params *params,
  283. struct snd_soc_dai *dai)
  284. {
  285. struct snd_soc_codec *codec = dai->codec;
  286. unsigned int val;
  287. switch (params_rate(params)) {
  288. case 96000:
  289. val = 1 << 5;
  290. break;
  291. case 32000:
  292. val = 1 << 4;
  293. break;
  294. case 48000:
  295. val = 1 << 3;
  296. break;
  297. case 44100:
  298. val = 1 << 2;
  299. break;
  300. case 16000:
  301. val = 1 << 1;
  302. break;
  303. case 8000:
  304. val = 1 << 0;
  305. break;
  306. default:
  307. dev_err(codec->dev, "unsupported rate\n");
  308. return -EINVAL;
  309. }
  310. snd_soc_update_bits(codec, MAX98090_0x05_SAMPLE_RATE, 0x03F, val);
  311. return 0;
  312. }
  313. static int max98090_dai_set_sysclk(struct snd_soc_dai *dai,
  314. int clk_id, unsigned int freq, int dir)
  315. {
  316. struct snd_soc_codec *codec = dai->codec;
  317. unsigned int val;
  318. snd_soc_update_bits(codec, MAX98090_0x45_DEV_SHUTDOWN,
  319. MAX98090_SHDNRUN, 0);
  320. switch (freq) {
  321. case 26000000:
  322. val = 1 << 7;
  323. break;
  324. case 19200000:
  325. val = 1 << 6;
  326. break;
  327. case 13000000:
  328. val = 1 << 5;
  329. break;
  330. case 12288000:
  331. val = 1 << 4;
  332. break;
  333. case 12000000:
  334. val = 1 << 3;
  335. break;
  336. case 11289600:
  337. val = 1 << 2;
  338. break;
  339. default:
  340. dev_err(codec->dev, "Invalid master clock frequency\n");
  341. return -EINVAL;
  342. }
  343. snd_soc_update_bits(codec, MAX98090_0x04_SYS_CLK, 0xFD, val);
  344. snd_soc_update_bits(codec, MAX98090_0x45_DEV_SHUTDOWN,
  345. MAX98090_SHDNRUN, MAX98090_SHDNRUN);
  346. dev_dbg(dai->dev, "sysclk is %uHz\n", freq);
  347. return 0;
  348. }
  349. static int max98090_dai_set_fmt(struct snd_soc_dai *dai,
  350. unsigned int fmt)
  351. {
  352. struct snd_soc_codec *codec = dai->codec;
  353. int is_master;
  354. u8 val;
  355. /* master/slave mode */
  356. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  357. case SND_SOC_DAIFMT_CBM_CFM:
  358. is_master = 1;
  359. break;
  360. case SND_SOC_DAIFMT_CBS_CFS:
  361. is_master = 0;
  362. break;
  363. default:
  364. dev_err(codec->dev, "unsupported clock\n");
  365. return -EINVAL;
  366. }
  367. /* format */
  368. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  369. case SND_SOC_DAIFMT_I2S:
  370. val = (is_master) ? MAX98090_I2S_M : MAX98090_I2S_S;
  371. break;
  372. case SND_SOC_DAIFMT_RIGHT_J:
  373. val = (is_master) ? MAX98090_RJ_M : MAX98090_RJ_S;
  374. break;
  375. case SND_SOC_DAIFMT_LEFT_J:
  376. val = (is_master) ? MAX98090_LJ_M : MAX98090_LJ_S;
  377. break;
  378. default:
  379. dev_err(codec->dev, "unsupported format\n");
  380. return -EINVAL;
  381. }
  382. snd_soc_update_bits(codec, MAX98090_0x06_DAI_IF,
  383. MAX98090_DAI_IF_MASK, val);
  384. return 0;
  385. }
  386. #define MAX98090_RATES SNDRV_PCM_RATE_8000_96000
  387. #define MAX98090_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S24_LE)
  388. static struct snd_soc_dai_ops max98090_dai_ops = {
  389. .set_sysclk = max98090_dai_set_sysclk,
  390. .set_fmt = max98090_dai_set_fmt,
  391. .hw_params = max98090_dai_hw_params,
  392. };
  393. static struct snd_soc_dai_driver max98090_dai = {
  394. .name = "max98090-Hifi",
  395. .playback = {
  396. .stream_name = "Playback",
  397. .channels_min = 1,
  398. .channels_max = 2,
  399. .rates = MAX98090_RATES,
  400. .formats = MAX98090_FORMATS,
  401. },
  402. .ops = &max98090_dai_ops,
  403. };
  404. static int max98090_probe(struct snd_soc_codec *codec)
  405. {
  406. struct max98090_priv *priv = snd_soc_codec_get_drvdata(codec);
  407. struct device *dev = codec->dev;
  408. int ret;
  409. codec->control_data = priv->regmap;
  410. ret = snd_soc_codec_set_cache_io(codec, 8, 8, SND_SOC_REGMAP);
  411. if (ret < 0) {
  412. dev_err(dev, "Failed to set cache I/O: %d\n", ret);
  413. return ret;
  414. }
  415. /* Device active */
  416. snd_soc_update_bits(codec, MAX98090_0x45_DEV_SHUTDOWN,
  417. MAX98090_SHDNRUN, MAX98090_SHDNRUN);
  418. return 0;
  419. }
  420. static int max98090_remove(struct snd_soc_codec *codec)
  421. {
  422. return 0;
  423. }
  424. static struct snd_soc_codec_driver soc_codec_dev_max98090 = {
  425. .probe = max98090_probe,
  426. .remove = max98090_remove,
  427. .controls = max98090_snd_controls,
  428. .num_controls = ARRAY_SIZE(max98090_snd_controls),
  429. .dapm_widgets = max98090_dapm_widgets,
  430. .num_dapm_widgets = ARRAY_SIZE(max98090_dapm_widgets),
  431. .dapm_routes = max98090_audio_map,
  432. .num_dapm_routes = ARRAY_SIZE(max98090_audio_map),
  433. };
  434. static const struct regmap_config max98090_regmap = {
  435. .reg_bits = 8,
  436. .val_bits = 8,
  437. .max_register = MAX98090_REG_END,
  438. .volatile_reg = max98090_volatile,
  439. .cache_type = REGCACHE_RBTREE,
  440. .reg_defaults = max98090_reg_defaults,
  441. .num_reg_defaults = ARRAY_SIZE(max98090_reg_defaults),
  442. };
  443. static int max98090_i2c_probe(struct i2c_client *i2c,
  444. const struct i2c_device_id *id)
  445. {
  446. struct max98090_priv *priv;
  447. struct device *dev = &i2c->dev;
  448. unsigned int val;
  449. int ret;
  450. priv = devm_kzalloc(dev, sizeof(struct max98090_priv),
  451. GFP_KERNEL);
  452. if (!priv)
  453. return -ENOMEM;
  454. priv->regmap = devm_regmap_init_i2c(i2c, &max98090_regmap);
  455. if (IS_ERR(priv->regmap)) {
  456. ret = PTR_ERR(priv->regmap);
  457. dev_err(dev, "Failed to init regmap: %d\n", ret);
  458. return ret;
  459. }
  460. i2c_set_clientdata(i2c, priv);
  461. ret = regmap_read(priv->regmap, MAX98090_0xFF_REV_ID, &val);
  462. if (ret < 0) {
  463. dev_err(dev, "Failed to read device revision: %d\n", ret);
  464. return ret;
  465. }
  466. dev_info(dev, "revision 0x%02x\n", val);
  467. ret = snd_soc_register_codec(dev,
  468. &soc_codec_dev_max98090,
  469. &max98090_dai, 1);
  470. return ret;
  471. }
  472. static int max98090_i2c_remove(struct i2c_client *client)
  473. {
  474. snd_soc_unregister_codec(&client->dev);
  475. return 0;
  476. }
  477. static const struct i2c_device_id max98090_i2c_id[] = {
  478. { "max98090", 0 },
  479. { }
  480. };
  481. MODULE_DEVICE_TABLE(i2c, max98090_i2c_id);
  482. static struct i2c_driver max98090_i2c_driver = {
  483. .driver = {
  484. .name = "max98090",
  485. .owner = THIS_MODULE,
  486. },
  487. .probe = max98090_i2c_probe,
  488. .remove = max98090_i2c_remove,
  489. .id_table = max98090_i2c_id,
  490. };
  491. module_i2c_driver(max98090_i2c_driver);
  492. MODULE_DESCRIPTION("ALSA SoC MAX98090 driver");
  493. MODULE_AUTHOR("Peter Hsiang, Kuninori Morimoto");
  494. MODULE_LICENSE("GPL");