soc_sdw_rt700.c 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. // This file incorporates work covered by the following copyright notice:
  3. // Copyright (c) 2020 Intel Corporation
  4. // Copyright (c) 2024 Advanced Micro Devices, Inc.
  5. /*
  6. * soc_sdw_rt700 - Helpers to handle RT700 from generic machine driver
  7. */
  8. #include <linux/device.h>
  9. #include <linux/errno.h>
  10. #include <linux/input.h>
  11. #include <sound/control.h>
  12. #include <sound/soc.h>
  13. #include <sound/soc-acpi.h>
  14. #include <sound/soc-dapm.h>
  15. #include <sound/jack.h>
  16. #include <sound/soc_sdw_utils.h>
  17. static const struct snd_soc_dapm_route rt700_map[] = {
  18. /* Headphones */
  19. { "Headphones", NULL, "rt700 HP" },
  20. { "Speaker", NULL, "rt700 SPK" },
  21. { "rt700 MIC2", NULL, "AMIC" },
  22. };
  23. static struct snd_soc_jack_pin rt700_jack_pins[] = {
  24. {
  25. .pin = "Headphones",
  26. .mask = SND_JACK_HEADPHONE,
  27. },
  28. {
  29. .pin = "AMIC",
  30. .mask = SND_JACK_MICROPHONE,
  31. },
  32. };
  33. int asoc_sdw_rt700_rtd_init(struct snd_soc_pcm_runtime *rtd, struct snd_soc_dai *dai)
  34. {
  35. struct snd_soc_card *card = rtd->card;
  36. struct asoc_sdw_mc_private *ctx = snd_soc_card_get_drvdata(card);
  37. struct snd_soc_component *component;
  38. struct snd_soc_jack *jack;
  39. int ret;
  40. component = dai->component;
  41. card->components = devm_kasprintf(card->dev, GFP_KERNEL,
  42. "%s hs:rt700",
  43. card->components);
  44. if (!card->components)
  45. return -ENOMEM;
  46. ret = snd_soc_dapm_add_routes(&card->dapm, rt700_map,
  47. ARRAY_SIZE(rt700_map));
  48. if (ret) {
  49. dev_err(card->dev, "rt700 map addition failed: %d\n", ret);
  50. return ret;
  51. }
  52. ret = snd_soc_card_jack_new_pins(rtd->card, "Headset Jack",
  53. SND_JACK_HEADSET | SND_JACK_BTN_0 |
  54. SND_JACK_BTN_1 | SND_JACK_BTN_2 |
  55. SND_JACK_BTN_3,
  56. &ctx->sdw_headset,
  57. rt700_jack_pins,
  58. ARRAY_SIZE(rt700_jack_pins));
  59. if (ret) {
  60. dev_err(rtd->card->dev, "Headset Jack creation failed: %d\n",
  61. ret);
  62. return ret;
  63. }
  64. jack = &ctx->sdw_headset;
  65. snd_jack_set_key(jack->jack, SND_JACK_BTN_0, KEY_PLAYPAUSE);
  66. snd_jack_set_key(jack->jack, SND_JACK_BTN_1, KEY_VOICECOMMAND);
  67. snd_jack_set_key(jack->jack, SND_JACK_BTN_2, KEY_VOLUMEUP);
  68. snd_jack_set_key(jack->jack, SND_JACK_BTN_3, KEY_VOLUMEDOWN);
  69. ret = snd_soc_component_set_jack(component, jack, NULL);
  70. if (ret)
  71. dev_err(rtd->card->dev, "Headset Jack call-back failed: %d\n",
  72. ret);
  73. return ret;
  74. }
  75. EXPORT_SYMBOL_NS(asoc_sdw_rt700_rtd_init, SND_SOC_SDW_UTILS);