| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /* SPDX-License-Identifier: GPL-2.0 */
- /*
- * The MIPI SDCA specification is available for public downloads at
- * https://www.mipi.org/mipi-sdca-v1-0-download
- *
- * Copyright (C) 2025 Cirrus Logic, Inc. and
- * Cirrus Logic International Semiconductor Ltd.
- */
- #ifndef __SDCA_FDL_H__
- #define __SDCA_FDL_H__
- #include <linux/completion.h>
- #include <linux/workqueue.h>
- struct device;
- struct regmap;
- struct sdca_fdl_set;
- struct sdca_function_data;
- struct sdca_interrupt;
- struct sdca_interrupt_info;
- /**
- * struct fdl_state - FDL state structure to keep data between interrupts
- * @begin: Completion indicating the start of an FDL download cycle.
- * @done: Completion indicating the end of an FDL download cycle.
- * @timeout: Delayed work used for timing out UMP transactions.
- * @lock: Mutex to protect between the timeout work and IRQ handlers.
- * @interrupt: Pointer to the interrupt struct to which this FDL is attached.
- * @set: Pointer to the FDL set currently being downloaded.
- * @file_index: Index of the current file being processed.
- */
- struct fdl_state {
- struct completion begin;
- struct completion done;
- struct delayed_work timeout;
- struct mutex lock;
- struct sdca_interrupt *interrupt;
- struct sdca_fdl_set *set;
- int file_index;
- };
- #define SDCA_CTL_XU_FDLH_COMPLETE 0
- #define SDCA_CTL_XU_FDLH_MORE_FILES SDCA_CTL_XU_FDLH_SET_IN_PROGRESS
- #define SDCA_CTL_XU_FDLH_FILE_AVAILABLE (SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
- SDCA_CTL_XU_FDLH_SET_IN_PROGRESS)
- #define SDCA_CTL_XU_FDLH_MASK (SDCA_CTL_XU_FDLH_TRANSFERRED_CHUNK | \
- SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
- SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
- SDCA_CTL_XU_FDLH_RESET_ACK | \
- SDCA_CTL_XU_FDLH_REQ_ABORT)
- #define SDCA_CTL_XU_FDLD_COMPLETE 0
- #define SDCA_CTL_XU_FDLD_FILE_OK (SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \
- SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
- SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
- SDCA_CTL_XU_FDLD_NEEDS_SET)
- #define SDCA_CTL_XU_FDLD_MORE_FILES_OK (SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \
- SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
- SDCA_CTL_XU_FDLD_NEEDS_SET)
- #define SDCA_CTL_XU_FDLD_MASK (SDCA_CTL_XU_FDLD_REQ_RESET | \
- SDCA_CTL_XU_FDLD_REQ_ABORT | \
- SDCA_CTL_XU_FDLD_ACK_TRANSFER | \
- SDCA_CTL_XU_FDLD_NEEDS_SET)
- #if IS_ENABLED(CONFIG_SND_SOC_SDCA_FDL)
- int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt);
- int sdca_fdl_process(struct sdca_interrupt *interrupt);
- int sdca_fdl_sync(struct device *dev, struct sdca_function_data *function,
- struct sdca_interrupt_info *info);
- int sdca_reset_function(struct device *dev, struct sdca_function_data *function,
- struct regmap *regmap);
- #else
- static inline int sdca_fdl_alloc_state(struct sdca_interrupt *interrupt)
- {
- return 0;
- }
- static inline int sdca_fdl_process(struct sdca_interrupt *interrupt)
- {
- return 0;
- }
- static inline int sdca_fdl_sync(struct device *dev,
- struct sdca_function_data *function,
- struct sdca_interrupt_info *info)
- {
- return 0;
- }
- static inline int sdca_reset_function(struct device *dev,
- struct sdca_function_data *function,
- struct regmap *regmap)
- {
- return 0;
- }
- #endif // CONFIG_SND_SOC_SDCA_FDL
- #endif // __SDCA_FDL_H__
|