ret = fwnode_property_read_u32(control5, "mipi-sdca-control-dc-value",
&function_type);
fwnode_handle_put(control5);
if (ret < 0) {
dev_err(dev, "function type only supported as DisCo constant\n"); return ret;
}
if (!sdca_device_quirk_match(slave, SDCA_QUIRKS_SKIP_FUNC_TYPE_PATCHING)) {
ret = patch_sdca_function_type(sdca_data->interface_revision, &function_type); if (ret < 0) {
dev_err(dev, "SDCA version %#x invalid function type %d\n",
sdca_data->interface_revision, function_type); return ret;
}
}
function_name = get_sdca_function_name(function_type); if (!function_name) {
dev_err(dev, "invalid SDCA function type %d\n", function_type); return -EINVAL;
}
dev_info(dev, "SDCA function %s (type %d) at 0x%llx\n",
function_name, function_type, addr);
staticconstchar *find_sdca_control_label(struct device *dev, conststruct sdca_entity *entity, conststruct sdca_control *control)
{ switch (SDCA_CTL_TYPE(entity->type, control->sel)) { case SDCA_CTL_TYPE_S(IT, MIC_BIAS): return SDCA_CTL_MIC_BIAS_NAME; case SDCA_CTL_TYPE_S(IT, USAGE): case SDCA_CTL_TYPE_S(OT, USAGE): return SDCA_CTL_USAGE_NAME; case SDCA_CTL_TYPE_S(IT, LATENCY): case SDCA_CTL_TYPE_S(OT, LATENCY): case SDCA_CTL_TYPE_S(MU, LATENCY): case SDCA_CTL_TYPE_S(SU, LATENCY): case SDCA_CTL_TYPE_S(FU, LATENCY): case SDCA_CTL_TYPE_S(XU, LATENCY): case SDCA_CTL_TYPE_S(CRU, LATENCY): case SDCA_CTL_TYPE_S(UDMPU, LATENCY): case SDCA_CTL_TYPE_S(MFPU, LATENCY): case SDCA_CTL_TYPE_S(SMPU, LATENCY): case SDCA_CTL_TYPE_S(SAPU, LATENCY): case SDCA_CTL_TYPE_S(PPU, LATENCY): return SDCA_CTL_LATENCY_NAME; case SDCA_CTL_TYPE_S(IT, CLUSTERINDEX): case SDCA_CTL_TYPE_S(CRU, CLUSTERINDEX): case SDCA_CTL_TYPE_S(UDMPU, CLUSTERINDEX): case SDCA_CTL_TYPE_S(MFPU, CLUSTERINDEX): return SDCA_CTL_CLUSTERINDEX_NAME; case SDCA_CTL_TYPE_S(IT, DATAPORT_SELECTOR): case SDCA_CTL_TYPE_S(OT, DATAPORT_SELECTOR): return SDCA_CTL_DATAPORT_SELECTOR_NAME; case SDCA_CTL_TYPE_S(IT, MATCHING_GUID): case SDCA_CTL_TYPE_S(OT, MATCHING_GUID): case SDCA_CTL_TYPE_S(ENTITY_0, MATCHING_GUID): return SDCA_CTL_MATCHING_GUID_NAME; case SDCA_CTL_TYPE_S(IT, KEEP_ALIVE): case SDCA_CTL_TYPE_S(OT, KEEP_ALIVE): return SDCA_CTL_KEEP_ALIVE_NAME; case SDCA_CTL_TYPE_S(IT, NDAI_STREAM): case SDCA_CTL_TYPE_S(OT, NDAI_STREAM): return SDCA_CTL_NDAI_STREAM_NAME; case SDCA_CTL_TYPE_S(IT, NDAI_CATEGORY): case SDCA_CTL_TYPE_S(OT, NDAI_CATEGORY): return SDCA_CTL_NDAI_CATEGORY_NAME; case SDCA_CTL_TYPE_S(IT, NDAI_CODINGTYPE): case SDCA_CTL_TYPE_S(OT, NDAI_CODINGTYPE): return SDCA_CTL_NDAI_CODINGTYPE_NAME; case SDCA_CTL_TYPE_S(IT, NDAI_PACKETTYPE): case SDCA_CTL_TYPE_S(OT, NDAI_PACKETTYPE): return SDCA_CTL_NDAI_PACKETTYPE_NAME; case SDCA_CTL_TYPE_S(MU, MIXER): return SDCA_CTL_MIXER_NAME; case SDCA_CTL_TYPE_S(SU, SELECTOR): return SDCA_CTL_SELECTOR_NAME; case SDCA_CTL_TYPE_S(FU, MUTE): return SDCA_CTL_MUTE_NAME; case SDCA_CTL_TYPE_S(FU, CHANNEL_VOLUME): return SDCA_CTL_CHANNEL_VOLUME_NAME; case SDCA_CTL_TYPE_S(FU, AGC): return SDCA_CTL_AGC_NAME; case SDCA_CTL_TYPE_S(FU, BASS_BOOST): return SDCA_CTL_BASS_BOOST_NAME; case SDCA_CTL_TYPE_S(FU, LOUDNESS): return SDCA_CTL_LOUDNESS_NAME; case SDCA_CTL_TYPE_S(FU, GAIN): return SDCA_CTL_GAIN_NAME; case SDCA_CTL_TYPE_S(XU, BYPASS): case SDCA_CTL_TYPE_S(MFPU, BYPASS): return SDCA_CTL_BYPASS_NAME; case SDCA_CTL_TYPE_S(XU, XU_ID): return SDCA_CTL_XU_ID_NAME; case SDCA_CTL_TYPE_S(XU, XU_VERSION): return SDCA_CTL_XU_VERSION_NAME; case SDCA_CTL_TYPE_S(XU, FDL_CURRENTOWNER): return SDCA_CTL_FDL_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(XU, FDL_MESSAGEOFFSET): return SDCA_CTL_FDL_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(XU, FDL_MESSAGELENGTH): return SDCA_CTL_FDL_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(XU, FDL_STATUS): return SDCA_CTL_FDL_STATUS_NAME; case SDCA_CTL_TYPE_S(XU, FDL_SET_INDEX): return SDCA_CTL_FDL_SET_INDEX_NAME; case SDCA_CTL_TYPE_S(XU, FDL_HOST_REQUEST): return SDCA_CTL_FDL_HOST_REQUEST_NAME; case SDCA_CTL_TYPE_S(CS, CLOCK_VALID): return SDCA_CTL_CLOCK_VALID_NAME; case SDCA_CTL_TYPE_S(CS, SAMPLERATEINDEX): return SDCA_CTL_SAMPLERATEINDEX_NAME; case SDCA_CTL_TYPE_S(CX, CLOCK_SELECT): return SDCA_CTL_CLOCK_SELECT_NAME; case SDCA_CTL_TYPE_S(PDE, REQUESTED_PS): return SDCA_CTL_REQUESTED_PS_NAME; case SDCA_CTL_TYPE_S(PDE, ACTUAL_PS): return SDCA_CTL_ACTUAL_PS_NAME; case SDCA_CTL_TYPE_S(GE, SELECTED_MODE): return SDCA_CTL_SELECTED_MODE_NAME; case SDCA_CTL_TYPE_S(GE, DETECTED_MODE): return SDCA_CTL_DETECTED_MODE_NAME; case SDCA_CTL_TYPE_S(SPE, PRIVATE): return SDCA_CTL_PRIVATE_NAME; case SDCA_CTL_TYPE_S(SPE, PRIVACY_POLICY): return SDCA_CTL_PRIVACY_POLICY_NAME; case SDCA_CTL_TYPE_S(SPE, PRIVACY_LOCKSTATE): return SDCA_CTL_PRIVACY_LOCKSTATE_NAME; case SDCA_CTL_TYPE_S(SPE, PRIVACY_OWNER): return SDCA_CTL_PRIVACY_OWNER_NAME; case SDCA_CTL_TYPE_S(SPE, AUTHTX_CURRENTOWNER): return SDCA_CTL_AUTHTX_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(SPE, AUTHTX_MESSAGEOFFSET): return SDCA_CTL_AUTHTX_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(SPE, AUTHTX_MESSAGELENGTH): return SDCA_CTL_AUTHTX_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(SPE, AUTHRX_CURRENTOWNER): return SDCA_CTL_AUTHRX_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(SPE, AUTHRX_MESSAGEOFFSET): return SDCA_CTL_AUTHRX_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(SPE, AUTHRX_MESSAGELENGTH): return SDCA_CTL_AUTHRX_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(UDMPU, ACOUSTIC_ENERGY_LEVEL_MONITOR): return SDCA_CTL_ACOUSTIC_ENERGY_LEVEL_MONITOR_NAME; case SDCA_CTL_TYPE_S(UDMPU, ULTRASOUND_LOOP_GAIN): return SDCA_CTL_ULTRASOUND_LOOP_GAIN_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_0): return SDCA_CTL_OPAQUESET_0_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_1): return SDCA_CTL_OPAQUESET_1_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_2): return SDCA_CTL_OPAQUESET_2_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_3): return SDCA_CTL_OPAQUESET_3_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_4): return SDCA_CTL_OPAQUESET_4_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_5): return SDCA_CTL_OPAQUESET_5_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_6): return SDCA_CTL_OPAQUESET_6_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_7): return SDCA_CTL_OPAQUESET_7_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_8): return SDCA_CTL_OPAQUESET_8_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_9): return SDCA_CTL_OPAQUESET_9_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_10): return SDCA_CTL_OPAQUESET_10_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_11): return SDCA_CTL_OPAQUESET_11_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_12): return SDCA_CTL_OPAQUESET_12_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_13): return SDCA_CTL_OPAQUESET_13_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_14): return SDCA_CTL_OPAQUESET_14_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_15): return SDCA_CTL_OPAQUESET_15_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_16): return SDCA_CTL_OPAQUESET_16_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_17): return SDCA_CTL_OPAQUESET_17_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_18): return SDCA_CTL_OPAQUESET_18_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_19): return SDCA_CTL_OPAQUESET_19_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_20): return SDCA_CTL_OPAQUESET_20_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_21): return SDCA_CTL_OPAQUESET_21_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_22): return SDCA_CTL_OPAQUESET_22_NAME; case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_23): return SDCA_CTL_OPAQUESET_23_NAME; case SDCA_CTL_TYPE_S(MFPU, ALGORITHM_READY): return SDCA_CTL_ALGORITHM_READY_NAME; case SDCA_CTL_TYPE_S(MFPU, ALGORITHM_ENABLE): return SDCA_CTL_ALGORITHM_ENABLE_NAME; case SDCA_CTL_TYPE_S(MFPU, ALGORITHM_PREPARE): return SDCA_CTL_ALGORITHM_PREPARE_NAME; case SDCA_CTL_TYPE_S(MFPU, CENTER_FREQUENCY_INDEX): return SDCA_CTL_CENTER_FREQUENCY_INDEX_NAME; case SDCA_CTL_TYPE_S(MFPU, ULTRASOUND_LEVEL): return SDCA_CTL_ULTRASOUND_LEVEL_NAME; case SDCA_CTL_TYPE_S(MFPU, AE_NUMBER): return SDCA_CTL_AE_NUMBER_NAME; case SDCA_CTL_TYPE_S(MFPU, AE_CURRENTOWNER): return SDCA_CTL_AE_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(MFPU, AE_MESSAGEOFFSET): return SDCA_CTL_AE_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(MFPU, AE_MESSAGELENGTH): return SDCA_CTL_AE_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(SMPU, TRIGGER_ENABLE): return SDCA_CTL_TRIGGER_ENABLE_NAME; case SDCA_CTL_TYPE_S(SMPU, TRIGGER_STATUS): return SDCA_CTL_TRIGGER_STATUS_NAME; case SDCA_CTL_TYPE_S(SMPU, HIST_BUFFER_MODE): return SDCA_CTL_HIST_BUFFER_MODE_NAME; case SDCA_CTL_TYPE_S(SMPU, HIST_BUFFER_PREAMBLE): return SDCA_CTL_HIST_BUFFER_PREAMBLE_NAME; case SDCA_CTL_TYPE_S(SMPU, HIST_ERROR): return SDCA_CTL_HIST_ERROR_NAME; case SDCA_CTL_TYPE_S(SMPU, TRIGGER_EXTENSION): return SDCA_CTL_TRIGGER_EXTENSION_NAME; case SDCA_CTL_TYPE_S(SMPU, TRIGGER_READY): return SDCA_CTL_TRIGGER_READY_NAME; case SDCA_CTL_TYPE_S(SMPU, HIST_CURRENTOWNER): return SDCA_CTL_HIST_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(SMPU, HIST_MESSAGEOFFSET): return SDCA_CTL_HIST_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(SMPU, HIST_MESSAGELENGTH): return SDCA_CTL_HIST_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(SMPU, DTODTX_CURRENTOWNER): return SDCA_CTL_DTODTX_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(SMPU, DTODTX_MESSAGEOFFSET): return SDCA_CTL_DTODTX_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(SMPU, DTODTX_MESSAGELENGTH): return SDCA_CTL_DTODTX_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(SMPU, DTODRX_CURRENTOWNER): return SDCA_CTL_DTODRX_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(SMPU, DTODRX_MESSAGEOFFSET): return SDCA_CTL_DTODRX_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(SMPU, DTODRX_MESSAGELENGTH): return SDCA_CTL_DTODRX_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(SAPU, PROTECTION_MODE): return SDCA_CTL_PROTECTION_MODE_NAME; case SDCA_CTL_TYPE_S(SAPU, PROTECTION_STATUS): return SDCA_CTL_PROTECTION_STATUS_NAME; case SDCA_CTL_TYPE_S(SAPU, OPAQUESETREQ_INDEX): return SDCA_CTL_OPAQUESETREQ_INDEX_NAME; case SDCA_CTL_TYPE_S(SAPU, DTODTX_CURRENTOWNER): return SDCA_CTL_DTODTX_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(SAPU, DTODTX_MESSAGEOFFSET): return SDCA_CTL_DTODTX_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(SAPU, DTODTX_MESSAGELENGTH): return SDCA_CTL_DTODTX_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(SAPU, DTODRX_CURRENTOWNER): return SDCA_CTL_DTODRX_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(SAPU, DTODRX_MESSAGEOFFSET): return SDCA_CTL_DTODRX_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(SAPU, DTODRX_MESSAGELENGTH): return SDCA_CTL_DTODRX_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(PPU, POSTURENUMBER): return SDCA_CTL_POSTURENUMBER_NAME; case SDCA_CTL_TYPE_S(PPU, POSTUREEXTENSION): return SDCA_CTL_POSTUREEXTENSION_NAME; case SDCA_CTL_TYPE_S(PPU, HORIZONTALBALANCE): return SDCA_CTL_HORIZONTALBALANCE_NAME; case SDCA_CTL_TYPE_S(PPU, VERTICALBALANCE): return SDCA_CTL_VERTICALBALANCE_NAME; case SDCA_CTL_TYPE_S(TG, TONE_DIVIDER): return SDCA_CTL_TONE_DIVIDER_NAME; case SDCA_CTL_TYPE_S(HIDE, HIDTX_CURRENTOWNER): return SDCA_CTL_HIDTX_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(HIDE, HIDTX_MESSAGEOFFSET): return SDCA_CTL_HIDTX_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(HIDE, HIDTX_MESSAGELENGTH): return SDCA_CTL_HIDTX_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(HIDE, HIDRX_CURRENTOWNER): return SDCA_CTL_HIDRX_CURRENTOWNER_NAME; case SDCA_CTL_TYPE_S(HIDE, HIDRX_MESSAGEOFFSET): return SDCA_CTL_HIDRX_MESSAGEOFFSET_NAME; case SDCA_CTL_TYPE_S(HIDE, HIDRX_MESSAGELENGTH): return SDCA_CTL_HIDRX_MESSAGELENGTH_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, COMMIT_GROUP_MASK): return SDCA_CTL_COMMIT_GROUP_MASK_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_SDCA_VERSION): return SDCA_CTL_FUNCTION_SDCA_VERSION_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_TYPE): return SDCA_CTL_FUNCTION_TYPE_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_MANUFACTURER_ID): return SDCA_CTL_FUNCTION_MANUFACTURER_ID_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_ID): return SDCA_CTL_FUNCTION_ID_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_VERSION): return SDCA_CTL_FUNCTION_VERSION_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_EXTENSION_ID): return SDCA_CTL_FUNCTION_EXTENSION_ID_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_EXTENSION_VERSION): return SDCA_CTL_FUNCTION_EXTENSION_VERSION_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_STATUS): return SDCA_CTL_FUNCTION_STATUS_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_ACTION): return SDCA_CTL_FUNCTION_ACTION_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_MANUFACTURER_ID): return SDCA_CTL_DEVICE_MANUFACTURER_ID_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_PART_ID): return SDCA_CTL_DEVICE_PART_ID_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_VERSION): return SDCA_CTL_DEVICE_VERSION_NAME; case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_SDCA_VERSION): return SDCA_CTL_DEVICE_SDCA_VERSION_NAME; default: return devm_kasprintf(dev, GFP_KERNEL, "Imp-Def %#x", control->sel);
}
}
staticunsignedint find_sdca_control_bits(conststruct sdca_entity *entity, conststruct sdca_control *control)
{ switch (SDCA_CTL_TYPE(entity->type, control->sel)) { case SDCA_CTL_TYPE_S(IT, LATENCY): case SDCA_CTL_TYPE_S(OT, LATENCY): case SDCA_CTL_TYPE_S(MU, LATENCY): case SDCA_CTL_TYPE_S(SU, LATENCY): case SDCA_CTL_TYPE_S(FU, LATENCY): case SDCA_CTL_TYPE_S(XU, LATENCY): case SDCA_CTL_TYPE_S(XU, FDL_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(XU, FDL_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SPE, AUTHTX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SPE, AUTHTX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SPE, AUTHRX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SPE, AUTHRX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(CRU, LATENCY): case SDCA_CTL_TYPE_S(UDMPU, LATENCY): case SDCA_CTL_TYPE_S(MFPU, LATENCY): case SDCA_CTL_TYPE_S(MFPU, AE_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(MFPU, AE_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SMPU, LATENCY): case SDCA_CTL_TYPE_S(SMPU, HIST_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SMPU, HIST_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SMPU, DTODTX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SMPU, DTODTX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SMPU, DTODRX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SMPU, DTODRX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SAPU, LATENCY): case SDCA_CTL_TYPE_S(SAPU, DTODTX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SAPU, DTODTX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SAPU, DTODRX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SAPU, DTODRX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(PPU, LATENCY): case SDCA_CTL_TYPE_S(HIDE, HIDTX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(HIDE, HIDTX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(HIDE, HIDRX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(HIDE, HIDRX_MESSAGELENGTH): return32; case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_MANUFACTURER_ID): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_ID): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_EXTENSION_ID): case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_MANUFACTURER_ID): case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_PART_ID): case SDCA_CTL_TYPE_S(IT, DATAPORT_SELECTOR): case SDCA_CTL_TYPE_S(OT, DATAPORT_SELECTOR): case SDCA_CTL_TYPE_S(MU, MIXER): case SDCA_CTL_TYPE_S(FU, CHANNEL_VOLUME): case SDCA_CTL_TYPE_S(FU, GAIN): case SDCA_CTL_TYPE_S(XU, XU_ID): case SDCA_CTL_TYPE_S(UDMPU, ACOUSTIC_ENERGY_LEVEL_MONITOR): case SDCA_CTL_TYPE_S(UDMPU, ULTRASOUND_LOOP_GAIN): case SDCA_CTL_TYPE_S(MFPU, ULTRASOUND_LEVEL): case SDCA_CTL_TYPE_S(PPU, HORIZONTALBALANCE): case SDCA_CTL_TYPE_S(PPU, VERTICALBALANCE): return16; case SDCA_CTL_TYPE_S(FU, MUTE): case SDCA_CTL_TYPE_S(FU, AGC): case SDCA_CTL_TYPE_S(FU, BASS_BOOST): case SDCA_CTL_TYPE_S(FU, LOUDNESS): case SDCA_CTL_TYPE_S(XU, BYPASS): case SDCA_CTL_TYPE_S(MFPU, BYPASS): return1; default: return8;
}
}
staticenum sdca_control_datatype
find_sdca_control_datatype(conststruct sdca_entity *entity, conststruct sdca_control *control)
{ switch (SDCA_CTL_TYPE(entity->type, control->sel)) { case SDCA_CTL_TYPE_S(XU, BYPASS): case SDCA_CTL_TYPE_S(MFPU, BYPASS): case SDCA_CTL_TYPE_S(FU, MUTE): case SDCA_CTL_TYPE_S(FU, AGC): case SDCA_CTL_TYPE_S(FU, BASS_BOOST): case SDCA_CTL_TYPE_S(FU, LOUDNESS): return SDCA_CTL_DATATYPE_ONEBIT; case SDCA_CTL_TYPE_S(IT, LATENCY): case SDCA_CTL_TYPE_S(OT, LATENCY): case SDCA_CTL_TYPE_S(MU, LATENCY): case SDCA_CTL_TYPE_S(SU, LATENCY): case SDCA_CTL_TYPE_S(FU, LATENCY): case SDCA_CTL_TYPE_S(XU, LATENCY): case SDCA_CTL_TYPE_S(CRU, LATENCY): case SDCA_CTL_TYPE_S(UDMPU, LATENCY): case SDCA_CTL_TYPE_S(MFPU, LATENCY): case SDCA_CTL_TYPE_S(SMPU, LATENCY): case SDCA_CTL_TYPE_S(SAPU, LATENCY): case SDCA_CTL_TYPE_S(PPU, LATENCY): case SDCA_CTL_TYPE_S(SU, SELECTOR): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_0): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_1): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_2): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_3): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_4): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_5): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_6): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_7): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_8): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_9): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_10): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_11): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_12): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_13): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_14): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_15): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_16): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_17): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_18): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_19): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_20): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_21): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_22): case SDCA_CTL_TYPE_S(UDMPU, OPAQUESET_23): case SDCA_CTL_TYPE_S(SAPU, PROTECTION_MODE): case SDCA_CTL_TYPE_S(SMPU, HIST_BUFFER_PREAMBLE): case SDCA_CTL_TYPE_S(XU, FDL_HOST_REQUEST): case SDCA_CTL_TYPE_S(XU, XU_ID): case SDCA_CTL_TYPE_S(CX, CLOCK_SELECT): case SDCA_CTL_TYPE_S(TG, TONE_DIVIDER): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_MANUFACTURER_ID): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_ID): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_EXTENSION_ID): case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_MANUFACTURER_ID): case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_PART_ID): case SDCA_CTL_TYPE_S(XU, FDL_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(XU, FDL_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SPE, AUTHTX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SPE, AUTHTX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SPE, AUTHRX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SPE, AUTHRX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(MFPU, AE_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(MFPU, AE_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SMPU, HIST_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SMPU, HIST_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SMPU, DTODTX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SMPU, DTODTX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SMPU, DTODRX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SMPU, DTODRX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SAPU, DTODTX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SAPU, DTODTX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(SAPU, DTODRX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(SAPU, DTODRX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(HIDE, HIDTX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(HIDE, HIDTX_MESSAGELENGTH): case SDCA_CTL_TYPE_S(HIDE, HIDRX_MESSAGEOFFSET): case SDCA_CTL_TYPE_S(HIDE, HIDRX_MESSAGELENGTH): return SDCA_CTL_DATATYPE_INTEGER; case SDCA_CTL_TYPE_S(IT, MIC_BIAS): case SDCA_CTL_TYPE_S(SMPU, HIST_BUFFER_MODE): case SDCA_CTL_TYPE_S(PDE, REQUESTED_PS): case SDCA_CTL_TYPE_S(PDE, ACTUAL_PS): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_TYPE): return SDCA_CTL_DATATYPE_SPEC_ENCODED_VALUE; case SDCA_CTL_TYPE_S(XU, XU_VERSION): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_SDCA_VERSION): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_VERSION): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_EXTENSION_VERSION): case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_VERSION): case SDCA_CTL_TYPE_S(ENTITY_0, DEVICE_SDCA_VERSION): return SDCA_CTL_DATATYPE_BCD; case SDCA_CTL_TYPE_S(FU, CHANNEL_VOLUME): case SDCA_CTL_TYPE_S(FU, GAIN): case SDCA_CTL_TYPE_S(MU, MIXER): case SDCA_CTL_TYPE_S(PPU, HORIZONTALBALANCE): case SDCA_CTL_TYPE_S(PPU, VERTICALBALANCE): case SDCA_CTL_TYPE_S(MFPU, ULTRASOUND_LEVEL): case SDCA_CTL_TYPE_S(UDMPU, ACOUSTIC_ENERGY_LEVEL_MONITOR): case SDCA_CTL_TYPE_S(UDMPU, ULTRASOUND_LOOP_GAIN): return SDCA_CTL_DATATYPE_Q7P8DB; case SDCA_CTL_TYPE_S(IT, USAGE): case SDCA_CTL_TYPE_S(OT, USAGE): case SDCA_CTL_TYPE_S(IT, CLUSTERINDEX): case SDCA_CTL_TYPE_S(CRU, CLUSTERINDEX): case SDCA_CTL_TYPE_S(UDMPU, CLUSTERINDEX): case SDCA_CTL_TYPE_S(MFPU, CLUSTERINDEX): case SDCA_CTL_TYPE_S(MFPU, CENTER_FREQUENCY_INDEX): case SDCA_CTL_TYPE_S(MFPU, AE_NUMBER): case SDCA_CTL_TYPE_S(SAPU, OPAQUESETREQ_INDEX): case SDCA_CTL_TYPE_S(XU, FDL_SET_INDEX): case SDCA_CTL_TYPE_S(CS, SAMPLERATEINDEX): case SDCA_CTL_TYPE_S(GE, SELECTED_MODE): case SDCA_CTL_TYPE_S(GE, DETECTED_MODE): return SDCA_CTL_DATATYPE_BYTEINDEX; case SDCA_CTL_TYPE_S(PPU, POSTURENUMBER): return SDCA_CTL_DATATYPE_POSTURENUMBER; case SDCA_CTL_TYPE_S(IT, DATAPORT_SELECTOR): case SDCA_CTL_TYPE_S(OT, DATAPORT_SELECTOR): return SDCA_CTL_DATATYPE_DP_INDEX; case SDCA_CTL_TYPE_S(MFPU, ALGORITHM_READY): case SDCA_CTL_TYPE_S(MFPU, ALGORITHM_ENABLE): case SDCA_CTL_TYPE_S(MFPU, ALGORITHM_PREPARE): case SDCA_CTL_TYPE_S(SAPU, PROTECTION_STATUS): case SDCA_CTL_TYPE_S(SMPU, TRIGGER_ENABLE): case SDCA_CTL_TYPE_S(SMPU, TRIGGER_STATUS): case SDCA_CTL_TYPE_S(SMPU, TRIGGER_READY): case SDCA_CTL_TYPE_S(SPE, PRIVACY_POLICY): case SDCA_CTL_TYPE_S(SPE, PRIVACY_OWNER): return SDCA_CTL_DATATYPE_BITINDEX; case SDCA_CTL_TYPE_S(IT, KEEP_ALIVE): case SDCA_CTL_TYPE_S(OT, KEEP_ALIVE): case SDCA_CTL_TYPE_S(IT, NDAI_STREAM): case SDCA_CTL_TYPE_S(OT, NDAI_STREAM): case SDCA_CTL_TYPE_S(IT, NDAI_CATEGORY): case SDCA_CTL_TYPE_S(OT, NDAI_CATEGORY): case SDCA_CTL_TYPE_S(IT, NDAI_CODINGTYPE): case SDCA_CTL_TYPE_S(OT, NDAI_CODINGTYPE): case SDCA_CTL_TYPE_S(IT, NDAI_PACKETTYPE): case SDCA_CTL_TYPE_S(OT, NDAI_PACKETTYPE): case SDCA_CTL_TYPE_S(SMPU, HIST_ERROR): case SDCA_CTL_TYPE_S(XU, FDL_STATUS): case SDCA_CTL_TYPE_S(CS, CLOCK_VALID): case SDCA_CTL_TYPE_S(SPE, PRIVACY_LOCKSTATE): case SDCA_CTL_TYPE_S(ENTITY_0, COMMIT_GROUP_MASK): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_STATUS): case SDCA_CTL_TYPE_S(ENTITY_0, FUNCTION_ACTION): case SDCA_CTL_TYPE_S(XU, FDL_CURRENTOWNER): case SDCA_CTL_TYPE_S(SPE, AUTHTX_CURRENTOWNER): case SDCA_CTL_TYPE_S(SPE, AUTHRX_CURRENTOWNER): case SDCA_CTL_TYPE_S(MFPU, AE_CURRENTOWNER): case SDCA_CTL_TYPE_S(SMPU, HIST_CURRENTOWNER): case SDCA_CTL_TYPE_S(SMPU, DTODTX_CURRENTOWNER): case SDCA_CTL_TYPE_S(SMPU, DTODRX_CURRENTOWNER): case SDCA_CTL_TYPE_S(SAPU, DTODTX_CURRENTOWNER): case SDCA_CTL_TYPE_S(SAPU, DTODRX_CURRENTOWNER): case SDCA_CTL_TYPE_S(HIDE, HIDTX_CURRENTOWNER): case SDCA_CTL_TYPE_S(HIDE, HIDRX_CURRENTOWNER): return SDCA_CTL_DATATYPE_BITMAP; case SDCA_CTL_TYPE_S(IT, MATCHING_GUID): case SDCA_CTL_TYPE_S(OT, MATCHING_GUID): case SDCA_CTL_TYPE_S(ENTITY_0, MATCHING_GUID): return SDCA_CTL_DATATYPE_GUID; default: return SDCA_CTL_DATATYPE_IMPDEF;
}
}
staticint find_sdca_control_range(struct device *dev, struct fwnode_handle *control_node, struct sdca_control_range *range)
{
u8 *range_list; int num_range;
u16 *limits; int i;
ret = fwnode_property_read_u32(control_node, "mipi-sdca-control-access-mode", &tmp); if (ret) {
dev_err(dev, "%s: control %#x: access mode missing: %d\n",
entity->label, control->sel, ret); return ret;
}
control->mode = tmp;
ret = fwnode_property_read_u32(control_node, "mipi-sdca-control-access-layer", &tmp); if (ret) {
dev_err(dev, "%s: control %#x: access layer missing: %d\n",
entity->label, control->sel, ret); return ret;
}
control->layers = tmp;
ret = fwnode_property_read_u64(control_node, "mipi-sdca-control-cn-list",
&control->cn_list); if (ret == -EINVAL) { /* Spec allows not specifying cn-list if only the first number is used */
control->cn_list = 0x1;
} elseif (ret || !control->cn_list) {
dev_err(dev, "%s: control %#x: cn list missing: %d\n",
entity->label, control->sel, ret); return ret;
}
control->values = devm_kzalloc(dev, hweight64(control->cn_list), GFP_KERNEL); if (!control->values) return -ENOMEM;
switch (control->mode) { case SDCA_ACCESS_MODE_DC:
ret = find_sdca_control_value(dev, entity, control_node, control, "dc-value"); if (ret) {
dev_err(dev, "%s: control %#x: dc value missing: %d\n",
entity->label, control->sel, ret); return ret;
}
control->has_fixed = true; break; case SDCA_ACCESS_MODE_RW: case SDCA_ACCESS_MODE_DUAL:
ret = find_sdca_control_value(dev, entity, control_node, control, "default-value"); if (!ret)
control->has_default = true;
ret = find_sdca_control_value(dev, entity, control_node, control, "fixed-value"); if (!ret)
control->has_fixed = true;
fallthrough; case SDCA_ACCESS_MODE_RO:
control->deferrable = fwnode_property_read_bool(control_node, "mipi-sdca-control-deferrable"); break; default: break;
}
ret = find_sdca_control_range(dev, control_node, &control->range); if (ret) {
dev_err(dev, "%s: control %#x: range missing: %d\n",
entity->label, control->sel, ret); return ret;
}
ret = fwnode_property_read_u32(control_node, "mipi-sdca-control-interrupt-position",
&tmp); if (!ret)
control->interrupt_position = tmp; else
control->interrupt_position = SDCA_NO_INTERRUPT;
control->label = find_sdca_control_label(dev, entity, control); if (!control->label) return -ENOMEM;
staticbool find_sdca_iot_dataport(struct sdca_entity_iot *terminal)
{ switch (terminal->type) { case SDCA_TERM_TYPE_GENERIC: case SDCA_TERM_TYPE_ULTRASOUND: case SDCA_TERM_TYPE_CAPTURE_DIRECT_PCM_MIC: case SDCA_TERM_TYPE_RAW_PDM_MIC: case SDCA_TERM_TYPE_SPEECH: case SDCA_TERM_TYPE_VOICE: case SDCA_TERM_TYPE_SECONDARY_PCM_MIC: case SDCA_TERM_TYPE_ACOUSTIC_CONTEXT_AWARENESS: case SDCA_TERM_TYPE_DTOD_STREAM: case SDCA_TERM_TYPE_REFERENCE_STREAM: case SDCA_TERM_TYPE_SENSE_CAPTURE: case SDCA_TERM_TYPE_STREAMING_MIC: case SDCA_TERM_TYPE_OPTIMIZATION_STREAM: case SDCA_TERM_TYPE_PDM_RENDER_STREAM: case SDCA_TERM_TYPE_COMPANION_DATA: returntrue; default: returnfalse;
}
}
ret = fwnode_property_read_u32(entity_node, "mipi-sdca-entity-type", &tmp); if (ret) {
dev_err(dev, "%s: type missing: %d\n", entity->label, ret); return ret;
}
entity->type = tmp;
dev_info(dev, "%s: entity %#x type %#x\n",
entity->label, entity->id, entity->type);
switch (entity->type) { case SDCA_ENTITY_TYPE_IT: case SDCA_ENTITY_TYPE_OT:
ret = find_sdca_entity_iot(dev, entity_node, entity); break; case SDCA_ENTITY_TYPE_CS:
ret = find_sdca_entity_cs(dev, entity_node, entity); break; case SDCA_ENTITY_TYPE_PDE:
ret = find_sdca_entity_pde(dev, entity_node, entity); break; case SDCA_ENTITY_TYPE_GE:
ret = find_sdca_entity_ge(dev, entity_node, entity); break; case SDCA_ENTITY_TYPE_HIDE:
ret = find_sdca_entity_hide(dev, function_node, entity_node, entity); break; default: break;
} if (ret) return ret;
ret = find_sdca_entity_controls(dev, entity_node, entity); if (ret) return ret;
return0;
}
staticint find_sdca_entities(struct device *dev, struct fwnode_handle *function_node, struct sdca_function_data *function)
{
u32 *entity_list __free(kfree) = NULL; struct sdca_entity *entities; int num_entities; int i, ret;
num_entities = fwnode_property_count_u32(function_node, "mipi-sdca-entity-id-list"); if (num_entities <= 0) {
dev_err(dev, "%pfwP: entity id list missing: %d\n",
function_node, num_entities); return -EINVAL;
} elseif (num_entities > SDCA_MAX_ENTITY_COUNT) {
dev_err(dev, "%pfwP: maximum number of entities exceeded\n",
function_node); return -EINVAL;
}
/* Add 1 to make space for Entity 0 */
entities = devm_kcalloc(dev, num_entities + 1, sizeof(*entities), GFP_KERNEL); if (!entities) return -ENOMEM;
entity_list = kcalloc(num_entities, sizeof(*entity_list), GFP_KERNEL); if (!entity_list) return -ENOMEM;
for (i = 0; i < num_managed; i++) {
managed[i] = find_sdca_entity_by_id(function, managed_list[i]); if (!managed[i]) {
dev_err(dev, "%s: failed to find entity with id %#x\n",
entity->label, managed_list[i]); return -EINVAL;
}
managed = find_sdca_entity_by_id(function, affected->id); if (!managed) {
dev_err(dev, "%s: failed to find entity with id %#x\n",
entity->label, affected->id); return -EINVAL;
}
if (managed->group && managed->group != entity) {
dev_err(dev, "%s: entity controlled by two groups %s, %s\n",
managed->label, managed->group->label,
entity->label); return -EINVAL;
}
managed->group = entity;
}
}
return0;
}
staticint find_sdca_entity_connection(struct device *dev, struct sdca_function_data *function, struct fwnode_handle *entity_node, struct sdca_entity *entity)
{ struct sdca_entity **pins; int num_pins, pin;
u64 pin_list; int i, ret;
switch (entity->type) { case SDCA_ENTITY_TYPE_IT: case SDCA_ENTITY_TYPE_OT:
ret = find_sdca_entity_connection_iot(dev, function,
entity_node, entity); break; case SDCA_ENTITY_TYPE_PDE:
ret = find_sdca_entity_connection_pde(dev, function,
entity_node, entity); break; case SDCA_ENTITY_TYPE_GE:
ret = find_sdca_entity_connection_ge(dev, function,
entity_node, entity); break; default:
ret = 0; break;
} if (ret) return ret;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.