diff --git a/arch/arm64/boot/dts/apple/t600x-die0.dtsi b/arch/arm64/boot/dts/apple/t600x-die0.dtsi
index 8121137f968091a..590271969f868a0 100644
--- a/arch/arm64/boot/dts/apple/t600x-die0.dtsi
+++ b/arch/arm64/boot/dts/apple/t600x-die0.dtsi
@@ -208,21 +208,22 @@
 		mbox-names = "mbox";
 		iommus = <&aop_dart 0>;
 
-		/* HACK: ensure probe order */
-		dmas = <&aop_admac 15>;
-		dma-names = "invalid-order-only";
-
 		status = "disabled";
 
 		aop_audio: audio {
+			compatible = "apple,t6000-aop-audio", "apple,aop-audio";
 			dmas = <&aop_admac 1>;
 			dma-names = "dma";
 		};
 
 		aop_als: als {
+			compatible = "apple,t6000-aop-als", "apple,aop-als";
 			// intentionally empty
 		};
 
+		las {
+			compatible = "apple,t6000-aop-las", "apple,aop-las";
+		};
 	};
 
 	disp0_dart: iommu@38b304000 {
diff --git a/arch/arm64/boot/dts/apple/t602x-die0.dtsi b/arch/arm64/boot/dts/apple/t602x-die0.dtsi
index 26b205ed335940d..06354a9b78872a7 100644
--- a/arch/arm64/boot/dts/apple/t602x-die0.dtsi
+++ b/arch/arm64/boot/dts/apple/t602x-die0.dtsi
@@ -209,20 +209,22 @@
 		mbox-names = "mbox";
 		iommus = <&aop_dart 0>;
 
-		/* HACK: ensure probe order */
-		dmas = <&aop_admac 15>;
-		dma-names = "invalid-order-only";
-
 		status = "disabled";
 
 		aop_audio: audio {
+			compatible = "apple,t6020-aop-audio", "apple,aop-audio";
 			dmas = <&aop_admac 1>;
 			dma-names = "dma";
 		};
 
 		aop_als: als {
+			compatible = "apple,t6020-aop-als", "apple,aop-als";
 			// intentionally empty
 		};
+
+		las {
+			compatible = "apple,t6020-aop-las", "apple,aop-las";
+		};
 	};
 
 	mtp: mtp@2a9400000 {
diff --git a/arch/arm64/boot/dts/apple/t8103.dtsi b/arch/arm64/boot/dts/apple/t8103.dtsi
index 9c0352a42d26a37..7d61ec5bc2fcb2b 100644
--- a/arch/arm64/boot/dts/apple/t8103.dtsi
+++ b/arch/arm64/boot/dts/apple/t8103.dtsi
@@ -1371,20 +1371,22 @@
 			mbox-names = "mbox";
 			iommus = <&aop_dart 0>;
 
-			/* HACK: ensure probe order */
-			dmas = <&aop_admac 15>;
-			dma-names = "invalid-order-only";
-
 			status = "disabled";
 
 			aop_audio: audio {
+				compatible = "apple,t8103-aop-audio", "apple,aop-audio";
 				dmas = <&aop_admac 1>;
 				dma-names = "dma";
 			};
 
 			aop_als: als {
+				compatible = "apple,t8103-aop-als", "apple,aop-als";
 				// intentionally empty
 			};
+
+			las {
+				compatible = "apple,t8103-aop-las", "apple,aop-las";
+			};
 		};
 
 		dispext0_dart: iommu@271304000 {
diff --git a/arch/arm64/boot/dts/apple/t8112.dtsi b/arch/arm64/boot/dts/apple/t8112.dtsi
index 4e93393536dc2f6..981a8e96eba295d 100644
--- a/arch/arm64/boot/dts/apple/t8112.dtsi
+++ b/arch/arm64/boot/dts/apple/t8112.dtsi
@@ -1455,20 +1455,22 @@
 			mbox-names = "mbox";
 			iommus = <&aop_dart 0>;
 
-			/* HACK: ensure probe order */
-			dmas = <&aop_admac 15>;
-			dma-names = "invalid-order-only";
-
 			status = "disabled";
 
 			aop_audio: audio {
+				compatible = "apple,t8112-aop-audio", "apple,aop-audio";
 				dmas = <&aop_admac 1>;
 				dma-names = "dma";
 			};
 
 			aop_als: als {
+				compatible = "apple,t8112-aop-als", "apple,aop-als";
 				// intentionally empty
 			};
+
+			las {
+				compatible = "apple,t8112-aop-las", "apple,aop-las";
+			};
 		};
 
 		mtp: mtp@24e400000 {
diff --git a/drivers/iio/common/aop_sensors/aop_als.rs b/drivers/iio/common/aop_sensors/aop_als.rs
index d9d454bb33eb934..ed873c8c1735091 100644
--- a/drivers/iio/common/aop_sensors/aop_als.rs
+++ b/drivers/iio/common/aop_sensors/aop_als.rs
@@ -79,7 +79,12 @@ impl MessageProcessor for MsgProc {
 #[repr(transparent)]
 struct IIOAopAlsDriver(IIORegistration<MsgProc>);
 
-kernel::of_device_table!(OF_TABLE, MODULE_OF_TABLE, (), [] as [(of::DeviceId, ()); 0]);
+kernel::of_device_table!(
+    OF_TABLE,
+    MODULE_OF_TABLE,
+    (),
+    [(of::DeviceId::new(c_str!("apple,aop-als")), ())]
+);
 
 impl platform::Driver for IIOAopAlsDriver {
     type IdInfo = ();
diff --git a/drivers/iio/common/aop_sensors/aop_las.rs b/drivers/iio/common/aop_sensors/aop_las.rs
index 0dcb6e6cc5bd58c..35bb8ec35e28f4f 100644
--- a/drivers/iio/common/aop_sensors/aop_las.rs
+++ b/drivers/iio/common/aop_sensors/aop_las.rs
@@ -26,7 +26,12 @@ impl MessageProcessor for MsgProc {
 #[repr(transparent)]
 struct IIOAopLasDriver(IIORegistration<MsgProc>);
 
-kernel::of_device_table!(OF_TABLE, MODULE_OF_TABLE, (), [] as [(of::DeviceId, ()); 0]);
+kernel::of_device_table!(
+    OF_TABLE,
+    MODULE_OF_TABLE,
+    (),
+    [(of::DeviceId::new(c_str!("apple,aop-las")), ())]
+);
 
 impl platform::Driver for IIOAopLasDriver {
     type IdInfo = ();
diff --git a/drivers/soc/apple/aop.rs b/drivers/soc/apple/aop.rs
index 8f9558e8d507ea9..efd5f5215df8cda 100644
--- a/drivers/soc/apple/aop.rs
+++ b/drivers/soc/apple/aop.rs
@@ -9,7 +9,6 @@ use core::{arch::asm, mem, ptr, slice};
 
 use kernel::{
     bindings, c_str, device,
-    device::property::FwNode,
     device::Core,
     devres::Devres,
     dma::{dma_bit_mask, CoherentAllocation},
@@ -583,13 +582,10 @@ struct AopServiceRegisterWork {
     name: &'static CStr,
     data: Arc<AopData>,
     service: EPICService,
-    fwnode: Option<ARef<FwNode>>,
     #[pin]
     work: Work<AopServiceRegisterWork>,
 }
 
-unsafe impl Send for AopServiceRegisterWork {}
-
 impl_has_work! {
     impl HasWork<Self, 0> for AopServiceRegisterWork { self.work }
 }
@@ -599,11 +595,10 @@ impl AopServiceRegisterWork {
         name: &'static CStr,
         data: Arc<AopData>,
         service: EPICService,
-        fwnode: Option<ARef<FwNode>>,
     ) -> Result<Pin<KBox<Self>>> {
         KBox::pin_init(
             pin_init!(AopServiceRegisterWork {
-                name, data, service, fwnode,
+                name, data, service,
                 work <- new_work!("AopServiceRegisterWork::work"),
             }),
             GFP_KERNEL,
@@ -615,6 +610,11 @@ impl WorkItem for AopServiceRegisterWork {
     type Pointer = Pin<KBox<AopServiceRegisterWork>>;
 
     fn run(this: Pin<KBox<AopServiceRegisterWork>>) {
+        let fwnode = this
+            .data
+            .dev
+            .fwnode()
+            .and_then(|x| x.get_child_by_name(this.name));
         let info = bindings::platform_device_info {
             parent: this.data.dev.as_raw(),
             name: this.name.as_ptr() as *const _,
@@ -624,7 +624,7 @@ impl WorkItem for AopServiceRegisterWork {
             data: &this.service as *const EPICService as *const _,
             size_data: mem::size_of::<EPICService>(),
             dma_mask: 0,
-            fwnode: this.fwnode.as_ref().map(|x| x.as_raw()).unwrap_or_default(),
+            fwnode: fwnode.map(|x| x.as_raw()).unwrap_or_default(),
             properties: ptr::null_mut(),
             of_node_reused: false,
         };
@@ -701,17 +701,16 @@ impl AopData {
             channel,
             endpoint: ep.index,
         };
-        let (dev_name, of_child) = match name {
-            b"aop-audio" => (c_str!("snd_soc_apple_aop"), Some(c_str!("audio"))),
-            b"las" => (c_str!("iio_aop_las"), None),
-            b"als" => (c_str!("iio_aop_als"), Some(c_str!("als"))),
+        let dev_name = match name {
+            b"aop-audio" => c_str!("audio"),
+            b"las" => c_str!("las"),
+            b"als" => c_str!("als"),
             _ => {
                 return Ok(());
             }
         };
-        let fwnode = of_child.and_then(|x| self.dev.fwnode()?.get_child_by_name(x));
         // probe can call back into us, run it with locks dropped.
-        let work = AopServiceRegisterWork::new(dev_name, self, svc, fwnode)?;
+        let work = AopServiceRegisterWork::new(dev_name, self, svc)?;
         workqueue::system().enqueue(work);
         Ok(())
     }
diff --git a/sound/soc/apple/aop_audio.rs b/sound/soc/apple/aop_audio.rs
index 4c5f1cfadfc3bc9..4a5be21349ab5a2 100644
--- a/sound/soc/apple/aop_audio.rs
+++ b/sound/soc/apple/aop_audio.rs
@@ -653,7 +653,12 @@ impl Drop for SndSocAopDriver {
 unsafe impl Send for SndSocAopDriver {}
 unsafe impl Sync for SndSocAopDriver {}
 
-kernel::of_device_table!(OF_TABLE, MODULE_OF_TABLE, (), [] as [(of::DeviceId, ()); 0]);
+kernel::of_device_table!(
+    OF_TABLE,
+    MODULE_OF_TABLE,
+    (),
+    [(of::DeviceId::new(c_str!("apple,aop-audio")), ())]
+);
 
 impl platform::Driver for SndSocAopDriver {
     type IdInfo = ();
