public inbox for linux-sound@vger.kernel.org
 help / color / mirror / Atom feed
* [bug report] ALSA: hda: cs35l56: Add support for speaker id
@ 2026-04-23  7:08 Dan Carpenter
  0 siblings, 0 replies; only message in thread
From: Dan Carpenter @ 2026-04-23  7:08 UTC (permalink / raw)
  To: Richard Fitzgerald; +Cc: linux-sound

[ It's weird that this is showing up now... - dan ]

Hello Richard Fitzgerald,

Commit 6f03b446cbae ("ALSA: hda: cs35l56: Add support for speaker
id") from Sep 18, 2023 (linux-next), leads to the following Smatch
static checker warning:

	sound/hda/codecs/side-codecs/cs35l56_hda.c:1084 cs35l56_hda_read_acpi()
	error: uninitialized symbol 'nval'.

sound/hda/codecs/side-codecs/cs35l56_hda.c
    1013 static int cs35l56_hda_read_acpi(struct cs35l56_hda *cs35l56, int hid, int id)
    1014 {
    1015         u32 values[HDA_MAX_COMPONENTS];
    1016         char hid_string[8];
    1017         struct acpi_device *adev;
    1018         const char *property, *sub;
    1019         size_t nval;
    1020         int i, ret;
    1021 
    1022         /*
    1023          * ACPI_COMPANION isn't available when this driver was instantiated by
    1024          * the serial-multi-instantiate driver, so lookup the node by HID
    1025          */
    1026         if (!ACPI_COMPANION(cs35l56->base.dev)) {
    1027                 snprintf(hid_string, sizeof(hid_string), "CSC%04X", hid);
    1028                 adev = acpi_dev_get_first_match_dev(hid_string, NULL, -1);
    1029                 if (!adev) {
    1030                         dev_err(cs35l56->base.dev, "Failed to find an ACPI device for %s\n",
    1031                                 dev_name(cs35l56->base.dev));
    1032                         return -ENODEV;
    1033                 }
    1034                 ACPI_COMPANION_SET(cs35l56->base.dev, adev);
    1035         }
    1036 
    1037         /* Initialize things that could be overwritten by a fixup */
    1038         cs35l56->index = -1;

We set cs35l56->index = -1;

    1039 
    1040         sub = acpi_get_subsystem_id(ACPI_HANDLE(cs35l56->base.dev));
    1041         ret = cs35l56_hda_apply_platform_fixups(cs35l56, sub, &id);
    1042         if (ret)
    1043                 return ret;
    1044 
    1045         if (cs35l56->index == -1) {

nval is uninitialized if cs35l56->index this condition is false.

    1046                 property = "cirrus,dev-index";
    1047                 ret = device_property_count_u32(cs35l56->base.dev, property);
    1048                 if (ret <= 0)
    1049                         goto err;
    1050 
    1051                 if (ret > ARRAY_SIZE(values)) {
    1052                         ret = -EINVAL;
    1053                         goto err;
    1054                 }
    1055                 nval = ret;
    1056 
    1057                 ret = device_property_read_u32_array(cs35l56->base.dev, property, values, nval);
    1058                 if (ret)
    1059                         goto err;
    1060 
    1061                 for (i = 0; i < nval; i++) {
    1062                         if (values[i] == id) {
    1063                                 cs35l56->index = i;
    1064                                 break;
    1065                         }
    1066                 }
    1067 
    1068                 /*
    1069                  * It's not an error for the ID to be missing: for I2C there can be
    1070                  * an alias address that is not a real device. So reject silently.
    1071                  */
    1072                 if (cs35l56->index == -1) {
    1073                         dev_dbg(cs35l56->base.dev, "No index found in %s\n", property);
    1074                         ret = -ENODEV;
    1075                         goto err;
    1076                 }
    1077         }
    1078 
    1079         if (IS_ERR(sub)) {
    1080                 dev_info(cs35l56->base.dev,
    1081                          "Read ACPI _SUB failed(%ld): fallback to generic firmware\n",
    1082                          PTR_ERR(sub));
    1083         } else {
--> 1084                 ret = cirrus_scodec_get_speaker_id(cs35l56->base.dev, cs35l56->index, nval, -1);
                                                                                               ^^^^
Warning here.

    1085                 if (ret == -ENOENT) {
    1086                         cs35l56->system_name = sub;
    1087                 } else if (ret >= 0) {
    1088                         cs35l56->system_name = kasprintf(GFP_KERNEL, "%s-spkid%d", sub, ret);
    1089                         kfree(sub);
    1090                         if (!cs35l56->system_name)
    1091                                 return -ENOMEM;
    1092                 } else {
    1093                         return ret;
    1094                 }
    1095         }
    1096 
    1097         cs35l56->base.reset_gpio = devm_gpiod_get_index_optional(cs35l56->base.dev,
    1098                                                                  "reset",
    1099                                                                  cs35l56->index,
    1100                                                                  GPIOD_OUT_LOW);
    1101         if (IS_ERR(cs35l56->base.reset_gpio)) {
    1102                 ret = PTR_ERR(cs35l56->base.reset_gpio);
    1103 
    1104                 /*
    1105                  * If RESET is shared the first amp to probe will grab the reset
    1106                  * line and reset all the amps
    1107                  */
    1108                 if (ret != -EBUSY)
    1109                         return dev_err_probe(cs35l56->base.dev, ret, "Failed to get reset GPIO\n");
    1110 
    1111                 dev_info(cs35l56->base.dev, "Reset GPIO busy, assume shared reset\n");
    1112                 cs35l56->base.reset_gpio = NULL;
    1113         }
    1114 
    1115         return 0;
    1116 
    1117 err:
    1118         if (ret != -ENODEV)
    1119                 dev_err(cs35l56->base.dev, "Failed property %s: %d\n", property, ret);
    1120 
    1121         return ret;
    1122 }

This email is a free service from the Smatch-CI project [smatch.sf.net].

regards,
dan carpenter

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-04-23  7:08 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-04-23  7:08 [bug report] ALSA: hda: cs35l56: Add support for speaker id Dan Carpenter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox