drivers/gpu/drm/imx/ipuv3/parallel-display.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/imx/ipuv3/parallel-display.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/imx/ipuv3/parallel-display.c- Extension
.c- Size
- 8309 bytes
- Lines
- 299
- 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/component.hlinux/media-bus-format.hlinux/module.hlinux/of.hlinux/platform_device.hlinux/videodev2.hdrm/drm_atomic_helper.hdrm/drm_bridge.hdrm/drm_bridge_connector.hdrm/drm_managed.hdrm/drm_of.hdrm/drm_probe_helper.hdrm/drm_simple_kms_helper.hdrm/bridge/of-display-mode-bridge.himx-drm.h
Detected Declarations
struct imx_parallel_display_encoderstruct imx_parallel_displayfunction imx_pd_bridge_atomic_get_output_bus_fmtsfunction imx_pd_format_supportedfunction imx_pd_bridge_atomic_get_input_bus_fmtsfunction imx_pd_bridge_atomic_checkfunction imx_pd_bridge_attachfunction imx_pd_bindfunction imx_pd_probefunction imx_pd_remove
Annotated Snippet
struct imx_parallel_display_encoder {
struct drm_encoder encoder;
};
struct imx_parallel_display {
struct device *dev;
u32 bus_format;
struct drm_bridge *next_bridge;
struct drm_bridge bridge;
};
static inline struct imx_parallel_display *bridge_to_imxpd(struct drm_bridge *b)
{
return container_of(b, struct imx_parallel_display, bridge);
}
static const u32 imx_pd_bus_fmts[] = {
MEDIA_BUS_FMT_RGB888_1X24,
MEDIA_BUS_FMT_BGR888_1X24,
MEDIA_BUS_FMT_GBR888_1X24,
MEDIA_BUS_FMT_RGB666_1X18,
MEDIA_BUS_FMT_RGB666_1X24_CPADHI,
MEDIA_BUS_FMT_RGB565_1X16,
};
static u32 *
imx_pd_bridge_atomic_get_output_bus_fmts(struct drm_bridge *bridge,
struct drm_bridge_state *bridge_state,
struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state,
unsigned int *num_output_fmts)
{
struct drm_display_info *di = &conn_state->connector->display_info;
struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge);
u32 *output_fmts;
if (!imxpd->bus_format && !di->num_bus_formats) {
*num_output_fmts = ARRAY_SIZE(imx_pd_bus_fmts);
return kmemdup(imx_pd_bus_fmts, sizeof(imx_pd_bus_fmts),
GFP_KERNEL);
}
*num_output_fmts = 1;
output_fmts = kmalloc_obj(*output_fmts);
if (!output_fmts)
return NULL;
if (!imxpd->bus_format && di->num_bus_formats)
output_fmts[0] = di->bus_formats[0];
else
output_fmts[0] = imxpd->bus_format;
return output_fmts;
}
static bool imx_pd_format_supported(u32 output_fmt)
{
unsigned int i;
for (i = 0; i < ARRAY_SIZE(imx_pd_bus_fmts); i++) {
if (imx_pd_bus_fmts[i] == output_fmt)
return true;
}
return false;
}
static u32 *
imx_pd_bridge_atomic_get_input_bus_fmts(struct drm_bridge *bridge,
struct drm_bridge_state *bridge_state,
struct drm_crtc_state *crtc_state,
struct drm_connector_state *conn_state,
u32 output_fmt,
unsigned int *num_input_fmts)
{
struct imx_parallel_display *imxpd = bridge_to_imxpd(bridge);
u32 *input_fmts;
/*
* If the next bridge does not support bus format negotiation, let's
* use the static bus format definition (imxpd->bus_format) if it's
* specified, RGB888 when it's not.
*/
if (output_fmt == MEDIA_BUS_FMT_FIXED)
output_fmt = imxpd->bus_format ? : MEDIA_BUS_FMT_RGB888_1X24;
/* Now make sure the requested output format is supported. */
if (!imx_pd_format_supported(output_fmt)) {
*num_input_fmts = 0;
return NULL;
Annotation
- Immediate include surface: `linux/component.h`, `linux/media-bus-format.h`, `linux/module.h`, `linux/of.h`, `linux/platform_device.h`, `linux/videodev2.h`, `drm/drm_atomic_helper.h`, `drm/drm_bridge.h`.
- Detected declarations: `struct imx_parallel_display_encoder`, `struct imx_parallel_display`, `function imx_pd_bridge_atomic_get_output_bus_fmts`, `function imx_pd_format_supported`, `function imx_pd_bridge_atomic_get_input_bus_fmts`, `function imx_pd_bridge_atomic_check`, `function imx_pd_bridge_attach`, `function imx_pd_bind`, `function imx_pd_probe`, `function imx_pd_remove`.
- 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.