drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/bridge/imx/imx8qxp-pxl2dpi.c- Extension
.c- Size
- 12187 bytes
- Lines
- 476
- 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.
- 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.
- Uses kernel synchronization; read lock ordering, sleepability, and interrupt context assumptions before translating.
- Allocates kernel memory; connect allocation flags and lifetime to context constraints.
- Defines or uses C structs; map object ownership, embedded links, reference counts, and lock ownership.
Dependency Surface
linux/firmware/imx/svc/misc.hlinux/media-bus-format.hlinux/mfd/syscon.hlinux/module.hlinux/of.hlinux/of_device.hlinux/of_graph.hlinux/platform_device.hlinux/pm_runtime.hlinux/regmap.hdrm/drm_atomic_state_helper.hdrm/drm_bridge.hdrm/drm_of.hdrm/drm_print.hdt-bindings/firmware/imx/rsrc.h
Detected Declarations
struct imx8qxp_pxl2dpifunction imx8qxp_pxl2dpi_bridge_attachfunction imx8qxp_pxl2dpi_bridge_destroyfunction imx8qxp_pxl2dpi_bridge_atomic_checkfunction imx8qxp_pxl2dpi_bridge_mode_setfunction imx8qxp_pxl2dpi_bridge_atomic_disablefunction imx8qxp_pxl2dpi_bus_output_fmt_supportedfunction imx8qxp_pxl2dpi_bridge_atomic_get_input_bus_fmtsfunction imx8qxp_pxl2dpi_bridge_atomic_get_output_bus_fmtsfunction imx8qxp_pxl2dpi_get_available_ep_from_portfunction imx8qxp_pxl2dpi_find_next_bridgefunction imx8qxp_pxl2dpi_set_pixel_link_selfunction imx8qxp_pxl2dpi_parse_dt_companionfunction imx8qxp_pxl2dpi_bridge_probefunction imx8qxp_pxl2dpi_bridge_remove
Annotated Snippet
struct imx8qxp_pxl2dpi {
struct regmap *regmap;
struct drm_bridge bridge;
struct drm_bridge *companion;
struct device *dev;
struct imx_sc_ipc *ipc_handle;
u32 sc_resource;
u32 in_bus_format;
u32 out_bus_format;
u32 pl_sel;
};
#define bridge_to_p2d(b) container_of(b, struct imx8qxp_pxl2dpi, bridge)
static int imx8qxp_pxl2dpi_bridge_attach(struct drm_bridge *bridge,
struct drm_encoder *encoder,
enum drm_bridge_attach_flags flags)
{
struct imx8qxp_pxl2dpi *p2d = bridge->driver_private;
if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
DRM_DEV_ERROR(p2d->dev,
"do not support creating a drm_connector\n");
return -EINVAL;
}
return drm_bridge_attach(encoder,
p2d->bridge.next_bridge, bridge,
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
}
static void imx8qxp_pxl2dpi_bridge_destroy(struct drm_bridge *bridge)
{
struct imx8qxp_pxl2dpi *p2d = bridge->driver_private;
if (!p2d)
return;
drm_bridge_put(p2d->companion);
}
static int
imx8qxp_pxl2dpi_bridge_atomic_check(struct drm_bridge *bridge,
struct drm_bridge_state *bridge_state,
struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state)
{
struct imx8qxp_pxl2dpi *p2d = bridge->driver_private;
p2d->in_bus_format = bridge_state->input_bus_cfg.format;
p2d->out_bus_format = bridge_state->output_bus_cfg.format;
return 0;
}
static void
imx8qxp_pxl2dpi_bridge_mode_set(struct drm_bridge *bridge,
const struct drm_display_mode *mode,
const struct drm_display_mode *adjusted_mode)
{
struct imx8qxp_pxl2dpi *p2d = bridge->driver_private;
struct imx8qxp_pxl2dpi *companion_p2d;
int ret;
ret = pm_runtime_get_sync(p2d->dev);
if (ret < 0)
DRM_DEV_ERROR(p2d->dev,
"failed to get runtime PM sync: %d\n", ret);
ret = imx_sc_misc_set_control(p2d->ipc_handle, p2d->sc_resource,
IMX_SC_C_PXL_LINK_SEL, p2d->pl_sel);
if (ret)
DRM_DEV_ERROR(p2d->dev,
"failed to set pixel link selection(%u): %d\n",
p2d->pl_sel, ret);
switch (p2d->out_bus_format) {
case MEDIA_BUS_FMT_RGB888_1X24:
regmap_write(p2d->regmap, PXL2DPI_CTRL, CFG_24BIT);
break;
case MEDIA_BUS_FMT_RGB666_1X24_CPADHI:
regmap_write(p2d->regmap, PXL2DPI_CTRL, CFG2_18BIT);
break;
default:
DRM_DEV_ERROR(p2d->dev,
"unsupported output bus format 0x%08x\n",
p2d->out_bus_format);
}
if (p2d->companion) {
Annotation
- Immediate include surface: `linux/firmware/imx/svc/misc.h`, `linux/media-bus-format.h`, `linux/mfd/syscon.h`, `linux/module.h`, `linux/of.h`, `linux/of_device.h`, `linux/of_graph.h`, `linux/platform_device.h`.
- Detected declarations: `struct imx8qxp_pxl2dpi`, `function imx8qxp_pxl2dpi_bridge_attach`, `function imx8qxp_pxl2dpi_bridge_destroy`, `function imx8qxp_pxl2dpi_bridge_atomic_check`, `function imx8qxp_pxl2dpi_bridge_mode_set`, `function imx8qxp_pxl2dpi_bridge_atomic_disable`, `function imx8qxp_pxl2dpi_bus_output_fmt_supported`, `function imx8qxp_pxl2dpi_bridge_atomic_get_input_bus_fmts`, `function imx8qxp_pxl2dpi_bridge_atomic_get_output_bus_fmts`, `function imx8qxp_pxl2dpi_get_available_ep_from_port`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
- Synchronization appears in or near this file; preserve lock ordering, sleepability, and interrupt-context constraints.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.