]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
soundwire: Add a helper function to wait for device initialisation
authorCharles Keepax <ckeepax@opensource.cirrus.com>
Tue, 12 May 2026 10:30:05 +0000 (11:30 +0100)
committerMark Brown <broonie@kernel.org>
Tue, 12 May 2026 10:46:59 +0000 (19:46 +0900)
Add a new helper function to wait for the device to enumerate
and be initialised by the SoundWire core. Most of the SoundWire
drivers have very similar boiler plate code in their runtime
resume, and that boiler plate tends to access various internals
of the SoundWire structs which is a mild layering violation.

Adding a new core helper function greatly eases both of these
issues.

Acked-by: Vinod Koul <vkoul@kernel.org>
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
Link: https://patch.msgid.link/20260512103022.1154645-2-ckeepax@opensource.cirrus.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/soundwire/bus.c
include/linux/soundwire/sdw.h

index fe5316d93fefe7f2b49d788352f7bdd41b878fd0..ea3a24f805c003bffb6b7fcf8527f45d4f0acdfd 100644 (file)
@@ -1372,6 +1372,37 @@ int sdw_slave_get_current_bank(struct sdw_slave *slave)
 }
 EXPORT_SYMBOL_GPL(sdw_slave_get_current_bank);
 
+/**
+ * sdw_slave_wait_for_init - Wait for device initialisation
+ * @slave: Pointer to the SoundWire peripheral.
+ * @timeout_ms: Timeout in milliseconds.
+ *
+ * Wait for a peripheral device to enumerate and be initialised by the
+ * SoundWire core.
+ *
+ * Return: Zero on success, and a negative error code on failure.
+ */
+int sdw_slave_wait_for_init(struct sdw_slave *slave, int timeout_ms)
+{
+       unsigned long time;
+
+       if (!slave->unattach_request)
+               return 0;
+
+       time = wait_for_completion_timeout(&slave->initialization_complete,
+                                          msecs_to_jiffies(timeout_ms));
+       if (!time) {
+               dev_err(&slave->dev, "Initialization not complete\n");
+               sdw_show_ping_status(slave->bus, true);
+               return -ETIMEDOUT;
+       }
+
+       slave->unattach_request = 0;
+
+       return 0;
+}
+EXPORT_SYMBOL_GPL(sdw_slave_wait_for_init);
+
 static int sdw_slave_set_frequency(struct sdw_slave *slave)
 {
        int scale_index;
index 6147eb1fb210d61c91c0019677fe5a504e659d2b..a46cbaec5949122100d42c793f65273bd905356a 100644 (file)
@@ -1093,6 +1093,8 @@ int sdw_slave_get_current_bank(struct sdw_slave *sdev);
 
 int sdw_slave_get_scale_index(struct sdw_slave *slave, u8 *base);
 
+int sdw_slave_wait_for_init(struct sdw_slave *slave, int timeout_ms);
+
 /* messaging and data APIs */
 int sdw_read(struct sdw_slave *slave, u32 addr);
 int sdw_write(struct sdw_slave *slave, u32 addr, u8 value);
@@ -1136,6 +1138,12 @@ static inline int sdw_slave_get_current_bank(struct sdw_slave *sdev)
        return -EINVAL;
 }
 
+static inline int sdw_slave_wait_for_init(struct sdw_slave *slave, int timeout_ms)
+{
+       WARN_ONCE(1, "SoundWire API is disabled");
+       return -EINVAL;
+}
+
 /* messaging and data APIs */
 static inline int sdw_read(struct sdw_slave *slave, u32 addr)
 {