drivers/media/dvb-frontends/lgdt330x.c

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

File Facts

System
Linux kernel
Corpus path
drivers/media/dvb-frontends/lgdt330x.c
Extension
.c
Size
26057 bytes
Lines
1007
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

struct lgdt330x_state {
	struct i2c_client *client;

	/* Configuration settings */
	struct lgdt330x_config config;

	struct dvb_frontend frontend;

	/* Demodulator private data */
	enum fe_modulation current_modulation;
	u32 snr;	/* Result of last SNR calculation */
	u16 ucblocks;
	unsigned long last_stats_time;

	/* Tuner private data */
	u32 current_frequency;
};

static int i2c_write_demod_bytes(struct lgdt330x_state *state,
				 const u8 *buf, /* data bytes to send */
				 int len  /* number of bytes to send */)
{
	int i;
	int err;

	for (i = 0; i < len - 1; i += 2) {
		err = i2c_master_send(state->client, buf, 2);
		if (err != 2) {
			dev_warn(&state->client->dev,
				 "%s: error (addr %02x <- %02x, err = %i)\n",
				__func__, buf[0], buf[1], err);
			if (err < 0)
				return err;
			else
				return -EREMOTEIO;
		}
		buf += 2;
	}
	return 0;
}

/*
 * This routine writes the register (reg) to the demod bus
 * then reads the data returned for (len) bytes.
 */
static int i2c_read_demod_bytes(struct lgdt330x_state *state,
				enum I2C_REG reg, u8 *buf, int len)
{
	u8 wr[] = { reg };
	struct i2c_msg msg[] = {
		{
			.addr = state->client->addr,
			.flags = 0,
			.buf = wr,
			.len = 1
		}, {
			.addr = state->client->addr,
			.flags = I2C_M_RD,
			.buf = buf,
			.len = len
		},
	};
	int ret;

	ret = i2c_transfer(state->client->adapter, msg, 2);
	if (ret != 2) {
		dev_warn(&state->client->dev,
			 "%s: addr 0x%02x select 0x%02x error (ret == %i)\n",
			 __func__, state->client->addr, reg, ret);
		if (ret >= 0)
			ret = -EIO;
	} else {
		ret = 0;
	}
	return ret;
}

/* Software reset */
static int lgdt3302_sw_reset(struct lgdt330x_state *state)
{
	u8 reset[] = {
		IRQ_MASK,
		/*
		 * bit 6 is active low software reset
		 * bits 5-0 are 1 to mask interrupts
		 */
		0x00
	};
	int ret;

Annotation

Implementation Notes