drivers/rtc/rtc-rc5t619.c

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

File Facts

System
Linux kernel
Corpus path
drivers/rtc/rtc-rc5t619.c
Extension
.c
Size
10275 bytes
Lines
452
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 rc5t619_rtc {
	int			irq;
	struct rtc_device	*rtc;
	struct rn5t618 *rn5t618;
};

#define CTRL1_ALARM_ENABLED 0x40
#define CTRL1_24HR 0x20
#define CTRL1_PERIODIC_MASK 0xf

#define CTRL2_PON 0x10
#define CTRL2_ALARM_STATUS 0x80
#define CTRL2_CTFG 0x4
#define CTRL2_CTC 0x1

#define MONTH_CENTFLAG 0x80
#define HOUR_PMFLAG 0x20
#define MDAY_DAL_EXT 0x80

static uint8_t rtc5t619_12hour_bcd2bin(uint8_t hour)
{
	if (hour & HOUR_PMFLAG) {
		hour = bcd2bin(hour & ~HOUR_PMFLAG);
		return hour == 12 ? 12 : 12 + hour;
	}

	hour = bcd2bin(hour);
	return hour == 12 ? 0 : hour;
}

static uint8_t rtc5t619_12hour_bin2bcd(uint8_t hour)
{
	if (!hour)
		return 0x12;

	if (hour < 12)
		return bin2bcd(hour);

	if (hour == 12)
		return 0x12 | HOUR_PMFLAG;

	return bin2bcd(hour - 12) | HOUR_PMFLAG;
}

static int rc5t619_rtc_periodic_disable(struct device *dev)
{
	struct rc5t619_rtc *rtc = dev_get_drvdata(dev);
	int err;

	/* disable function */
	err = regmap_update_bits(rtc->rn5t618->regmap,
				 RN5T618_RTC_CTRL1, CTRL1_PERIODIC_MASK, 0);
	if (err < 0)
		return err;

	/* clear alarm flag and CTFG */
	err = regmap_update_bits(rtc->rn5t618->regmap, RN5T618_RTC_CTRL2,
				 CTRL2_ALARM_STATUS | CTRL2_CTFG | CTRL2_CTC,
				 0);
	if (err < 0)
		return err;

	return 0;
}

/* things to be done once after power on */
static int rc5t619_rtc_pon_setup(struct device *dev)
{
	struct rc5t619_rtc *rtc = dev_get_drvdata(dev);
	int err;
	unsigned int reg_data;

	err = regmap_read(rtc->rn5t618->regmap, RN5T618_RTC_CTRL2, &reg_data);
	if (err < 0)
		return err;

	/* clear VDET PON */
	reg_data &= ~(CTRL2_PON | CTRL2_CTC | 0x4a);	/* 0101-1011 */
	reg_data |= 0x20;	/* 0010-0000 */
	err = regmap_write(rtc->rn5t618->regmap, RN5T618_RTC_CTRL2, reg_data);
	if (err < 0)
		return err;

	/* clearing RTC Adjust register */
	err = regmap_write(rtc->rn5t618->regmap, RN5T618_RTC_ADJUST, 0);
	if (err)
		return err;

	return regmap_update_bits(rtc->rn5t618->regmap,
					RN5T618_RTC_CTRL1,

Annotation

Implementation Notes