drivers/media/dvb-frontends/mxl692.c

Source file repositories/reference/linux-study-clean/drivers/media/dvb-frontends/mxl692.c

File Facts

System
Linux kernel
Corpus path
drivers/media/dvb-frontends/mxl692.c
Extension
.c
Size
35316 bytes
Lines
1369
Domain
Driver Families
Bucket
drivers/media
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 mxl692_dev {
	struct dvb_frontend fe;
	struct i2c_client *i2c_client;
	struct mutex i2c_lock;		/* i2c command mutex */
	enum MXL_EAGLE_DEMOD_TYPE_E demod_type;
	enum MXL_EAGLE_POWER_MODE_E power_mode;
	u32 current_frequency;
	int device_type;
	int seqnum;
	int init_done;
};

static int mxl692_i2c_write(struct mxl692_dev *dev, u8 *buffer, u16 buf_len)
{
	int ret = 0;
	struct i2c_msg msg = {
		.addr = dev->i2c_client->addr,
		.flags = 0,
		.buf = buffer,
		.len = buf_len
	};

	ret = i2c_transfer(dev->i2c_client->adapter, &msg, 1);
	if (ret != 1)
		dev_dbg(&dev->i2c_client->dev, "i2c write error!\n");

	return ret;
}

static int mxl692_i2c_read(struct mxl692_dev *dev, u8 *buffer, u16 buf_len)
{
	int ret = 0;
	struct i2c_msg msg = {
		.addr = dev->i2c_client->addr,
		.flags = I2C_M_RD,
		.buf = buffer,
		.len = buf_len
	};

	ret = i2c_transfer(dev->i2c_client->adapter, &msg, 1);
	if (ret != 1)
		dev_dbg(&dev->i2c_client->dev, "i2c read error!\n");

	return ret;
}

static int convert_endian(u32 size, u8 *d)
{
	u32 i;

	for (i = 0; i < (size & ~3); i += 4) {
		d[i + 0] ^= d[i + 3];
		d[i + 3] ^= d[i + 0];
		d[i + 0] ^= d[i + 3];

		d[i + 1] ^= d[i + 2];
		d[i + 2] ^= d[i + 1];
		d[i + 1] ^= d[i + 2];
	}

	switch (size & 3) {
	case 0:
	case 1:
		/* do nothing */
		break;
	case 2:
		d[i + 0] ^= d[i + 1];
		d[i + 1] ^= d[i + 0];
		d[i + 0] ^= d[i + 1];
		break;

	case 3:
		d[i + 0] ^= d[i + 2];
		d[i + 2] ^= d[i + 0];
		d[i + 0] ^= d[i + 2];
		break;
	}
	return size;
}

static int convert_endian_n(int n, u32 size, u8 *d)
{
	int i, count = 0;

	for (i = 0; i < n; i += size)
		count += convert_endian(size, d + i);
	return count;
}

static void mxl692_tx_swap(enum MXL_EAGLE_OPCODE_E opcode, u8 *buffer)

Annotation

Implementation Notes