On Wednesday 01 September 2010 10:34:23 pm Ambrose, Martin wrote:
> On Wed, Sep 01, 2010 at 14:20:00, Caglar Akyuz wrote:
> > On Wednesday 01 September 2010 09:30:53 pm Ambrose, Martin wrote:
> > > On Wed, Sep 01, 2010 at 11:57:32, Caglar Akyuz wrote:
>
> [snip]
>
[...]
>
> Looks like just adding the printf changed which side of the race condition
> you are on. Correct?
>
Yes.
> > Any ideas for a proper fix?
>
> Sorry my breadth of knowledge here is pretty shallow. This patch was my
> first exposure to the framebuffer architecture.
>
> I think I would need to be able to recreate the problem to better analyze.
I think race is between irq_handler and fb_setcolreg. Registering irq_handler
at the end of probe function solves the issue.(Patch is attached) I don't know
da8xx lcd controller enough but one of your comments in the code says lcd
raster controller should be disabled prior to any register update. So I think
following sequence happens on my board:
- raster controller is disabled
- fb_setcolreg is called at boot time as you pointed out
- irq fires-up, enables raster controller
- fb_setcolreg calls lcd_blit which modifies LCD_RASTER_CTRL_REG while
raster controller is enabled
printk delayed irq and the problem disappeared, registering irq at the end of
probe function served the same purpose.
> And, unfortunately, don't have a Hawkboard myself. If you or Roger
> have a spare board I can take a more in-depth look but likely not until
> beginning of Oct due to prior commits.
>
I never thought TIers would be in a short of development boards, I think
I'm being harsh on my local TI representatives :)
Thanks for all your help on this and for eventually pointing the source of
the problem.
Best Regards,
Caglar
---
diff --git a/drivers/video/da8xx-fb.c b/drivers/video/da8xx-fb.c
index 0ad6fe4..edb0616 100644
--- a/drivers/video/da8xx-fb.c
+++ b/drivers/video/da8xx-fb.c
@@ -1020,10 +1020,6 @@ static int __init fb_probe(struct platform_device
*device)
goto err_release_pl_mem;
}
- ret = request_irq(par->irq, lcdc_irq_handler, 0, DRIVER_NAME, par);
- if (ret)
- goto err_release_pl_mem;
-
/* Initialize par */
da8xx_fb_info->var.bits_per_pixel = lcd_cfg->bpp;
@@ -1051,7 +1047,7 @@ static int __init fb_probe(struct platform_device *device)
ret = fb_alloc_cmap(&da8xx_fb_info->cmap, PALETTE_SIZE, 0);
if (ret)
- goto err_free_irq;
+ goto err_release_pl_mem;
da8xx_fb_info->cmap.len = par->palette_sz;
/* initialize var_screeninfo */
@@ -1079,8 +1075,13 @@ static int __init fb_probe(struct platform_device
*device)
goto err_cpu_freq;
}
#endif
+
+ ret = request_irq(par->irq, lcdc_irq_handler, 0, DRIVER_NAME, par);
+ if (ret)
+ goto irq_freq;
return 0;
+irq_freq:
#ifdef CONFIG_CPU_FREQ
err_cpu_freq:
unregister_framebuffer(da8xx_fb_info);
@@ -1089,9 +1090,6 @@ err_cpu_freq:
err_dealloc_cmap:
fb_dealloc_cmap(&da8xx_fb_info->cmap);
-err_free_irq:
- free_irq(par->irq, par);
-
err_release_pl_mem:
dma_free_coherent(NULL, PALETTE_SIZE, par->v_palette_base,
par->p_palette_base);
_______________________________________________
Davinci-linux-open-source mailing list
[email protected]
http://linux.davincidsp.com/mailman/listinfo/davinci-linux-open-source