CONFIG_RTC_DRV_EFI

如果定义CONFIG_RTC_DRV_EFI的话
ifdef CONFIG_RTC_DRV_EFI
rtc-core-y            += rtc-efi-platform.o
endif
obj-$(CONFIG_RTC_DRV_EFI)    += rtc-efi.o
就会新增rtc-efi-platform.c 和 rtc-efi.c
在rtc-efi-platform.c 中注册了一个platform_device_register
static int __init rtc_init(void)
{
    if (efi_enabled(EFI_RUNTIME_SERVICES))
        if (platform_device_register(&rtc_efi_dev) < 0)
            pr_err("unable to register rtc device...\n");

    /* not necessarily an error */
    return 0;
}
module_init(rtc_init);
在 rtc-efi.c 中有注册一个platform_driver。name都是rtc-efi,正好匹配调用efi_rtc_probe函数
static struct platform_driver efi_rtc_driver = {
    .driver = {
        .name = "rtc-efi",
    },
};

module_platform_driver_probe(efi_rtc_driver, efi_rtc_probe);
在efi_rtc_probe 中最重要是注册一个efi_rtc_ops
static int __init efi_rtc_probe(struct platform_device *dev)
{
    
    rtc = devm_rtc_device_register(&dev->dev, "rtc-efi", &efi_rtc_ops,
                    THIS_MODULE);
    return 0;
}
而efi_rtc_ops 提供了如下四个函数
static const struct rtc_class_ops efi_rtc_ops = {
    .read_time    = efi_read_time,
    .set_time    = efi_set_time,
    .read_alarm    = efi_read_alarm,
    .set_alarm    = efi_set_alarm,
    .proc        = efi_procfs,
};
我们以efi_read_time为例
static int efi_read_time(struct device *dev, struct rtc_time *tm)
{

    status = efi.get_time(&eft, &cap);

}
原来是调用efi.get_time。
而efi实在drivers/firmware/efi/runtime-wrappers.c中赋值的
void efi_native_runtime_setup(void)
{
    efi.get_time = virt_efi_get_time;
    efi.set_time = virt_efi_set_time;
}
这样就调用到uefi的runtime service里面去了
static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
{
    efi_status_t status;

    if (down_interruptible(&efi_runtime_lock))
        return EFI_ABORTED;
    status = efi_call_virt(get_time, tm, tc);
    up(&efi_runtime_lock);
    return status;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值