[PATCH] rivafb/nvidiafb: race between register_framebuffer and *_bl_init

Since we now use the generic backlight infrastructure, I think we need to
call rivafb_bl_init before calling register_framebuffer since otherwise
rivafb_bl_init might race with the framebuffer layer already opening the
device and setting up the video mode. In this case we might end up with a
not yet fully intialized backlight (info->bl_dev still NULL) when calling
riva_bl_set_power via rivafb_set_par/rivafb_load_video_mode and the kernel
dies without any further notice during boot.

This fixes booting current git on a PB 6,1. In this case radeonfb/atyfb
would be affected too - I can fix that too but don't have any hardware to
test this on.

Cc: "Antonino A. Daplas" <adaplas@pol.net>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Guido Guenther and committed by Linus Torvalds ce38cac4 b1367d2a

+5 -7
+2 -3
drivers/video/nvidia/nvidia.c
··· 1299 1299 1300 1300 nvidia_save_vga(par, &par->SavedReg); 1301 1301 1302 + pci_set_drvdata(pd, info); 1303 + nvidia_bl_init(par); 1302 1304 if (register_framebuffer(info) < 0) { 1303 1305 printk(KERN_ERR PFX "error registering nVidia framebuffer\n"); 1304 1306 goto err_out_iounmap_fb; 1305 1307 } 1306 1308 1307 - pci_set_drvdata(pd, info); 1308 1309 1309 1310 printk(KERN_INFO PFX 1310 1311 "PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n", 1311 1312 info->fix.id, 1312 1313 par->FbMapSize / (1024 * 1024), info->fix.smem_start); 1313 - 1314 - nvidia_bl_init(par); 1315 1314 1316 1315 NVTRACE_LEAVE(); 1317 1316 return 0;
+3 -4
drivers/video/riva/fbdev.c
··· 2132 2132 2133 2133 fb_destroy_modedb(info->monspecs.modedb); 2134 2134 info->monspecs.modedb = NULL; 2135 + 2136 + pci_set_drvdata(pd, info); 2137 + riva_bl_init(info->par); 2135 2138 ret = register_framebuffer(info); 2136 2139 if (ret < 0) { 2137 2140 printk(KERN_ERR PFX ··· 2142 2139 goto err_iounmap_screen_base; 2143 2140 } 2144 2141 2145 - pci_set_drvdata(pd, info); 2146 - 2147 2142 printk(KERN_INFO PFX 2148 2143 "PCI nVidia %s framebuffer ver %s (%dMB @ 0x%lX)\n", 2149 2144 info->fix.id, 2150 2145 RIVAFB_VERSION, 2151 2146 info->fix.smem_len / (1024 * 1024), 2152 2147 info->fix.smem_start); 2153 - 2154 - riva_bl_init(info->par); 2155 2148 2156 2149 NVTRACE_LEAVE(); 2157 2150 return 0;