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;
}