drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/bridge/synopsys/dw-mipi-dsi.c- Extension
.c- Size
- 35476 bytes
- Lines
- 1343
- 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.
- 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.
- Exports symbols or registers init work; inspect boot/module ordering and who consumes the exported contract.
- 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/clk.hlinux/component.hlinux/debugfs.hlinux/export.hlinux/iopoll.hlinux/math64.hlinux/media-bus-format.hlinux/module.hlinux/platform_device.hlinux/pm_runtime.hlinux/reset.hvideo/mipi_display.hdrm/bridge/dw_mipi_dsi.hdrm/drm_atomic_helper.hdrm/drm_bridge.hdrm/drm_connector.hdrm/drm_crtc.hdrm/drm_mipi_dsi.hdrm/drm_modes.hdrm/drm_of.hdrm/drm_print.h
Detected Declarations
struct debugfs_entriesstruct dw_mipi_dsifunction dw_mipi_is_dual_modefunction dw_mipi_dsi_wait_for_two_framesfunction dsi_writefunction dsi_readfunction dw_mipi_dsi_host_attachfunction dw_mipi_dsi_host_detachfunction dw_mipi_message_configfunction dw_mipi_dsi_gen_pkt_hdr_writefunction dw_mipi_dsi_writefunction dw_mipi_dsi_readfunction dw_mipi_dsi_host_transferfunction dw_mipi_dsi_bridge_atomic_get_input_bus_fmtsfunction dw_mipi_dsi_bridge_atomic_checkfunction dw_mipi_dsi_video_mode_configfunction dw_mipi_dsi_set_modefunction dw_mipi_dsi_disablefunction dw_mipi_dsi_initfunction dw_mipi_dsi_dpi_configfunction dw_mipi_dsi_packet_handler_configfunction dw_mipi_dsi_video_packet_configfunction dw_mipi_dsi_command_mode_configfunction dw_mipi_dsi_get_minimum_lbccfunction dw_mipi_dsi_get_hcomponent_lbccfunction dw_mipi_dsi_line_timer_configfunction dw_mipi_dsi_vertical_timing_configfunction dw_mipi_dsi_dphy_timing_configfunction dw_mipi_dsi_dphy_interface_configfunction dw_mipi_dsi_dphy_initfunction dw_mipi_dsi_dphy_enablefunction dw_mipi_dsi_clear_errfunction dw_mipi_dsi_bridge_post_atomic_disablefunction dw_mipi_dsi_get_lanesfunction dw_mipi_dsi_mode_setfunction dw_mipi_dsi_bridge_atomic_pre_enablefunction dw_mipi_dsi_bridge_mode_setfunction dw_mipi_dsi_bridge_atomic_enablefunction dw_mipi_dsi_bridge_mode_validfunction dw_mipi_dsi_bridge_attachfunction dw_mipi_dsi_debugfs_writefunction dw_mipi_dsi_debugfs_showfunction debugfs_create_filesfunction dw_mipi_dsi_debugfs_initfunction dw_mipi_dsi_debugfs_removefunction dw_mipi_dsi_debugfs_initfunction __dw_mipi_dsi_removefunction dw_mipi_dsi_set_slave
Annotated Snippet
struct debugfs_entries {
const char *name;
bool *reg;
u32 mask;
struct dw_mipi_dsi *dsi;
};
#endif /* CONFIG_DEBUG_FS */
struct dw_mipi_dsi {
struct drm_bridge bridge;
struct mipi_dsi_host dsi_host;
struct drm_bridge *panel_bridge;
struct device *dev;
void __iomem *base;
struct clk *pclk;
unsigned int lane_mbps; /* per lane */
u32 channel;
u32 lanes;
u32 format;
unsigned long mode_flags;
#ifdef CONFIG_DEBUG_FS
struct dentry *debugfs;
struct debugfs_entries *debugfs_vpg;
struct {
bool vpg;
bool vpg_horizontal;
bool vpg_ber_pattern;
} vpg_defs;
#endif /* CONFIG_DEBUG_FS */
struct dw_mipi_dsi *master; /* dual-dsi master ptr */
struct dw_mipi_dsi *slave; /* dual-dsi slave ptr */
struct drm_display_mode mode;
const struct dw_mipi_dsi_plat_data *plat_data;
};
/*
* Check if either a link to a master or slave is present
*/
static inline bool dw_mipi_is_dual_mode(struct dw_mipi_dsi *dsi)
{
return dsi->slave || dsi->master;
}
/*
* The controller should generate 2 frames before
* preparing the peripheral.
*/
static void dw_mipi_dsi_wait_for_two_frames(const struct drm_display_mode *mode)
{
int refresh, two_frames;
refresh = drm_mode_vrefresh(mode);
two_frames = DIV_ROUND_UP(MSEC_PER_SEC, refresh) * 2;
msleep(two_frames);
}
static inline struct dw_mipi_dsi *host_to_dsi(struct mipi_dsi_host *host)
{
return container_of(host, struct dw_mipi_dsi, dsi_host);
}
static inline struct dw_mipi_dsi *bridge_to_dsi(struct drm_bridge *bridge)
{
return container_of(bridge, struct dw_mipi_dsi, bridge);
}
static inline void dsi_write(struct dw_mipi_dsi *dsi, u32 reg, u32 val)
{
writel(val, dsi->base + reg);
}
static inline u32 dsi_read(struct dw_mipi_dsi *dsi, u32 reg)
{
return readl(dsi->base + reg);
}
static int dw_mipi_dsi_host_attach(struct mipi_dsi_host *host,
struct mipi_dsi_device *device)
{
struct dw_mipi_dsi *dsi = host_to_dsi(host);
const struct dw_mipi_dsi_plat_data *pdata = dsi->plat_data;
struct drm_bridge *bridge;
int ret;
if (device->lanes > dsi->plat_data->max_data_lanes) {
Annotation
- Immediate include surface: `linux/clk.h`, `linux/component.h`, `linux/debugfs.h`, `linux/export.h`, `linux/iopoll.h`, `linux/math64.h`, `linux/media-bus-format.h`, `linux/module.h`.
- Detected declarations: `struct debugfs_entries`, `struct dw_mipi_dsi`, `function dw_mipi_is_dual_mode`, `function dw_mipi_dsi_wait_for_two_frames`, `function dsi_write`, `function dsi_read`, `function dw_mipi_dsi_host_attach`, `function dw_mipi_dsi_host_detach`, `function dw_mipi_message_config`, `function dw_mipi_dsi_gen_pkt_hdr_write`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: integration 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.