separate device interfaces from driver implementations