blob: 33c11bd76334f2f1590829b70b1b3e4b42bed4c4 [file] [log] [blame]
// Copyright 2025 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
use super::file::RtcFile;
use starnix_core::device::DeviceOps;
use starnix_core::task::CurrentTask;
use starnix_core::vfs::{FileOps, NamespaceNode};
use starnix_logging::log_debug;
use starnix_sync::{FileOpsCore, LockEqualOrBefore, Locked};
use starnix_uapi::device_type::DeviceType;
use starnix_uapi::errors::Errno;
use starnix_uapi::open_flags::OpenFlags;
#[derive(Clone)]
struct RtcDevice;
impl DeviceOps for RtcDevice {
fn open(
&self,
_locked: &mut Locked<FileOpsCore>,
current_task: &CurrentTask,
_id: DeviceType,
_node: &NamespaceNode,
_flags: OpenFlags,
) -> Result<Box<dyn FileOps>, Errno> {
RtcFile::new_file(current_task)
}
}
/// Initialize a RTC device.
///
/// It will be available at `/dev/rtc0`.
pub fn rtc_device_init<L>(locked: &mut Locked<L>, current_task: &CurrentTask) -> Result<(), Errno>
where
L: LockEqualOrBefore<FileOpsCore>,
{
let kernel = current_task.kernel();
let registry = &kernel.device_registry;
registry
.register_dyn_device(
locked,
current_task,
"rtc0".into(),
registry.objects.rtc_class(),
RtcDevice,
)
.inspect(|dev| log_debug!("registered RTC device: {dev:?}"))
.map(|_| ())
}