soundwire: fix initializing sysfs for same devices on different buses
authorKrzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Tue, 17 Oct 2023 16:09:33 +0000 (11:09 -0500)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 1 Feb 2024 00:18:47 +0000 (16:18 -0800)
[ Upstream commit 8a8a9ac8a4972ee69d3dd3d1ae43963ae39cee18 ]

If same devices with same device IDs are present on different soundwire
buses, the probe fails due to conflicting device names and sysfs
entries:

  sysfs: cannot create duplicate filename '/bus/soundwire/devices/sdw:0:0217:0204:00:0'

The link ID is 0 for both devices, so they should be differentiated by
the controller ID. Add the controller ID so, the device names and sysfs entries look
like:

  sdw:1:0:0217:0204:00:0 -> ../../../devices/platform/soc@0/6ab0000.soundwire-controller/sdw-master-1-0/sdw:1:0:0217:0204:00:0
  sdw:3:0:0217:0204:00:0 -> ../../../devices/platform/soc@0/6b10000.soundwire-controller/sdw-master-3-0/sdw:3:0:0217:0204:00:0

[PLB changes: use bus->controller_id instead of bus->id]

Fixes: 7c3cd189b86d ("soundwire: Add Master registration")
Cc: stable@vger.kernel.org
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Reviewed-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Co-developed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Tested-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
Acked-by: Mark Brown <broonie@kernel.org>
Tested-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20231017160933.12624-3-pierre-louis.bossart@linux.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/soundwire/slave.c
sound/soc/intel/boards/sof_sdw.c

index c1c1a2a..060c298 100644 (file)
@@ -39,14 +39,14 @@ int sdw_slave_add(struct sdw_bus *bus,
        slave->dev.fwnode = fwnode;
 
        if (id->unique_id == SDW_IGNORED_UNIQUE_ID) {
-               /* name shall be sdw:link:mfg:part:class */
-               dev_set_name(&slave->dev, "sdw:%01x:%04x:%04x:%02x",
-                            bus->link_id, id->mfg_id, id->part_id,
+               /* name shall be sdw:ctrl:link:mfg:part:class */
+               dev_set_name(&slave->dev, "sdw:%01x:%01x:%04x:%04x:%02x",
+                            bus->controller_id, bus->link_id, id->mfg_id, id->part_id,
                             id->class_id);
        } else {
-               /* name shall be sdw:link:mfg:part:class:unique */
-               dev_set_name(&slave->dev, "sdw:%01x:%04x:%04x:%02x:%01x",
-                            bus->link_id, id->mfg_id, id->part_id,
+               /* name shall be sdw:ctrl:link:mfg:part:class:unique */
+               dev_set_name(&slave->dev, "sdw:%01x:%01x:%04x:%04x:%02x:%01x",
+                            bus->controller_id, bus->link_id, id->mfg_id, id->part_id,
                             id->class_id, id->unique_id);
        }
 
index 24e966a..9ed5721 100644 (file)
@@ -1197,11 +1197,11 @@ static int fill_sdw_codec_dlc(struct device *dev,
        else if (is_unique_device(adr_link, sdw_version, mfg_id, part_id,
                                  class_id, adr_index))
                codec->name = devm_kasprintf(dev, GFP_KERNEL,
-                                            "sdw:%01x:%04x:%04x:%02x", link_id,
+                                            "sdw:0:%01x:%04x:%04x:%02x", link_id,
                                             mfg_id, part_id, class_id);
        else
                codec->name = devm_kasprintf(dev, GFP_KERNEL,
-                                            "sdw:%01x:%04x:%04x:%02x:%01x", link_id,
+                                            "sdw:0:%01x:%04x:%04x:%02x:%01x", link_id,
                                             mfg_id, part_id, class_id, unique_id);
 
        if (!codec->name)