drivers/gpu/drm/drm_panel.c

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

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/drm_panel.c
Extension
.c
Size
21394 bytes
Lines
759
Domain
Driver Families
Bucket
drivers/gpu
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 (panel->dev->of_node == np) {
			mutex_unlock(&panel_lock);
			return panel;
		}
	}

	mutex_unlock(&panel_lock);
	return ERR_PTR(-EPROBE_DEFER);
}
EXPORT_SYMBOL(of_drm_find_panel);

/**
 * of_drm_get_panel_orientation - look up the orientation of the panel through
 * the "rotation" binding from a device tree node
 * @np: device tree node of the panel
 * @orientation: orientation enum to be filled in
 *
 * Looks up the rotation of a panel in the device tree. The orientation of the
 * panel is expressed as a property name "rotation" in the device tree. The
 * rotation in the device tree is counter clockwise.
 *
 * Return: 0 when a valid rotation value (0, 90, 180, or 270) is read or the
 * rotation property doesn't exist. Return a negative error code on failure.
 */
int of_drm_get_panel_orientation(const struct device_node *np,
				 enum drm_panel_orientation *orientation)
{
	int rotation, ret;

	ret = of_property_read_u32(np, "rotation", &rotation);
	if (ret == -EINVAL) {
		/* Don't return an error if there's no rotation property. */
		*orientation = DRM_MODE_PANEL_ORIENTATION_UNKNOWN;
		return 0;
	}

	if (ret < 0)
		return ret;

	if (rotation == 0)
		*orientation = DRM_MODE_PANEL_ORIENTATION_NORMAL;
	else if (rotation == 90)
		*orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP;
	else if (rotation == 180)
		*orientation = DRM_MODE_PANEL_ORIENTATION_BOTTOM_UP;
	else if (rotation == 270)
		*orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP;
	else
		return -EINVAL;

	return 0;
}
EXPORT_SYMBOL(of_drm_get_panel_orientation);
#endif

/* Find panel by fwnode. This should be identical to of_drm_find_panel(). */
static struct drm_panel *find_panel_by_fwnode(const struct fwnode_handle *fwnode)
{
	struct drm_panel *panel;

	if (!fwnode_device_is_available(fwnode))
		return ERR_PTR(-ENODEV);

	mutex_lock(&panel_lock);

	list_for_each_entry(panel, &panel_list, list) {
		if (dev_fwnode(panel->dev) == fwnode) {
			mutex_unlock(&panel_lock);
			return panel;
		}
	}

	mutex_unlock(&panel_lock);

	return ERR_PTR(-EPROBE_DEFER);
}

/* Find panel by follower device */
static struct drm_panel *find_panel_by_dev(struct device *follower_dev)
{
	struct fwnode_handle *fwnode;
	struct drm_panel *panel;

	fwnode = fwnode_find_reference(dev_fwnode(follower_dev), "panel", 0);
	if (IS_ERR(fwnode))
		return ERR_PTR(-ENODEV);

	panel = find_panel_by_fwnode(fwnode);
	fwnode_handle_put(fwnode);

Annotation

Implementation Notes