Lines Matching refs:msmfb

104 	struct msmfb_info *msmfb  = container_of(callback, struct msmfb_info,  in msmfb_handle_dma_interrupt()  local
107 spin_lock_irqsave(&msmfb->update_lock, irq_flags); in msmfb_handle_dma_interrupt()
108 msmfb->frame_done = msmfb->frame_requested; in msmfb_handle_dma_interrupt()
109 if (msmfb->sleeping == UPDATING && in msmfb_handle_dma_interrupt()
110 msmfb->frame_done == msmfb->update_frame) { in msmfb_handle_dma_interrupt()
112 schedule_work(&msmfb->resume_work); in msmfb_handle_dma_interrupt()
114 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in msmfb_handle_dma_interrupt()
115 wake_up(&msmfb->frame_wq); in msmfb_handle_dma_interrupt()
118 static int msmfb_start_dma(struct msmfb_info *msmfb) in msmfb_start_dma() argument
125 struct msm_panel_data *panel = msmfb->panel; in msmfb_start_dma()
127 spin_lock_irqsave(&msmfb->update_lock, irq_flags); in msmfb_start_dma()
129 msmfb->vsync_request_time)); in msmfb_start_dma()
136 if (msmfb->frame_done == msmfb->frame_requested) { in msmfb_start_dma()
137 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in msmfb_start_dma()
140 if (msmfb->sleeping == SLEEPING) { in msmfb_start_dma()
142 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in msmfb_start_dma()
145 x = msmfb->update_info.left; in msmfb_start_dma()
146 y = msmfb->update_info.top; in msmfb_start_dma()
147 w = msmfb->update_info.eright - x; in msmfb_start_dma()
148 h = msmfb->update_info.ebottom - y; in msmfb_start_dma()
149 yoffset = msmfb->yoffset; in msmfb_start_dma()
150 msmfb->update_info.left = msmfb->xres + 1; in msmfb_start_dma()
151 msmfb->update_info.top = msmfb->yres + 1; in msmfb_start_dma()
152 msmfb->update_info.eright = 0; in msmfb_start_dma()
153 msmfb->update_info.ebottom = 0; in msmfb_start_dma()
154 if (unlikely(w > msmfb->xres || h > msmfb->yres || in msmfb_start_dma()
158 msmfb->frame_done = msmfb->frame_requested; in msmfb_start_dma()
161 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in msmfb_start_dma()
163 addr = ((msmfb->xres * (yoffset + y) + x) * 2); in msmfb_start_dma()
164 mdp->dma(mdp, addr + msmfb->fb->fix.smem_start, in msmfb_start_dma()
165 msmfb->xres * 2, w, h, x, y, &msmfb->dma_callback, in msmfb_start_dma()
169 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in msmfb_start_dma()
173 wake_up(&msmfb->frame_wq); in msmfb_start_dma()
180 struct msmfb_info *msmfb = container_of(callback, struct msmfb_info, in msmfb_handle_vsync_interrupt() local
182 msmfb_start_dma(msmfb); in msmfb_handle_vsync_interrupt()
187 struct msmfb_info *msmfb = container_of(timer, struct msmfb_info, in msmfb_fake_vsync() local
189 msmfb_start_dma(msmfb); in msmfb_fake_vsync()
197 struct msmfb_info *msmfb = info->par; in msmfb_pan_update() local
198 struct msm_panel_data *panel = msmfb->panel; in msmfb_pan_update()
206 spin_lock_irqsave(&msmfb->update_lock, irq_flags); in msmfb_pan_update()
210 if (msmfb->sleeping == SLEEPING) { in msmfb_pan_update()
212 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in msmfb_pan_update()
214 wait_event_interruptible_timeout(msmfb->frame_wq, in msmfb_pan_update()
215 msmfb->sleeping != SLEEPING, HZ/10); in msmfb_pan_update()
219 sleeping = msmfb->sleeping; in msmfb_pan_update()
221 if ((pan_display && msmfb->frame_requested != msmfb->frame_done) || in msmfb_pan_update()
224 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in msmfb_pan_update()
225 ret = wait_event_interruptible_timeout(msmfb->frame_wq, in msmfb_pan_update()
226 msmfb->frame_done == msmfb->frame_requested && in msmfb_pan_update()
227 msmfb->sleeping != UPDATING, 5 * HZ); in msmfb_pan_update()
228 if (ret <= 0 && (msmfb->frame_requested != msmfb->frame_done || in msmfb_pan_update()
229 msmfb->sleeping == UPDATING)) { in msmfb_pan_update()
233 &msmfb->vsync_callback); in msmfb_pan_update()
240 msmfb->frame_requested, in msmfb_pan_update()
241 msmfb->frame_done); in msmfb_pan_update()
249 msmfb->frame_requested++; in msmfb_pan_update()
253 msmfb->yoffset = yoffset; in msmfb_pan_update()
257 msmfb->update_frame = msmfb->frame_requested; in msmfb_pan_update()
259 msmfb->sleeping = UPDATING; in msmfb_pan_update()
265 if (left < msmfb->update_info.left) in msmfb_pan_update()
266 msmfb->update_info.left = left; in msmfb_pan_update()
267 if (top < msmfb->update_info.top) in msmfb_pan_update()
268 msmfb->update_info.top = top; in msmfb_pan_update()
269 if (eright > msmfb->update_info.eright) in msmfb_pan_update()
270 msmfb->update_info.eright = eright; in msmfb_pan_update()
271 if (ebottom > msmfb->update_info.ebottom) in msmfb_pan_update()
272 msmfb->update_info.ebottom = ebottom; in msmfb_pan_update()
274 msmfb->update_info.left, msmfb->update_info.top, in msmfb_pan_update()
275 msmfb->update_info.eright, msmfb->update_info.ebottom, in msmfb_pan_update()
276 msmfb->yoffset); in msmfb_pan_update()
277 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in msmfb_pan_update()
281 msmfb->vsync_request_time = ktime_get(); in msmfb_pan_update()
283 panel->request_vsync(panel, &msmfb->vsync_callback); in msmfb_pan_update()
285 if (!hrtimer_active(&msmfb->fake_vsync)) { in msmfb_pan_update()
286 hrtimer_start(&msmfb->fake_vsync, in msmfb_pan_update()
301 struct msmfb_info *msmfb = in power_on_panel() local
303 struct msm_panel_data *panel = msmfb->panel; in power_on_panel()
306 mutex_lock(&msmfb->panel_init_lock); in power_on_panel()
308 if (msmfb->sleeping == UPDATING) { in power_on_panel()
314 spin_lock_irqsave(&msmfb->update_lock, irq_flags); in power_on_panel()
315 msmfb->sleeping = AWAKE; in power_on_panel()
316 wake_up(&msmfb->frame_wq); in power_on_panel()
317 spin_unlock_irqrestore(&msmfb->update_lock, irq_flags); in power_on_panel()
320 mutex_unlock(&msmfb->panel_init_lock); in power_on_panel()
339 struct msmfb_info *msmfb = info->par; in msmfb_pan_display() local
340 struct msm_panel_data *panel = msmfb->panel; in msmfb_pan_display()
443 static void setup_fb_info(struct msmfb_info *msmfb) in setup_fb_info() argument
445 struct fb_info *fb_info = msmfb->fb; in setup_fb_info()
457 fb_info->fix.line_length = msmfb->xres * 2; in setup_fb_info()
459 fb_info->var.xres = msmfb->xres; in setup_fb_info()
460 fb_info->var.yres = msmfb->yres; in setup_fb_info()
461 fb_info->var.width = msmfb->panel->fb_data->width; in setup_fb_info()
462 fb_info->var.height = msmfb->panel->fb_data->height; in setup_fb_info()
463 fb_info->var.xres_virtual = msmfb->xres; in setup_fb_info()
464 fb_info->var.yres_virtual = msmfb->yres * 2; in setup_fb_info()
470 if (msmfb->panel->caps & MSMFB_CAP_PARTIAL_UPDATES) { in setup_fb_info()
485 fb_info->var.reserved[2] = (uint16_t)msmfb->xres | in setup_fb_info()
486 ((uint32_t)msmfb->yres << 16); in setup_fb_info()
507 static int setup_fbmem(struct msmfb_info *msmfb, struct platform_device *pdev) in setup_fbmem() argument
509 struct fb_info *fb = msmfb->fb; in setup_fbmem()
511 unsigned long size = msmfb->xres * msmfb->yres * in setup_fbmem()
540 struct msmfb_info *msmfb; in msmfb_probe() local
556 msmfb = fb->par; in msmfb_probe()
557 msmfb->fb = fb; in msmfb_probe()
558 msmfb->panel = panel; in msmfb_probe()
559 msmfb->xres = panel->fb_data->xres; in msmfb_probe()
560 msmfb->yres = panel->fb_data->yres; in msmfb_probe()
562 ret = setup_fbmem(msmfb, pdev); in msmfb_probe()
566 setup_fb_info(msmfb); in msmfb_probe()
568 spin_lock_init(&msmfb->update_lock); in msmfb_probe()
569 mutex_init(&msmfb->panel_init_lock); in msmfb_probe()
570 init_waitqueue_head(&msmfb->frame_wq); in msmfb_probe()
571 INIT_WORK(&msmfb->resume_work, power_on_panel); in msmfb_probe()
572 msmfb->black = devm_kzalloc(&pdev->dev, in msmfb_probe()
573 msmfb->fb->var.bits_per_pixel*msmfb->xres, in msmfb_probe()
575 if (!msmfb->black) { in msmfb_probe()
581 msmfb->xres, msmfb->yres); in msmfb_probe()
583 msmfb->dma_callback.func = msmfb_handle_dma_interrupt; in msmfb_probe()
584 msmfb->vsync_callback.func = msmfb_handle_vsync_interrupt; in msmfb_probe()
585 hrtimer_init(&msmfb->fake_vsync, CLOCK_MONOTONIC, in msmfb_probe()
589 msmfb->fake_vsync.function = msmfb_fake_vsync; in msmfb_probe()
595 msmfb->sleeping = WAKING; in msmfb_probe()
597 platform_set_drvdata(pdev, msmfb); in msmfb_probe()
604 framebuffer_release(msmfb->fb); in msmfb_probe()
610 struct msmfb_info *msmfb; in msmfb_remove() local
612 msmfb = platform_get_drvdata(pdev); in msmfb_remove()
614 unregister_framebuffer(msmfb->fb); in msmfb_remove()
615 iounmap(msmfb->fb->screen_base); in msmfb_remove()
616 framebuffer_release(msmfb->fb); in msmfb_remove()