@@ -1197,17 +1197,17 @@ static int nvidia_set_fbinfo(struct fb_info *info)
1197
1197
return nvidiafb_check_var (& info -> var , info );
1198
1198
}
1199
1199
1200
- static u32 nvidia_get_chipset (struct fb_info * info )
1200
+ static u32 nvidia_get_chipset (struct pci_dev * pci_dev ,
1201
+ volatile u32 __iomem * REGS )
1201
1202
{
1202
- struct nvidia_par * par = info -> par ;
1203
- u32 id = (par -> pci_dev -> vendor << 16 ) | par -> pci_dev -> device ;
1203
+ u32 id = (pci_dev -> vendor << 16 ) | pci_dev -> device ;
1204
1204
1205
1205
printk (KERN_INFO PFX "Device ID: %x \n" , id );
1206
1206
1207
1207
if ((id & 0xfff0 ) == 0x00f0 ||
1208
1208
(id & 0xfff0 ) == 0x02e0 ) {
1209
1209
/* pci-e */
1210
- id = NV_RD32 (par -> REGS , 0x1800 );
1210
+ id = NV_RD32 (REGS , 0x1800 );
1211
1211
1212
1212
if ((id & 0x0000ffff ) == 0x000010DE )
1213
1213
id = 0x10DE0000 | (id >> 16 );
@@ -1220,12 +1220,11 @@ static u32 nvidia_get_chipset(struct fb_info *info)
1220
1220
return id ;
1221
1221
}
1222
1222
1223
- static u32 nvidia_get_arch (struct fb_info * info )
1223
+ static u32 nvidia_get_arch (u32 Chipset )
1224
1224
{
1225
- struct nvidia_par * par = info -> par ;
1226
1225
u32 arch = 0 ;
1227
1226
1228
- switch (par -> Chipset & 0x0ff0 ) {
1227
+ switch (Chipset & 0x0ff0 ) {
1229
1228
case 0x0100 : /* GeForce 256 */
1230
1229
case 0x0110 : /* GeForce2 MX */
1231
1230
case 0x0150 : /* GeForce2 */
@@ -1278,16 +1277,44 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
1278
1277
struct fb_info * info ;
1279
1278
unsigned short cmd ;
1280
1279
int ret ;
1280
+ volatile u32 __iomem * REGS ;
1281
+ int Chipset ;
1282
+ u32 Architecture ;
1281
1283
1282
1284
NVTRACE_ENTER ();
1283
1285
assert (pd != NULL );
1284
1286
1287
+ if (pci_enable_device (pd )) {
1288
+ printk (KERN_ERR PFX "cannot enable PCI device\n" );
1289
+ return - ENODEV ;
1290
+ }
1291
+
1292
+ /* enable IO and mem if not already done */
1293
+ pci_read_config_word (pd , PCI_COMMAND , & cmd );
1294
+ cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY );
1295
+ pci_write_config_word (pd , PCI_COMMAND , cmd );
1296
+
1297
+ nvidiafb_fix .mmio_start = pci_resource_start (pd , 0 );
1298
+ nvidiafb_fix .mmio_len = pci_resource_len (pd , 0 );
1299
+
1300
+ REGS = ioremap (nvidiafb_fix .mmio_start , nvidiafb_fix .mmio_len );
1301
+ if (!REGS ) {
1302
+ printk (KERN_ERR PFX "cannot ioremap MMIO base\n" );
1303
+ return - ENODEV ;
1304
+ }
1305
+
1306
+ Chipset = nvidia_get_chipset (pd , REGS );
1307
+ Architecture = nvidia_get_arch (Chipset );
1308
+ if (Architecture == 0 ) {
1309
+ printk (KERN_ERR PFX "unknown NV_ARCH\n" );
1310
+ goto err_out ;
1311
+ }
1312
+
1285
1313
ret = aperture_remove_conflicting_pci_devices (pd , "nvidiafb" );
1286
1314
if (ret )
1287
- return ret ;
1315
+ goto err_out ;
1288
1316
1289
1317
info = framebuffer_alloc (sizeof (struct nvidia_par ), & pd -> dev );
1290
-
1291
1318
if (!info )
1292
1319
goto err_out ;
1293
1320
@@ -1298,11 +1325,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
1298
1325
if (info -> pixmap .addr == NULL )
1299
1326
goto err_out_kfree ;
1300
1327
1301
- if (pci_enable_device (pd )) {
1302
- printk (KERN_ERR PFX "cannot enable PCI device\n" );
1303
- goto err_out_enable ;
1304
- }
1305
-
1306
1328
if (pci_request_regions (pd , "nvidiafb" )) {
1307
1329
printk (KERN_ERR PFX "cannot request PCI regions\n" );
1308
1330
goto err_out_enable ;
@@ -1318,34 +1340,17 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
1318
1340
par -> paneltweak = paneltweak ;
1319
1341
par -> reverse_i2c = reverse_i2c ;
1320
1342
1321
- /* enable IO and mem if not already done */
1322
- pci_read_config_word (pd , PCI_COMMAND , & cmd );
1323
- cmd |= (PCI_COMMAND_IO | PCI_COMMAND_MEMORY );
1324
- pci_write_config_word (pd , PCI_COMMAND , cmd );
1325
-
1326
- nvidiafb_fix .mmio_start = pci_resource_start (pd , 0 );
1327
1343
nvidiafb_fix .smem_start = pci_resource_start (pd , 1 );
1328
- nvidiafb_fix .mmio_len = pci_resource_len (pd , 0 );
1329
-
1330
- par -> REGS = ioremap (nvidiafb_fix .mmio_start , nvidiafb_fix .mmio_len );
1331
1344
1332
- if (!par -> REGS ) {
1333
- printk (KERN_ERR PFX "cannot ioremap MMIO base\n" );
1334
- goto err_out_free_base0 ;
1335
- }
1345
+ par -> REGS = REGS ;
1336
1346
1337
- par -> Chipset = nvidia_get_chipset (info );
1338
- par -> Architecture = nvidia_get_arch (info );
1339
-
1340
- if (par -> Architecture == 0 ) {
1341
- printk (KERN_ERR PFX "unknown NV_ARCH\n" );
1342
- goto err_out_arch ;
1343
- }
1347
+ par -> Chipset = Chipset ;
1348
+ par -> Architecture = Architecture ;
1344
1349
1345
1350
sprintf (nvidiafb_fix .id , "NV%x" , (pd -> device & 0x0ff0 ) >> 4 );
1346
1351
1347
1352
if (NVCommonSetup (info ))
1348
- goto err_out_arch ;
1353
+ goto err_out_free_base0 ;
1349
1354
1350
1355
par -> FbAddress = nvidiafb_fix .smem_start ;
1351
1356
par -> FbMapSize = par -> RamAmountKBytes * 1024 ;
@@ -1401,7 +1406,6 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
1401
1406
goto err_out_iounmap_fb ;
1402
1407
}
1403
1408
1404
-
1405
1409
printk (KERN_INFO PFX
1406
1410
"PCI nVidia %s framebuffer (%dMB @ 0x%lX)\n" ,
1407
1411
info -> fix .id ,
@@ -1415,15 +1419,14 @@ static int nvidiafb_probe(struct pci_dev *pd, const struct pci_device_id *ent)
1415
1419
err_out_free_base1 :
1416
1420
fb_destroy_modedb (info -> monspecs .modedb );
1417
1421
nvidia_delete_i2c_busses (par );
1418
- err_out_arch :
1419
- iounmap (par -> REGS );
1420
- err_out_free_base0 :
1422
+ err_out_free_base0 :
1421
1423
pci_release_regions (pd );
1422
1424
err_out_enable :
1423
1425
kfree (info -> pixmap .addr );
1424
1426
err_out_kfree :
1425
1427
framebuffer_release (info );
1426
1428
err_out :
1429
+ iounmap (REGS );
1427
1430
return - ENODEV ;
1428
1431
}
1429
1432
0 commit comments