Простейший вопрос вроде.. Но примитивы синхронизации работают либо в ядре, либо в юзере. Может надо использовать select над файловым дескриптором? А что в драйвере делать? Я вообще в том направлении смотрю хоть? У меня ДМА запускается по пользовательскому запросу, после чего желательно уступить поток, пробудить по окончании.
Бывает сложнее, когда один драйвер должен пользоваться другим. Ну например, драйвер UART должен давать задание на DMA, причем DMA выполнен как большой независимый ресурс, а не какой-то там встроенный в UART дополнительный модуль.