Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

ASoC: SDCA: Split function type patching and function naming

Currently, patch_sdca_function_type() both patches the function type
for older SDCA revisions, and reports the name of the function. In
general it is cleaner to have a single function only do a single
task, so split these operations into two separate functions.

Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://patch.msgid.link/20241220173516.907406-5-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>

authored by

Charles Keepax and committed by
Mark Brown
69dcf023 c1ed5eb1

+64 -75
+64 -75
sound/soc/sdca/sdca_functions.c
··· 17 17 #include <sound/sdca.h> 18 18 #include <sound/sdca_function.h> 19 19 20 - static int patch_sdca_function_type(struct device *dev, 21 - u32 interface_revision, 22 - u32 *function_type, 23 - const char **function_name) 20 + static int patch_sdca_function_type(u32 interface_revision, u32 *function_type) 24 21 { 25 - unsigned long function_type_patch = 0; 26 - 27 22 /* 28 23 * Unfortunately early SDCA specifications used different indices for Functions, 29 24 * for backwards compatibility we have to reorder the values found 30 25 */ 31 - if (interface_revision >= 0x0801) 32 - goto skip_early_draft_order; 33 - 34 - switch (*function_type) { 35 - case 1: 36 - function_type_patch = SDCA_FUNCTION_TYPE_SMART_AMP; 37 - break; 38 - case 2: 39 - function_type_patch = SDCA_FUNCTION_TYPE_SMART_MIC; 40 - break; 41 - case 3: 42 - function_type_patch = SDCA_FUNCTION_TYPE_SPEAKER_MIC; 43 - break; 44 - case 4: 45 - function_type_patch = SDCA_FUNCTION_TYPE_UAJ; 46 - break; 47 - case 5: 48 - function_type_patch = SDCA_FUNCTION_TYPE_RJ; 49 - break; 50 - case 6: 51 - function_type_patch = SDCA_FUNCTION_TYPE_HID; 52 - break; 53 - default: 54 - dev_warn(dev, "SDCA version %#x invalid function type %d\n", 55 - interface_revision, *function_type); 56 - return -EINVAL; 26 + if (interface_revision < 0x0801) { 27 + switch (*function_type) { 28 + case 1: 29 + *function_type = SDCA_FUNCTION_TYPE_SMART_AMP; 30 + break; 31 + case 2: 32 + *function_type = SDCA_FUNCTION_TYPE_SMART_MIC; 33 + break; 34 + case 3: 35 + *function_type = SDCA_FUNCTION_TYPE_SPEAKER_MIC; 36 + break; 37 + case 4: 38 + *function_type = SDCA_FUNCTION_TYPE_UAJ; 39 + break; 40 + case 5: 41 + *function_type = SDCA_FUNCTION_TYPE_RJ; 42 + break; 43 + case 6: 44 + *function_type = SDCA_FUNCTION_TYPE_HID; 45 + break; 46 + default: 47 + return -EINVAL; 48 + } 57 49 } 58 - 59 - skip_early_draft_order: 60 - if (function_type_patch) 61 - *function_type = function_type_patch; 62 - 63 - /* now double-check the values */ 64 - switch (*function_type) { 65 - case SDCA_FUNCTION_TYPE_SMART_AMP: 66 - *function_name = SDCA_FUNCTION_TYPE_SMART_AMP_NAME; 67 - break; 68 - case SDCA_FUNCTION_TYPE_SMART_MIC: 69 - *function_name = SDCA_FUNCTION_TYPE_SMART_MIC_NAME; 70 - break; 71 - case SDCA_FUNCTION_TYPE_UAJ: 72 - *function_name = SDCA_FUNCTION_TYPE_UAJ_NAME; 73 - break; 74 - case SDCA_FUNCTION_TYPE_HID: 75 - *function_name = SDCA_FUNCTION_TYPE_HID_NAME; 76 - break; 77 - case SDCA_FUNCTION_TYPE_SIMPLE_AMP: 78 - *function_name = SDCA_FUNCTION_TYPE_SIMPLE_AMP_NAME; 79 - break; 80 - case SDCA_FUNCTION_TYPE_SIMPLE_MIC: 81 - *function_name = SDCA_FUNCTION_TYPE_SIMPLE_MIC_NAME; 82 - break; 83 - case SDCA_FUNCTION_TYPE_SPEAKER_MIC: 84 - *function_name = SDCA_FUNCTION_TYPE_SPEAKER_MIC_NAME; 85 - break; 86 - case SDCA_FUNCTION_TYPE_RJ: 87 - *function_name = SDCA_FUNCTION_TYPE_RJ_NAME; 88 - break; 89 - case SDCA_FUNCTION_TYPE_IMP_DEF: 90 - *function_name = SDCA_FUNCTION_TYPE_IMP_DEF_NAME; 91 - break; 92 - default: 93 - dev_err(dev, "invalid SDCA function type %d\n", *function_type); 94 - return -EINVAL; 95 - } 96 - 97 - dev_info(dev, "SDCA function %s (type %d)\n", *function_name, *function_type); 98 50 99 51 return 0; 52 + } 53 + 54 + static const char *get_sdca_function_name(u32 function_type) 55 + { 56 + switch (function_type) { 57 + case SDCA_FUNCTION_TYPE_SMART_AMP: 58 + return SDCA_FUNCTION_TYPE_SMART_AMP_NAME; 59 + case SDCA_FUNCTION_TYPE_SMART_MIC: 60 + return SDCA_FUNCTION_TYPE_SMART_MIC_NAME; 61 + case SDCA_FUNCTION_TYPE_UAJ: 62 + return SDCA_FUNCTION_TYPE_UAJ_NAME; 63 + case SDCA_FUNCTION_TYPE_HID: 64 + return SDCA_FUNCTION_TYPE_HID_NAME; 65 + case SDCA_FUNCTION_TYPE_SIMPLE_AMP: 66 + return SDCA_FUNCTION_TYPE_SIMPLE_AMP_NAME; 67 + case SDCA_FUNCTION_TYPE_SIMPLE_MIC: 68 + return SDCA_FUNCTION_TYPE_SIMPLE_MIC_NAME; 69 + case SDCA_FUNCTION_TYPE_SPEAKER_MIC: 70 + return SDCA_FUNCTION_TYPE_SPEAKER_MIC_NAME; 71 + case SDCA_FUNCTION_TYPE_RJ: 72 + return SDCA_FUNCTION_TYPE_RJ_NAME; 73 + case SDCA_FUNCTION_TYPE_IMP_DEF: 74 + return SDCA_FUNCTION_TYPE_IMP_DEF_NAME; 75 + default: 76 + return NULL; 77 + } 100 78 } 101 79 102 80 static int find_sdca_function(struct acpi_device *adev, void *data) ··· 128 150 return ret; 129 151 } 130 152 131 - ret = patch_sdca_function_type(dev, sdca_data->interface_revision, 132 - &function_type, &function_name); 133 - if (ret < 0) 153 + ret = patch_sdca_function_type(sdca_data->interface_revision, &function_type); 154 + if (ret < 0) { 155 + dev_err(dev, "SDCA version %#x invalid function type %d\n", 156 + sdca_data->interface_revision, function_type); 134 157 return ret; 158 + } 159 + 160 + function_name = get_sdca_function_name(function_type); 161 + if (!function_name) { 162 + dev_err(dev, "invalid SDCA function type %d\n", function_type); 163 + return -EINVAL; 164 + } 165 + 166 + dev_info(dev, "SDCA function %s (type %d) at 0x%llx\n", 167 + function_name, function_type, addr); 135 168 136 169 /* store results */ 137 170 func_index = sdca_data->num_functions;