drivers/media/pci/bt8xx/dst.c

Source file repositories/reference/linux-study-clean/drivers/media/pci/bt8xx/dst.c

File Facts

System
Linux kernel
Corpus path
drivers/media/pci/bt8xx/dst.c
Extension
.c
Size
46679 bytes
Lines
1840
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: exported/initcall integration point
Status
integration 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

if (dst_gpio_inb(state, &reply) < 0) {
			pr_err("dst_gpio_inb ERROR !\n");
			return -1;
		}
		if ((reply & RDC_8820_PIO_0_ENABLE) == 0) {
			dprintk(2, "dst wait ready after %d\n", i);
			return 1;
		}
		msleep(10);
	}
	dprintk(1, "dst wait NOT ready after %d\n", i);

	return 0;
}
EXPORT_SYMBOL(dst_wait_dst_ready);

int dst_error_recovery(struct dst_state *state)
{
	dprintk(1, "Trying to return from previous errors.\n");
	dst_pio_disable(state);
	msleep(10);
	dst_pio_enable(state);
	msleep(10);

	return 0;
}
EXPORT_SYMBOL(dst_error_recovery);

int dst_error_bailout(struct dst_state *state)
{
	dprintk(2, "Trying to bailout from previous error.\n");
	rdc_8820_reset(state);
	dst_pio_disable(state);
	msleep(10);

	return 0;
}
EXPORT_SYMBOL(dst_error_bailout);

int dst_comm_init(struct dst_state *state)
{
	dprintk(2, "Initializing DST.\n");
	if ((dst_pio_enable(state)) < 0) {
		pr_err("PIO Enable Failed\n");
		return -1;
	}
	if ((rdc_reset_state(state)) < 0) {
		pr_err("RDC 8820 State RESET Failed.\n");
		return -1;
	}
	if (state->type_flags & DST_TYPE_HAS_FW_1)
		msleep(100);
	else
		msleep(5);

	return 0;
}
EXPORT_SYMBOL(dst_comm_init);

int write_dst(struct dst_state *state, u8 *data, u8 len)
{
	struct i2c_msg msg = {
		.addr = state->config->demod_address,
		.flags = 0,
		.buf = data,
		.len = len
	};

	int err;
	u8 cnt;

	dprintk(1, "writing [ %*ph ]\n", len, data);

	for (cnt = 0; cnt < 2; cnt++) {
		if ((err = i2c_transfer(state->i2c, &msg, 1)) < 0) {
			dprintk(2, "_write_dst error (err == %i, len == 0x%02x, b0 == 0x%02x)\n",
				err, len, data[0]);
			dst_error_recovery(state);
			continue;
		} else
			break;
	}
	if (cnt >= 2) {
		dprintk(2, "RDC 8820 RESET\n");
		dst_error_bailout(state);

		return -1;
	}

	return 0;

Annotation

Implementation Notes