adv7511_audio.c 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. /*
  2. * Analog Devices ADV7511 HDMI transmitter driver
  3. *
  4. * Copyright 2012 Analog Devices Inc.
  5. * Copyright (c) 2016, Linaro Limited
  6. *
  7. * Licensed under the GPL-2.
  8. */
  9. #include <sound/core.h>
  10. #include <sound/hdmi-codec.h>
  11. #include <sound/pcm.h>
  12. #include <sound/soc.h>
  13. #include <linux/of_graph.h>
  14. #include "adv7511.h"
  15. static void adv7511_calc_cts_n(unsigned int f_tmds, unsigned int fs,
  16. unsigned int *cts, unsigned int *n)
  17. {
  18. switch (fs) {
  19. case 32000:
  20. *n = 4096;
  21. break;
  22. case 44100:
  23. *n = 6272;
  24. break;
  25. case 48000:
  26. *n = 6144;
  27. break;
  28. }
  29. *cts = ((f_tmds * *n) / (128 * fs)) * 1000;
  30. }
  31. static int adv7511_update_cts_n(struct adv7511 *adv7511)
  32. {
  33. unsigned int cts = 0;
  34. unsigned int n = 0;
  35. adv7511_calc_cts_n(adv7511->f_tmds, adv7511->f_audio, &cts, &n);
  36. regmap_write(adv7511->regmap, ADV7511_REG_N0, (n >> 16) & 0xf);
  37. regmap_write(adv7511->regmap, ADV7511_REG_N1, (n >> 8) & 0xff);
  38. regmap_write(adv7511->regmap, ADV7511_REG_N2, n & 0xff);
  39. regmap_write(adv7511->regmap, ADV7511_REG_CTS_MANUAL0,
  40. (cts >> 16) & 0xf);
  41. regmap_write(adv7511->regmap, ADV7511_REG_CTS_MANUAL1,
  42. (cts >> 8) & 0xff);
  43. regmap_write(adv7511->regmap, ADV7511_REG_CTS_MANUAL2,
  44. cts & 0xff);
  45. return 0;
  46. }
  47. int adv7511_hdmi_hw_params(struct device *dev, void *data,
  48. struct hdmi_codec_daifmt *fmt,
  49. struct hdmi_codec_params *hparms)
  50. {
  51. struct adv7511 *adv7511 = dev_get_drvdata(dev);
  52. unsigned int audio_source, i2s_format = 0;
  53. unsigned int invert_clock;
  54. unsigned int rate;
  55. unsigned int len;
  56. switch (hparms->sample_rate) {
  57. case 32000:
  58. rate = ADV7511_SAMPLE_FREQ_32000;
  59. break;
  60. case 44100:
  61. rate = ADV7511_SAMPLE_FREQ_44100;
  62. break;
  63. case 48000:
  64. rate = ADV7511_SAMPLE_FREQ_48000;
  65. break;
  66. case 88200:
  67. rate = ADV7511_SAMPLE_FREQ_88200;
  68. break;
  69. case 96000:
  70. rate = ADV7511_SAMPLE_FREQ_96000;
  71. break;
  72. case 176400:
  73. rate = ADV7511_SAMPLE_FREQ_176400;
  74. break;
  75. case 192000:
  76. rate = ADV7511_SAMPLE_FREQ_192000;
  77. break;
  78. default:
  79. return -EINVAL;
  80. }
  81. switch (hparms->sample_width) {
  82. case 16:
  83. len = ADV7511_I2S_SAMPLE_LEN_16;
  84. break;
  85. case 18:
  86. len = ADV7511_I2S_SAMPLE_LEN_18;
  87. break;
  88. case 20:
  89. len = ADV7511_I2S_SAMPLE_LEN_20;
  90. break;
  91. case 24:
  92. len = ADV7511_I2S_SAMPLE_LEN_24;
  93. break;
  94. default:
  95. return -EINVAL;
  96. }
  97. switch (fmt->fmt) {
  98. case HDMI_I2S:
  99. audio_source = ADV7511_AUDIO_SOURCE_I2S;
  100. i2s_format = ADV7511_I2S_FORMAT_I2S;
  101. break;
  102. case HDMI_RIGHT_J:
  103. audio_source = ADV7511_AUDIO_SOURCE_I2S;
  104. i2s_format = ADV7511_I2S_FORMAT_RIGHT_J;
  105. break;
  106. case HDMI_LEFT_J:
  107. audio_source = ADV7511_AUDIO_SOURCE_I2S;
  108. i2s_format = ADV7511_I2S_FORMAT_LEFT_J;
  109. break;
  110. default:
  111. return -EINVAL;
  112. }
  113. invert_clock = fmt->bit_clk_inv;
  114. regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_SOURCE, 0x70,
  115. audio_source << 4);
  116. regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG, BIT(6),
  117. invert_clock << 6);
  118. regmap_update_bits(adv7511->regmap, ADV7511_REG_I2S_CONFIG, 0x03,
  119. i2s_format);
  120. adv7511->audio_source = audio_source;
  121. adv7511->f_audio = hparms->sample_rate;
  122. adv7511_update_cts_n(adv7511);
  123. regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CFG3,
  124. ADV7511_AUDIO_CFG3_LEN_MASK, len);
  125. regmap_update_bits(adv7511->regmap, ADV7511_REG_I2C_FREQ_ID_CFG,
  126. ADV7511_I2C_FREQ_ID_CFG_RATE_MASK, rate << 4);
  127. regmap_write(adv7511->regmap, 0x73, 0x1);
  128. return 0;
  129. }
  130. static int audio_startup(struct device *dev, void *data)
  131. {
  132. struct adv7511 *adv7511 = dev_get_drvdata(dev);
  133. regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CONFIG,
  134. BIT(7), 0);
  135. /* hide Audio infoframe updates */
  136. regmap_update_bits(adv7511->regmap, ADV7511_REG_INFOFRAME_UPDATE,
  137. BIT(5), BIT(5));
  138. /* enable N/CTS, enable Audio sample packets */
  139. regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1,
  140. BIT(5), BIT(5));
  141. /* enable N/CTS */
  142. regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1,
  143. BIT(6), BIT(6));
  144. /* not copyrighted */
  145. regmap_update_bits(adv7511->regmap, ADV7511_REG_AUDIO_CFG1,
  146. BIT(5), BIT(5));
  147. /* enable audio infoframes */
  148. regmap_update_bits(adv7511->regmap, ADV7511_REG_PACKET_ENABLE1,
  149. BIT(3), BIT(3));
  150. /* AV mute disable */
  151. regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(0),
  152. BIT(7) | BIT(6), BIT(7));
  153. /* use Audio infoframe updated info */
  154. regmap_update_bits(adv7511->regmap, ADV7511_REG_GC(1),
  155. BIT(5), 0);
  156. return 0;
  157. }
  158. static void audio_shutdown(struct device *dev, void *data)
  159. {
  160. }
  161. static int adv7511_hdmi_i2s_get_dai_id(struct snd_soc_component *component,
  162. struct device_node *endpoint)
  163. {
  164. struct of_endpoint of_ep;
  165. int ret;
  166. ret = of_graph_parse_endpoint(endpoint, &of_ep);
  167. if (ret < 0)
  168. return ret;
  169. /*
  170. * HDMI sound should be located as reg = <2>
  171. * Then, it is sound port 0
  172. */
  173. if (of_ep.port == 2)
  174. return 0;
  175. return -EINVAL;
  176. }
  177. static const struct hdmi_codec_ops adv7511_codec_ops = {
  178. .hw_params = adv7511_hdmi_hw_params,
  179. .audio_shutdown = audio_shutdown,
  180. .audio_startup = audio_startup,
  181. .get_dai_id = adv7511_hdmi_i2s_get_dai_id,
  182. };
  183. static const struct hdmi_codec_pdata codec_data = {
  184. .ops = &adv7511_codec_ops,
  185. .max_i2s_channels = 2,
  186. .i2s = 1,
  187. };
  188. int adv7511_audio_init(struct device *dev, struct adv7511 *adv7511)
  189. {
  190. adv7511->audio_pdev = platform_device_register_data(dev,
  191. HDMI_CODEC_DRV_NAME,
  192. PLATFORM_DEVID_AUTO,
  193. &codec_data,
  194. sizeof(codec_data));
  195. return PTR_ERR_OR_ZERO(adv7511->audio_pdev);
  196. }
  197. void adv7511_audio_exit(struct adv7511 *adv7511)
  198. {
  199. if (adv7511->audio_pdev) {
  200. platform_device_unregister(adv7511->audio_pdev);
  201. adv7511->audio_pdev = NULL;
  202. }
  203. }