firmware: arm_scmi: Exclude transport devices from bus matching
authorSudeep Holla <sudeep.holla@arm.com>
Mon, 17 Mar 2025 10:31:25 +0000 (10:31 +0000)
committerSudeep Holla <sudeep.holla@arm.com>
Mon, 14 Apr 2025 09:12:02 +0000 (10:12 +0100)
Transport devices are currently being unintentionally matched to
drivers with the same name, allowing their probe function to be
invoked. However, the bus notifier prevents them from setting up
handles, rendering them unable to utilize SCMI core functionality.

Instead of relying on the bus notifier which can't prevent bus matching
even if it returns early or error, move the check into the bus matching
logic itself. This change ensures that transport devices are entirely
excluded from driver matching, preventing any unintended probe attempts.

Message-Id: <20250317-b4-scmi_minor_cleanup-v2-5-f4be99bd9864@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
drivers/firmware/arm_scmi/bus.c
drivers/firmware/arm_scmi/driver.c

index cb4f9de1ae7e2da3d226beca032bba11f681df6b..480074824d29f17b43980aeac55125026ff47b9b 100644 (file)
@@ -207,8 +207,10 @@ static int scmi_dev_match_by_id_table(struct scmi_device *scmi_dev,
        if (!id_table || !id_table->name)
                return 0;
 
+       /* Always skip transport devices from matching */
        for (; id_table->protocol_id && id_table->name; id_table++)
                if (id_table->protocol_id == scmi_dev->protocol_id &&
+                   strncmp(scmi_dev->name, "__scmi_transport_device", 23) &&
                    !strcmp(id_table->name, scmi_dev->name))
                        return 1;
        return 0;
index 3ca019a5f7ef4ef2e0509c226b3e393e16750507..43cd410d94f04441804f98ae502446ace83b00dd 100644 (file)
@@ -2819,9 +2819,8 @@ static int scmi_bus_notifier(struct notifier_block *nb,
        struct scmi_info *info = bus_nb_to_scmi_info(nb);
        struct scmi_device *sdev = to_scmi_dev(data);
 
-       /* Skip transport devices and devices of different SCMI instances */
-       if (!strncmp(sdev->name, "__scmi_transport_device", 23) ||
-           sdev->dev.parent != info->dev)
+       /* Skip devices of different SCMI instances */
+       if (sdev->dev.parent != info->dev)
                return NOTIFY_DONE;
 
        switch (action) {