starnix_modules_hvdcp_opti/
device.rs1use super::iio_file::{
6 build_battery_power_supply_directory, build_iio0_directory, build_iio1_directory,
7 build_usb_power_supply_directory,
8};
9use super::qbg_battery_file::create_battery_profile_device;
10use super::qbg_file::create_qbg_device;
11use super::utils::{ReadWriteBytesFile, connect_to_device_channel};
12use fidl_fuchsia_hardware_qcom_hvdcpopti as fhvdcpopti;
13use starnix_core::device::DeviceMode;
14use starnix_core::device::kobject::DeviceMetadata;
15use starnix_core::fs::sysfs::build_device_directory;
16use starnix_core::task::Kernel;
17use starnix_logging::log_warn;
18use starnix_sync::{FileOpsCore, LockEqualOrBefore, Locked};
19use starnix_uapi::device_id::DeviceId;
20use starnix_uapi::errors::Errno;
21use starnix_uapi::file_mode::mode;
22use std::sync::Arc;
23
24pub fn hvdcp_opti_init<L>(locked: &mut Locked<L>, kernel: &Kernel) -> Result<(), Errno>
25where
26 L: LockEqualOrBefore<FileOpsCore>,
27{
28 let proxy = match connect_to_device_channel("iio") {
29 Ok(chan) => Arc::new(fhvdcpopti::IioSynchronousProxy::new(chan)),
30 Err(e) => {
31 log_warn!(
33 "Could not connect to hvdcp_opti server {}. This is expected on everything but Sorrel.",
34 e
35 );
36 return Ok(());
37 }
38 };
39
40 let registry = &kernel.device_registry;
41
42 let qdb_class =
43 registry.objects.class_with_dir("qbg".into(), registry.objects.virtual_bus(), |dir| {
44 dir.entry("qbg_context", ReadWriteBytesFile::new_node(), mode!(IFREG, 0o666));
45 });
46
47 registry.register_device(
49 locked,
50 kernel,
51 "qbg".into(),
52 DeviceMetadata::new("qbg".into(), DeviceId::new(484, 0), DeviceMode::Char),
53 qdb_class,
54 create_qbg_device,
55 )?;
56
57 registry.register_device(
59 locked,
60 kernel,
61 "qbg_battery".into(),
62 DeviceMetadata::new("qbg_battery".into(), DeviceId::new(485, 0), DeviceMode::Char),
63 registry.objects.get_or_create_class("qbg_battery".into(), registry.objects.virtual_bus()),
64 create_battery_profile_device,
65 )?;
66
67 let iio = registry
71 .objects
72 .get_or_create_class("iio".into(), registry.objects.get_or_create_bus("iio".into()));
73 registry.add_numberless_device(locked, "iio:device0".into(), iio.clone(), |device, dir| {
74 build_iio0_directory(device, &proxy, dir)
75 });
76
77 registry.add_numberless_device(locked, "iio:device1".into(), iio, |device, dir| {
78 build_iio1_directory(device, &proxy, dir)
79 });
80
81 let power_supply =
84 registry.objects.get_or_create_class("power_supply".into(), registry.objects.virtual_bus());
85 registry.add_numberless_device(locked, "usb".into(), power_supply.clone(), |device, dir| {
87 build_usb_power_supply_directory(device, &proxy, dir)
88 });
89
90 registry.add_numberless_device(
92 locked,
93 "battery".into(),
94 power_supply.clone(),
95 |device, dir| build_battery_power_supply_directory(device, &proxy, dir),
96 );
97
98 registry.add_numberless_device(locked, "bms".into(), power_supply, build_device_directory);
100 Ok(())
101}