Skip to content

Commit ecfcb72

Browse files
committed
fixup! soc: apple: Add support for the AOP co-processor.
Adpapt to current IoMem series. Signed-off-by: Janne Grunau <j@jannau.net>
1 parent b690fb7 commit ecfcb72

1 file changed

Lines changed: 29 additions & 14 deletions

File tree

drivers/soc/apple/aop.rs

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use kernel::{
1212
devres::Devres,
1313
dma::CoherentAllocation,
1414
error::from_err_ptr,
15-
io_mem::IoMem,
15+
io::mem::IoMem,
1616
module_platform_driver, new_condvar, new_mutex, of, platform,
1717
prelude::*,
1818
soc::apple::aop::{from_fourcc, EPICService, FakehidListener, AOP},
@@ -557,8 +557,8 @@ unsafe impl Send for ListenerEntry {}
557557
#[pin_data]
558558
struct AopData {
559559
dev: ARef<device::Device>,
560-
aop_mmio: IoMem<AOP_MMIO_SIZE>,
561-
asc_mmio: IoMem<ASC_MMIO_SIZE>,
560+
aop_mmio: Devres<IoMem<AOP_MMIO_SIZE>>,
561+
asc_mmio: Devres<IoMem<ASC_MMIO_SIZE>>,
562562
#[pin]
563563
rtkit: Mutex<Option<rtkit::RtKit<AopData>>>,
564564
#[pin]
@@ -637,13 +637,16 @@ impl WorkItem for AopServiceRegisterWork {
637637
}
638638

639639
impl AopData {
640-
fn new(pdev: &mut platform::Device) -> Result<Arc<AopData>> {
641-
let aop_mmio = unsafe { pdev.ioremap_resource(0)? };
642-
let asc_mmio = unsafe { pdev.ioremap_resource(1)? };
640+
fn new(pdev: &platform::Device) -> Result<Arc<AopData>> {
641+
let dev = ARef::<device::Device>::from(pdev.as_ref());
642+
let aop_res = pdev.resource(0).ok_or(EINVAL)?;
643+
let asc_res = pdev.resource(1).ok_or(EINVAL)?;
644+
let aop_mmio = pdev.ioremap_resource_sized::<AOP_MMIO_SIZE>(aop_res)?;
645+
let asc_mmio = pdev.ioremap_resource_sized::<ASC_MMIO_SIZE>(asc_res)?;
643646
Arc::pin_init(
644647
pin_init!(
645648
AopData {
646-
dev: pdev.get_device(),
649+
dev,
647650
aop_mmio,
648651
asc_mmio,
649652
rtkit <- new_mutex!(None),
@@ -733,7 +736,11 @@ impl AopData {
733736
}
734737

735738
fn aop_read32(&self, off: usize) -> u32 {
736-
self.aop_mmio.readl_relaxed(off)
739+
if let Some(aop_mmio) = self.aop_mmio.try_access() {
740+
aop_mmio.readl_relaxed(off)
741+
} else {
742+
0
743+
}
737744
}
738745

739746
fn patch_bootargs(&self, patches: &[(u32, u32)]) -> Result<()> {
@@ -743,7 +750,10 @@ impl AopData {
743750
for _ in 0..size {
744751
arg_bytes.push(0, GFP_KERNEL).unwrap();
745752
}
746-
self.aop_mmio.try_memcpy_fromio(&mut arg_bytes, offset)?;
753+
{
754+
let aop_mmio = self.aop_mmio.try_access().ok_or(ENXIO)?;
755+
aop_mmio.try_memcpy_fromio(&mut arg_bytes, offset)?;
756+
}
747757
let mut idx = 0;
748758
while idx < size {
749759
let key = u32::from_le_bytes(arg_bytes[idx..idx + 4].try_into().unwrap());
@@ -758,12 +768,17 @@ impl AopData {
758768
}
759769
idx += size;
760770
}
761-
self.aop_mmio.try_memcpy_toio(offset, &arg_bytes)
771+
{
772+
let aop_mmio = self.aop_mmio.try_access().ok_or(ENXIO)?;
773+
aop_mmio.try_memcpy_toio(offset, &arg_bytes)
774+
}
762775
}
763776

764-
fn start_cpu(&self) {
765-
let val = self.asc_mmio.readl_relaxed(CPU_CONTROL);
766-
self.asc_mmio.writel_relaxed(val | CPU_RUN, CPU_CONTROL);
777+
fn start_cpu(&self) -> Result<()> {
778+
let asc_mmio = self.asc_mmio.try_access().ok_or(ENXIO)?;
779+
let val = asc_mmio.readl_relaxed(CPU_CONTROL);
780+
asc_mmio.writel_relaxed(val | CPU_RUN, CPU_CONTROL);
781+
Ok(())
767782
}
768783
}
769784

@@ -868,7 +883,7 @@ impl platform::Driver for AopDriver {
868883
])?;
869884
let rtkit = rtkit::RtKit::<AopData>::new(&dev, None, 0, data.clone())?;
870885
*data.rtkit.lock() = Some(rtkit);
871-
data.start_cpu();
886+
let _ = data.start_cpu();
872887
data.start()?;
873888
let data = data as Arc<dyn AOP>;
874889
Ok(KBox::pin(AopDriver(data), GFP_KERNEL)?)

0 commit comments

Comments
 (0)