drivers/rtc/rtc-cv1800.c

Source file repositories/reference/linux-study-clean/drivers/rtc/rtc-cv1800.c

File Facts

System
Linux kernel
Corpus path
drivers/rtc/rtc-cv1800.c
Extension
.c
Size
5162 bytes
Lines
219
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.

Dependency Surface

Detected Declarations

Annotated Snippet

struct cv1800_rtc_priv {
	struct rtc_device *rtc_dev;
	struct regmap *rtc_map;
	struct clk *clk;
	int irq;
};

static bool cv1800_rtc_enabled(struct device *dev)
{
	struct cv1800_rtc_priv *info = dev_get_drvdata(dev);
	u32 reg;

	regmap_read(info->rtc_map, SEC_PULSE_GEN, &reg);

	return (reg & SEL_SEC_PULSE) == 0;
}

static void cv1800_rtc_enable(struct device *dev)
{
	struct cv1800_rtc_priv *info = dev_get_drvdata(dev);

	/* Sec pulse generated internally */
	regmap_update_bits(info->rtc_map, SEC_PULSE_GEN, SEL_SEC_PULSE, 0);
}

static int cv1800_rtc_alarm_irq_enable(struct device *dev, unsigned int enabled)
{
	struct cv1800_rtc_priv *info = dev_get_drvdata(dev);

	regmap_write(info->rtc_map, ALARM_ENABLE, enabled);

	return 0;
}

static int cv1800_rtc_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)
{
	struct cv1800_rtc_priv *info = dev_get_drvdata(dev);
	unsigned long alarm_time;

	alarm_time = rtc_tm_to_time64(&alrm->time);

	cv1800_rtc_alarm_irq_enable(dev, 0);

	regmap_write(info->rtc_map, ALARM_TIME, alarm_time);

	cv1800_rtc_alarm_irq_enable(dev, alrm->enabled);

	return 0;
}

static int cv1800_rtc_read_alarm(struct device *dev, struct rtc_wkalrm *alarm)
{
	struct cv1800_rtc_priv *info = dev_get_drvdata(dev);
	u32 enabled;
	u32 time;

	if (!cv1800_rtc_enabled(dev)) {
		alarm->enabled = 0;
		return 0;
	}

	regmap_read(info->rtc_map, ALARM_ENABLE, &enabled);

	alarm->enabled = enabled & ALARM_ENABLE_MASK;

	regmap_read(info->rtc_map, ALARM_TIME, &time);

	rtc_time64_to_tm(time, &alarm->time);

	return 0;
}

static int cv1800_rtc_read_time(struct device *dev, struct rtc_time *tm)
{
	struct cv1800_rtc_priv *info = dev_get_drvdata(dev);
	u32 sec;

	if (!cv1800_rtc_enabled(dev))
		return -EINVAL;

	regmap_read(info->rtc_map, SEC_CNTR_VAL, &sec);

	rtc_time64_to_tm(sec, tm);

	return 0;
}

static int cv1800_rtc_set_time(struct device *dev, struct rtc_time *tm)
{
	struct cv1800_rtc_priv *info = dev_get_drvdata(dev);

Annotation

Implementation Notes