This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

fb driver has some problem. DM6446.

Hi, all.

on boot log, it has some error for display driver.
Below is a cut my boot log.
and next source code is quoted from linux driver files.


problem 1. "Failed to obtain ownership of OSD window" 
   => probe() function is called two times. Thus , davinci_disp_request_layer() returns error code.
         why does it is called two time?

        davincifb.0 and davincifb on boot log are different device?

I saw some people has same problem in Google search. But no anybody give solution clearly.

thank you.

 

JFFS2 version 2.2. (NAND) (C) 2001-2006 Red Hat, Inc.
yaffs Mar 20 2010 22:30:41 Installing.
SGI XFS with no debug enabled
Initializing Cryptographic API
io scheduler noop registered
io scheduler anticipatory registered (default)
LTT : ltt-facilities init
LTT : ltt-facility-core init in kernel
davincifb davincifb: davincifb_probe():+                          //<========entry probe()
davincifb davincifb: is_osd_win()=1, xres=720, yres=480, own_window=0
davincifb davincifb: is_osd_win()=1, own_window=1
davincifb davincifb: dm_osd0_fb:
720x480x16@0,0 with framebuffer size 1350KB
davincifb davincifb: davincifb_probe():1
davincifb davincifb: is_osd_win()=0, xres=720, yres=480, own_window=0
davincifb davincifb: is_osd_win()=0, own_window=1
davincifb davincifb: dm_vid0_fb:
720x480x16@0,0 with framebuffer size 2025KB
davincifb davincifb: davincifb_probe():2
davincifb davincifb: is_osd_win()=1, xres=720, yres=480, own_window=0
davincifb davincifb: is_osd_win()=1, own_window=1
davincifb davincifb: dm_osd1_fb:
720x480x4@0,0 with framebuffer size 1350KB
davincifb davincifb: is_osd_win()=0, xres=720, yres=480, own_window=0
davincifb davincifb: is_osd_win()=0, own_window=1
davincifb davincifb: dm_vid1_fb:
720x480x16@0,0 with framebuffer size 2025KB
davincifb davincifb: davincifb_probe():-
davincifb davincifb.0: davincifb_probe():+                                              //<===========enter second time !!!!!! why???
davincifb davincifb.0: is_osd_win()=1, xres=720, yres=480, own_window=0
davincifb davincifb.0: is_osd_win()=1, own_window=0
davincifb davincifb.0: dm_osd0_fb: Failed to obtain ownership of OSD window.             //<============error
davincifb davincifb.0: davincifb_probe():1
DAVINCI-WDT: DaVinci Watchdog Timer: heartbeat 60 sec
Serial: 8250/16550 driver $Revision: 1.90 $ 2 ports, IRQ sharing disabled
serial8250.0: ttyS0 at MMIO map 0x1c20000 mem 0xfec20000 (irq = 40) is a 16550A
RAMDISK driver initialized: 1 RAM disks of 32768K size 1024 blocksize

 

 

 


//    drivers/video/Davincifb.c
static int davincifb_probe(struct device *dev)
{
 struct vpbe_dm_info *dm;
 struct davinci_layer_config lconfig;
 unsigned fb_size;
 int err;
dev_err(dev, "davincifb_probe():+\n");                   //<====indicate entry

 dm = kzalloc(sizeof(*dm), GFP_KERNEL);
 if (!dm) {
  dev_err(dev, "Can't allocate memory for driver state.\n");
  return -ENOMEM;
 }
 dev_set_drvdata(dev, dm);

 /* get the video mode from the encoder manager */
 get_video_mode(&dm->mode);

 /* set the default Cb/Cr order */
 dm->yc_pixfmt = PIXFMT_YCbCrI;

 /* initialize OSD0 */
 dm->win[WIN_OSD0].layer = WIN_OSD0;
 dm->win[WIN_OSD0].dm = dm;
 dm->win[WIN_OSD0].sdram_address = 0;
 davincifb_get_default_win_config(dev, &dm->win[WIN_OSD0], &lconfig,
      &fb_size, options);
 err =
     davincifb_init_window(dev, &dm->win[WIN_OSD0], &lconfig, fb_size,
      OSD0_FBNAME);
dev_err(dev, "davincifb_probe():1\n");              //   <=======debugging message

...........

 


}


//    drivers/video/Davincifb.c
static int davincifb_init_window(struct device *dev,
     struct vpbe_dm_win_info *win,
     struct davinci_layer_config *lconfig,
     unsigned fb_size, const char *name)
{

......................
#if 1//


 dev_err(dev,"is_osd_win()=%d, xres=%d, yres=%d, own_window=%d\n",is_osd_win(info),
   info->var.xres, info->var.yres, win->own_window);


#endif

 if (is_osd_win(info) || (info->var.xres != 0 && info->var.yres != 0)) {
  if (!davinci_disp_request_layer(win->layer))//<=========??????
   win->own_window = 1;
 }
 /* bail out if this is an OSD window and we don't own it */

#if 1//


 dev_err(dev,"is_osd_win()=%d, own_window=%d\n",is_osd_win(info), win->own_window);


#endif

 
 if (is_osd_win(info) && !win->own_window) {
  dev_err(dev, "%s: Failed to obtain ownership of OSD "//<================?????
   "window.\n", name);
  err = -ENODEV;
  goto own_out;
 }


.......................

 

}

 


//    drivers/media/video/davinci/Davinci_osd.c
int davinci_disp_request_layer(enum davinci_disp_layer layer)
{
 struct davinci_window_state *win = &osd->win[layer];
 unsigned long flags;

 spin_lock_irqsave(&osd->lock, flags);

 if (win->is_allocated) {
  spin_unlock_irqrestore(&osd->lock, flags);
  return -1;//<===========??????
 }
 win->is_allocated = 1;

 spin_unlock_irqrestore(&osd->lock, flags);
 return 0;
}