drivers/gpu/drm/tiny/pixpaper.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/tiny/pixpaper.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/tiny/pixpaper.c
Extension
.c
Size
43568 bytes
Lines
1167
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 pixpaper_error_ctx {
	int errno_code;
};

struct pixpaper_panel {
	struct drm_device drm;
	struct drm_plane plane;
	struct drm_crtc crtc;
	struct drm_encoder encoder;
	struct drm_connector connector;

	struct spi_device *spi;
	struct gpio_desc *reset;
	struct gpio_desc *busy;
	struct gpio_desc *dc;
};

static inline struct pixpaper_panel *to_pixpaper_panel(struct drm_device *drm)
{
	return container_of(drm, struct pixpaper_panel, drm);
}

static void pixpaper_wait_for_panel(struct pixpaper_panel *panel)
{
	unsigned int timeout_ms = 10000;
	unsigned long timeout_jiffies = jiffies + msecs_to_jiffies(timeout_ms);

	usleep_range(1000, 1500);
	while (gpiod_get_value_cansleep(panel->busy) != 1) {
		if (time_after(jiffies, timeout_jiffies)) {
			drm_warn(&panel->drm, "Busy wait timed out\n");
			return;
		}
		usleep_range(100, 200);
	}
}

static void pixpaper_spi_sync(struct spi_device *spi, struct spi_message *msg,
			      struct pixpaper_error_ctx *err)
{
	if (err->errno_code)
		return;

	int ret = spi_sync(spi, msg);

	if (ret < 0)
		err->errno_code = ret;
}

static void pixpaper_send_cmd(struct pixpaper_panel *panel, u8 cmd,
			      struct pixpaper_error_ctx *err)
{
	if (err->errno_code)
		return;

	struct spi_transfer xfer = {
		.tx_buf = &cmd,
		.len = 1,
	};
	struct spi_message msg;

	spi_message_init(&msg);
	spi_message_add_tail(&xfer, &msg);

	gpiod_set_value_cansleep(panel->dc, 0);
	usleep_range(1, 5);
	pixpaper_spi_sync(panel->spi, &msg, err);
}

static void pixpaper_send_data(struct pixpaper_panel *panel, u8 data,
			       struct pixpaper_error_ctx *err)
{
	if (err->errno_code)
		return;

	struct spi_transfer xfer = {
		.tx_buf = &data,
		.len = 1,
	};
	struct spi_message msg;

	spi_message_init(&msg);
	spi_message_add_tail(&xfer, &msg);

	gpiod_set_value_cansleep(panel->dc, 1);
	usleep_range(1, 5);
	pixpaper_spi_sync(panel->spi, &msg, err);
}

static int pixpaper_panel_hw_init(struct pixpaper_panel *panel)

Annotation

Implementation Notes