Skip to content

Commit 020b056

Browse files
committed
Merge branch 'bits/250-aop' into asahi-wip
2 parents 705ecbb + da9cf4c commit 020b056

File tree

30 files changed

+2664
-4
lines changed

30 files changed

+2664
-4
lines changed

drivers/iio/common/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
# IIO common modules
44
#
55

6+
source "drivers/iio/common/aop_sensors/Kconfig"
67
source "drivers/iio/common/cros_ec_sensors/Kconfig"
78
source "drivers/iio/common/hid-sensors/Kconfig"
89
source "drivers/iio/common/inv_sensors/Kconfig"

drivers/iio/common/Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
#
99

1010
# When adding new entries keep the list in alphabetical order
11+
obj-y += aop_sensors/
1112
obj-y += cros_ec_sensors/
1213
obj-y += hid-sensors/
1314
obj-y += inv_sensors/
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# SPDX-License-Identifier: GPL-2.0-only OR MIT
2+
3+
config IIO_AOP_SENSOR_LAS
4+
tristate "AOP Lid angle sensor"
5+
depends on ARCH_APPLE || COMPILE_TEST
6+
depends on RUST
7+
depends on SYSFS
8+
select APPLE_AOP
9+
default m if ARCH_APPLE
10+
help
11+
Module to handle the lid angle sensor attached to the AOP
12+
coprocessor on Apple laptops.
13+
14+
config IIO_AOP_SENSOR_ALS
15+
tristate "AOP Ambient light sensor"
16+
depends on ARCH_APPLE || COMPILE_TEST
17+
depends on RUST
18+
depends on SYSFS
19+
select APPLE_AOP
20+
default m if ARCH_APPLE
21+
help
22+
Module to handle the ambient light sensor attached to the AOP
23+
coprocessor on Apple laptops.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# SPDX-License-Identifier: GPL-2.0-only OR MIT
2+
3+
obj-$(CONFIG_IIO_AOP_SENSOR_LAS) += aop_las.o
4+
obj-$(CONFIG_IIO_AOP_SENSOR_ALS) += aop_als.o
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
// SPDX-License-Identifier: GPL-2.0-only OR MIT
2+
3+
//! Apple AOP ambient light sensor driver
4+
//!
5+
//! Copyright (C) The Asahi Linux Contributors
6+
7+
use kernel::{
8+
bindings, c_str,
9+
iio::common::aop_sensors::{AopSensorData, IIORegistration, MessageProcessor},
10+
module_platform_driver,
11+
of::{self, Node},
12+
platform,
13+
prelude::*,
14+
soc::apple::aop::{EPICService, AOP},
15+
sync::Arc,
16+
types::ForeignOwnable,
17+
};
18+
19+
const EPIC_SUBTYPE_SET_ALS_PROPERTY: u16 = 0x4;
20+
21+
fn enable_als(aop: &dyn AOP, dev: &platform::Device, of: &Node, svc: &EPICService) -> Result<()> {
22+
if let Some(prop) = of.find_property(c_str!("apple,als-calibration")) {
23+
set_als_property(aop, svc, 0xb, prop.value())?;
24+
set_als_property(aop, svc, 0, &200000u32.to_le_bytes())?;
25+
} else {
26+
dev_warn!(
27+
dev.as_ref(),
28+
"ALS Calibration not found, will not enable it"
29+
);
30+
}
31+
Ok(())
32+
}
33+
fn set_als_property(aop: &dyn AOP, svc: &EPICService, tag: u32, data: &[u8]) -> Result<u32> {
34+
let mut buf = KVec::new();
35+
buf.resize(data.len() + 8, 0, GFP_KERNEL)?;
36+
buf[8..].copy_from_slice(data);
37+
buf[4..8].copy_from_slice(&tag.to_le_bytes());
38+
aop.epic_call(svc, EPIC_SUBTYPE_SET_ALS_PROPERTY, &buf)
39+
}
40+
41+
fn f32_to_u32(f: u32) -> u32 {
42+
if f & 0x80000000 != 0 {
43+
return 0;
44+
}
45+
let exp = ((f & 0x7f800000) >> 23) as i32 - 127;
46+
if exp < 0 {
47+
return 0;
48+
}
49+
if exp == 128 && f & 0x7fffff != 0 {
50+
return 0;
51+
}
52+
let mant = f & 0x7fffff | 0x800000;
53+
if exp <= 23 {
54+
return mant >> (23 - exp);
55+
}
56+
if exp >= 32 {
57+
return u32::MAX;
58+
}
59+
mant << (exp - 23)
60+
}
61+
62+
struct MsgProc(usize);
63+
64+
impl MessageProcessor for MsgProc {
65+
fn process(&self, message: &[u8]) -> u32 {
66+
let offset = self.0;
67+
let raw = u32::from_le_bytes(message[offset..offset + 4].try_into().unwrap());
68+
f32_to_u32(raw)
69+
}
70+
}
71+
72+
#[repr(transparent)]
73+
struct IIOAopAlsDriver(IIORegistration<MsgProc>);
74+
75+
kernel::of_device_table!(OF_TABLE, MODULE_OF_TABLE, (), [] as [(of::DeviceId, ()); 0]);
76+
77+
impl platform::Driver for IIOAopAlsDriver {
78+
type IdInfo = ();
79+
80+
const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE);
81+
82+
fn probe(
83+
pdev: &mut platform::Device,
84+
_info: Option<&()>,
85+
) -> Result<Pin<KBox<IIOAopAlsDriver>>> {
86+
let dev = pdev.as_ref();
87+
let parent = dev.parent().unwrap();
88+
// SAFETY: our parent is AOP, and AopDriver is repr(transparent) for Arc<dyn Aop>
89+
let adata_ptr = unsafe { Pin::<KBox<Arc<dyn AOP>>>::borrow(parent.get_drvdata()) };
90+
let adata = (&*adata_ptr).clone();
91+
// SAFETY: AOP sets the platform data correctly
92+
let service = unsafe { *((*dev.as_raw()).platform_data as *const EPICService) };
93+
let of = parent
94+
.of_node()
95+
.ok_or(EIO)?
96+
.get_child_by_name(c_str!("als"))
97+
.ok_or(EIO)?;
98+
let ty = bindings::BINDINGS_IIO_LIGHT;
99+
let data = AopSensorData::new(pdev.clone(), ty, MsgProc(40))?;
100+
adata.add_fakehid_listener(service, data.clone())?;
101+
enable_als(adata.as_ref(), pdev, &of, &service)?;
102+
let info_mask = 1 << bindings::BINDINGS_IIO_CHAN_INFO_PROCESSED;
103+
Ok(KBox::pin(
104+
IIOAopAlsDriver(IIORegistration::<MsgProc>::new(
105+
data,
106+
c_str!("aop-sensors-als"),
107+
ty,
108+
info_mask,
109+
&THIS_MODULE,
110+
)?),
111+
GFP_KERNEL,
112+
)?)
113+
}
114+
}
115+
116+
module_platform_driver! {
117+
type: IIOAopAlsDriver,
118+
name: "iio_aop_als",
119+
license: "Dual MIT/GPL",
120+
alias: ["platform:iio_aop_als"],
121+
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// SPDX-License-Identifier: GPL-2.0-only OR MIT
2+
3+
//! Apple AOP lid angle sensor driver
4+
//!
5+
//! Copyright (C) The Asahi Linux Contributors
6+
7+
use kernel::{
8+
bindings, c_str,
9+
iio::common::aop_sensors::{AopSensorData, IIORegistration, MessageProcessor},
10+
module_platform_driver, of, platform,
11+
prelude::*,
12+
soc::apple::aop::{EPICService, AOP},
13+
sync::Arc,
14+
types::ForeignOwnable,
15+
};
16+
17+
struct MsgProc;
18+
19+
impl MessageProcessor for MsgProc {
20+
fn process(&self, message: &[u8]) -> u32 {
21+
message[1] as u32
22+
}
23+
}
24+
25+
#[repr(transparent)]
26+
struct IIOAopLasDriver(IIORegistration<MsgProc>);
27+
28+
kernel::of_device_table!(OF_TABLE, MODULE_OF_TABLE, (), [] as [(of::DeviceId, ()); 0]);
29+
30+
impl platform::Driver for IIOAopLasDriver {
31+
type IdInfo = ();
32+
33+
const OF_ID_TABLE: Option<of::IdTable<Self::IdInfo>> = Some(&OF_TABLE);
34+
35+
fn probe(
36+
pdev: &mut platform::Device,
37+
_info: Option<&()>,
38+
) -> Result<Pin<KBox<IIOAopLasDriver>>> {
39+
let dev = pdev.as_ref();
40+
let parent = dev.parent().unwrap();
41+
// SAFETY: our parent is AOP, and AopDriver is repr(transparent) for Arc<dyn Aop>
42+
let adata_ptr = unsafe { Pin::<KBox<Arc<dyn AOP>>>::borrow(parent.get_drvdata()) };
43+
let adata = (&*adata_ptr).clone();
44+
// SAFETY: AOP sets the platform data correctly
45+
let service = unsafe { *((*dev.as_raw()).platform_data as *const EPICService) };
46+
47+
let ty = bindings::BINDINGS_IIO_ANGL;
48+
let data = AopSensorData::new(pdev.clone(), ty, MsgProc)?;
49+
adata.add_fakehid_listener(service, data.clone())?;
50+
let info_mask = 1 << bindings::BINDINGS_IIO_CHAN_INFO_RAW;
51+
Ok(KBox::pin(
52+
IIOAopLasDriver(IIORegistration::<MsgProc>::new(
53+
data,
54+
c_str!("aop-sensors-las"),
55+
ty,
56+
info_mask,
57+
&THIS_MODULE,
58+
)?),
59+
GFP_KERNEL,
60+
)?)
61+
}
62+
}
63+
64+
module_platform_driver! {
65+
type: IIOAopLasDriver,
66+
name: "iio_aop_las",
67+
license: "Dual MIT/GPL",
68+
alias: ["platform:iio_aop_las"],
69+
}

drivers/soc/apple/Kconfig

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,30 @@ config RUST_APPLE_RTKIT
7979
depends on RUST
8080
depends on APPLE_RTKIT
8181

82+
config APPLE_AOP
83+
tristate "Apple \"Always-on\" Processor"
84+
depends on ARCH_APPLE || COMPILE_TEST
85+
depends on RUST
86+
select RUST_APPLE_RTKIT
87+
default m if ARCH_APPLE
88+
help
89+
A co-processor persent on certain Apple SoCs controlling accelerometers,
90+
gyros, ambient light sensors and microphones. Is not actually always on.
91+
92+
Say 'y' here if you have an Apple laptop.
93+
94+
config APPLE_SEP
95+
tristate "Apple Secure Element Processor"
96+
depends on ARCH_APPLE || COMPILE_TEST
97+
depends on RUST
98+
select RUST_APPLE_RTKIT
99+
default y if ARCH_APPLE
100+
help
101+
A security co-processor persent on Apple SoCs, controlling transparent
102+
disk encryption, secure boot, HDCP, biometric auth and probably more.
103+
104+
Say 'y' here if you have an Apple SoC.
105+
82106
endmenu
83107

84108
endif

drivers/soc/apple/Makefile

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,3 +16,7 @@ apple-rtkit-helper-y = rtkit-helper.o
1616

1717
obj-$(CONFIG_APPLE_SART) += apple-sart.o
1818
apple-sart-y = sart.o
19+
20+
obj-$(CONFIG_APPLE_AOP) += aop.o
21+
22+
obj-$(CONFIG_APPLE_SEP) += sep.o

0 commit comments

Comments
 (0)