Commit 7afc50e4 authored by Pierre-Louis Bossart's avatar Pierre-Louis Bossart Committed by Vinod Koul

soundwire: sdw_slave: add initialization_complete definition

Slave drivers may have different ways of handling their settings, with
or without regmap.

During the integration of codec drivers, done in partnership between
Intel and Realtek, it became desirable to implement a predictable
order between low-level initializations performed in .update_status()
(invoked by an interrupt thread) and the settings restored in the
resume steps (invoked by the PM core).

This patch builds on the previous solution to wait for the Slave
device to be fully enumerated. The complete() in this case is signaled
not before the .update_status() is called, but after .update_status()
returns. Without this patch, the settings were not properly restored,
leading to timing-dependent 'no sound after resume' or 'no headset
detected after resume' bug reports.

Depending on how initialization is handled, a Slave device driver may
wait for enumeration_complete, or for initialization_complete, both
are valid synchronization points. They are initialized at the same
time, they only differ on when complete() is invoked.
Signed-off-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Link: https://lore.kernel.org/r/20191212014507.28050-4-pierre-louis.bossart@linux.intel.comSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent fbbff363
...@@ -554,6 +554,8 @@ struct sdw_slave_ops { ...@@ -554,6 +554,8 @@ struct sdw_slave_ops {
* @enumeration_complete: completion utility to control potential races * @enumeration_complete: completion utility to control potential races
* on startup between device enumeration and read/write access to the * on startup between device enumeration and read/write access to the
* Slave device * Slave device
* @initialization_complete: completion utility to control potential races
* on startup between device enumeration and settings being restored
*/ */
struct sdw_slave { struct sdw_slave {
struct sdw_slave_id id; struct sdw_slave_id id;
...@@ -571,6 +573,7 @@ struct sdw_slave { ...@@ -571,6 +573,7 @@ struct sdw_slave {
bool probed; bool probed;
struct completion probe_complete; struct completion probe_complete;
struct completion enumeration_complete; struct completion enumeration_complete;
struct completion initialization_complete;
}; };
#define dev_to_sdw_dev(_dev) container_of(_dev, struct sdw_slave, dev) #define dev_to_sdw_dev(_dev) container_of(_dev, struct sdw_slave, dev)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment