drivers/acpi/acpi_tad.c
Source file repositories/reference/linux-study-clean/drivers/acpi/acpi_tad.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/acpi/acpi_tad.c- Extension
.c- Size
- 21583 bytes
- Lines
- 903
- Domain
- Driver Families
- Bucket
- drivers/acpi
- Inferred role
- Driver Families: implementation source
- Status
- source implementation candidate
Why This File Exists
Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/acpi.hlinux/kernel.hlinux/ktime.hlinux/module.hlinux/platform_device.hlinux/pm_runtime.hlinux/rtc.hlinux/suspend.h
Detected Declarations
struct acpi_tad_driver_datastruct acpi_tad_rtfunction acpi_tad_rt_is_invalidfunction acpi_tad_set_real_timefunction acpi_tad_evaluate_grtfunction __acpi_tad_get_real_timefunction acpi_tad_get_real_timefunction __acpi_tad_wake_setfunction __acpi_tad_wake_readfunction time_storefunction time_showfunction acpi_tad_wake_setfunction acpi_tad_wake_writefunction acpi_tad_wake_readfunction acpi_tad_alarm_writefunction acpi_tad_alarm_readfunction acpi_tad_policy_writefunction acpi_tad_policy_readfunction acpi_tad_clear_statusfunction acpi_tad_status_writefunction acpi_tad_status_readfunction caps_showfunction ac_alarm_storefunction ac_alarm_showfunction ac_policy_storefunction ac_policy_showfunction ac_status_storefunction ac_status_showfunction dc_alarm_storefunction dc_alarm_showfunction dc_policy_storefunction dc_policy_showfunction dc_status_storefunction dc_status_showfunction acpi_tad_attr_is_visiblefunction acpi_tad_rt_to_tmfunction acpi_tad_rtc_set_timefunction acpi_tad_rtc_read_timefunction acpi_tad_rtc_set_alarmfunction acpi_tad_rtc_read_alarmfunction acpi_tad_register_rtcfunction acpi_tad_register_rtcfunction acpi_tad_removefunction scoped_guardfunction acpi_tad_probe
Annotated Snippet
struct acpi_tad_driver_data {
u32 capabilities;
};
struct acpi_tad_rt {
u16 year; /* 1900 - 9999 */
u8 month; /* 1 - 12 */
u8 day; /* 1 - 31 */
u8 hour; /* 0 - 23 */
u8 minute; /* 0 - 59 */
u8 second; /* 0 - 59 */
u8 valid; /* 0 (failed) or 1 (success) for reads, 0 for writes */
u16 msec; /* 1 - 1000 */
s16 tz; /* -1440 to 1440 or 2047 (unspecified) */
u8 daylight;
u8 padding[3]; /* must be 0 */
} __packed;
static bool acpi_tad_rt_is_invalid(struct acpi_tad_rt *rt)
{
return rt->year < 1900 || rt->year > 9999 ||
rt->month < 1 || rt->month > 12 ||
rt->hour > 23 || rt->minute > 59 || rt->second > 59 ||
rt->tz < -1440 ||
(rt->tz > 1440 && rt->tz != ACPI_TAD_TZ_UNSPEC) ||
rt->daylight > 3;
}
static int acpi_tad_set_real_time(struct device *dev, struct acpi_tad_rt *rt)
{
acpi_handle handle = ACPI_HANDLE(dev);
union acpi_object args[] = {
{ .type = ACPI_TYPE_BUFFER, },
};
struct acpi_object_list arg_list = {
.pointer = args,
.count = ARRAY_SIZE(args),
};
unsigned long long retval;
acpi_status status;
if (acpi_tad_rt_is_invalid(rt))
return -EINVAL;
rt->valid = 0;
rt->msec = 0;
memset(rt->padding, 0, 3);
args[0].buffer.pointer = (u8 *)rt;
args[0].buffer.length = sizeof(*rt);
PM_RUNTIME_ACQUIRE(dev, pm);
if (PM_RUNTIME_ACQUIRE_ERR(&pm))
return -ENXIO;
status = acpi_evaluate_integer(handle, "_SRT", &arg_list, &retval);
if (ACPI_FAILURE(status) || retval)
return -EIO;
return 0;
}
static int acpi_tad_evaluate_grt(struct device *dev, struct acpi_tad_rt *rt)
{
acpi_handle handle = ACPI_HANDLE(dev);
struct acpi_buffer output = { ACPI_ALLOCATE_BUFFER };
union acpi_object *out_obj;
struct acpi_tad_rt *data;
acpi_status status;
int ret = -EIO;
status = acpi_evaluate_object(handle, "_GRT", NULL, &output);
if (ACPI_FAILURE(status))
goto out_free;
out_obj = output.pointer;
if (out_obj->type != ACPI_TYPE_BUFFER)
goto out_free;
if (out_obj->buffer.length != sizeof(*rt))
goto out_free;
data = (struct acpi_tad_rt *)(out_obj->buffer.pointer);
if (!data->valid)
goto out_free;
memcpy(rt, data, sizeof(*rt));
ret = 0;
out_free:
Annotation
- Immediate include surface: `linux/acpi.h`, `linux/kernel.h`, `linux/ktime.h`, `linux/module.h`, `linux/platform_device.h`, `linux/pm_runtime.h`, `linux/rtc.h`, `linux/suspend.h`.
- Detected declarations: `struct acpi_tad_driver_data`, `struct acpi_tad_rt`, `function acpi_tad_rt_is_invalid`, `function acpi_tad_set_real_time`, `function acpi_tad_evaluate_grt`, `function __acpi_tad_get_real_time`, `function acpi_tad_get_real_time`, `function __acpi_tad_wake_set`, `function __acpi_tad_wake_read`, `function time_store`.
- Atlas domain: Driver Families / drivers/acpi.
- Implementation status: source implementation candidate.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.