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 10 #ifndef __SDCA_FDL_H__ 11 #define __SDCA_FDL_H__ 12 13 #include <linux/completion.h> 14 15 struct device; 16 struct regmap; 17 struct sdca_fdl_set; 18 struct sdca_function_data; 19 struct sdca_interrupt; 20 struct sdca_interrupt_info; 21 22 /** 23 * struct fdl_state - FDL state structure to keep data between interrupts 24 * @begin: Completion indicating the start of an FDL download cycle. 25 * @done: Completion indicating the end of an FDL download cycle. 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 33 struct sdca_fdl_set *set; 34 int file_index; 35 }; 36 37 #define SDCA_CTL_XU_FDLH_COMPLETE 0 38 #define SDCA_CTL_XU_FDLH_MORE_FILES SDCA_CTL_XU_FDLH_SET_IN_PROGRESS 39 #define SDCA_CTL_XU_FDLH_FILE_AVAILABLE (SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \ 40 SDCA_CTL_XU_FDLH_SET_IN_PROGRESS) 41 #define SDCA_CTL_XU_FDLH_MASK (SDCA_CTL_XU_FDLH_TRANSFERRED_CHUNK | \ 42 SDCA_CTL_XU_FDLH_TRANSFERRED_FILE | \ 43 SDCA_CTL_XU_FDLH_SET_IN_PROGRESS | \ 44 SDCA_CTL_XU_FDLH_RESET_ACK | \ 45 SDCA_CTL_XU_FDLH_REQ_ABORT) 46 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 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 65 int sdca_reset_function(struct device *dev, struct sdca_function_data *function, 66 struct regmap *regmap); 67 68 #endif // __SDCA_FDL_H__ 69