drivers/gpu/drm/drm_mipi_dsi.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/drm_mipi_dsi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/drm_mipi_dsi.c- Extension
.c- Size
- 55059 bytes
- Lines
- 2082
- Domain
- Driver Families
- Bucket
- drivers/gpu
- Inferred role
- Driver Families: operation-table or driver-model contract
- Status
- pattern 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.
- Defines an operation table; this is where Linux turns generic core objects into subsystem-specific behavior.
- 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/device.hlinux/export.hlinux/module.hlinux/of.hlinux/of_device.hlinux/pm_runtime.hlinux/slab.hdrm/display/drm_dsc.hdrm/drm_mipi_dsi.hdrm/drm_print.hlinux/media-bus-format.hvideo/mipi_display.h
Detected Declarations
function Copyrightfunction mipi_dsi_ueventfunction of_find_mipi_dsi_device_by_nodefunction mipi_dsi_dev_releasefunction mipi_dsi_device_addfunction of_mipi_dsi_device_addfunction of_mipi_dsi_device_addfunction mipi_dsi_device_register_fullfunction mipi_dsi_device_unregisterfunction devm_mipi_dsi_device_unregisterfunction mipi_dsi_device_register_fullfunction of_find_mipi_dsi_host_by_nodefunction list_for_each_entryfunction mipi_dsi_host_registerfunction for_each_available_child_of_nodefunction mipi_dsi_remove_device_fnfunction mipi_dsi_host_unregisterfunction mipi_dsi_attachfunction mipi_dsi_detachfunction devm_mipi_dsi_detachfunction mipi_dsi_attachfunction mipi_dsi_device_transferfunction mipi_dsi_packet_format_is_shortfunction mipi_dsi_packet_format_is_longfunction mipi_dsi_create_packetfunction mipi_dsi_shutdown_peripheralfunction mipi_dsi_turn_on_peripheralfunction mipi_dsi_set_maximum_return_packet_sizefunction mipi_dsi_compression_mode_extfunction mipi_dsi_compression_modefunction mipi_dsi_picture_parameter_setfunction mipi_dsi_generic_writefunction mipi_dsi_generic_write_multifunction mipi_dsi_dual_generic_write_multifunction mipi_dsi_generic_readfunction drm_mipi_dsi_get_input_bus_fmtfunction mipi_dsi_dcs_write_bufferfunction mipi_dsi_dcs_write_bufferfunction mipi_dsi_dcs_write_buffer_chattyfunction mipi_dsi_dcs_write_buffer_multifunction mipi_dsi_dcs_writefunction mipi_dsi_dcs_readfunction mipi_dsi_dcs_read_multifunction mipi_dsi_dcs_nopfunction mipi_dsi_dcs_soft_resetfunction mipi_dsi_dcs_get_power_modefunction mipi_dsi_dcs_get_pixel_formatfunction mipi_dsi_dcs_enter_sleep_mode
Annotated Snippet
static int mipi_dsi_device_match(struct device *dev, const struct device_driver *drv)
{
struct mipi_dsi_device *dsi = to_mipi_dsi_device(dev);
/* attempt OF style match */
if (of_driver_match_device(dev, drv))
return 1;
/* compare DSI device and driver names */
if (!strcmp(dsi->name, drv->name))
return 1;
return 0;
}
static int mipi_dsi_uevent(const struct device *dev, struct kobj_uevent_env *env)
{
const struct mipi_dsi_device *dsi = to_mipi_dsi_device(dev);
int err;
err = of_device_uevent_modalias(dev, env);
if (err != -ENODEV)
return err;
add_uevent_var(env, "MODALIAS=%s%s", MIPI_DSI_MODULE_PREFIX,
dsi->name);
return 0;
}
static const struct dev_pm_ops mipi_dsi_device_pm_ops = {
.runtime_suspend = pm_generic_runtime_suspend,
.runtime_resume = pm_generic_runtime_resume,
.suspend = pm_generic_suspend,
.resume = pm_generic_resume,
.freeze = pm_generic_freeze,
.thaw = pm_generic_thaw,
.poweroff = pm_generic_poweroff,
.restore = pm_generic_restore,
};
const struct bus_type mipi_dsi_bus_type = {
.name = "mipi-dsi",
.match = mipi_dsi_device_match,
.uevent = mipi_dsi_uevent,
.pm = &mipi_dsi_device_pm_ops,
};
EXPORT_SYMBOL_GPL(mipi_dsi_bus_type);
/**
* of_find_mipi_dsi_device_by_node() - find the MIPI DSI device matching a
* device tree node
* @np: device tree node
*
* Return: A pointer to the MIPI DSI device corresponding to @np or NULL if no
* such device exists (or has not been registered yet).
*/
struct mipi_dsi_device *of_find_mipi_dsi_device_by_node(struct device_node *np)
{
struct device *dev;
dev = bus_find_device_by_of_node(&mipi_dsi_bus_type, np);
return dev ? to_mipi_dsi_device(dev) : NULL;
}
EXPORT_SYMBOL(of_find_mipi_dsi_device_by_node);
static void mipi_dsi_dev_release(struct device *dev)
{
struct mipi_dsi_device *dsi = to_mipi_dsi_device(dev);
of_node_put(dev->of_node);
kfree(dsi);
}
static const struct device_type mipi_dsi_device_type = {
.release = mipi_dsi_dev_release,
};
static struct mipi_dsi_device *mipi_dsi_device_alloc(struct mipi_dsi_host *host)
{
struct mipi_dsi_device *dsi;
dsi = kzalloc_obj(*dsi);
if (!dsi)
return ERR_PTR(-ENOMEM);
dsi->host = host;
dsi->dev.bus = &mipi_dsi_bus_type;
dsi->dev.parent = host->dev;
Annotation
- Immediate include surface: `linux/device.h`, `linux/export.h`, `linux/module.h`, `linux/of.h`, `linux/of_device.h`, `linux/pm_runtime.h`, `linux/slab.h`, `drm/display/drm_dsc.h`.
- Detected declarations: `function Copyright`, `function mipi_dsi_uevent`, `function of_find_mipi_dsi_device_by_node`, `function mipi_dsi_dev_release`, `function mipi_dsi_device_add`, `function of_mipi_dsi_device_add`, `function of_mipi_dsi_device_add`, `function mipi_dsi_device_register_full`, `function mipi_dsi_device_unregister`, `function devm_mipi_dsi_device_unregister`.
- Atlas domain: Driver Families / drivers/gpu.
- Implementation status: pattern 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.