1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */ 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) 2024 Intel Corporation 7 */ 8 9 #ifndef __SDCA_FUNCTION_H__ 10 #define __SDCA_FUNCTION_H__ 11 12 #include <linux/bits.h> 13 #include <linux/types.h> 14 15 struct device; 16 struct sdca_function_desc; 17 18 /* 19 * The addressing space for SDCA relies on 7 bits for Entities, so a 20 * maximum of 128 Entities per function can be represented. 21 */ 22 #define SDCA_MAX_ENTITY_COUNT 128 23 24 /* 25 * Sanity check on number of initialization writes, can be expanded if needed. 26 */ 27 #define SDCA_MAX_INIT_COUNT 2048 28 29 /** 30 * enum sdca_function_type - SDCA Function Type codes 31 * @SDCA_FUNCTION_TYPE_SMART_AMP: Amplifier with protection features. 32 * @SDCA_FUNCTION_TYPE_SIMPLE_AMP: Subset of SmartAmp. 33 * @SDCA_FUNCTION_TYPE_SMART_MIC: Smart microphone with acoustic triggers. 34 * @SDCA_FUNCTION_TYPE_SIMPLE_MIC: Subset of SmartMic. 35 * @SDCA_FUNCTION_TYPE_SPEAKER_MIC: Combination of SmartMic and SmartAmp. 36 * @SDCA_FUNCTION_TYPE_UAJ: 3.5mm Universal Audio jack. 37 * @SDCA_FUNCTION_TYPE_RJ: Retaskable jack. 38 * @SDCA_FUNCTION_TYPE_SIMPLE_JACK: Subset of UAJ. 39 * @SDCA_FUNCTION_TYPE_HID: Human Interface Device, for e.g. buttons. 40 * @SDCA_FUNCTION_TYPE_IMP_DEF: Implementation-defined function. 41 * 42 * SDCA Function Types from SDCA specification v1.0a Section 5.1.2 43 * all Function types not described are reserved. 44 * 45 * Note that SIMPLE_AMP, SIMPLE_MIC and SIMPLE_JACK Function Types 46 * are NOT defined in SDCA 1.0a, but they were defined in earlier 47 * drafts and are planned for 1.1. 48 */ 49 enum sdca_function_type { 50 SDCA_FUNCTION_TYPE_SMART_AMP = 0x01, 51 SDCA_FUNCTION_TYPE_SIMPLE_AMP = 0x02, 52 SDCA_FUNCTION_TYPE_SMART_MIC = 0x03, 53 SDCA_FUNCTION_TYPE_SIMPLE_MIC = 0x04, 54 SDCA_FUNCTION_TYPE_SPEAKER_MIC = 0x05, 55 SDCA_FUNCTION_TYPE_UAJ = 0x06, 56 SDCA_FUNCTION_TYPE_RJ = 0x07, 57 SDCA_FUNCTION_TYPE_SIMPLE_JACK = 0x08, 58 SDCA_FUNCTION_TYPE_HID = 0x0A, 59 SDCA_FUNCTION_TYPE_IMP_DEF = 0x1F, 60 }; 61 62 /* Human-readable names used for kernel logs and Function device registration/bind */ 63 #define SDCA_FUNCTION_TYPE_SMART_AMP_NAME "SmartAmp" 64 #define SDCA_FUNCTION_TYPE_SIMPLE_AMP_NAME "SimpleAmp" 65 #define SDCA_FUNCTION_TYPE_SMART_MIC_NAME "SmartMic" 66 #define SDCA_FUNCTION_TYPE_SIMPLE_MIC_NAME "SimpleMic" 67 #define SDCA_FUNCTION_TYPE_SPEAKER_MIC_NAME "SpeakerMic" 68 #define SDCA_FUNCTION_TYPE_UAJ_NAME "UAJ" 69 #define SDCA_FUNCTION_TYPE_RJ_NAME "RJ" 70 #define SDCA_FUNCTION_TYPE_SIMPLE_NAME "SimpleJack" 71 #define SDCA_FUNCTION_TYPE_HID_NAME "HID" 72 #define SDCA_FUNCTION_TYPE_IMP_DEF_NAME "ImplementationDefined" 73 74 /** 75 * struct sdca_init_write - a single initialization write 76 * @addr: Register address to be written 77 * @val: Single byte value to be written 78 */ 79 struct sdca_init_write { 80 u32 addr; 81 u8 val; 82 }; 83 84 /** 85 * enum sdca_entity0_controls - SDCA Controls for Entity 0 86 * 87 * Control Selectors for Entity 0 from SDCA specification v1.0 Section 88 * 6.7.1.1. 89 */ 90 enum sdca_entity0_controls { 91 SDCA_CTL_ENTITY_0_COMMIT_GROUP_MASK = 0x01, 92 SDCA_CTL_ENTITY_0_FUNCTION_SDCA_VERSION = 0x04, 93 SDCA_CTL_ENTITY_0_FUNCTION_TYPE = 0x05, 94 SDCA_CTL_ENTITY_0_FUNCTION_MANUFACTURER_ID = 0x06, 95 SDCA_CTL_ENTITY_0_FUNCTION_ID = 0x07, 96 SDCA_CTL_ENTITY_0_FUNCTION_VERSION = 0x08, 97 SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_ID = 0x09, 98 SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_VERSION = 0x0A, 99 SDCA_CTL_ENTITY_0_FUNCTION_STATUS = 0x10, 100 SDCA_CTL_ENTITY_0_FUNCTION_ACTION = 0x11, 101 SDCA_CTL_ENTITY_0_MATCHING_GUID = 0x12, 102 SDCA_CTL_ENTITY_0_DEVICE_MANUFACTURER_ID = 0x2C, 103 SDCA_CTL_ENTITY_0_DEVICE_PART_ID = 0x2D, 104 SDCA_CTL_ENTITY_0_DEVICE_VERSION = 0x2E, 105 SDCA_CTL_ENTITY_0_DEVICE_SDCA_VERSION = 0x2F, 106 107 /* Function Status Bits */ 108 SDCA_CTL_ENTITY_0_DEVICE_NEWLY_ATTACHED = BIT(0), 109 SDCA_CTL_ENTITY_0_INTS_DISABLED_ABNORMALLY = BIT(1), 110 SDCA_CTL_ENTITY_0_STREAMING_STOPPED_ABNORMALLY = BIT(2), 111 SDCA_CTL_ENTITY_0_FUNCTION_FAULT = BIT(3), 112 SDCA_CTL_ENTITY_0_UMP_SEQUENCE_FAULT = BIT(4), 113 SDCA_CTL_ENTITY_0_FUNCTION_NEEDS_INITIALIZATION = BIT(5), 114 SDCA_CTL_ENTITY_0_FUNCTION_HAS_BEEN_RESET = BIT(6), 115 SDCA_CTL_ENTITY_0_FUNCTION_BUSY = BIT(7), 116 }; 117 118 /** 119 * enum sdca_entity_type - SDCA Entity Type codes 120 * @SDCA_ENTITY_TYPE_ENTITY_0: Entity 0, not actually from the 121 * specification but useful internally as an Entity structure 122 * is allocated for Entity 0, to hold Entity 0 controls. 123 * @SDCA_ENTITY_TYPE_IT: Input Terminal. 124 * @SDCA_ENTITY_TYPE_OT: Output Terminal. 125 * @SDCA_ENTITY_TYPE_MU: Mixer Unit. 126 * @SDCA_ENTITY_TYPE_SU: Selector Unit. 127 * @SDCA_ENTITY_TYPE_FU: Feature Unit. 128 * @SDCA_ENTITY_TYPE_XU: Extension Unit. 129 * @SDCA_ENTITY_TYPE_CS: Clock Source. 130 * @SDCA_ENTITY_TYPE_CX: Clock selector. 131 * @SDCA_ENTITY_TYPE_PDE: Power-Domain Entity. 132 * @SDCA_ENTITY_TYPE_GE: Group Entity. 133 * @SDCA_ENTITY_TYPE_SPE: Security & Privacy Entity. 134 * @SDCA_ENTITY_TYPE_CRU: Channel Remapping Unit. 135 * @SDCA_ENTITY_TYPE_UDMPU: Up-Down Mixer Processing Unit. 136 * @SDCA_ENTITY_TYPE_MFPU: Multi-Function Processing Unit. 137 * @SDCA_ENTITY_TYPE_SMPU: Smart Microphone Processing Unit. 138 * @SDCA_ENTITY_TYPE_SAPU: Smart Amp Processing Unit. 139 * @SDCA_ENTITY_TYPE_PPU: Posture Processing Unit. 140 * @SDCA_ENTITY_TYPE_TG: Tone Generator. 141 * @SDCA_ENTITY_TYPE_HIDE: Human Interface Device Entity. 142 * 143 * SDCA Entity Types from SDCA specification v1.0 Section 6.1.2 144 * all Entity Types not described are reserved. 145 */ 146 enum sdca_entity_type { 147 SDCA_ENTITY_TYPE_ENTITY_0 = 0x00, 148 SDCA_ENTITY_TYPE_IT = 0x02, 149 SDCA_ENTITY_TYPE_OT = 0x03, 150 SDCA_ENTITY_TYPE_MU = 0x05, 151 SDCA_ENTITY_TYPE_SU = 0x06, 152 SDCA_ENTITY_TYPE_FU = 0x07, 153 SDCA_ENTITY_TYPE_XU = 0x0A, 154 SDCA_ENTITY_TYPE_CS = 0x0B, 155 SDCA_ENTITY_TYPE_CX = 0x0C, 156 SDCA_ENTITY_TYPE_PDE = 0x11, 157 SDCA_ENTITY_TYPE_GE = 0x12, 158 SDCA_ENTITY_TYPE_SPE = 0x13, 159 SDCA_ENTITY_TYPE_CRU = 0x20, 160 SDCA_ENTITY_TYPE_UDMPU = 0x21, 161 SDCA_ENTITY_TYPE_MFPU = 0x22, 162 SDCA_ENTITY_TYPE_SMPU = 0x23, 163 SDCA_ENTITY_TYPE_SAPU = 0x24, 164 SDCA_ENTITY_TYPE_PPU = 0x25, 165 SDCA_ENTITY_TYPE_TG = 0x30, 166 SDCA_ENTITY_TYPE_HIDE = 0x31, 167 }; 168 169 /** 170 * struct sdca_entity - information for one SDCA Entity 171 * @label: String such as "OT 12". 172 * @id: Identifier used for addressing. 173 * @type: Type code for the Entity. 174 * @sources: Dynamically allocated array pointing to each input Entity 175 * connected to this Entity. 176 * @num_sources: Number of sources for the Entity. 177 */ 178 struct sdca_entity { 179 const char *label; 180 int id; 181 enum sdca_entity_type type; 182 183 struct sdca_entity **sources; 184 int num_sources; 185 }; 186 187 /** 188 * struct sdca_function_data - top-level information for one SDCA function 189 * @desc: Pointer to short descriptor from initial parsing. 190 * @init_table: Pointer to a table of initialization writes. 191 * @entities: Dynamically allocated array of Entities. 192 * @num_init_table: Number of initialization writes. 193 * @num_entities: Number of Entities reported in this Function. 194 * @busy_max_delay: Maximum Function busy delay in microseconds, before an 195 * error should be reported. 196 */ 197 struct sdca_function_data { 198 struct sdca_function_desc *desc; 199 200 struct sdca_init_write *init_table; 201 struct sdca_entity *entities; 202 int num_init_table; 203 int num_entities; 204 205 unsigned int busy_max_delay; 206 }; 207 208 int sdca_parse_function(struct device *dev, 209 struct sdca_function_desc *desc, 210 struct sdca_function_data *function); 211 212 #endif 213