drivers/thermal/qcom/tsens.c

Source file repositories/reference/linux-study-clean/drivers/thermal/qcom/tsens.c

File Facts

System
Linux kernel
Corpus path
drivers/thermal/qcom/tsens.c
Extension
.c
Size
37728 bytes
Lines
1482
Domain
Driver Families
Bucket
drivers/thermal
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 tsens_irq_data {
	u32 up_viol;
	int up_thresh;
	u32 up_irq_mask;
	u32 up_irq_clear;
	u32 low_viol;
	int low_thresh;
	u32 low_irq_mask;
	u32 low_irq_clear;
	u32 crit_viol;
	u32 crit_thresh;
	u32 crit_irq_mask;
	u32 crit_irq_clear;
};

char *qfprom_read(struct device *dev, const char *cname)
{
	struct nvmem_cell *cell;
	ssize_t data;
	char *ret;

	cell = nvmem_cell_get(dev, cname);
	if (IS_ERR(cell))
		return ERR_CAST(cell);

	ret = nvmem_cell_read(cell, &data);
	nvmem_cell_put(cell);

	return ret;
}

int tsens_read_calibration(struct tsens_priv *priv, int shift, u32 *p1, u32 *p2, bool backup)
{
	u32 mode;
	u32 base1, base2;
	char name[] = "sXX_pY_backup"; /* s10_p1_backup */
	int i, ret;

	if (priv->num_sensors > MAX_SENSORS)
		return -EINVAL;

	ret = snprintf(name, sizeof(name), "mode%s", backup ? "_backup" : "");
	if (ret < 0)
		return ret;

	ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &mode);
	if (ret == -ENOENT)
		dev_warn(priv->dev, "Please migrate to separate nvmem cells for calibration data\n");
	if (ret < 0)
		return ret;

	dev_dbg(priv->dev, "calibration mode is %d\n", mode);

	ret = snprintf(name, sizeof(name), "base1%s", backup ? "_backup" : "");
	if (ret < 0)
		return ret;

	ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &base1);
	if (ret < 0)
		return ret;

	ret = snprintf(name, sizeof(name), "base2%s", backup ? "_backup" : "");
	if (ret < 0)
		return ret;

	ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &base2);
	if (ret < 0)
		return ret;

	for (i = 0; i < priv->num_sensors; i++) {
		ret = snprintf(name, sizeof(name), "s%d_p1%s", priv->sensor[i].hw_id,
			       backup ? "_backup" : "");
		if (ret < 0)
			return ret;

		ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &p1[i]);
		if (ret)
			return ret;

		ret = snprintf(name, sizeof(name), "s%d_p2%s", priv->sensor[i].hw_id,
			       backup ? "_backup" : "");
		if (ret < 0)
			return ret;

		ret = nvmem_cell_read_variable_le_u32(priv->dev, name, &p2[i]);
		if (ret)
			return ret;
	}

	switch (mode) {

Annotation

Implementation Notes