I think the delayed amp off would be much easier/cleaner if you used delayed_work instead of a timer.
https://www.kernel.org/doc/Documentation/workqueue.txt

You just need to call ```INIT_DELAYED_WORK(&chip->work, snd_legoev3_pcm_stop);``` in snd_legoev3_probe, then you would call ```schedule_delayed_work(&chip->work, msecs_to_jiffies(1000));``` here and ```cancel_delayed_work_sync(&chip->work);``` in case SNDRV_PCM_TRIGGER_START and snd_legoev3_remove.

Also, I would make the delay for turning off the amp ~1sec instead of right after the ramp down. Sometimes playback stops and starts in rapid succession and there is no reason to turn the amp off and back on in this short amount of time.

When playing around, it seems that you have fixed the issue with pops during the volume change, but if I run ```speaker-test```, I am still getting alot of pops. It loops a wave file or sine wave and stops and restarts in between each one. This is where you hear the pops.