drivers/rtc/rtc-max31335.c

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

File Facts

System
Linux kernel
Corpus path
drivers/rtc/rtc-max31335.c
Extension
.c
Size
21079 bytes
Lines
777
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 chip_desc {
	u8 sec_reg;
	u8 alarm1_sec_reg;

	u8 int_en_reg;
	u8 int_status_reg;

	u8 ram_reg;
	u8 ram_size;

	u8 temp_reg;

	u8 trickle_reg;

	u8 clkout_reg;

	enum max_rtc_ids id;
};

struct max31335_data {
	struct regmap *regmap;
	struct rtc_device *rtc;
	struct clk_hw clkout;
	struct clk *clkin;
	const struct chip_desc *chip;
	int irq;
};

static const int max31335_clkout_freq[] = { 1, 64, 1024, 32768 };

static const struct chip_desc chip[MAX_RTC_ID_NR] = {
	[ID_MAX31331] = {
		.id = ID_MAX31331,
		.int_en_reg = 0x01,
		.int_status_reg = 0x00,
		.sec_reg = 0x08,
		.alarm1_sec_reg = 0x0F,
		.ram_reg = 0x20,
		.ram_size = 32,
		.trickle_reg = 0x1B,
		.clkout_reg = 0x04,
	},
	[ID_MAX31335] = {
		.id = ID_MAX31335,
		.int_en_reg = 0x01,
		.int_status_reg = 0x00,
		.sec_reg = 0x0A,
		.alarm1_sec_reg = 0x11,
		.ram_reg = 0x40,
		.ram_size = 32,
		.temp_reg = 0x35,
		.trickle_reg = 0x1D,
		.clkout_reg = 0x06,
	},
};

static const u16 max31335_trickle_resistors[] = {3000, 6000, 11000};

static bool max31335_volatile_reg(struct device *dev, unsigned int reg)
{
	struct max31335_data *max31335 = dev_get_drvdata(dev);
	const struct chip_desc *chip = max31335->chip;

	/* time keeping registers */
	if (reg >= chip->sec_reg && reg < chip->sec_reg + MAX31335_TIME_SIZE)
		return true;

	/* interrupt status register */
	if (reg == chip->int_status_reg)
		return true;

	/* temperature registers if valid */
	if (chip->temp_reg && (reg == chip->temp_reg || reg == chip->temp_reg + 1))
		return true;

	return false;
}

static const struct regmap_config regmap_config = {
	.reg_bits = 8,
	.val_bits = 8,
	.max_register = 0x5F,
	.volatile_reg = max31335_volatile_reg,
};

static int max31335_read_time(struct device *dev, struct rtc_time *tm)
{
	struct max31335_data *max31335 = dev_get_drvdata(dev);
	u8 date[7];
	int ret;

Annotation

Implementation Notes