drivers/hwmon/max6639.c

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

File Facts

System
Linux kernel
Corpus path
drivers/hwmon/max6639.c
Extension
.c
Size
20205 bytes
Lines
812
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 max6639_data {
	struct regmap *regmap;

	/* Register values initialized only once */
	u8 ppr[MAX6639_NUM_CHANNELS];	/* Pulses per rotation 0..3 for 1..4 ppr */
	u8 rpm_range[MAX6639_NUM_CHANNELS]; /* Index in above rpm_ranges table */
	u32 target_rpm[MAX6639_NUM_CHANNELS];

	/* Optional regulator for FAN supply */
	struct regulator *reg;
};

static int max6639_temp_read_input(struct device *dev, int channel, long *temp)
{
	u32 regs[2] = { MAX6639_REG_TEMP_EXT(channel), MAX6639_REG_TEMP(channel) };
	struct max6639_data *data = dev_get_drvdata(dev);
	u8 regvals[2];
	int res;

	res = regmap_multi_reg_read(data->regmap, regs, regvals, 2);
	if (res < 0)
		return res;

	*temp = ((regvals[0] >> 5) | (regvals[1] << 3)) * 125;

	return 0;
}

static int max6639_temp_read_fault(struct device *dev, int channel, long *fault)
{
	struct max6639_data *data = dev_get_drvdata(dev);
	unsigned int val;
	int res;

	res = regmap_read(data->regmap, MAX6639_REG_TEMP_EXT(channel), &val);
	if (res < 0)
		return res;

	*fault = val & 1;

	return 0;
}

static int max6639_temp_read_max(struct device *dev, int channel, long *max)
{
	struct max6639_data *data = dev_get_drvdata(dev);
	unsigned int val;
	int res;

	res = regmap_read(data->regmap, MAX6639_REG_THERM_LIMIT(channel), &val);
	if (res < 0)
		return res;

	*max = (long)val * 1000;

	return 0;
}

static int max6639_temp_read_crit(struct device *dev, int channel, long *crit)
{
	struct max6639_data *data = dev_get_drvdata(dev);
	unsigned int val;
	int res;

	res = regmap_read(data->regmap, MAX6639_REG_ALERT_LIMIT(channel), &val);
	if (res < 0)
		return res;

	*crit = (long)val * 1000;

	return 0;
}

static int max6639_temp_read_emergency(struct device *dev, int channel, long *emerg)
{
	struct max6639_data *data = dev_get_drvdata(dev);
	unsigned int val;
	int res;

	res = regmap_read(data->regmap, MAX6639_REG_OT_LIMIT(channel), &val);
	if (res < 0)
		return res;

	*emerg = (long)val * 1000;

	return 0;
}

static int max6639_get_status(struct device *dev, unsigned int *status)
{

Annotation

Implementation Notes