[RFC PATCH] soundwire: use driver callbacks directly with proper locking

Pierre-Louis Bossart pierre-louis.bossart at linux.intel.com
Thu Apr 14 23:17:31 CEST 2022


>>> @@ -846,12 +847,18 @@ static int sdw_slave_clk_stop_callback(struct sdw_slave *slave,
>>>  				       enum sdw_clk_stop_mode mode,
>>>  				       enum sdw_clk_stop_type type)
>>>  {
>>> -	int ret;
>>> +	struct device *dev = &slave->dev;
>>> +	struct sdw_driver *drv;
>>>  
>>> -	if (slave->ops && slave->ops->clk_stop) {
>>> -		ret = slave->ops->clk_stop(slave, mode, type);
>>> -		if (ret < 0)
>>> -			return ret;
>>> +	/*
>>> +	 * this function can only be called from a pm_runtime
>>> +	 * sequence where the device is already locked
>>> +	 */
>>
>> If this is guaranteed..
>>
>>> +
>>> +	if (dev->driver) {
>>
>> do we need to check this? Did you find a case where this was not valid
>> while device is locked, maybe do this while holding the lock (kind of
>> moot to process the calls if driver is gone)
> 
> Humm, good feedback. I will re-check for cases where the driver is 'blacklisted' and also cases there there's no power management supported.

I rechecked all this and it turns out I was mistaken. This function is part of a pm_runtime sequence indeed, but at the parent bus/manager device level. I confused levels and adding a deplock_assert showed very quickly that the peripheral device was never locked.

Thanks for pushing back on this!

In all other cases, I think it's valid and safe to take the lock and test dev->driver. It can happen that there is no driver enabled in the build, or that the driver is 'blacklisted', and in theory the user could muck with sysfs to trigger a peripheral driver binding sequence that would happen smack while the bus is suspended or resume.

I'll do more validation and send an update next week.

-Pierre



More information about the Alsa-devel mailing list