drivers/hwmon/spd5118.c

Source file repositories/reference/linux-study-clean/drivers/hwmon/spd5118.c

File Facts

System
Linux kernel
Corpus path
drivers/hwmon/spd5118.c
Extension
.c
Size
20235 bytes
Lines
779
Domain
Driver Families
Bucket
drivers/hwmon
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 spd5118_data {
	struct regmap *regmap;
	struct mutex nvmem_lock;
	bool is_16bit;
};

/* hwmon */

static int spd5118_temp_from_reg(u16 reg)
{
	int temp = sign_extend32(reg >> 2, 10);

	return temp * SPD5118_TEMP_UNIT;
}

static u16 spd5118_temp_to_reg(long temp)
{
	temp = clamp_val(temp, SPD5118_TEMP_RANGE_MIN, SPD5118_TEMP_RANGE_MAX);
	return (DIV_ROUND_CLOSEST(temp, SPD5118_TEMP_UNIT) & 0x7ff) << 2;
}

static int spd5118_read_temp(struct regmap *regmap, u32 attr, long *val)
{
	int reg, err;
	u8 regval[2];
	u16 temp;

	switch (attr) {
	case hwmon_temp_input:
		reg = SPD5118_REG_TEMP;
		break;
	case hwmon_temp_max:
		reg = SPD5118_REG_TEMP_MAX;
		break;
	case hwmon_temp_min:
		reg = SPD5118_REG_TEMP_MIN;
		break;
	case hwmon_temp_crit:
		reg = SPD5118_REG_TEMP_CRIT;
		break;
	case hwmon_temp_lcrit:
		reg = SPD5118_REG_TEMP_LCRIT;
		break;
	default:
		return -EOPNOTSUPP;
	}

	err = regmap_bulk_read(regmap, reg, regval, 2);
	if (err)
		return err;

	temp = (regval[1] << 8) | regval[0];

	*val = spd5118_temp_from_reg(temp);
	return 0;
}

static int spd5118_read_alarm(struct regmap *regmap, u32 attr, long *val)
{
	unsigned int mask, regval;
	int err;

	switch (attr) {
	case hwmon_temp_max_alarm:
		mask = SPD5118_TEMP_STATUS_HIGH;
		break;
	case hwmon_temp_min_alarm:
		mask = SPD5118_TEMP_STATUS_LOW;
		break;
	case hwmon_temp_crit_alarm:
		mask = SPD5118_TEMP_STATUS_CRIT;
		break;
	case hwmon_temp_lcrit_alarm:
		mask = SPD5118_TEMP_STATUS_LCRIT;
		break;
	default:
		return -EOPNOTSUPP;
	}

	err = regmap_read(regmap, SPD5118_REG_TEMP_STATUS, &regval);
	if (err < 0)
		return err;
	*val = !!(regval & mask);
	if (*val)
		return regmap_write(regmap, SPD5118_REG_TEMP_CLR, mask);
	return 0;
}

static int spd5118_read_enable(struct regmap *regmap, long *val)
{

Annotation

Implementation Notes