From edcb4494a6738058a009d00216f3e0a2c3cf8284 Mon Sep 17 00:00:00 2001 From: =?utf8?q?=E9=BB=84=E6=B6=9B?= Date: Thu, 31 May 2012 09:31:35 +0800 Subject: [PATCH] rk: fb: fix earlysuspend bug fix this bug: rk30_pm_power_off start... Unable to handle kernel NULL pointer dereference at virtual address 00000054 pgd = c0404000 [00000054] *pgd=00000000pre WM831X_POWER_STATE = 0x8800 wm831x_last_deinit Internal error: Oops: 17 [#1] PREEMPT SMP CPU: 0 Tainted: G C (3.0.8+ #2) PC is at rkfb_early_suspend+0x18/0x70 LR is at early_suspend+0xc4/0x12c --- drivers/video/rockchip/rk_fb.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/drivers/video/rockchip/rk_fb.c b/drivers/video/rockchip/rk_fb.c index c8454cab3790..fd6fbdf12448 100644 --- a/drivers/video/rockchip/rk_fb.c +++ b/drivers/video/rockchip/rk_fb.c @@ -1000,6 +1000,7 @@ int rk_fb_unregister(struct rk_lcdc_device_driver *dev_drv) framebuffer_release(fbi); } fb_inf->lcdc_dev_drv[dev_drv->id]= NULL; + fb_inf->num_lcdc--; return 0; } @@ -1020,6 +1021,8 @@ static void rkfb_early_suspend(struct early_suspend *h) int i; for(i = 0; i < inf->num_lcdc; i++) { + if (!inf->lcdc_dev_drv[i]) + continue; if(inf->lcdc_dev_drv[i]->screen_ctr_info->io_disable) inf->lcdc_dev_drv[i]->screen_ctr_info->io_disable(); if(inf->lcdc_dev_drv[i]->screen->standby) @@ -1036,6 +1039,8 @@ static void rkfb_early_resume(struct early_suspend *h) int i; for(i = 0; i < inf->num_lcdc; i++) { + if (!inf->lcdc_dev_drv[i]) + continue; if(inf->lcdc_dev_drv[i]->screen_ctr_info->io_enable) inf->lcdc_dev_drv[i]->screen_ctr_info->io_enable(); if(inf->lcdc_dev_drv[i]->screen->standby) @@ -1093,9 +1098,12 @@ static int __devexit rk_fb_remove(struct platform_device *pdev) static void rk_fb_shutdown(struct platform_device *pdev) { - struct rk_fb_inf *fb_inf = platform_get_drvdata(pdev); - kfree(fb_inf); - platform_set_drvdata(pdev, NULL); +// struct rk_fb_inf *fb_inf = platform_get_drvdata(pdev); +// kfree(fb_inf); +// platform_set_drvdata(pdev, NULL); +#ifdef CONFIG_HAS_EARLYSUSPEND + unregister_early_suspend(&suspend_info.early_suspend); +#endif } static struct platform_driver rk_fb_driver = { @@ -1105,7 +1113,7 @@ static struct platform_driver rk_fb_driver = { .name = "rk-fb", .owner = THIS_MODULE, }, - //.shutdown = rk_fb_shutdown, + .shutdown = rk_fb_shutdown, }; static int __init rk_fb_init(void) -- 2.34.1