q6dsp-common.c 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. // SPDX-License-Identifier: GPL-2.0
  2. // Copyright (c) 2011-2017, The Linux Foundation. All rights reserved.
  3. // Copyright (c) 2018, Linaro Limited
  4. #include "q6dsp-common.h"
  5. #include <linux/kernel.h>
  6. #include <linux/module.h>
  7. #include <linux/string.h>
  8. #include <linux/errno.h>
  9. int q6dsp_map_channels(u8 ch_map[PCM_MAX_NUM_CHANNEL], int ch)
  10. {
  11. memset(ch_map, 0, PCM_MAX_NUM_CHANNEL);
  12. switch (ch) {
  13. case 1:
  14. ch_map[0] = PCM_CHANNEL_FC;
  15. break;
  16. case 2:
  17. ch_map[0] = PCM_CHANNEL_FL;
  18. ch_map[1] = PCM_CHANNEL_FR;
  19. break;
  20. case 3:
  21. ch_map[0] = PCM_CHANNEL_FL;
  22. ch_map[1] = PCM_CHANNEL_FR;
  23. ch_map[2] = PCM_CHANNEL_FC;
  24. break;
  25. case 4:
  26. ch_map[0] = PCM_CHANNEL_FL;
  27. ch_map[1] = PCM_CHANNEL_FR;
  28. ch_map[2] = PCM_CHANNEL_LS;
  29. ch_map[3] = PCM_CHANNEL_RS;
  30. break;
  31. case 5:
  32. ch_map[0] = PCM_CHANNEL_FL;
  33. ch_map[1] = PCM_CHANNEL_FR;
  34. ch_map[2] = PCM_CHANNEL_FC;
  35. ch_map[3] = PCM_CHANNEL_LS;
  36. ch_map[4] = PCM_CHANNEL_RS;
  37. break;
  38. case 6:
  39. ch_map[0] = PCM_CHANNEL_FL;
  40. ch_map[1] = PCM_CHANNEL_FR;
  41. ch_map[2] = PCM_CHANNEL_LFE;
  42. ch_map[3] = PCM_CHANNEL_FC;
  43. ch_map[4] = PCM_CHANNEL_LS;
  44. ch_map[5] = PCM_CHANNEL_RS;
  45. break;
  46. case 8:
  47. ch_map[0] = PCM_CHANNEL_FL;
  48. ch_map[1] = PCM_CHANNEL_FR;
  49. ch_map[2] = PCM_CHANNEL_LFE;
  50. ch_map[3] = PCM_CHANNEL_FC;
  51. ch_map[4] = PCM_CHANNEL_LS;
  52. ch_map[5] = PCM_CHANNEL_RS;
  53. ch_map[6] = PCM_CHANNEL_LB;
  54. ch_map[7] = PCM_CHANNEL_RB;
  55. break;
  56. default:
  57. return -EINVAL;
  58. }
  59. return 0;
  60. }
  61. EXPORT_SYMBOL_GPL(q6dsp_map_channels);
  62. int q6dsp_get_channel_allocation(int channels)
  63. {
  64. int channel_allocation;
  65. /* HDMI spec CEA-861-E: Table 28 Audio InfoFrame Data Byte 4 */
  66. switch (channels) {
  67. case 2:
  68. channel_allocation = 0;
  69. break;
  70. case 3:
  71. channel_allocation = 0x02;
  72. break;
  73. case 4:
  74. channel_allocation = 0x06;
  75. break;
  76. case 5:
  77. channel_allocation = 0x0A;
  78. break;
  79. case 6:
  80. channel_allocation = 0x0B;
  81. break;
  82. case 7:
  83. channel_allocation = 0x12;
  84. break;
  85. case 8:
  86. channel_allocation = 0x13;
  87. break;
  88. default:
  89. return -EINVAL;
  90. }
  91. return channel_allocation;
  92. }
  93. EXPORT_SYMBOL_GPL(q6dsp_get_channel_allocation);
  94. MODULE_DESCRIPTION("ASoC MSM QDSP6 helper functions");
  95. MODULE_LICENSE("GPL v2");