drivers/gpu/drm/omapdrm/dss/dsi.c
Source file repositories/reference/linux-study-clean/drivers/gpu/drm/omapdrm/dss/dsi.c
File Facts
- System
- Linux kernel
- Corpus path
drivers/gpu/drm/omapdrm/dss/dsi.c- Extension
.c- Size
- 122879 bytes
- Lines
- 5104
- 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.
- Touches IRQ or DMA behavior; this matters for the representative real-device path.
- 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/kernel.hlinux/mfd/syscon.hlinux/regmap.hlinux/io.hlinux/clk.hlinux/device.hlinux/err.hlinux/interrupt.hlinux/irq.hlinux/delay.hlinux/gpio/consumer.hlinux/mutex.hlinux/module.hlinux/semaphore.hlinux/seq_file.hlinux/platform_device.hlinux/regulator/consumer.hlinux/wait.hlinux/workqueue.hlinux/sched.hlinux/slab.hlinux/debugfs.hlinux/pm_runtime.hlinux/of.hlinux/of_graph.hlinux/of_platform.hlinux/component.hlinux/sys_soc.hdrm/drm_bridge.hdrm/drm_mipi_dsi.hdrm/drm_panel.hvideo/mipi_display.h
Detected Declarations
enum dsi_pll_power_stateenum dsi_cio_power_statefunction dsi_write_regfunction dsi_read_regfunction dsi_bus_lockfunction dsi_bus_unlockfunction dsi_bus_is_lockedfunction dsi_completion_handlerfunction wait_for_bit_changefunction dsi_perf_mark_setupfunction dsi_perf_mark_startfunction dsi_perf_showfunction dsi_perf_mark_setupfunction print_irq_statusfunction print_irq_status_vcfunction print_irq_status_ciofunction dsi_collect_irq_statsfunction dsi_handle_irq_errorsfunction dsi_call_isrsfunction dsi_handle_isrsfunction omap_dsi_irq_handlerfunction _omap_dsi_configure_irqsfunction _omap_dsi_set_irqsfunction _omap_dsi_set_irqs_vcfunction _omap_dsi_set_irqs_ciofunction _dsi_initialize_irqfunction _dsi_register_isrfunction _dsi_unregister_isrfunction dsi_register_isrfunction dsi_unregister_isrfunction dsi_register_isr_vcfunction dsi_unregister_isr_vcfunction dsi_get_errorsfunction dsi_runtime_getfunction dsi_runtime_putfunction _dsi_print_reset_statusfunction dsi_if_enablefunction dsi_get_pll_hsdiv_dispc_ratefunction dsi_get_pll_hsdiv_dsi_ratefunction dsi_get_txbyteclkhsfunction dsi_fclk_ratefunction dsi_lp_clock_calcfunction dsi_set_lp_clk_divisorfunction dsi_enable_scp_clkfunction dsi_disable_scp_clkfunction dsi_pll_powerfunction dsi_pll_calc_dsi_fckfunction dsi_pll_enable
Annotated Snippet
if (vcstatus[i] & DSI_VC_IRQ_ERROR_MASK) {
DSSERR("DSI VC(%d) error, vc irqstatus %x\n",
i, vcstatus[i]);
print_irq_status_vc(i, vcstatus[i]);
} else if (debug_irq) {
print_irq_status_vc(i, vcstatus[i]);
}
}
if (ciostatus & DSI_CIO_IRQ_ERROR_MASK) {
DSSERR("DSI CIO error, cio irqstatus %x\n", ciostatus);
print_irq_status_cio(ciostatus);
} else if (debug_irq) {
print_irq_status_cio(ciostatus);
}
}
static void dsi_call_isrs(struct dsi_isr_data *isr_array,
unsigned int isr_array_size, u32 irqstatus)
{
struct dsi_isr_data *isr_data;
int i;
for (i = 0; i < isr_array_size; i++) {
isr_data = &isr_array[i];
if (isr_data->isr && isr_data->mask & irqstatus)
isr_data->isr(isr_data->arg, irqstatus);
}
}
static void dsi_handle_isrs(struct dsi_isr_tables *isr_tables,
u32 irqstatus, u32 *vcstatus, u32 ciostatus)
{
int i;
dsi_call_isrs(isr_tables->isr_table,
ARRAY_SIZE(isr_tables->isr_table),
irqstatus);
for (i = 0; i < 4; ++i) {
if (vcstatus[i] == 0)
continue;
dsi_call_isrs(isr_tables->isr_table_vc[i],
ARRAY_SIZE(isr_tables->isr_table_vc[i]),
vcstatus[i]);
}
if (ciostatus != 0)
dsi_call_isrs(isr_tables->isr_table_cio,
ARRAY_SIZE(isr_tables->isr_table_cio),
ciostatus);
}
static irqreturn_t omap_dsi_irq_handler(int irq, void *arg)
{
struct dsi_data *dsi = arg;
u32 irqstatus, vcstatus[4], ciostatus;
int i;
if (!dsi->is_enabled)
return IRQ_NONE;
spin_lock(&dsi->irq_lock);
irqstatus = dsi_read_reg(dsi, DSI_IRQSTATUS);
/* IRQ is not for us */
if (!irqstatus) {
spin_unlock(&dsi->irq_lock);
return IRQ_NONE;
}
dsi_write_reg(dsi, DSI_IRQSTATUS, irqstatus & ~DSI_IRQ_CHANNEL_MASK);
/* flush posted write */
dsi_read_reg(dsi, DSI_IRQSTATUS);
for (i = 0; i < 4; ++i) {
if ((irqstatus & (1 << i)) == 0) {
vcstatus[i] = 0;
continue;
}
vcstatus[i] = dsi_read_reg(dsi, DSI_VC_IRQSTATUS(i));
dsi_write_reg(dsi, DSI_VC_IRQSTATUS(i), vcstatus[i]);
/* flush posted write */
dsi_read_reg(dsi, DSI_VC_IRQSTATUS(i));
}
if (irqstatus & DSI_IRQ_COMPLEXIO_ERR) {
Annotation
- Immediate include surface: `linux/kernel.h`, `linux/mfd/syscon.h`, `linux/regmap.h`, `linux/io.h`, `linux/clk.h`, `linux/device.h`, `linux/err.h`, `linux/interrupt.h`.
- Detected declarations: `enum dsi_pll_power_state`, `enum dsi_cio_power_state`, `function dsi_write_reg`, `function dsi_read_reg`, `function dsi_bus_lock`, `function dsi_bus_unlock`, `function dsi_bus_is_locked`, `function dsi_completion_handler`, `function wait_for_bit_change`, `function dsi_perf_mark_setup`.
- 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.
- IRQ or DMA behavior appears here, which is relevant to the selected PCIe/NVMe device path.
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.