drivers/gpu/drm/bridge/lontium-lt8713sx.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/bridge/lontium-lt8713sx.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/bridge/lontium-lt8713sx.c
Extension
.c
Size
15821 bytes
Lines
597
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

struct lt8713sx {
	struct device *dev;
	struct drm_bridge bridge;

	struct regmap *regmap;
	/* Protects all accesses to registers by stopping the on-chip MCU */
	struct mutex ocm_lock;

	struct gpio_desc *reset_gpio;
	struct gpio_desc *enable_gpio;

	struct i2c_client *client;
	const struct firmware *fw;

	u8 *fw_buffer;

	u32 main_crc_value;
	u32 bank_crc_value[17];

	int bank_num;
};

static void lt8713sx_reset(struct lt8713sx *lt8713sx);

static const struct regmap_range lt8713sx_ranges[] = {
	{
		.range_min = 0x0000,
		.range_max = 0xffff
	},
};

static const struct regmap_access_table lt8713sx_table = {
	.yes_ranges = lt8713sx_ranges,
	.n_yes_ranges = ARRAY_SIZE(lt8713sx_ranges),
};

static const struct regmap_range_cfg lt8713sx_range_cfg = {
	.name = "lt8713sx",
	.range_min = 0x0000,
	.range_max = 0xffff,
	.selector_reg = REG_PAGE_CONTROL,
	.selector_mask = 0xff,
	.selector_shift = 0,
	.window_start = 0,
	.window_len = 0x100,
};

static const struct regmap_config lt8713sx_regmap_config = {
	.reg_bits = 8,
	.val_bits = 8,
	.volatile_table = &lt8713sx_table,
	.ranges = &lt8713sx_range_cfg,
	.num_ranges = 1,
	.cache_type = REGCACHE_NONE,
	.max_register = 0xffff,
};

static void lt8713sx_i2c_enable(struct lt8713sx *lt8713sx)
{
	regmap_write(lt8713sx->regmap, 0xe0ee, 0x01);
}

static void lt8713sx_i2c_disable(struct lt8713sx *lt8713sx)
{
	regmap_write(lt8713sx->regmap, 0xe0ee, 0x00);
}

static int lt8713sx_prepare_firmware_data(struct lt8713sx *lt8713sx)
{
	int ret = 0;
	size_t sz_12k = 12 * SZ_1K;

	ret = request_firmware(&lt8713sx->fw, FW_FILE, lt8713sx->dev);
	if (ret < 0) {
		dev_err(lt8713sx->dev, "request firmware failed\n");
		return ret;
	}

	dev_dbg(lt8713sx->dev, "Firmware size: %zu bytes\n", lt8713sx->fw->size);

	if (lt8713sx->fw->size > SZ_256K - 1) {
		dev_err(lt8713sx->dev, "Firmware size exceeds 256KB limit\n");
		release_firmware(lt8713sx->fw);
		return -EINVAL;
	}

	lt8713sx->fw_buffer = kvmalloc(SZ_256K, GFP_KERNEL);
	if (!lt8713sx->fw_buffer) {
		release_firmware(lt8713sx->fw);
		return -ENOMEM;

Annotation

Implementation Notes