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 * define SDCA_CTL_TYPE - create a unique identifier for an SDCA Control 86 * @ent: Entity Type code. 87 * @sel: Control Selector code. 88 * 89 * Sometimes there is a need to identify a type of Control, for example to 90 * determine what name the control should have. SDCA Selectors are reused 91 * across Entity types, as such it is necessary to combine both the Entity 92 * Type and the Control Selector to obtain a unique identifier. 93 */ 94 #define SDCA_CTL_TYPE(ent, sel) ((ent) << 8 | (sel)) 95 96 /** 97 * define SDCA_CTL_TYPE_S - static version of SDCA_CTL_TYPE 98 * @ent: Entity name, for example IT, MFPU, etc. this string can be read 99 * from the last characters of the SDCA_ENTITY_TYPE_* macros. 100 * @sel: Control Selector name, for example MIC_BIAS, MUTE, etc. this 101 * string can be read from the last characters of the SDCA_CTL_*_* 102 * macros. 103 * 104 * Short hand to specific a Control type statically for example: 105 * SDAC_CTL_TYPE_S(IT, MIC_BIAS). 106 */ 107 #define SDCA_CTL_TYPE_S(ent, sel) SDCA_CTL_TYPE(SDCA_ENTITY_TYPE_##ent, \ 108 SDCA_CTL_##ent##_##sel) 109 110 /** 111 * enum sdca_it_controls - SDCA Controls for Input Terminal 112 * 113 * Control Selectors for Input Terminal from SDCA specification v1.0 114 * section 6.2.1.3. 115 */ 116 enum sdca_it_controls { 117 SDCA_CTL_IT_MIC_BIAS = 0x03, 118 SDCA_CTL_IT_USAGE = 0x04, 119 SDCA_CTL_IT_LATENCY = 0x08, 120 SDCA_CTL_IT_CLUSTERINDEX = 0x10, 121 SDCA_CTL_IT_DATAPORT_SELECTOR = 0x11, 122 SDCA_CTL_IT_MATCHING_GUID = 0x12, 123 SDCA_CTL_IT_KEEP_ALIVE = 0x13, 124 SDCA_CTL_IT_NDAI_STREAM = 0x14, 125 SDCA_CTL_IT_NDAI_CATEGORY = 0x15, 126 SDCA_CTL_IT_NDAI_CODINGTYPE = 0x16, 127 SDCA_CTL_IT_NDAI_PACKETTYPE = 0x17, 128 }; 129 130 /** 131 * enum sdca_ot_controls - SDCA Controls for Output Terminal 132 * 133 * Control Selectors for Output Terminal from SDCA specification v1.0 134 * section 6.2.2.3. 135 */ 136 enum sdca_ot_controls { 137 SDCA_CTL_OT_USAGE = 0x04, 138 SDCA_CTL_OT_LATENCY = 0x08, 139 SDCA_CTL_OT_DATAPORT_SELECTOR = 0x11, 140 SDCA_CTL_OT_MATCHING_GUID = 0x12, 141 SDCA_CTL_OT_KEEP_ALIVE = 0x13, 142 SDCA_CTL_OT_NDAI_STREAM = 0x14, 143 SDCA_CTL_OT_NDAI_CATEGORY = 0x15, 144 SDCA_CTL_OT_NDAI_CODINGTYPE = 0x16, 145 SDCA_CTL_OT_NDAI_PACKETTYPE = 0x17, 146 }; 147 148 /** 149 * enum sdca_mu_controls - SDCA Controls for Mixer Unit 150 * 151 * Control Selectors for Mixer Unit from SDCA specification v1.0 152 * section 6.3.4.2. 153 */ 154 enum sdca_mu_controls { 155 SDCA_CTL_MU_MIXER = 0x01, 156 SDCA_CTL_MU_LATENCY = 0x06, 157 }; 158 159 /** 160 * enum sdca_su_controls - SDCA Controls for Selector Unit 161 * 162 * Control Selectors for Selector Unit from SDCA specification v1.0 163 * section 6.3.8.3. 164 */ 165 enum sdca_su_controls { 166 SDCA_CTL_SU_SELECTOR = 0x01, 167 SDCA_CTL_SU_LATENCY = 0x02, 168 }; 169 170 /** 171 * enum sdca_fu_controls - SDCA Controls for Feature Unit 172 * 173 * Control Selectors for Feature Unit from SDCA specification v1.0 174 * section 6.3.2.3. 175 */ 176 enum sdca_fu_controls { 177 SDCA_CTL_FU_MUTE = 0x01, 178 SDCA_CTL_FU_CHANNEL_VOLUME = 0x02, 179 SDCA_CTL_FU_AGC = 0x07, 180 SDCA_CTL_FU_BASS_BOOST = 0x09, 181 SDCA_CTL_FU_LOUDNESS = 0x0A, 182 SDCA_CTL_FU_GAIN = 0x0B, 183 SDCA_CTL_FU_LATENCY = 0x10, 184 }; 185 186 /** 187 * enum sdca_xu_controls - SDCA Controls for Extension Unit 188 * 189 * Control Selectors for Extension Unit from SDCA specification v1.0 190 * section 6.3.10.3. 191 */ 192 enum sdca_xu_controls { 193 SDCA_CTL_XU_BYPASS = 0x01, 194 SDCA_CTL_XU_LATENCY = 0x06, 195 SDCA_CTL_XU_XU_ID = 0x07, 196 SDCA_CTL_XU_XU_VERSION = 0x08, 197 SDCA_CTL_XU_FDL_CURRENTOWNER = 0x10, 198 SDCA_CTL_XU_FDL_MESSAGEOFFSET = 0x12, 199 SDCA_CTL_XU_FDL_MESSAGELENGTH = 0x13, 200 SDCA_CTL_XU_FDL_STATUS = 0x14, 201 SDCA_CTL_XU_FDL_SET_INDEX = 0x15, 202 SDCA_CTL_XU_FDL_HOST_REQUEST = 0x16, 203 }; 204 205 /** 206 * enum sdca_cs_controls - SDCA Controls for Clock Source 207 * 208 * Control Selectors for Clock Source from SDCA specification v1.0 209 * section 6.4.1.3. 210 */ 211 enum sdca_cs_controls { 212 SDCA_CTL_CS_CLOCK_VALID = 0x02, 213 SDCA_CTL_CS_SAMPLERATEINDEX = 0x10, 214 }; 215 216 /** 217 * enum sdca_cx_controls - SDCA Controls for Clock Selector 218 * 219 * Control Selectors for Clock Selector from SDCA specification v1.0 220 * section 6.4.2.3. 221 */ 222 enum sdca_cx_controls { 223 SDCA_CTL_CX_CLOCK_SELECT = 0x01, 224 }; 225 226 /** 227 * enum sdca_pde_controls - SDCA Controls for Power Domain Entity 228 * 229 * Control Selectors for Power Domain Entity from SDCA specification 230 * v1.0 section 6.5.2.2. 231 */ 232 enum sdca_pde_controls { 233 SDCA_CTL_PDE_REQUESTED_PS = 0x01, 234 SDCA_CTL_PDE_ACTUAL_PS = 0x10, 235 }; 236 237 /** 238 * enum sdca_ge_controls - SDCA Controls for Group Unit 239 * 240 * Control Selectors for Group Unit from SDCA specification v1.0 241 * section 6.5.1.4. 242 */ 243 enum sdca_ge_controls { 244 SDCA_CTL_GE_SELECTED_MODE = 0x01, 245 SDCA_CTL_GE_DETECTED_MODE = 0x02, 246 }; 247 248 /** 249 * enum sdca_spe_controls - SDCA Controls for Security & Privacy Unit 250 * 251 * Control Selectors for Security & Privacy Unit from SDCA 252 * specification v1.0 Section 6.5.3.2. 253 */ 254 enum sdca_spe_controls { 255 SDCA_CTL_SPE_PRIVATE = 0x01, 256 SDCA_CTL_SPE_PRIVACY_POLICY = 0x02, 257 SDCA_CTL_SPE_PRIVACY_LOCKSTATE = 0x03, 258 SDCA_CTL_SPE_PRIVACY_OWNER = 0x04, 259 SDCA_CTL_SPE_AUTHTX_CURRENTOWNER = 0x10, 260 SDCA_CTL_SPE_AUTHTX_MESSAGEOFFSET = 0x12, 261 SDCA_CTL_SPE_AUTHTX_MESSAGELENGTH = 0x13, 262 SDCA_CTL_SPE_AUTHRX_CURRENTOWNER = 0x14, 263 SDCA_CTL_SPE_AUTHRX_MESSAGEOFFSET = 0x16, 264 SDCA_CTL_SPE_AUTHRX_MESSAGELENGTH = 0x17, 265 }; 266 267 /** 268 * enum sdca_cru_controls - SDCA Controls for Channel Remapping Unit 269 * 270 * Control Selectors for Channel Remapping Unit from SDCA 271 * specification v1.0 Section 6.3.1.3. 272 */ 273 enum sdca_cru_controls { 274 SDCA_CTL_CRU_LATENCY = 0x06, 275 SDCA_CTL_CRU_CLUSTERINDEX = 0x10, 276 }; 277 278 /** 279 * enum sdca_udmpu_controls - SDCA Controls for Up-Down Mixer Processing Unit 280 * 281 * Control Selectors for Up-Down Mixer Processing Unit from SDCA 282 * specification v1.0 Section 6.3.9.3. 283 */ 284 enum sdca_udmpu_controls { 285 SDCA_CTL_UDMPU_LATENCY = 0x06, 286 SDCA_CTL_UDMPU_CLUSTERINDEX = 0x10, 287 SDCA_CTL_UDMPU_ACOUSTIC_ENERGY_LEVEL_MONITOR = 0x11, 288 SDCA_CTL_UDMPU_ULTRASOUND_LOOP_GAIN = 0x12, 289 SDCA_CTL_UDMPU_OPAQUESET_0 = 0x18, 290 SDCA_CTL_UDMPU_OPAQUESET_1 = 0x19, 291 SDCA_CTL_UDMPU_OPAQUESET_2 = 0x1A, 292 SDCA_CTL_UDMPU_OPAQUESET_3 = 0x1B, 293 SDCA_CTL_UDMPU_OPAQUESET_4 = 0x1C, 294 SDCA_CTL_UDMPU_OPAQUESET_5 = 0x1D, 295 SDCA_CTL_UDMPU_OPAQUESET_6 = 0x1E, 296 SDCA_CTL_UDMPU_OPAQUESET_7 = 0x1F, 297 SDCA_CTL_UDMPU_OPAQUESET_8 = 0x20, 298 SDCA_CTL_UDMPU_OPAQUESET_9 = 0x21, 299 SDCA_CTL_UDMPU_OPAQUESET_10 = 0x22, 300 SDCA_CTL_UDMPU_OPAQUESET_11 = 0x23, 301 SDCA_CTL_UDMPU_OPAQUESET_12 = 0x24, 302 SDCA_CTL_UDMPU_OPAQUESET_13 = 0x25, 303 SDCA_CTL_UDMPU_OPAQUESET_14 = 0x26, 304 SDCA_CTL_UDMPU_OPAQUESET_15 = 0x27, 305 SDCA_CTL_UDMPU_OPAQUESET_16 = 0x28, 306 SDCA_CTL_UDMPU_OPAQUESET_17 = 0x29, 307 SDCA_CTL_UDMPU_OPAQUESET_18 = 0x2A, 308 SDCA_CTL_UDMPU_OPAQUESET_19 = 0x2B, 309 SDCA_CTL_UDMPU_OPAQUESET_20 = 0x2C, 310 SDCA_CTL_UDMPU_OPAQUESET_21 = 0x2D, 311 SDCA_CTL_UDMPU_OPAQUESET_22 = 0x2E, 312 SDCA_CTL_UDMPU_OPAQUESET_23 = 0x2F, 313 }; 314 315 /** 316 * enum sdca_mfpu_controls - SDCA Controls for Multi-Function Processing Unit 317 * 318 * Control Selectors for Multi-Function Processing Unit from SDCA 319 * specification v1.0 Section 6.3.3.4. 320 */ 321 enum sdca_mfpu_controls { 322 SDCA_CTL_MFPU_BYPASS = 0x01, 323 SDCA_CTL_MFPU_ALGORITHM_READY = 0x04, 324 SDCA_CTL_MFPU_ALGORITHM_ENABLE = 0x05, 325 SDCA_CTL_MFPU_LATENCY = 0x08, 326 SDCA_CTL_MFPU_ALGORITHM_PREPARE = 0x09, 327 SDCA_CTL_MFPU_CLUSTERINDEX = 0x10, 328 SDCA_CTL_MFPU_CENTER_FREQUENCY_INDEX = 0x11, 329 SDCA_CTL_MFPU_ULTRASOUND_LEVEL = 0x12, 330 SDCA_CTL_MFPU_AE_NUMBER = 0x13, 331 SDCA_CTL_MFPU_AE_CURRENTOWNER = 0x14, 332 SDCA_CTL_MFPU_AE_MESSAGEOFFSET = 0x16, 333 SDCA_CTL_MFPU_AE_MESSAGELENGTH = 0x17, 334 }; 335 336 /** 337 * enum sdca_smpu_controls - SDCA Controls for Smart Mic Processing Unit 338 * 339 * Control Selectors for Smart Mic Processing Unit from SDCA 340 * specification v1.0 Section 6.3.7.3. 341 */ 342 enum sdca_smpu_controls { 343 SDCA_CTL_SMPU_LATENCY = 0x06, 344 SDCA_CTL_SMPU_TRIGGER_ENABLE = 0x10, 345 SDCA_CTL_SMPU_TRIGGER_STATUS = 0x11, 346 SDCA_CTL_SMPU_HIST_BUFFER_MODE = 0x12, 347 SDCA_CTL_SMPU_HIST_BUFFER_PREAMBLE = 0x13, 348 SDCA_CTL_SMPU_HIST_ERROR = 0x14, 349 SDCA_CTL_SMPU_TRIGGER_EXTENSION = 0x15, 350 SDCA_CTL_SMPU_TRIGGER_READY = 0x16, 351 SDCA_CTL_SMPU_HIST_CURRENTOWNER = 0x18, 352 SDCA_CTL_SMPU_HIST_MESSAGEOFFSET = 0x1A, 353 SDCA_CTL_SMPU_HIST_MESSAGELENGTH = 0x1B, 354 SDCA_CTL_SMPU_DTODTX_CURRENTOWNER = 0x1C, 355 SDCA_CTL_SMPU_DTODTX_MESSAGEOFFSET = 0x1E, 356 SDCA_CTL_SMPU_DTODTX_MESSAGELENGTH = 0x1F, 357 SDCA_CTL_SMPU_DTODRX_CURRENTOWNER = 0x20, 358 SDCA_CTL_SMPU_DTODRX_MESSAGEOFFSET = 0x22, 359 SDCA_CTL_SMPU_DTODRX_MESSAGELENGTH = 0x23, 360 }; 361 362 /** 363 * enum sdca_sapu_controls - SDCA Controls for Smart Amp Processing Unit 364 * 365 * Control Selectors for Smart Amp Processing Unit from SDCA 366 * specification v1.0 Section 6.3.6.3. 367 */ 368 enum sdca_sapu_controls { 369 SDCA_CTL_SAPU_LATENCY = 0x05, 370 SDCA_CTL_SAPU_PROTECTION_MODE = 0x10, 371 SDCA_CTL_SAPU_PROTECTION_STATUS = 0x11, 372 SDCA_CTL_SAPU_OPAQUESETREQ_INDEX = 0x12, 373 SDCA_CTL_SAPU_DTODTX_CURRENTOWNER = 0x14, 374 SDCA_CTL_SAPU_DTODTX_MESSAGEOFFSET = 0x16, 375 SDCA_CTL_SAPU_DTODTX_MESSAGELENGTH = 0x17, 376 SDCA_CTL_SAPU_DTODRX_CURRENTOWNER = 0x18, 377 SDCA_CTL_SAPU_DTODRX_MESSAGEOFFSET = 0x1A, 378 SDCA_CTL_SAPU_DTODRX_MESSAGELENGTH = 0x1B, 379 }; 380 381 /** 382 * enum sdca_ppu_controls - SDCA Controls for Post Processing Unit 383 * 384 * Control Selectors for Post Processing Unit from SDCA specification 385 * v1.0 Section 6.3.5.3. 386 */ 387 enum sdca_ppu_controls { 388 SDCA_CTL_PPU_LATENCY = 0x06, 389 SDCA_CTL_PPU_POSTURENUMBER = 0x10, 390 SDCA_CTL_PPU_POSTUREEXTENSION = 0x11, 391 SDCA_CTL_PPU_HORIZONTALBALANCE = 0x12, 392 SDCA_CTL_PPU_VERTICALBALANCE = 0x13, 393 }; 394 395 /** 396 * enum sdca_tg_controls - SDCA Controls for Tone Generator Entity 397 * 398 * Control Selectors for Tone Generator from SDCA specification v1.0 399 * Section 6.5.4.4. 400 */ 401 enum sdca_tg_controls { 402 SDCA_CTL_TG_TONE_DIVIDER = 0x10, 403 }; 404 405 /** 406 * enum sdca_hide_controls - SDCA Controls for HIDE Entity 407 * 408 * Control Selectors for HIDE from SDCA specification v1.0 Section 409 * 6.6.1.2. 410 */ 411 enum sdca_hide_controls { 412 SDCA_CTL_HIDE_HIDTX_CURRENTOWNER = 0x10, 413 SDCA_CTL_HIDE_HIDTX_MESSAGEOFFSET = 0x12, 414 SDCA_CTL_HIDE_HIDTX_MESSAGELENGTH = 0x13, 415 SDCA_CTL_HIDE_HIDRX_CURRENTOWNER = 0x14, 416 SDCA_CTL_HIDE_HIDRX_MESSAGEOFFSET = 0x16, 417 SDCA_CTL_HIDE_HIDRX_MESSAGELENGTH = 0x17, 418 }; 419 420 /** 421 * enum sdca_entity0_controls - SDCA Controls for Entity 0 422 * 423 * Control Selectors for Entity 0 from SDCA specification v1.0 Section 424 * 6.7.1.1. 425 */ 426 enum sdca_entity0_controls { 427 SDCA_CTL_ENTITY_0_COMMIT_GROUP_MASK = 0x01, 428 SDCA_CTL_ENTITY_0_FUNCTION_SDCA_VERSION = 0x04, 429 SDCA_CTL_ENTITY_0_FUNCTION_TYPE = 0x05, 430 SDCA_CTL_ENTITY_0_FUNCTION_MANUFACTURER_ID = 0x06, 431 SDCA_CTL_ENTITY_0_FUNCTION_ID = 0x07, 432 SDCA_CTL_ENTITY_0_FUNCTION_VERSION = 0x08, 433 SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_ID = 0x09, 434 SDCA_CTL_ENTITY_0_FUNCTION_EXTENSION_VERSION = 0x0A, 435 SDCA_CTL_ENTITY_0_FUNCTION_STATUS = 0x10, 436 SDCA_CTL_ENTITY_0_FUNCTION_ACTION = 0x11, 437 SDCA_CTL_ENTITY_0_MATCHING_GUID = 0x12, 438 SDCA_CTL_ENTITY_0_DEVICE_MANUFACTURER_ID = 0x2C, 439 SDCA_CTL_ENTITY_0_DEVICE_PART_ID = 0x2D, 440 SDCA_CTL_ENTITY_0_DEVICE_VERSION = 0x2E, 441 SDCA_CTL_ENTITY_0_DEVICE_SDCA_VERSION = 0x2F, 442 443 /* Function Status Bits */ 444 SDCA_CTL_ENTITY_0_DEVICE_NEWLY_ATTACHED = BIT(0), 445 SDCA_CTL_ENTITY_0_INTS_DISABLED_ABNORMALLY = BIT(1), 446 SDCA_CTL_ENTITY_0_STREAMING_STOPPED_ABNORMALLY = BIT(2), 447 SDCA_CTL_ENTITY_0_FUNCTION_FAULT = BIT(3), 448 SDCA_CTL_ENTITY_0_UMP_SEQUENCE_FAULT = BIT(4), 449 SDCA_CTL_ENTITY_0_FUNCTION_NEEDS_INITIALIZATION = BIT(5), 450 SDCA_CTL_ENTITY_0_FUNCTION_HAS_BEEN_RESET = BIT(6), 451 SDCA_CTL_ENTITY_0_FUNCTION_BUSY = BIT(7), 452 }; 453 454 #define SDCA_CTL_MIC_BIAS_NAME "Mic Bias" 455 #define SDCA_CTL_USAGE_NAME "Usage" 456 #define SDCA_CTL_LATENCY_NAME "Latency" 457 #define SDCA_CTL_CLUSTERINDEX_NAME "Cluster Index" 458 #define SDCA_CTL_DATAPORT_SELECTOR_NAME "Dataport Selector" 459 #define SDCA_CTL_MATCHING_GUID_NAME "Matching GUID" 460 #define SDCA_CTL_KEEP_ALIVE_NAME "Keep Alive" 461 #define SDCA_CTL_NDAI_STREAM_NAME "NDAI Stream" 462 #define SDCA_CTL_NDAI_CATEGORY_NAME "NDAI Category" 463 #define SDCA_CTL_NDAI_CODINGTYPE_NAME "NDAI Coding Type" 464 #define SDCA_CTL_NDAI_PACKETTYPE_NAME "NDAI Packet Type" 465 #define SDCA_CTL_MIXER_NAME "Mixer" 466 #define SDCA_CTL_SELECTOR_NAME "Selector" 467 #define SDCA_CTL_MUTE_NAME "Mute" 468 #define SDCA_CTL_CHANNEL_VOLUME_NAME "Channel Volume" 469 #define SDCA_CTL_AGC_NAME "AGC" 470 #define SDCA_CTL_BASS_BOOST_NAME "Bass Boost" 471 #define SDCA_CTL_LOUDNESS_NAME "Loudness" 472 #define SDCA_CTL_GAIN_NAME "Gain" 473 #define SDCA_CTL_BYPASS_NAME "Bypass" 474 #define SDCA_CTL_XU_ID_NAME "XU ID" 475 #define SDCA_CTL_XU_VERSION_NAME "XU Version" 476 #define SDCA_CTL_FDL_CURRENTOWNER_NAME "FDL Current Owner" 477 #define SDCA_CTL_FDL_MESSAGEOFFSET_NAME "FDL Message Offset" 478 #define SDCA_CTL_FDL_MESSAGELENGTH_NAME "FDL Message Length" 479 #define SDCA_CTL_FDL_STATUS_NAME "FDL Status" 480 #define SDCA_CTL_FDL_SET_INDEX_NAME "FDL Set Index" 481 #define SDCA_CTL_FDL_HOST_REQUEST_NAME "FDL Host Request" 482 #define SDCA_CTL_CLOCK_VALID_NAME "Clock Valid" 483 #define SDCA_CTL_SAMPLERATEINDEX_NAME "Sample Rate Index" 484 #define SDCA_CTL_CLOCK_SELECT_NAME "Clock Select" 485 #define SDCA_CTL_REQUESTED_PS_NAME "Requested PS" 486 #define SDCA_CTL_ACTUAL_PS_NAME "Actual PS" 487 #define SDCA_CTL_SELECTED_MODE_NAME "Selected Mode" 488 #define SDCA_CTL_DETECTED_MODE_NAME "Detected Mode" 489 #define SDCA_CTL_PRIVATE_NAME "Private" 490 #define SDCA_CTL_PRIVACY_POLICY_NAME "Privacy Policy" 491 #define SDCA_CTL_PRIVACY_LOCKSTATE_NAME "Privacy Lockstate" 492 #define SDCA_CTL_PRIVACY_OWNER_NAME "Privacy Owner" 493 #define SDCA_CTL_AUTHTX_CURRENTOWNER_NAME "AuthTX Current Owner" 494 #define SDCA_CTL_AUTHTX_MESSAGEOFFSET_NAME "AuthTX Message Offset" 495 #define SDCA_CTL_AUTHTX_MESSAGELENGTH_NAME "AuthTX Message Length" 496 #define SDCA_CTL_AUTHRX_CURRENTOWNER_NAME "AuthRX Current Owner" 497 #define SDCA_CTL_AUTHRX_MESSAGEOFFSET_NAME "AuthRX Message Offset" 498 #define SDCA_CTL_AUTHRX_MESSAGELENGTH_NAME "AuthRX Message Length" 499 #define SDCA_CTL_ACOUSTIC_ENERGY_LEVEL_MONITOR_NAME "Acoustic Energy Level Monitor" 500 #define SDCA_CTL_ULTRASOUND_LOOP_GAIN_NAME "Ultrasound Loop Gain" 501 #define SDCA_CTL_OPAQUESET_0_NAME "Opaqueset 0" 502 #define SDCA_CTL_OPAQUESET_1_NAME "Opaqueset 1" 503 #define SDCA_CTL_OPAQUESET_2_NAME "Opaqueset 2" 504 #define SDCA_CTL_OPAQUESET_3_NAME "Opaqueset 3" 505 #define SDCA_CTL_OPAQUESET_4_NAME "Opaqueset 4" 506 #define SDCA_CTL_OPAQUESET_5_NAME "Opaqueset 5" 507 #define SDCA_CTL_OPAQUESET_6_NAME "Opaqueset 6" 508 #define SDCA_CTL_OPAQUESET_7_NAME "Opaqueset 7" 509 #define SDCA_CTL_OPAQUESET_8_NAME "Opaqueset 8" 510 #define SDCA_CTL_OPAQUESET_9_NAME "Opaqueset 9" 511 #define SDCA_CTL_OPAQUESET_10_NAME "Opaqueset 10" 512 #define SDCA_CTL_OPAQUESET_11_NAME "Opaqueset 11" 513 #define SDCA_CTL_OPAQUESET_12_NAME "Opaqueset 12" 514 #define SDCA_CTL_OPAQUESET_13_NAME "Opaqueset 13" 515 #define SDCA_CTL_OPAQUESET_14_NAME "Opaqueset 14" 516 #define SDCA_CTL_OPAQUESET_15_NAME "Opaqueset 15" 517 #define SDCA_CTL_OPAQUESET_16_NAME "Opaqueset 16" 518 #define SDCA_CTL_OPAQUESET_17_NAME "Opaqueset 17" 519 #define SDCA_CTL_OPAQUESET_18_NAME "Opaqueset 18" 520 #define SDCA_CTL_OPAQUESET_19_NAME "Opaqueset 19" 521 #define SDCA_CTL_OPAQUESET_20_NAME "Opaqueset 20" 522 #define SDCA_CTL_OPAQUESET_21_NAME "Opaqueset 21" 523 #define SDCA_CTL_OPAQUESET_22_NAME "Opaqueset 22" 524 #define SDCA_CTL_OPAQUESET_23_NAME "Opaqueset 23" 525 #define SDCA_CTL_ALGORITHM_READY_NAME "Algorithm Ready" 526 #define SDCA_CTL_ALGORITHM_ENABLE_NAME "Algorithm Enable" 527 #define SDCA_CTL_ALGORITHM_PREPARE_NAME "Algorithm Prepare" 528 #define SDCA_CTL_CENTER_FREQUENCY_INDEX_NAME "Center Frequency Index" 529 #define SDCA_CTL_ULTRASOUND_LEVEL_NAME "Ultrasound Level" 530 #define SDCA_CTL_AE_NUMBER_NAME "AE Number" 531 #define SDCA_CTL_AE_CURRENTOWNER_NAME "AE Current Owner" 532 #define SDCA_CTL_AE_MESSAGEOFFSET_NAME "AE Message Offset" 533 #define SDCA_CTL_AE_MESSAGELENGTH_NAME "AE Message Length" 534 #define SDCA_CTL_TRIGGER_ENABLE_NAME "Trigger Enable" 535 #define SDCA_CTL_TRIGGER_STATUS_NAME "Trigger Status" 536 #define SDCA_CTL_HIST_BUFFER_MODE_NAME "Hist Buffer Mode" 537 #define SDCA_CTL_HIST_BUFFER_PREAMBLE_NAME "Hist Buffer Preamble" 538 #define SDCA_CTL_HIST_ERROR_NAME "Hist Error" 539 #define SDCA_CTL_TRIGGER_EXTENSION_NAME "Trigger Extension" 540 #define SDCA_CTL_TRIGGER_READY_NAME "Trigger Ready" 541 #define SDCA_CTL_HIST_CURRENTOWNER_NAME "Hist Current Owner" 542 #define SDCA_CTL_HIST_MESSAGEOFFSET_NAME "Hist Message Offset" 543 #define SDCA_CTL_HIST_MESSAGELENGTH_NAME "Hist Message Length" 544 #define SDCA_CTL_DTODTX_CURRENTOWNER_NAME "DTODTX Current Owner" 545 #define SDCA_CTL_DTODTX_MESSAGEOFFSET_NAME "DTODTX Message Offset" 546 #define SDCA_CTL_DTODTX_MESSAGELENGTH_NAME "DTODTX Message Length" 547 #define SDCA_CTL_DTODRX_CURRENTOWNER_NAME "DTODRX Current Owner" 548 #define SDCA_CTL_DTODRX_MESSAGEOFFSET_NAME "DTODRX Message Offset" 549 #define SDCA_CTL_DTODRX_MESSAGELENGTH_NAME "DTODRX Message Length" 550 #define SDCA_CTL_PROTECTION_MODE_NAME "Protection Mode" 551 #define SDCA_CTL_PROTECTION_STATUS_NAME "Protection Status" 552 #define SDCA_CTL_OPAQUESETREQ_INDEX_NAME "Opaqueset Req Index" 553 #define SDCA_CTL_DTODTX_CURRENTOWNER_NAME "DTODTX Current Owner" 554 #define SDCA_CTL_DTODTX_MESSAGEOFFSET_NAME "DTODTX Message Offset" 555 #define SDCA_CTL_DTODTX_MESSAGELENGTH_NAME "DTODTX Message Length" 556 #define SDCA_CTL_DTODRX_CURRENTOWNER_NAME "DTODRX Current Owner" 557 #define SDCA_CTL_DTODRX_MESSAGEOFFSET_NAME "DTODRX Message Offset" 558 #define SDCA_CTL_DTODRX_MESSAGELENGTH_NAME "DTODRX Message Length" 559 #define SDCA_CTL_POSTURENUMBER_NAME "Posture Number" 560 #define SDCA_CTL_POSTUREEXTENSION_NAME "Posture Extension" 561 #define SDCA_CTL_HORIZONTALBALANCE_NAME "Horizontal Balance" 562 #define SDCA_CTL_VERTICALBALANCE_NAME "Vertical Balance" 563 #define SDCA_CTL_TONE_DIVIDER_NAME "Tone Divider" 564 #define SDCA_CTL_HIDTX_CURRENTOWNER_NAME "HIDTX Current Owner" 565 #define SDCA_CTL_HIDTX_MESSAGEOFFSET_NAME "HIDTX Message Offset" 566 #define SDCA_CTL_HIDTX_MESSAGELENGTH_NAME "HIDTX Message Length" 567 #define SDCA_CTL_HIDRX_CURRENTOWNER_NAME "HIDRX Current Owner" 568 #define SDCA_CTL_HIDRX_MESSAGEOFFSET_NAME "HIDRX Message Offset" 569 #define SDCA_CTL_HIDRX_MESSAGELENGTH_NAME "HIDRX Message Length" 570 #define SDCA_CTL_COMMIT_GROUP_MASK_NAME "Commit Group Mask" 571 #define SDCA_CTL_FUNCTION_SDCA_VERSION_NAME "Function SDCA Version" 572 #define SDCA_CTL_FUNCTION_TYPE_NAME "Function Type" 573 #define SDCA_CTL_FUNCTION_MANUFACTURER_ID_NAME "Function Manufacturer ID" 574 #define SDCA_CTL_FUNCTION_ID_NAME "Function ID" 575 #define SDCA_CTL_FUNCTION_VERSION_NAME "Function Version" 576 #define SDCA_CTL_FUNCTION_EXTENSION_ID_NAME "Function Extension ID" 577 #define SDCA_CTL_FUNCTION_EXTENSION_VERSION_NAME "Function Extension Version" 578 #define SDCA_CTL_FUNCTION_STATUS_NAME "Function Status" 579 #define SDCA_CTL_FUNCTION_ACTION_NAME "Function Action" 580 #define SDCA_CTL_DEVICE_MANUFACTURER_ID_NAME "Device Manufacturer ID" 581 #define SDCA_CTL_DEVICE_PART_ID_NAME "Device Part ID" 582 #define SDCA_CTL_DEVICE_VERSION_NAME "Device Version" 583 #define SDCA_CTL_DEVICE_SDCA_VERSION_NAME "Device SDCA Version" 584 585 /** 586 * enum sdca_access_mode - SDCA Control access mode 587 * 588 * Access modes as described in the SDCA specification v1.0 section 589 * 7.1.8.2. 590 */ 591 enum sdca_access_mode { 592 SDCA_ACCESS_MODE_RW = 0x0, 593 SDCA_ACCESS_MODE_DUAL = 0x1, 594 SDCA_ACCESS_MODE_RW1C = 0x2, 595 SDCA_ACCESS_MODE_RO = 0x3, 596 SDCA_ACCESS_MODE_RW1S = 0x4, 597 SDCA_ACCESS_MODE_DC = 0x5, 598 }; 599 600 /** 601 * enum sdca_access_layer - SDCA Control access layer 602 * 603 * Access layers as described in the SDCA specification v1.0 section 604 * 7.1.9. 605 */ 606 enum sdca_access_layer { 607 SDCA_ACCESS_LAYER_USER = 1 << 0, 608 SDCA_ACCESS_LAYER_APPLICATION = 1 << 1, 609 SDCA_ACCESS_LAYER_CLASS = 1 << 2, 610 SDCA_ACCESS_LAYER_PLATFORM = 1 << 3, 611 SDCA_ACCESS_LAYER_DEVICE = 1 << 4, 612 SDCA_ACCESS_LAYER_EXTENSION = 1 << 5, 613 }; 614 615 /** 616 * struct sdca_control_range - SDCA Control range table 617 * @cols: Number of columns in the range table. 618 * @rows: Number of rows in the range table. 619 * @data: Array of values contained in the range table. 620 */ 621 struct sdca_control_range { 622 unsigned int cols; 623 unsigned int rows; 624 u32 *data; 625 }; 626 627 /** 628 * struct sdca_control - information for one SDCA Control 629 * @label: Name for the Control, from SDCA Specification v1.0, section 7.1.7. 630 * @sel: Identifier used for addressing. 631 * @value: Holds the Control value for constants and defaults. 632 * @nbits: Number of bits used in the Control. 633 * @interrupt_position: SCDA interrupt line that will alert to changes on this 634 * Control. 635 * @cn_list: A bitmask showing the valid Control Numbers within this Control, 636 * Control Numbers typically represent channels. 637 * @range: Buffer describing valid range of values for the Control. 638 * @mode: Access mode of the Control. 639 * @layers: Bitmask of access layers of the Control. 640 * @deferrable: Indicates if the access to the Control can be deferred. 641 * @has_default: Indicates the Control has a default value to be written. 642 * @has_fixed: Indicates the Control only supports a single value. 643 */ 644 struct sdca_control { 645 const char *label; 646 int sel; 647 648 int value; 649 int nbits; 650 int interrupt_position; 651 u64 cn_list; 652 653 struct sdca_control_range range; 654 enum sdca_access_mode mode; 655 u8 layers; 656 657 bool deferrable; 658 bool has_default; 659 bool has_fixed; 660 }; 661 662 /** 663 * enum sdca_entity_type - SDCA Entity Type codes 664 * @SDCA_ENTITY_TYPE_ENTITY_0: Entity 0, not actually from the 665 * specification but useful internally as an Entity structure 666 * is allocated for Entity 0, to hold Entity 0 controls. 667 * @SDCA_ENTITY_TYPE_IT: Input Terminal. 668 * @SDCA_ENTITY_TYPE_OT: Output Terminal. 669 * @SDCA_ENTITY_TYPE_MU: Mixer Unit. 670 * @SDCA_ENTITY_TYPE_SU: Selector Unit. 671 * @SDCA_ENTITY_TYPE_FU: Feature Unit. 672 * @SDCA_ENTITY_TYPE_XU: Extension Unit. 673 * @SDCA_ENTITY_TYPE_CS: Clock Source. 674 * @SDCA_ENTITY_TYPE_CX: Clock selector. 675 * @SDCA_ENTITY_TYPE_PDE: Power-Domain Entity. 676 * @SDCA_ENTITY_TYPE_GE: Group Entity. 677 * @SDCA_ENTITY_TYPE_SPE: Security & Privacy Entity. 678 * @SDCA_ENTITY_TYPE_CRU: Channel Remapping Unit. 679 * @SDCA_ENTITY_TYPE_UDMPU: Up-Down Mixer Processing Unit. 680 * @SDCA_ENTITY_TYPE_MFPU: Multi-Function Processing Unit. 681 * @SDCA_ENTITY_TYPE_SMPU: Smart Microphone Processing Unit. 682 * @SDCA_ENTITY_TYPE_SAPU: Smart Amp Processing Unit. 683 * @SDCA_ENTITY_TYPE_PPU: Posture Processing Unit. 684 * @SDCA_ENTITY_TYPE_TG: Tone Generator. 685 * @SDCA_ENTITY_TYPE_HIDE: Human Interface Device Entity. 686 * 687 * SDCA Entity Types from SDCA specification v1.0 Section 6.1.2 688 * all Entity Types not described are reserved. 689 */ 690 enum sdca_entity_type { 691 SDCA_ENTITY_TYPE_ENTITY_0 = 0x00, 692 SDCA_ENTITY_TYPE_IT = 0x02, 693 SDCA_ENTITY_TYPE_OT = 0x03, 694 SDCA_ENTITY_TYPE_MU = 0x05, 695 SDCA_ENTITY_TYPE_SU = 0x06, 696 SDCA_ENTITY_TYPE_FU = 0x07, 697 SDCA_ENTITY_TYPE_XU = 0x0A, 698 SDCA_ENTITY_TYPE_CS = 0x0B, 699 SDCA_ENTITY_TYPE_CX = 0x0C, 700 SDCA_ENTITY_TYPE_PDE = 0x11, 701 SDCA_ENTITY_TYPE_GE = 0x12, 702 SDCA_ENTITY_TYPE_SPE = 0x13, 703 SDCA_ENTITY_TYPE_CRU = 0x20, 704 SDCA_ENTITY_TYPE_UDMPU = 0x21, 705 SDCA_ENTITY_TYPE_MFPU = 0x22, 706 SDCA_ENTITY_TYPE_SMPU = 0x23, 707 SDCA_ENTITY_TYPE_SAPU = 0x24, 708 SDCA_ENTITY_TYPE_PPU = 0x25, 709 SDCA_ENTITY_TYPE_TG = 0x30, 710 SDCA_ENTITY_TYPE_HIDE = 0x31, 711 }; 712 713 /** 714 * struct sdca_entity - information for one SDCA Entity 715 * @label: String such as "OT 12". 716 * @id: Identifier used for addressing. 717 * @type: Type code for the Entity. 718 * @sources: Dynamically allocated array pointing to each input Entity 719 * connected to this Entity. 720 * @controls: Dynamically allocated array of Controls. 721 * @num_sources: Number of sources for the Entity. 722 * @num_controls: Number of Controls for the Entity. 723 */ 724 struct sdca_entity { 725 const char *label; 726 int id; 727 enum sdca_entity_type type; 728 729 struct sdca_entity **sources; 730 struct sdca_control *controls; 731 int num_sources; 732 int num_controls; 733 }; 734 735 /** 736 * struct sdca_function_data - top-level information for one SDCA function 737 * @desc: Pointer to short descriptor from initial parsing. 738 * @init_table: Pointer to a table of initialization writes. 739 * @entities: Dynamically allocated array of Entities. 740 * @num_init_table: Number of initialization writes. 741 * @num_entities: Number of Entities reported in this Function. 742 * @busy_max_delay: Maximum Function busy delay in microseconds, before an 743 * error should be reported. 744 */ 745 struct sdca_function_data { 746 struct sdca_function_desc *desc; 747 748 struct sdca_init_write *init_table; 749 struct sdca_entity *entities; 750 int num_init_table; 751 int num_entities; 752 753 unsigned int busy_max_delay; 754 }; 755 756 int sdca_parse_function(struct device *dev, 757 struct sdca_function_desc *desc, 758 struct sdca_function_data *function); 759 760 #endif 761