On 9/12/22 17:36, Richard Fitzgerald wrote: > On 12/09/2022 11:53, Pierre-Louis Bossart wrote: >> >> >> On 9/7/22 12:14, Richard Fitzgerald wrote: >>> The cadence_master code needs the interrupt to complete message >>> transfers. >>> When the bus driver is being removed child drivers are removed, and >>> their >>> remove actions might need bus transactions. >>> >>> Use the sdw_master_ops.remove callback to disable the interrupt handling >>> only after the child drivers have been removed. >>> >>> Signed-off-by: Richard Fitzgerald <rf@xxxxxxxxxxxxxxxxxxxxx> >>> --- >>> drivers/soundwire/intel.c | 9 ++++++++- >>> 1 file changed, 8 insertions(+), 1 deletion(-) >>> >>> diff --git a/drivers/soundwire/intel.c b/drivers/soundwire/intel.c >>> index 01be62fa6c83..d5e723a9c80b 100644 >>> --- a/drivers/soundwire/intel.c >>> +++ b/drivers/soundwire/intel.c >>> @@ -1255,6 +1255,13 @@ static int intel_prop_read(struct sdw_bus *bus) >>> return 0; >>> } >>> +static void intel_bus_remove(struct sdw_bus *bus) >>> +{ >>> + struct sdw_cdns *cdns = bus_to_cdns(bus); >>> + >>> + sdw_cdns_enable_interrupt(cdns, false); >> >> don't you need to check for any on-going transactions on the bus? >> > > As all the child drivers have removed, I think the only other place that > can generate bus transactions is the PING handler but > sdw_cdns_enable_interrupt(false) calls cancel_work_sync() to > cancel the cdns->work and it sets a flag so that it will not be > re-queued. > >> I wonder if there could be a corner case where there are no child >> devices but still a device physically attached to the bus. I am not sure >> if the 'no devices left' is a good-enough indication of no activity on >> the bus. >> > > As above - yes there could, but sdw_cdns_enable_interrupt(false) will > cancel the work and stop it being re-queued. Ah yes, I forgot that part, thanks! Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@xxxxxxxxxxxxxxx>