drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/stm/dw_mipi_dsi-stm.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/stm/dw_mipi_dsi-stm.c- Extension
.c- Size
- 21333 bytes
- Lines
- 802
- 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.
- 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/clk-provider.hlinux/iopoll.hlinux/kernel.hlinux/mod_devicetable.hlinux/module.hlinux/platform_device.hlinux/pm_runtime.hlinux/regulator/consumer.hvideo/mipi_display.hdrm/bridge/dw_mipi_dsi.hdrm/drm_mipi_dsi.hdrm/drm_print.h
Detected Declarations
struct dw_mipi_dsi_stmenum dsi_colorfunction dsi_writefunction dsi_readfunction dsi_setfunction dsi_clearfunction dsi_update_bitsfunction dsi_color_from_mipifunction dsi_pll_get_clkout_khzfunction dsi_pll_get_paramsfunction dw_mipi_dsi_clk_disablefunction dw_mipi_dsi_clk_enablefunction dw_mipi_dsi_clk_is_enabledfunction dw_mipi_dsi_clk_recalc_ratefunction dw_mipi_dsi_clk_determine_ratefunction dw_mipi_dsi_clk_set_ratefunction dw_mipi_dsi_clk_unregisterfunction dw_mipi_dsi_clk_registerfunction dw_mipi_dsi_phy_initfunction dw_mipi_dsi_phy_power_onfunction dw_mipi_dsi_phy_power_offfunction dw_mipi_dsi_get_lane_mbpsfunction dw_mipi_dsi_phy_get_timingfunction dw_mipi_dsi_stm_mode_validfunction dw_mipi_dsi_stm_probefunction dw_mipi_dsi_stm_removefunction dw_mipi_dsi_stm_suspendfunction dw_mipi_dsi_stm_resume
Annotated Snippet
struct dw_mipi_dsi_stm {
void __iomem *base;
struct device *dev;
struct clk *pllref_clk;
struct clk *pclk;
struct clk_hw txbyte_clk;
struct dw_mipi_dsi *dsi;
struct dw_mipi_dsi_plat_data pdata;
u32 hw_version;
int lane_min_kbps;
int lane_max_kbps;
struct regulator *vdd_supply;
};
static inline void dsi_write(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 val)
{
writel(val, dsi->base + reg);
}
static inline u32 dsi_read(struct dw_mipi_dsi_stm *dsi, u32 reg)
{
return readl(dsi->base + reg);
}
static inline void dsi_set(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 mask)
{
dsi_write(dsi, reg, dsi_read(dsi, reg) | mask);
}
static inline void dsi_clear(struct dw_mipi_dsi_stm *dsi, u32 reg, u32 mask)
{
dsi_write(dsi, reg, dsi_read(dsi, reg) & ~mask);
}
static inline void dsi_update_bits(struct dw_mipi_dsi_stm *dsi, u32 reg,
u32 mask, u32 val)
{
dsi_write(dsi, reg, (dsi_read(dsi, reg) & ~mask) | val);
}
static enum dsi_color dsi_color_from_mipi(enum mipi_dsi_pixel_format fmt)
{
switch (fmt) {
case MIPI_DSI_FMT_RGB888:
return DSI_RGB888;
case MIPI_DSI_FMT_RGB666:
return DSI_RGB666_CONF2;
case MIPI_DSI_FMT_RGB666_PACKED:
return DSI_RGB666_CONF1;
case MIPI_DSI_FMT_RGB565:
return DSI_RGB565_CONF1;
default:
DRM_DEBUG_DRIVER("MIPI color invalid, so we use rgb888\n");
}
return DSI_RGB888;
}
static int dsi_pll_get_clkout_khz(int clkin_khz, int idf, int ndiv, int odf)
{
int divisor = idf * odf;
/* prevent from division by 0 */
if (!divisor)
return 0;
return DIV_ROUND_CLOSEST(clkin_khz * ndiv, divisor);
}
static int dsi_pll_get_params(struct dw_mipi_dsi_stm *dsi,
int clkin_khz, int clkout_khz,
int *idf, int *ndiv, int *odf)
{
int i, o, n, n_min, n_max;
int fvco_min, fvco_max, delta, best_delta; /* all in khz */
/* Early checks preventing division by 0 & odd results */
if (clkin_khz <= 0 || clkout_khz <= 0)
return -EINVAL;
fvco_min = dsi->lane_min_kbps * 2 * ODF_MAX;
fvco_max = dsi->lane_max_kbps * 2 * ODF_MIN;
best_delta = 1000000; /* big started value (1000000khz) */
for (i = IDF_MIN; i <= IDF_MAX; i++) {
/* Compute ndiv range according to Fvco */
n_min = ((fvco_min * i) / (2 * clkin_khz)) + 1;
n_max = (fvco_max * i) / (2 * clkin_khz);
/* No need to continue idf loop if we reach ndiv max */
Annotation
- Immediate include surface: `linux/clk.h`, `linux/clk-provider.h`, `linux/iopoll.h`, `linux/kernel.h`, `linux/mod_devicetable.h`, `linux/module.h`, `linux/platform_device.h`, `linux/pm_runtime.h`.
- Detected declarations: `struct dw_mipi_dsi_stm`, `enum dsi_color`, `function dsi_write`, `function dsi_read`, `function dsi_set`, `function dsi_clear`, `function dsi_update_bits`, `function dsi_color_from_mipi`, `function dsi_pll_get_clkout_khz`, `function dsi_pll_get_params`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: source implementation candidate.
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.