ark1668e_audio_codec.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. /*
  2. * ARK1668E - ark internal codec
  3. *
  4. */
  5. #include <linux/module.h>
  6. #include <sound/soc.h>
  7. #include <linux/io.h>
  8. #include <linux/slab.h>
  9. #include "ark1668e_i2s.h"
  10. #define HPOUT_EN
  11. //Mute State
  12. #define MUTE_OFF 0
  13. #define MUTE_ON 1
  14. extern int mute_status;
  15. #define ARKDAC_RATES \
  16. (SNDRV_PCM_RATE_11025 | SNDRV_PCM_RATE_16000 | SNDRV_PCM_RATE_22050 | \
  17. SNDRV_PCM_RATE_32000 | SNDRV_PCM_RATE_44100 | SNDRV_PCM_RATE_48000 | \
  18. SNDRV_PCM_RATE_64000 | SNDRV_PCM_RATE_88200 | SNDRV_PCM_RATE_96000 | \
  19. SNDRV_PCM_RATE_176400 | SNDRV_PCM_RATE_192000 |SNDRV_PCM_RATE_8000)
  20. #define ARKDAC_FORMATS (SNDRV_PCM_FMTBIT_S16_LE)
  21. struct ark_sddac {
  22. struct device *dev;
  23. void __iomem *sys_base;//sys_base
  24. unsigned int vol_l;
  25. unsigned int vol_r;
  26. int master;
  27. int mute_status;
  28. };
  29. static const char *mute_switch[] = {
  30. "UNMUTE",
  31. "MUTE",
  32. };
  33. static const struct soc_enum mute_switch_enum =
  34. SOC_ENUM_SINGLE_EXT(ARRAY_SIZE(mute_switch), mute_switch);
  35. /***************************************************************************************************
  36. *
  37. * Mute setting
  38. *
  39. ***************************************************************************************************/
  40. static int get_lineout_mute_status(struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
  41. {
  42. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  43. struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
  44. printk("get:lineout_pa_mute_status= %d\n",adac->mute_status);
  45. ucontrol->value.integer.value[0] = adac->mute_status;
  46. return 0;
  47. }
  48. static int set_lineout_mute_status (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
  49. {
  50. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  51. struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
  52. unsigned int mute;
  53. int ret = -1;
  54. unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_2);
  55. printk("set:lineout_pa_mute_status= %ld\n",ucontrol->value.integer.value[0]);
  56. mute = ucontrol->value.integer.value[0];
  57. switch (mute)
  58. {
  59. case MUTE_OFF:
  60. //unmute PA
  61. //val &= ~(3<<27);
  62. val &= ~(0x3<<29);//unmute
  63. writel(val, adac->sys_base + rSYS_AUDIO_CFG_2);
  64. ret = adac->mute_status = MUTE_OFF;
  65. break;
  66. case MUTE_ON:
  67. //mute PA
  68. //val |= (3<<27);
  69. val |= (0x3<<29);//mute
  70. writel(val, adac->sys_base + rSYS_AUDIO_CFG_2);
  71. ret = adac->mute_status = MUTE_ON;
  72. break;
  73. default:
  74. break;
  75. }
  76. return ret;
  77. }
  78. static int ark_adac_get_l_playback_volume (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
  79. {
  80. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  81. struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
  82. ucontrol->value.integer.value[0] = adac->vol_l & 0x3f;
  83. //printk("get_l_playback_volume = %ld\n",ucontrol->value.integer.value[0]);
  84. return 0;
  85. }
  86. static int ark_adac_set_l_playback_volume (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
  87. {
  88. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  89. struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
  90. {
  91. //lineout
  92. unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_3);
  93. adac->vol_l = ucontrol->value.integer.value[0];
  94. //printk("set_l_playback_volume = %d\n",dac->vol_l);
  95. val &= ~DACR0_LVOL_MASK;
  96. val |= DACR0_LVOL(adac->vol_l);
  97. //printk("new_l_playback_volume = 0x%x\n",DACR0_LVOL(dac->vol_l));
  98. writel(val, adac->sys_base + rSYS_AUDIO_CFG_3);
  99. }
  100. {
  101. //hpout
  102. unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_4);
  103. adac->vol_l = ucontrol->value.integer.value[0];
  104. //printk("set_l_playback_volume = %d\n",dac->vol_l);
  105. val &= ~DACR0_LHPVOL_MASK;
  106. val |= DACR0_LHPVOL(adac->vol_l);
  107. //printk("new_l_playback_volume = 0x%x\n",DACR0_LHPVOL(dac->vol_l));
  108. writel(val, adac->sys_base + rSYS_AUDIO_CFG_4);
  109. }
  110. return 0;
  111. }
  112. static int ark_adac_get_r_playback_volume (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
  113. {
  114. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  115. struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
  116. ucontrol->value.integer.value[0] = adac->vol_r & 0x3f;
  117. //printk("get_r_playback_volume = %ld\n",ucontrol->value.integer.value[0]);
  118. return 0;
  119. }
  120. static int ark_adac_set_r_playback_volume (struct snd_kcontrol * kcontrol, struct snd_ctl_elem_value * ucontrol)
  121. {
  122. struct snd_soc_component *component = snd_soc_kcontrol_component(kcontrol);
  123. struct ark_sddac *adac = snd_soc_component_get_drvdata(component);
  124. //unsigned int val = readl(dac->sys_base + rSYS_AUDIO_CFG_3);
  125. //dac->vol_r = ucontrol->value.integer.value[0];
  126. //printk("set_r_playback_volume = %d\n",dac->vol_r);
  127. {
  128. //lineout
  129. unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_3);
  130. adac->vol_r = ucontrol->value.integer.value[0];
  131. val &= ~DACR0_RVOL_MASK;
  132. val |= DACR0_RVOL(adac->vol_r);
  133. //printk("new_r_playback_volume = 0x%x\n",DACR0_RVOL(dac->vol_r));
  134. writel(val, adac->sys_base + rSYS_AUDIO_CFG_3);
  135. }
  136. {
  137. //hpout
  138. unsigned int val = readl(adac->sys_base + rSYS_AUDIO_CFG_3);
  139. adac->vol_r = ucontrol->value.integer.value[0];
  140. val &= ~DACR0_RHPVOL_MASK;
  141. val |= DACR0_RHPVOL(adac->vol_r);
  142. //printk("new_r_playback_volume = 0x%x\n",DACR0_RHPVOL(dac->vol_r));
  143. writel(val, adac->sys_base + rSYS_AUDIO_CFG_3);
  144. }
  145. return 0;
  146. }
  147. static const struct snd_kcontrol_new ark_adac_snd_controls[] = {
  148. /* DAC volume control */
  149. SOC_SINGLE_EXT("DAC Left Playback Volume", 0, 0, 63, 0,
  150. ark_adac_get_l_playback_volume, ark_adac_set_l_playback_volume),
  151. SOC_SINGLE_EXT("DAC Right Playback Volume", 0, 0, 63, 0,
  152. ark_adac_get_r_playback_volume, ark_adac_set_r_playback_volume),
  153. SOC_ENUM_EXT("DAC PA Mute Control", mute_switch_enum,
  154. get_lineout_mute_status, set_lineout_mute_status),
  155. };
  156. static const struct snd_soc_dapm_widget ark_adac_dapm_widgets[] = {
  157. SND_SOC_DAPM_OUTPUT("LOUT"),
  158. SND_SOC_DAPM_OUTPUT("ROUT"),
  159. };
  160. static int ark_adac_startup(struct snd_pcm_substream *substream,
  161. struct snd_soc_dai *dai)
  162. {
  163. return 0 ;
  164. }
  165. static void ark_adac_shutdown(struct snd_pcm_substream *substream,
  166. struct snd_soc_dai *dai)
  167. {
  168. }
  169. static int ark_adac_hw_params(struct snd_pcm_substream *substream,
  170. struct snd_pcm_hw_params *params,
  171. struct snd_soc_dai *dai)
  172. {
  173. unsigned int val;
  174. struct ark_sddac *adac = snd_soc_dai_get_drvdata(dai);
  175. if (substream->stream == SNDRV_PCM_STREAM_PLAYBACK) {
  176. //printk(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>PLAYBACK\n");
  177. val = readl(adac->sys_base + rSYS_DEVICE_CLK_CFG3);
  178. val |= (1 << 7) | (1 << 6); //select i2s1 clk
  179. writel(val, adac->sys_base + rSYS_DEVICE_CLK_CFG3);
  180. val = readl(adac->sys_base + rSYS_PAD_CTRL0F);
  181. val |= (1 << 11) | (1 << 15); //select i2s1 bclk and sync
  182. val &= ~((1 << 13) | (1 << 14)); //select internal codec
  183. writel(val, adac->sys_base + rSYS_PAD_CTRL0F);
  184. val = readl(adac->sys_base + rSYS_AUDIO_CFG_0);
  185. if(adac->master)
  186. val |= (1<<0);//Master
  187. else
  188. val &= ~(1<<0);//Slave
  189. val |=(0x1<<9)|(0xf<<1);
  190. //val &= ~(0x3<<13);//0:RMICIN/LMICIN 1: RLINEIN/LLINEIN
  191. writel(val, adac->sys_base + rSYS_AUDIO_CFG_0);
  192. val = readl(adac->sys_base + rSYS_AUDIO_CFG_3);
  193. val &= ~(0x3<<15);//DAC_PD
  194. val &= ~(0x7<<21);//HP_PD
  195. val |= (0x3<<17);//
  196. writel(val, adac->sys_base + rSYS_AUDIO_CFG_3);
  197. val = readl(adac->sys_base + rSYS_AUDIO_CFG_2);
  198. val &= ~(0x3<<27);//LINEOUT_PD
  199. writel(val, adac->sys_base + rSYS_AUDIO_CFG_2);
  200. val = readl(adac->sys_base + rSYS_AUDIO_CFG_4);
  201. val &= ~(0x1<<9);//SPK_PD
  202. val &=~(0x1 << 8);
  203. val |= (0x1 << 7);
  204. writel(val, adac->sys_base + rSYS_AUDIO_CFG_4);
  205. val = readl(adac->sys_base + rSYS_AUDIO_CFG_5);
  206. val |=(0x1<<31);
  207. writel(val,adac->sys_base + rSYS_AUDIO_CFG_5);
  208. } else if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) {
  209. //printk(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>CAPTURE\n");
  210. udelay(2);
  211. val = readl(adac->sys_base + rSYS_DEVICE_CLK_CFG3);
  212. val |= (1 << 7);
  213. val &= ~(1 << 6); //select i2s0 clk
  214. writel(val, adac->sys_base + rSYS_DEVICE_CLK_CFG3);
  215. val = readl(adac->sys_base + rSYS_PAD_CTRL0F);
  216. val &= ~((1 << 11) | (1 << 15)); //select i2s0 bclk and sync
  217. val &= ~((1 << 8) | (1 << 9) | (1 << 10)); //select internal codec
  218. writel(val, adac->sys_base + rSYS_PAD_CTRL0F);
  219. val = readl(adac->sys_base + rSYS_AUDIO_CFG_0);
  220. if(adac->master)
  221. val |= (1<<0);//Master
  222. else
  223. val &= ~(1<<0);//Slave
  224. //val &= ~(0x3<<13);
  225. val &= ~(1<<13);//0:RMICIN 1: RLINEIN
  226. val &= ~(1<<14);//0:LMICIN 1:LLINEIN
  227. //val &= ~(1<<15);//
  228. //val &= ~(1<<16);//
  229. val &= ~(1<<21);
  230. val &= ~(1<<22);
  231. //val |=(0x3<<13)|(0x1<<9)|(0xf<<1);
  232. val |=(0x1<<9)|(0xf<<1);
  233. writel(val, adac->sys_base + rSYS_AUDIO_CFG_0);
  234. val = readl(adac->sys_base + rSYS_AUDIO_CFG_1);
  235. val &= ~(0xf<<6);
  236. //val |= ((0x1<<7)|(0x1<<9));//L: Power-down mode R:Normal mode //for ksw only
  237. //val |= ((0x1<<6)|(0x1<<8));//L:Normal mode R: Power-down mode
  238. val |= (0x5f<<19)|(0x5f<<12);//volume gain control
  239. writel(val, adac->sys_base + rSYS_AUDIO_CFG_1);
  240. val = readl(adac->sys_base + rSYS_AUDIO_CFG_5);
  241. val &=~(0x1<<17);//MICBPD
  242. writel(val,adac->sys_base + rSYS_AUDIO_CFG_5);
  243. }
  244. return 0;
  245. }
  246. static int ark_adac_mute(struct snd_soc_dai *dai, int mute)
  247. {
  248. return 0;
  249. }
  250. static int ark_adac_set_dai_sysclk(struct snd_soc_dai *codec_dai,
  251. int clk_id, unsigned int freq, int dir)
  252. {
  253. return 0;
  254. }
  255. static int ark_adac_set_dai_fmt(struct snd_soc_dai *codec_dai,
  256. unsigned int fmt)
  257. {
  258. struct ark_sddac *i2s = snd_soc_dai_get_drvdata(codec_dai);
  259. switch (fmt & SND_SOC_DAIFMT_MASTER_MASK) {
  260. case SND_SOC_DAIFMT_CBM_CFM:
  261. printk("##############ark audio codec master\n");
  262. i2s->master= 1;
  263. break;
  264. case SND_SOC_DAIFMT_CBS_CFS:
  265. printk("##############ark audio codec slave\n");
  266. i2s->master = 0;
  267. break;
  268. default:
  269. break;
  270. }
  271. return 0;
  272. }
  273. static const struct snd_soc_dai_ops ark_adac_dai_ops = {
  274. .startup = ark_adac_startup,
  275. .shutdown = ark_adac_shutdown,
  276. .hw_params = ark_adac_hw_params,
  277. .set_sysclk = ark_adac_set_dai_sysclk,
  278. .set_fmt = ark_adac_set_dai_fmt,
  279. .digital_mute = ark_adac_mute,
  280. };
  281. static struct snd_soc_dai_driver ark_adac_dai = {
  282. .name = "ark1668e-audio-codec",
  283. .playback = {
  284. .stream_name = "Playback",
  285. .channels_min = 1,
  286. .channels_max = 2,
  287. .rates = ARKDAC_RATES,
  288. .formats = ARKDAC_FORMATS,
  289. },
  290. .capture = {
  291. .stream_name = "Capture",
  292. .channels_min = 1,
  293. .channels_max = 2,
  294. .rates = ARKDAC_RATES,
  295. .formats = ARKDAC_FORMATS,
  296. },
  297. .ops = &ark_adac_dai_ops,
  298. };
  299. static int ark_adac_codec_probe(struct snd_soc_component *component)
  300. {
  301. printk("############[%s]:\n",__FUNCTION__);
  302. return 0;
  303. }
  304. static const struct snd_soc_component_driver ark_adac_component_driver = {
  305. .probe = ark_adac_codec_probe,
  306. .controls = ark_adac_snd_controls,
  307. .num_controls = ARRAY_SIZE(ark_adac_snd_controls),
  308. .dapm_widgets = ark_adac_dapm_widgets,
  309. .num_dapm_widgets = ARRAY_SIZE(ark_adac_dapm_widgets),
  310. };
  311. static int ark_adac_probe(struct platform_device *pdev)
  312. {
  313. struct ark_sddac *adac;
  314. struct device *dev = &pdev->dev;
  315. struct resource *res;
  316. int ret;
  317. adac = devm_kzalloc(dev, sizeof(*adac), GFP_KERNEL);
  318. if (!adac)
  319. return -ENOMEM;
  320. adac->mute_status = MUTE_OFF;
  321. if (of_property_read_u32(pdev->dev.of_node, "left-volume", &adac->vol_l))
  322. adac->vol_l = 50;
  323. if (of_property_read_u32(pdev->dev.of_node, "right-volume", &adac->vol_r))
  324. adac->vol_r = 50;
  325. //printk(">>>>>>>>>>>>>>>>>>dac:left-volume = %d,right-volume = %d \n",dac->vol_l,dac->vol_r);
  326. platform_set_drvdata(pdev, adac);
  327. //sys resource
  328. res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  329. adac->sys_base = ioremap(res->start, resource_size(res));
  330. if (IS_ERR(adac->sys_base))
  331. return PTR_ERR(adac->sys_base);
  332. //printk("==============[sys_base = 0x%08x ]\n",adac->sys_base);
  333. ret = devm_snd_soc_register_component(dev, &ark_adac_component_driver,
  334. &ark_adac_dai,
  335. 1);
  336. if (ret) {
  337. dev_err(dev, "failed to register codec: %d\n", ret);
  338. goto err;
  339. }
  340. return 0;
  341. err:
  342. return ret;
  343. }
  344. static int ark_adac_remove(struct platform_device *pdev)
  345. {
  346. struct ark_sddac *adac = dev_get_drvdata(&pdev->dev);
  347. if (adac->sys_base)
  348. iounmap(adac->sys_base);
  349. return 0;
  350. }
  351. static const struct of_device_id ark_adac_match[] = {
  352. { .compatible = "arkmicro,ark-audio-codec", },
  353. {},
  354. };
  355. static struct platform_driver ark_adac_driver = {
  356. .driver = {
  357. .name = "ark-adac",
  358. .of_match_table = of_match_ptr(ark_adac_match),
  359. },
  360. .probe = ark_adac_probe,
  361. .remove = ark_adac_remove,
  362. };
  363. module_platform_driver(ark_adac_driver);
  364. MODULE_DESCRIPTION("ARK dac codec driver");
  365. MODULE_AUTHOR("Sim");
  366. MODULE_LICENSE("GPL v2");