sdca_fdl.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. /*
  3. * The MIPI SDCA specification is available for public downloads at
  4. * https://www.mipi.org/mipi-sdca-v1-0-download
  5. *
  6. * Copyright (C) 2025 Cirrus Logic, Inc. and
  7. * Cirrus Logic International Semiconductor Ltd.
  8. */
  9. #ifndef __SDCA_FDL_H__
  10. #define __SDCA_FDL_H__
  11. #include <linux/completion.h>
  12. #include <linux/workqueue.h>
  13. struct device;
  14. struct regmap;
  15. struct sdca_fdl_set;
  16. struct sdca_function_data;
  17. struct sdca_interrupt;
  18. struct sdca_interrupt_info;
  19. /**
  20. * struct fdl_state - FDL state structure to keep data between interrupts
  21. * @begin: Completion indicating the start of an FDL download cycle.
  22. * @done: Completion indicating the end of an FDL download cycle.
  23. * @timeout: Delayed work used for timing out UMP transactions.
  24. * @lock: Mutex to protect between the timeout work and IRQ handlers.
  25. * @interrupt: Pointer to the interrupt struct to which this FDL is attached.
  26. * @set: Pointer to the FDL set currently being downloaded.
  27. * @file_index: Index of the current file being processed.
  28. */
  29. struct fdl_state {
  30. struct completion begin;
  31. struct completion done;
  32. struct delayed_work timeout;
  33. struct mutex lock;
  34. struct sdca_interrupt *interrupt;
  35. struct sdca_fdl_set *set;
  36. int file_index;
  37. };
  38. #define SDCA_CTL_XU_FDLH_COMPLETE 0
  39. #define SDCA_CTL_XU_FDLH_MORE_FILES SDCA_CTL_XU_FDLH_SET_IN_PROGRESS
  40. #define SDCA_CTL_XU_FDLH_FILE_AVAILABLE (SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
  41. SDCA_CTL_XU_FDLH_SET_IN_PROGRESS)
  42. #define SDCA_CTL_XU_FDLH_MASK (SDCA_CTL_XU_FDLH_TRANSFERRED_CHUNK | \
  43. SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
  44. SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
  45. SDCA_CTL_XU_FDLH_RESET_ACK | \
  46. SDCA_CTL_XU_FDLH_REQ_ABORT)
  47. #define SDCA_CTL_XU_FDLD_COMPLETE 0
  48. #define SDCA_CTL_XU_FDLD_FILE_OK (SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
  49. SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
  50. SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
  51. SDCA_CTL_XU_FDLD_NEEDS_SET)
  52. #define SDCA_CTL_XU_FDLD_MORE_FILES_OK (SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
  53. SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
  54. SDCA_CTL_XU_FDLD_NEEDS_SET)
  55. #define SDCA_CTL_XU_FDLD_MASK (SDCA_CTL_XU_FDLD_REQ_RESET | \
  56. SDCA_CTL_XU_FDLD_REQ_ABORT | \
  57. SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
  58. SDCA_CTL_XU_FDLD_NEEDS_SET)
  59. #if IS_ENABLED(CONFIG_SND_SOC_SDCA_FDL)
  60. int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt);
  61. int sdca_fdl_process(struct sdca_interrupt *interrupt);
  62. int sdca_fdl_sync(struct device *dev, struct sdca_function_data *function,
  63. struct sdca_interrupt_info *info);
  64. int sdca_reset_function(struct device *dev, struct sdca_function_data *function,
  65. struct regmap *regmap);
  66. #else
  67. static inline int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt)
  68. {
  69. return 0;
  70. }
  71. static inline int sdca_fdl_process(struct sdca_interrupt *interrupt)
  72. {
  73. return 0;
  74. }
  75. static inline int sdca_fdl_sync(struct device *dev,
  76. struct sdca_function_data *function,
  77. struct sdca_interrupt_info *info)
  78. {
  79. return 0;
  80. }
  81. static inline int sdca_reset_function(struct device *dev,
  82. struct sdca_function_data *function,
  83. struct regmap *regmap)
  84. {
  85. return 0;
  86. }
  87. #endif // CONFIG_SND_SOC_SDCA_FDL
  88. #endif // __SDCA_FDL_H__