acp-common.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
  2. //
  3. // This file is provided under a dual BSD/GPLv2 license. When using or
  4. // redistributing this file, you may do so under either license.
  5. //
  6. // Copyright(c) 2022 Advanced Micro Devices, Inc.
  7. //
  8. // Authors: Ajit Kumar Pandey <[email protected]>
  9. // V sujith kumar Reddy <[email protected]>
  10. /* ACP-specific Common code */
  11. #include "../sof-priv.h"
  12. #include "../sof-audio.h"
  13. #include "../ops.h"
  14. #include "../sof-audio.h"
  15. #include "acp.h"
  16. #include "acp-dsp-offset.h"
  17. int acp_dai_probe(struct snd_soc_dai *dai)
  18. {
  19. struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(dai->component);
  20. const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
  21. unsigned int val;
  22. val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->i2s_pin_config_offset);
  23. if (val != desc->i2s_mode) {
  24. dev_err(sdev->dev, "I2S Mode is not supported (I2S_PIN_CONFIG: %#x)\n", val);
  25. return -EINVAL;
  26. }
  27. return 0;
  28. }
  29. EXPORT_SYMBOL_NS(acp_dai_probe, SND_SOC_SOF_AMD_COMMON);
  30. struct snd_soc_acpi_mach *amd_sof_machine_select(struct snd_sof_dev *sdev)
  31. {
  32. struct snd_sof_pdata *sof_pdata = sdev->pdata;
  33. const struct sof_dev_desc *desc = sof_pdata->desc;
  34. struct snd_soc_acpi_mach *mach;
  35. mach = snd_soc_acpi_find_machine(desc->machines);
  36. if (!mach) {
  37. dev_warn(sdev->dev, "No matching ASoC machine driver found\n");
  38. return NULL;
  39. }
  40. sof_pdata->tplg_filename = mach->sof_tplg_filename;
  41. sof_pdata->fw_filename = mach->fw_filename;
  42. return mach;
  43. }
  44. /* AMD Common DSP ops */
  45. struct snd_sof_dsp_ops sof_acp_common_ops = {
  46. /* probe and remove */
  47. .probe = amd_sof_acp_probe,
  48. .remove = amd_sof_acp_remove,
  49. /* Register IO */
  50. .write = sof_io_write,
  51. .read = sof_io_read,
  52. /* Block IO */
  53. .block_read = acp_dsp_block_read,
  54. .block_write = acp_dsp_block_write,
  55. /*Firmware loading */
  56. .load_firmware = snd_sof_load_firmware_memcpy,
  57. .pre_fw_run = acp_dsp_pre_fw_run,
  58. .get_bar_index = acp_get_bar_index,
  59. /* DSP core boot */
  60. .run = acp_sof_dsp_run,
  61. /*IPC */
  62. .send_msg = acp_sof_ipc_send_msg,
  63. .ipc_msg_data = acp_sof_ipc_msg_data,
  64. .get_mailbox_offset = acp_sof_ipc_get_mailbox_offset,
  65. .get_window_offset = acp_sof_ipc_get_window_offset,
  66. .irq_thread = acp_sof_ipc_irq_thread,
  67. /* stream callbacks */
  68. .pcm_open = acp_pcm_open,
  69. .pcm_close = acp_pcm_close,
  70. .pcm_hw_params = acp_pcm_hw_params,
  71. .hw_info = SNDRV_PCM_INFO_MMAP |
  72. SNDRV_PCM_INFO_MMAP_VALID |
  73. SNDRV_PCM_INFO_INTERLEAVED |
  74. SNDRV_PCM_INFO_PAUSE |
  75. SNDRV_PCM_INFO_NO_PERIOD_WAKEUP,
  76. /* Machine driver callbacks */
  77. .machine_select = amd_sof_machine_select,
  78. .machine_register = sof_machine_register,
  79. .machine_unregister = sof_machine_unregister,
  80. /* Trace Logger */
  81. .trace_init = acp_sof_trace_init,
  82. .trace_release = acp_sof_trace_release,
  83. /* PM */
  84. .suspend = amd_sof_acp_suspend,
  85. .resume = amd_sof_acp_resume,
  86. };
  87. EXPORT_SYMBOL_NS(sof_acp_common_ops, SND_SOC_SOF_AMD_COMMON);
  88. MODULE_IMPORT_NS(SND_SOC_SOF_AMD_COMMON);
  89. MODULE_DESCRIPTION("ACP SOF COMMON Driver");
  90. MODULE_LICENSE("Dual BSD/GPL");