如果定义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;
}
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;
}