rk fb : fix a panic bug
authoryxj <yxj@rock-chips.com>
Wed, 20 Mar 2013 03:26:56 +0000 (11:26 +0800)
committeryxj <yxj@rock-chips.com>
Wed, 20 Mar 2013 04:29:02 +0000 (12:29 +0800)
panic bug like this:
rk_fb_wait_for_vsync_thread may access inf->fb[0] before it is initialized
[    1.009224] Unable to handle kernel NULL pointer dereference at virtual address 00000240
[    1.017323] pgd = c0404000
[    1.020035] [00000240] *pgd=00000000
[    1.023620] Internal error: Oops: 5 [#1] PREEMPT SMP
[    1.028586] CPU: 1    Not tainted  (3.0.36+ #217)
[    1.033297] PC is at rk_fb_wait_for_vsync_thread+0xe8/0x144
[    1.112136] LR is at rk_fb_wait_for_vsync_thread+0xe8/0x144
[    1.117708] pc : [<c06243e0>]    lr : [<c06243e0>]    psr: 60000013
[    1.117715] sp : efe59f80  ip : c04384a0  fp : 00000000
[    1.129194] r10: 00000000  r9 : efe59f90  r8 : efe58000
[    1.134417] r7 : efe39a98  r6 : 00000000  r5 : efe59f84  r4 : efe39a08
[    1.140942] r3 : 00000000  r2 : 00000000  r1 : efc475a0  r0 : 00000036
[    1.147469] Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[    1.154777] Control: 10c5387d  Table: 6040404a  DAC: 00000015

drivers/video/rockchip/rk_fb.c

index 17c1db1c25c4e1269311cc9f110cdb62e8bc00c3..0297472fce6bdc9a2e1f31e6e2adf34bb5dfed9d 100644 (file)
@@ -378,6 +378,7 @@ static int rk_fb_ioctl(struct fb_info *info, unsigned int cmd,unsigned long arg)
                        }
                #endif 
        #endif
+                       break;
                default:
                        dev_drv->ioctl(dev_drv,cmd,arg,layer_id);
                        break;
@@ -1250,7 +1251,10 @@ int rk_fb_register(struct rk_lcdc_device_driver *dev_drv,
                    ret = -EINVAL;
                }
                rkfb_create_sysfs(fbi);
-
+               fb_inf->fb[fb_inf->num_fb] = fbi;
+               printk("%s>>>>>%s\n",__func__,fb_inf->fb[fb_inf->num_fb]->fix.id);
+               fb_inf->num_fb++;
+               
                if(i == 0)
                {
                        init_waitqueue_head(&dev_drv->vsync_info.wait);
@@ -1270,9 +1274,7 @@ int rk_fb_register(struct rk_lcdc_device_driver *dev_drv,
                        }
                        dev_drv->vsync_info.active = 1;
                }
-               fb_inf->fb[fb_inf->num_fb] = fbi;
-               printk("%s>>>>>%s\n",__func__,fb_inf->fb[fb_inf->num_fb]->fix.id);
-               fb_inf->num_fb++;       
+                       
        }
 #if !defined(CONFIG_FRAMEBUFFER_CONSOLE) && defined(CONFIG_LOGO)
     if(dev_drv->screen_ctr_info->prop == PRMRY) //show logo for primary display device