hda.c 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. // SPDX-License-Identifier: MIT
  2. /*
  3. * Copyright (C) 2019 NVIDIA Corporation
  4. */
  5. #include <linux/bug.h>
  6. #include <sound/hda_verbs.h>
  7. #include "hda.h"
  8. void tegra_hda_parse_format(unsigned int format, struct tegra_hda_format *fmt)
  9. {
  10. unsigned int mul, div, bits, channels;
  11. if (format & AC_FMT_TYPE_NON_PCM)
  12. fmt->pcm = false;
  13. else
  14. fmt->pcm = true;
  15. if (format & AC_FMT_BASE_44K)
  16. fmt->sample_rate = 44100;
  17. else
  18. fmt->sample_rate = 48000;
  19. mul = (format & AC_FMT_MULT_MASK) >> AC_FMT_MULT_SHIFT;
  20. div = (format & AC_FMT_DIV_MASK) >> AC_FMT_DIV_SHIFT;
  21. fmt->sample_rate *= (mul + 1) / (div + 1);
  22. switch (format & AC_FMT_BITS_MASK) {
  23. case AC_FMT_BITS_8:
  24. fmt->bits = 8;
  25. break;
  26. case AC_FMT_BITS_16:
  27. fmt->bits = 16;
  28. break;
  29. case AC_FMT_BITS_20:
  30. fmt->bits = 20;
  31. break;
  32. case AC_FMT_BITS_24:
  33. fmt->bits = 24;
  34. break;
  35. case AC_FMT_BITS_32:
  36. fmt->bits = 32;
  37. break;
  38. default:
  39. bits = (format & AC_FMT_BITS_MASK) >> AC_FMT_BITS_SHIFT;
  40. WARN(1, "invalid number of bits: %#x\n", bits);
  41. fmt->bits = 8;
  42. break;
  43. }
  44. channels = (format & AC_FMT_CHAN_MASK) >> AC_FMT_CHAN_SHIFT;
  45. /* channels are encoded as n - 1 */
  46. fmt->channels = channels + 1;
  47. }