diff options
Diffstat (limited to 'drivers/ide/pci/hpt366.c')
-rw-r--r-- | drivers/ide/pci/hpt366.c | 84 |
1 files changed, 46 insertions, 38 deletions
diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c index 5623cad569da..7a8c8c7a8b96 100644 --- a/drivers/ide/pci/hpt366.c +++ b/drivers/ide/pci/hpt366.c | |||
@@ -1279,12 +1279,55 @@ static unsigned int __devinit init_chipset_hpt366(struct pci_dev *dev, const cha | |||
1279 | return dev->irq; | 1279 | return dev->irq; |
1280 | } | 1280 | } |
1281 | 1281 | ||
1282 | static u8 __devinit hpt3xx_cable_detect(ide_hwif_t *hwif) | ||
1283 | { | ||
1284 | struct pci_dev *dev = to_pci_dev(hwif->dev); | ||
1285 | struct hpt_info *info = pci_get_drvdata(dev); | ||
1286 | u8 chip_type = info->chip_type; | ||
1287 | u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02; | ||
1288 | |||
1289 | /* | ||
1290 | * The HPT37x uses the CBLID pins as outputs for MA15/MA16 | ||
1291 | * address lines to access an external EEPROM. To read valid | ||
1292 | * cable detect state the pins must be enabled as inputs. | ||
1293 | */ | ||
1294 | if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) { | ||
1295 | /* | ||
1296 | * HPT374 PCI function 1 | ||
1297 | * - set bit 15 of reg 0x52 to enable TCBLID as input | ||
1298 | * - set bit 15 of reg 0x56 to enable FCBLID as input | ||
1299 | */ | ||
1300 | u8 mcr_addr = hwif->select_data + 2; | ||
1301 | u16 mcr; | ||
1302 | |||
1303 | pci_read_config_word(dev, mcr_addr, &mcr); | ||
1304 | pci_write_config_word(dev, mcr_addr, (mcr | 0x8000)); | ||
1305 | /* now read cable id register */ | ||
1306 | pci_read_config_byte(dev, 0x5a, &scr1); | ||
1307 | pci_write_config_word(dev, mcr_addr, mcr); | ||
1308 | } else if (chip_type >= HPT370) { | ||
1309 | /* | ||
1310 | * HPT370/372 and 374 pcifn 0 | ||
1311 | * - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs | ||
1312 | */ | ||
1313 | u8 scr2 = 0; | ||
1314 | |||
1315 | pci_read_config_byte(dev, 0x5b, &scr2); | ||
1316 | pci_write_config_byte(dev, 0x5b, (scr2 & ~1)); | ||
1317 | /* now read cable id register */ | ||
1318 | pci_read_config_byte(dev, 0x5a, &scr1); | ||
1319 | pci_write_config_byte(dev, 0x5b, scr2); | ||
1320 | } else | ||
1321 | pci_read_config_byte(dev, 0x5a, &scr1); | ||
1322 | |||
1323 | return (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; | ||
1324 | } | ||
1325 | |||
1282 | static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | 1326 | static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) |
1283 | { | 1327 | { |
1284 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 1328 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
1285 | struct hpt_info *info = pci_get_drvdata(dev); | 1329 | struct hpt_info *info = pci_get_drvdata(dev); |
1286 | int serialize = HPT_SERIALIZE_IO; | 1330 | int serialize = HPT_SERIALIZE_IO; |
1287 | u8 scr1 = 0, ata66 = hwif->channel ? 0x01 : 0x02; | ||
1288 | u8 chip_type = info->chip_type; | 1331 | u8 chip_type = info->chip_type; |
1289 | u8 new_mcr, old_mcr = 0; | 1332 | u8 new_mcr, old_mcr = 0; |
1290 | 1333 | ||
@@ -1301,6 +1344,8 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | |||
1301 | hwif->udma_filter = &hpt3xx_udma_filter; | 1344 | hwif->udma_filter = &hpt3xx_udma_filter; |
1302 | hwif->mdma_filter = &hpt3xx_mdma_filter; | 1345 | hwif->mdma_filter = &hpt3xx_mdma_filter; |
1303 | 1346 | ||
1347 | hwif->cable_detect = hpt3xx_cable_detect; | ||
1348 | |||
1304 | /* | 1349 | /* |
1305 | * HPT3xxN chips have some complications: | 1350 | * HPT3xxN chips have some complications: |
1306 | * | 1351 | * |
@@ -1346,43 +1391,6 @@ static void __devinit init_hwif_hpt366(ide_hwif_t *hwif) | |||
1346 | if (hwif->dma_base == 0) | 1391 | if (hwif->dma_base == 0) |
1347 | return; | 1392 | return; |
1348 | 1393 | ||
1349 | /* | ||
1350 | * The HPT37x uses the CBLID pins as outputs for MA15/MA16 | ||
1351 | * address lines to access an external EEPROM. To read valid | ||
1352 | * cable detect state the pins must be enabled as inputs. | ||
1353 | */ | ||
1354 | if (chip_type == HPT374 && (PCI_FUNC(dev->devfn) & 1)) { | ||
1355 | /* | ||
1356 | * HPT374 PCI function 1 | ||
1357 | * - set bit 15 of reg 0x52 to enable TCBLID as input | ||
1358 | * - set bit 15 of reg 0x56 to enable FCBLID as input | ||
1359 | */ | ||
1360 | u8 mcr_addr = hwif->select_data + 2; | ||
1361 | u16 mcr; | ||
1362 | |||
1363 | pci_read_config_word (dev, mcr_addr, &mcr); | ||
1364 | pci_write_config_word(dev, mcr_addr, (mcr | 0x8000)); | ||
1365 | /* now read cable id register */ | ||
1366 | pci_read_config_byte (dev, 0x5a, &scr1); | ||
1367 | pci_write_config_word(dev, mcr_addr, mcr); | ||
1368 | } else if (chip_type >= HPT370) { | ||
1369 | /* | ||
1370 | * HPT370/372 and 374 pcifn 0 | ||
1371 | * - clear bit 0 of reg 0x5b to enable P/SCBLID as inputs | ||
1372 | */ | ||
1373 | u8 scr2 = 0; | ||
1374 | |||
1375 | pci_read_config_byte (dev, 0x5b, &scr2); | ||
1376 | pci_write_config_byte(dev, 0x5b, (scr2 & ~1)); | ||
1377 | /* now read cable id register */ | ||
1378 | pci_read_config_byte (dev, 0x5a, &scr1); | ||
1379 | pci_write_config_byte(dev, 0x5b, scr2); | ||
1380 | } else | ||
1381 | pci_read_config_byte (dev, 0x5a, &scr1); | ||
1382 | |||
1383 | if (hwif->cbl != ATA_CBL_PATA40_SHORT) | ||
1384 | hwif->cbl = (scr1 & ata66) ? ATA_CBL_PATA40 : ATA_CBL_PATA80; | ||
1385 | |||
1386 | if (chip_type >= HPT374) { | 1394 | if (chip_type >= HPT374) { |
1387 | hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq; | 1395 | hwif->ide_dma_test_irq = &hpt374_ide_dma_test_irq; |
1388 | hwif->ide_dma_end = &hpt374_ide_dma_end; | 1396 | hwif->ide_dma_end = &hpt374_ide_dma_end; |