tilcdc_crtc
init_waitqueue_head(&tilcdc_crtc->frame_done_wq);
spin_lock_init(&tilcdc_crtc->irq_lock);
INIT_WORK(&tilcdc_crtc->recover_work, tilcdc_crtc_recover_work);
reinit_completion(&tilcdc_crtc->palette_loaded);
tilcdc_crtc->palette_dma_handle);
(u32) tilcdc_crtc->palette_dma_handle +
ret = wait_for_completion_timeout(&tilcdc_crtc->palette_loaded,
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
tilcdc_crtc->lcd_fck_rate = clk_rate;
tilcdc_crtc->lcd_fck_rate, crtc->mode.clock, clkdiv);
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
tilcdc_crtc->hvtotal_us =
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
mutex_lock(&tilcdc_crtc->enable_lock);
if (tilcdc_crtc->enabled || tilcdc_crtc->shutdown) {
mutex_unlock(&tilcdc_crtc->enable_lock);
spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
tilcdc_crtc->last_vblank = ktime_get();
spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
tilcdc_crtc->enabled = true;
mutex_unlock(&tilcdc_crtc->enable_lock);
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
mutex_lock(&tilcdc_crtc->enable_lock);
tilcdc_crtc->shutdown = true;
if (!tilcdc_crtc->enabled) {
mutex_unlock(&tilcdc_crtc->enable_lock);
tilcdc_crtc->frame_done = false;
ret = wait_event_timeout(tilcdc_crtc->frame_done_wq,
tilcdc_crtc->frame_done,
tilcdc_crtc->enabled = false;
mutex_unlock(&tilcdc_crtc->enable_lock);
struct tilcdc_crtc *tilcdc_crtc =
container_of(work, struct tilcdc_crtc, recover_work);
struct drm_crtc *crtc = &tilcdc_crtc->base;
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
if (tilcdc_crtc->event) {
#define to_tilcdc_crtc(x) container_of(x, struct tilcdc_crtc, base)
tilcdc_crtc->event = event;
mutex_lock(&tilcdc_crtc->enable_lock);
if (tilcdc_crtc->enabled) {
spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
next_vblank = ktime_add_us(tilcdc_crtc->last_vblank,
tilcdc_crtc->hvtotal_us);
tilcdc_crtc->next_fb = fb;
spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
mutex_unlock(&tilcdc_crtc->enable_lock);
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
spin_lock_irqsave(&tilcdc_crtc->irq_lock, flags);
spin_unlock_irqrestore(&tilcdc_crtc->irq_lock, flags);
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
tilcdc_crtc->frame_done = false;
ret = wait_event_timeout(tilcdc_crtc->frame_done_wq,
tilcdc_crtc->frame_done,
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
if (tilcdc_crtc->lcd_fck_rate != clk_get_rate(priv->clk)) {
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
spin_lock(&tilcdc_crtc->irq_lock);
tilcdc_crtc->last_vblank = now;
if (tilcdc_crtc->next_fb) {
set_scanout(crtc, tilcdc_crtc->next_fb);
tilcdc_crtc->next_fb = NULL;
spin_unlock(&tilcdc_crtc->irq_lock);
event = tilcdc_crtc->event;
tilcdc_crtc->event = NULL;
if (tilcdc_crtc->frame_intact)
tilcdc_crtc->sync_lost_count = 0;
tilcdc_crtc->frame_intact = true;
complete(&tilcdc_crtc->palette_loaded);
tilcdc_crtc->frame_intact = false;
if (tilcdc_crtc->sync_lost_count++ >
&tilcdc_crtc->recover_work);
tilcdc_crtc->sync_lost_count = 0;
tilcdc_crtc->frame_done = true;
wake_up(&tilcdc_crtc->frame_done_wq);
struct tilcdc_crtc *tilcdc_crtc = to_tilcdc_crtc(crtc);
struct tilcdc_crtc *tilcdc_crtc;
tilcdc_crtc = drmm_crtc_alloc_with_planes(dev, struct tilcdc_crtc, base,
if (IS_ERR(tilcdc_crtc)) {
drm_err(dev, "Failed to init CRTC: %pe\n", tilcdc_crtc);
return PTR_ERR(tilcdc_crtc);
tilcdc_crtc->primary = primary;
priv->crtc = &tilcdc_crtc->base;
init_completion(&tilcdc_crtc->palette_loaded);
tilcdc_crtc->palette_base = dmam_alloc_coherent(dev->dev,
&tilcdc_crtc->palette_dma_handle,
if (!tilcdc_crtc->palette_base)
*tilcdc_crtc->palette_base = TILCDC_PALETTE_FIRST_ENTRY;
crtc = &tilcdc_crtc->base;
mutex_init(&tilcdc_crtc->enable_lock);