Re: [PATCH 01/17] soundwire: Add a helper function to wait for device initialisation

From: Charles Keepax

Date: Tue May 05 2026 - 12:57:58 EST


On Tue, May 05, 2026 at 05:47:51PM +0100, Charles Keepax wrote:
> 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.
>
> Signed-off-by: Charles Keepax <ckeepax@xxxxxxxxxxxxxxxxxxxxx>
> ---

Sorry Vinod, it appears I somehow completely forgot to CC you on
this series. Let me know if you got it through the mailing list,
and if not I will do a resend.

Thanks,
Charles

> drivers/soundwire/bus.c | 21 +++++++++++++++++++++
> include/linux/soundwire/sdw.h | 2 ++
> 2 files changed, 23 insertions(+)
>
> diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
> index fe5316d93fefe..b9ca35e530a3b 100644
> --- a/drivers/soundwire/bus.c
> +++ b/drivers/soundwire/bus.c
> @@ -1372,6 +1372,27 @@ int sdw_slave_get_current_bank(struct sdw_slave *slave)
> }
> EXPORT_SYMBOL_GPL(sdw_slave_get_current_bank);
>
> +int sdw_slave_wait_for_init(struct sdw_slave *slave, int timeout)
> +{
> + unsigned long time;
> +
> + if (!slave->unattach_request)
> + return 0;
> +
> + time = wait_for_completion_timeout(&slave->initialization_complete,
> + msecs_to_jiffies(timeout));
> + 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;
> diff --git a/include/linux/soundwire/sdw.h b/include/linux/soundwire/sdw.h
> index 6147eb1fb210d..847b001d1a774 100644
> --- a/include/linux/soundwire/sdw.h
> +++ b/include/linux/soundwire/sdw.h
> @@ -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);
> +
> /* messaging and data APIs */
> int sdw_read(struct sdw_slave *slave, u32 addr);
> int sdw_write(struct sdw_slave *slave, u32 addr, u8 value);
> --
> 2.47.3
>