>>>>>> The trigger callback is handled in the stream lock atomically, >>>>>> and are you sure that you want to operate a possibly heavy task there? >>>>> >>>>> It's a good objection that we didn't think of. >>>> >>>> Doesn't Intel use non atomic trigger to send IPCs which anyway >>>> involve code which can sleep..? >>> >>> sof_sdw.c doesn't seem setting it? >> >> Yes I think init_dai_link() should set it. Maybe Pierre/Bard would know why. > > init_dai_link() is to assign dai link elements only. No IPC is needed. The 'nonatomic' concept is only used for an FE dailink which expose a PCM device: soc-pcm.c: pcm->nonatomic = rtd->dai_link->nonatomic; Setting a BE dailink as 'nonatomic' would not accomplish much since BEs use the 'no_pcm' option. So the question is: is there any issue with sending an IPC in a DAI trigger callback? This is not very different from sending a command on a bus btw, I see a similar example for SLIMbus devices: wcd9335.c: case SNDRV_PCM_TRIGGER_SUSPEND: wcd9335.c- case SNDRV_PCM_TRIGGER_PAUSE_PUSH: wcd9335.c- slim_stream_unprepare(dai_data->sruntime); wcd9335.c- slim_stream_disable(dai_data->sruntime); int slim_stream_unprepare(struct slim_stream_runtime *stream) { int i; for (i = 0; i < stream->num_ports; i++) slim_disconnect_port(stream, &stream->ports[i]); static int slim_disconnect_port(struct slim_stream_runtime *stream, struct slim_port *port) { struct slim_device *sdev = stream->dev; u8 wbuf[1]; struct slim_val_inf msg = {0, 1, NULL, wbuf, NULL}; u8 mc = SLIM_MSG_MC_DISCONNECT_PORT; DEFINE_SLIM_LDEST_TXN(txn, mc, 5, stream->dev->laddr, &msg); wbuf[0] = port->id; port->ch.state = SLIM_CH_STATE_DISCONNECTED; port->state = SLIM_PORT_DISCONNECTED; return slim_do_transfer(sdev->ctrl, &txn); } Such commands may take time...