adv7511_audio.c 5.0 KB

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