drivers/rtc/rtc-imx-sm-bbm.c
Source file repositories/reference/linux-study-clean/drivers/rtc/rtc-imx-sm-bbm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/rtc/rtc-imx-sm-bbm.c- Extension
.c- Size
- 4034 bytes
- Lines
- 163
- Domain
- Driver Families
- Bucket
- drivers/rtc
- 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/jiffies.hlinux/module.hlinux/platform_device.hlinux/rtc.hlinux/scmi_protocol.hlinux/scmi_imx_protocol.h
Detected Declarations
struct scmi_imx_bbmfunction scmi_imx_bbm_read_timefunction scmi_imx_bbm_set_timefunction scmi_imx_bbm_alarm_irq_enablefunction scmi_imx_bbm_set_alarmfunction scmi_imx_bbm_rtc_notifierfunction scmi_imx_bbm_rtc_initfunction scmi_imx_bbm_rtc_probe
Annotated Snippet
struct scmi_imx_bbm {
const struct scmi_imx_bbm_proto_ops *ops;
struct rtc_device *rtc_dev;
struct scmi_protocol_handle *ph;
struct notifier_block nb;
};
static int scmi_imx_bbm_read_time(struct device *dev, struct rtc_time *tm)
{
struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev);
struct scmi_protocol_handle *ph = bbnsm->ph;
u64 val;
int ret;
ret = bbnsm->ops->rtc_time_get(ph, 0, &val);
if (ret)
return ret;
rtc_time64_to_tm(val, tm);
return 0;
}
static int scmi_imx_bbm_set_time(struct device *dev, struct rtc_time *tm)
{
struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev);
struct scmi_protocol_handle *ph = bbnsm->ph;
u64 val;
val = rtc_tm_to_time64(tm);
return bbnsm->ops->rtc_time_set(ph, 0, val);
}
static int scmi_imx_bbm_alarm_irq_enable(struct device *dev, unsigned int enable)
{
struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev);
struct scmi_protocol_handle *ph = bbnsm->ph;
/* scmi_imx_bbm_set_alarm enables the irq, just handle disable here */
if (!enable)
return bbnsm->ops->rtc_alarm_set(ph, 0, false, 0);
return 0;
}
static int scmi_imx_bbm_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
{
struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev);
struct scmi_protocol_handle *ph = bbnsm->ph;
struct rtc_time *alrm_tm = &alrm->time;
u64 val;
val = rtc_tm_to_time64(alrm_tm);
return bbnsm->ops->rtc_alarm_set(ph, 0, true, val);
}
static const struct rtc_class_ops smci_imx_bbm_rtc_ops = {
.read_time = scmi_imx_bbm_read_time,
.set_time = scmi_imx_bbm_set_time,
.set_alarm = scmi_imx_bbm_set_alarm,
.alarm_irq_enable = scmi_imx_bbm_alarm_irq_enable,
};
static int scmi_imx_bbm_rtc_notifier(struct notifier_block *nb, unsigned long event, void *data)
{
struct scmi_imx_bbm *bbnsm = container_of(nb, struct scmi_imx_bbm, nb);
struct scmi_imx_bbm_notif_report *r = data;
if (r->is_rtc)
rtc_update_irq(bbnsm->rtc_dev, 1, RTC_AF | RTC_IRQF);
else
pr_err("Unexpected bbm event: %s\n", __func__);
return 0;
}
static int scmi_imx_bbm_rtc_init(struct scmi_device *sdev)
{
const struct scmi_handle *handle = sdev->handle;
struct device *dev = &sdev->dev;
struct scmi_imx_bbm *bbnsm = dev_get_drvdata(dev);
int ret;
bbnsm->rtc_dev = devm_rtc_allocate_device(dev);
if (IS_ERR(bbnsm->rtc_dev))
return PTR_ERR(bbnsm->rtc_dev);
bbnsm->rtc_dev->ops = &smci_imx_bbm_rtc_ops;
Annotation
- Immediate include surface: `linux/jiffies.h`, `linux/module.h`, `linux/platform_device.h`, `linux/rtc.h`, `linux/scmi_protocol.h`, `linux/scmi_imx_protocol.h`.
- Detected declarations: `struct scmi_imx_bbm`, `function scmi_imx_bbm_read_time`, `function scmi_imx_bbm_set_time`, `function scmi_imx_bbm_alarm_irq_enable`, `function scmi_imx_bbm_set_alarm`, `function scmi_imx_bbm_rtc_notifier`, `function scmi_imx_bbm_rtc_init`, `function scmi_imx_bbm_rtc_probe`.
- Atlas domain: Driver Families / drivers/rtc.
- 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.