};
 
 struct fsi_stream_handler {
+       int (*init)(struct fsi_priv *fsi, struct fsi_stream *io);
+       int (*quit)(struct fsi_priv *fsi, struct fsi_stream *io);
        int (*probe)(struct fsi_priv *fsi, struct fsi_stream *io);
        int (*transfer)(struct fsi_priv *fsi, struct fsi_stream *io);
        int (*remove)(struct fsi_priv *fsi, struct fsi_stream *io);
        io->sample_width        = samples_to_bytes(runtime, 1);
        io->oerr_num    = -1; /* ignore 1st err */
        io->uerr_num    = -1; /* ignore 1st err */
+       fsi_stream_handler_call(io, init, fsi, io);
        spin_unlock_irqrestore(&master->lock, flags);
 }
 
        if (io->uerr_num > 0)
                dev_err(dai->dev, "under_run = %d\n", io->uerr_num);
 
+       fsi_stream_handler_call(io, quit, fsi, io);
        io->substream   = NULL;
        io->buff_sample_capa    = 0;
        io->buff_sample_pos     = 0;