drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxch.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxch.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/nouveau/nvkm/subdev/i2c/auxch.c
Extension
.c
Size
4997 bytes
Lines
216
Domain
Driver Families
Bucket
drivers/gpu
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

while (remaining) {
			u8 cnt, retries, cmd;

			if (msg->flags & I2C_M_RD)
				cmd = 1;
			else
				cmd = 0;

			if (mcnt || remaining > 16)
				cmd |= 4; /* MOT */

			for (retries = 0, cnt = 0;
			     retries < 32 && !cnt;
			     retries++) {
				cnt = min_t(u8, remaining, 16);
				ret = aux->func->xfer(aux, true, cmd,
						      msg->addr, ptr, &cnt);
				if (ret < 0)
					goto out;
			}
			if (!cnt) {
				AUX_TRACE(aux, "no data after 32 retries");
				ret = -EIO;
				goto out;
			}

			ptr += cnt;
			remaining -= cnt;
		}

		msg++;
	}

	ret = num;
out:
	nvkm_i2c_aux_release(aux);
	return ret;
}

static u32
nvkm_i2c_aux_i2c_func(struct i2c_adapter *adap)
{
	return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
}

static const struct i2c_algorithm
nvkm_i2c_aux_i2c_algo = {
	.master_xfer = nvkm_i2c_aux_i2c_xfer,
	.functionality = nvkm_i2c_aux_i2c_func
};

void
nvkm_i2c_aux_monitor(struct nvkm_i2c_aux *aux, bool monitor)
{
	struct nvkm_i2c_pad *pad = aux->pad;
	AUX_TRACE(aux, "monitor: %s", str_yes_no(monitor));
	if (monitor)
		nvkm_i2c_pad_mode(pad, NVKM_I2C_PAD_AUX);
	else
		nvkm_i2c_pad_mode(pad, NVKM_I2C_PAD_OFF);
}

void
nvkm_i2c_aux_release(struct nvkm_i2c_aux *aux)
{
	struct nvkm_i2c_pad *pad = aux->pad;
	AUX_TRACE(aux, "release");
	nvkm_i2c_pad_release(pad);
	mutex_unlock(&aux->mutex);
}

int
nvkm_i2c_aux_acquire(struct nvkm_i2c_aux *aux)
{
	struct nvkm_i2c_pad *pad = aux->pad;
	int ret;

	AUX_TRACE(aux, "acquire");
	mutex_lock(&aux->mutex);

	if (aux->enabled)
		ret = nvkm_i2c_pad_acquire(pad, NVKM_I2C_PAD_AUX);
	else
		ret = -EIO;

	if (ret)
		mutex_unlock(&aux->mutex);
	return ret;
}

Annotation

Implementation Notes