drivers/watchdog/max77620_wdt.c

Source file repositories/reference/linux-study-clean/drivers/watchdog/max77620_wdt.c

File Facts

System
Linux kernel
Corpus path
drivers/watchdog/max77620_wdt.c
Extension
.c
Size
7257 bytes
Lines
264
Domain
Driver Families
Bucket
drivers/watchdog
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 max77620_variant {
	u8 reg_onoff_cnfg2;
	u8 reg_cnfg_glbl2;
	u8 reg_cnfg_glbl3;
	u8 wdtc_mask;
	u8 bit_wd_rst_wk;
	u8 cnfg_glbl2_cfg_bits;
};

struct max77620_wdt {
	struct device			*dev;
	struct regmap			*rmap;
	const struct max77620_variant	*drv_data;
	struct watchdog_device		wdt_dev;
};

static const struct max77620_variant max77620_wdt_data = {
	.reg_onoff_cnfg2     = MAX77620_REG_ONOFFCNFG2,
	.reg_cnfg_glbl2      = MAX77620_REG_CNFGGLBL2,
	.reg_cnfg_glbl3      = MAX77620_REG_CNFGGLBL3,
	.wdtc_mask           = MAX77620_WDTC_MASK,
	.bit_wd_rst_wk       = MAX77620_ONOFFCNFG2_WD_RST_WK,
	/* Set WDT clear in OFF and sleep mode */
	.cnfg_glbl2_cfg_bits = MAX77620_WDTSLPC | MAX77620_WDTOFFC,
};

static const struct max77620_variant max77714_wdt_data = {
	.reg_onoff_cnfg2     = MAX77714_CNFG2_ONOFF,
	.reg_cnfg_glbl2      = MAX77714_CNFG_GLBL2,
	.reg_cnfg_glbl3      = MAX77714_CNFG_GLBL3,
	.wdtc_mask           = MAX77714_WDTC,
	.bit_wd_rst_wk       = MAX77714_WD_RST_WK,
	/* Set WDT clear in sleep mode (there is no WDTOFFC on MAX77714) */
	.cnfg_glbl2_cfg_bits = MAX77714_WDTSLPC,
};

static int max77620_wdt_start(struct watchdog_device *wdt_dev)
{
	struct max77620_wdt *wdt = watchdog_get_drvdata(wdt_dev);

	return regmap_update_bits(wdt->rmap, wdt->drv_data->reg_cnfg_glbl2,
				  MAX77620_WDTEN, MAX77620_WDTEN);
}

static int max77620_wdt_stop(struct watchdog_device *wdt_dev)
{
	struct max77620_wdt *wdt = watchdog_get_drvdata(wdt_dev);

	return regmap_update_bits(wdt->rmap, wdt->drv_data->reg_cnfg_glbl2,
				  MAX77620_WDTEN, 0);
}

static int max77620_wdt_ping(struct watchdog_device *wdt_dev)
{
	struct max77620_wdt *wdt = watchdog_get_drvdata(wdt_dev);

	return regmap_update_bits(wdt->rmap, wdt->drv_data->reg_cnfg_glbl3,
				  wdt->drv_data->wdtc_mask, 0x1);
}

static int max77620_wdt_set_timeout(struct watchdog_device *wdt_dev,
				    unsigned int timeout)
{
	struct max77620_wdt *wdt = watchdog_get_drvdata(wdt_dev);
	unsigned int wdt_timeout;
	u8 regval;
	int ret;

	switch (timeout) {
	case 0 ... 2:
		regval = MAX77620_TWD_2s;
		wdt_timeout = 2;
		break;

	case 3 ... 16:
		regval = MAX77620_TWD_16s;
		wdt_timeout = 16;
		break;

	case 17 ... 64:
		regval = MAX77620_TWD_64s;
		wdt_timeout = 64;
		break;

	default:
		regval = MAX77620_TWD_128s;
		wdt_timeout = 128;
		break;
	}

Annotation

Implementation Notes