On Fri, Oct 2, 2009 at 3:44 PM, Tony Lindgren <tony@xxxxxxxxxxx> wrote: > > From: Sergio Aguirre <saaguirre@xxxxxx> > > This fixes a bug introduced by this commit ID: > > commit 537a1bf059fa312355696fa6db80726e655e7f17 > Author: Krzysztof Helt <krzysztof.h1@xxxxx> > Date: Tue Jun 30 11:41:29 2009 -0700 > > fbdev: add mutex for fb_mmap locking > > In which a mutex was added when changing smem_start and smem_len fields, > so the mutex inside the fb_mmap() call is actually used. > > The problem was that set_fb_fix, which modifies the above 2 fields, > was called before and after registering the framebuffer, > which when used before registration, lead to a failed attempt to > use an uninitialized mutex. > > Solution: Don't use mutex before framebuffer registration. > > Signed-off-by: Sergio Aguirre <saaguirre@xxxxxx> > Acked-by: Tomi Valkeinen <tomi.valkeinen@xxxxxxxxx> > Acked-by: Imre Deak <imre.deak@xxxxxxxxx> > Signed-off-by: Tony Lindgren <tony@xxxxxxxxxxx> > --- > drivers/video/omap/omapfb_main.c | 22 ++++++++++++++-------- > 1 files changed, 14 insertions(+), 8 deletions(-) > > diff --git a/drivers/video/omap/omapfb_main.c b/drivers/video/omap/omapfb_main.c > index 125e605..0d0c8c8 100644 > --- a/drivers/video/omap/omapfb_main.c > +++ b/drivers/video/omap/omapfb_main.c > @@ -393,7 +393,7 @@ static void omapfb_sync(struct fb_info *fbi) > * Set fb_info.fix fields and also updates fbdev. > * When calling this fb_info.var must be set up already. > */ > -static void set_fb_fix(struct fb_info *fbi) > +static void set_fb_fix(struct fb_info *fbi, int from_init) > { > struct fb_fix_screeninfo *fix = &fbi->fix; > struct fb_var_screeninfo *var = &fbi->var; > @@ -403,10 +403,16 @@ static void set_fb_fix(struct fb_info *fbi) > > rg = &plane->fbdev->mem_desc.region[plane->idx]; > fbi->screen_base = rg->vaddr; > - mutex_lock(&fbi->mm_lock); > - fix->smem_start = rg->paddr; > - fix->smem_len = rg->size; > - mutex_unlock(&fbi->mm_lock); > + > + if (!from_init) { > + mutex_lock(&fbi->mm_lock); > + fix->smem_start = rg->paddr; > + fix->smem_len = rg->size; > + mutex_unlock(&fbi->mm_lock); > + } else { > + fix->smem_start = rg->paddr; > + fix->smem_len = rg->size; > + } > > fix->type = FB_TYPE_PACKED_PIXELS; > bpp = var->bits_per_pixel; > @@ -704,7 +710,7 @@ static int omapfb_set_par(struct fb_info *fbi) > int r = 0; > > omapfb_rqueue_lock(fbdev); > - set_fb_fix(fbi); > + set_fb_fix(fbi, 0); > r = ctrl_change_mode(fbi); > omapfb_rqueue_unlock(fbdev); > > @@ -904,7 +910,7 @@ static int omapfb_setup_mem(struct fb_info *fbi, struct omapfb_mem_info *mi) > if (old_size != size) { > if (size) { > memcpy(&fbi->var, new_var, sizeof(fbi->var)); > - set_fb_fix(fbi); > + set_fb_fix(fbi, 0); > } else { > /* > * Set these explicitly to indicate that the > @@ -1504,7 +1510,7 @@ static int fbinfo_init(struct omapfb_device *fbdev, struct fb_info *info) > var->bits_per_pixel = fbdev->panel->bpp; > > set_fb_var(info, var); > - set_fb_fix(info); > + set_fb_fix(info, 1); > > r = fb_alloc_cmap(&info->cmap, 16, 0); > if (r != 0) > > -- > To unsubscribe from this list: send the line "unsubscribe linux-omap" in > the body of a message to majordomo@xxxxxxxxxxxxxxx > More majordomo info at http://vger.kernel.org/majordomo-info.html Tested-by: Cory Maccarrone <darkstar6262@xxxxxxxxx> This patch works beautifully for omap850-based devices. I need only add a board file and LCD resolution parameters, and I get a fully working framebuffer. I have tested with linux-omap master (commit 6469d1c660f8751ff39836c81970cdbe46953057), adding only the board/lcd files on HTC Herald. - Cory -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html