diff options
Diffstat (limited to 'drivers/ide/ppc/pmac.c')
-rw-r--r-- | drivers/ide/ppc/pmac.c | 97 |
1 files changed, 57 insertions, 40 deletions
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index 93fb9067c043..9244b58e0548 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
@@ -424,7 +424,9 @@ static void pmac_ide_kauai_selectproc(ide_drive_t *drive); | |||
424 | static void | 424 | static void |
425 | pmac_ide_selectproc(ide_drive_t *drive) | 425 | pmac_ide_selectproc(ide_drive_t *drive) |
426 | { | 426 | { |
427 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 427 | ide_hwif_t *hwif = drive->hwif; |
428 | pmac_ide_hwif_t *pmif = | ||
429 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
428 | 430 | ||
429 | if (pmif == NULL) | 431 | if (pmif == NULL) |
430 | return; | 432 | return; |
@@ -444,7 +446,9 @@ pmac_ide_selectproc(ide_drive_t *drive) | |||
444 | static void | 446 | static void |
445 | pmac_ide_kauai_selectproc(ide_drive_t *drive) | 447 | pmac_ide_kauai_selectproc(ide_drive_t *drive) |
446 | { | 448 | { |
447 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 449 | ide_hwif_t *hwif = drive->hwif; |
450 | pmac_ide_hwif_t *pmif = | ||
451 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
448 | 452 | ||
449 | if (pmif == NULL) | 453 | if (pmif == NULL) |
450 | return; | 454 | return; |
@@ -465,7 +469,9 @@ pmac_ide_kauai_selectproc(ide_drive_t *drive) | |||
465 | static void | 469 | static void |
466 | pmac_ide_do_update_timings(ide_drive_t *drive) | 470 | pmac_ide_do_update_timings(ide_drive_t *drive) |
467 | { | 471 | { |
468 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 472 | ide_hwif_t *hwif = drive->hwif; |
473 | pmac_ide_hwif_t *pmif = | ||
474 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
469 | 475 | ||
470 | if (pmif == NULL) | 476 | if (pmif == NULL) |
471 | return; | 477 | return; |
@@ -493,11 +499,13 @@ static void pmac_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port) | |||
493 | static void | 499 | static void |
494 | pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) | 500 | pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) |
495 | { | 501 | { |
502 | ide_hwif_t *hwif = drive->hwif; | ||
503 | pmac_ide_hwif_t *pmif = | ||
504 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
496 | struct ide_timing *tim = ide_timing_find_mode(XFER_PIO_0 + pio); | 505 | struct ide_timing *tim = ide_timing_find_mode(XFER_PIO_0 + pio); |
497 | u32 *timings, t; | 506 | u32 *timings, t; |
498 | unsigned accessTicks, recTicks; | 507 | unsigned accessTicks, recTicks; |
499 | unsigned accessTime, recTime; | 508 | unsigned accessTime, recTime; |
500 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | ||
501 | unsigned int cycle_time; | 509 | unsigned int cycle_time; |
502 | 510 | ||
503 | if (pmif == NULL) | 511 | if (pmif == NULL) |
@@ -778,9 +786,11 @@ set_timings_mdma(ide_drive_t *drive, int intf_type, u32 *timings, u32 *timings2, | |||
778 | 786 | ||
779 | static void pmac_ide_set_dma_mode(ide_drive_t *drive, const u8 speed) | 787 | static void pmac_ide_set_dma_mode(ide_drive_t *drive, const u8 speed) |
780 | { | 788 | { |
789 | ide_hwif_t *hwif = drive->hwif; | ||
790 | pmac_ide_hwif_t *pmif = | ||
791 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
781 | int unit = (drive->select.b.unit & 0x01); | 792 | int unit = (drive->select.b.unit & 0x01); |
782 | int ret = 0; | 793 | int ret = 0; |
783 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | ||
784 | u32 *timings, *timings2, tl[2]; | 794 | u32 *timings, *timings2, tl[2]; |
785 | 795 | ||
786 | timings = &pmif->timings[unit]; | 796 | timings = &pmif->timings[unit]; |
@@ -852,11 +862,8 @@ sanitize_timings(pmac_ide_hwif_t *pmif) | |||
852 | /* Suspend call back, should be called after the child devices | 862 | /* Suspend call back, should be called after the child devices |
853 | * have actually been suspended | 863 | * have actually been suspended |
854 | */ | 864 | */ |
855 | static int | 865 | static int pmac_ide_do_suspend(pmac_ide_hwif_t *pmif) |
856 | pmac_ide_do_suspend(ide_hwif_t *hwif) | ||
857 | { | 866 | { |
858 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data; | ||
859 | |||
860 | /* We clear the timings */ | 867 | /* We clear the timings */ |
861 | pmif->timings[0] = 0; | 868 | pmif->timings[0] = 0; |
862 | pmif->timings[1] = 0; | 869 | pmif->timings[1] = 0; |
@@ -884,11 +891,8 @@ pmac_ide_do_suspend(ide_hwif_t *hwif) | |||
884 | /* Resume call back, should be called before the child devices | 891 | /* Resume call back, should be called before the child devices |
885 | * are resumed | 892 | * are resumed |
886 | */ | 893 | */ |
887 | static int | 894 | static int pmac_ide_do_resume(pmac_ide_hwif_t *pmif) |
888 | pmac_ide_do_resume(ide_hwif_t *hwif) | ||
889 | { | 895 | { |
890 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data; | ||
891 | |||
892 | /* Hard reset & re-enable controller (do we really need to reset ? -BenH) */ | 896 | /* Hard reset & re-enable controller (do we really need to reset ? -BenH) */ |
893 | if (!pmif->mediabay) { | 897 | if (!pmif->mediabay) { |
894 | ppc_md.feature_call(PMAC_FTR_IDE_RESET, pmif->node, pmif->aapl_bus_id, 1); | 898 | ppc_md.feature_call(PMAC_FTR_IDE_RESET, pmif->node, pmif->aapl_bus_id, 1); |
@@ -916,7 +920,8 @@ pmac_ide_do_resume(ide_hwif_t *hwif) | |||
916 | 920 | ||
917 | static u8 pmac_ide_cable_detect(ide_hwif_t *hwif) | 921 | static u8 pmac_ide_cable_detect(ide_hwif_t *hwif) |
918 | { | 922 | { |
919 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)ide_get_hwifdata(hwif); | 923 | pmac_ide_hwif_t *pmif = |
924 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
920 | struct device_node *np = pmif->node; | 925 | struct device_node *np = pmif->node; |
921 | const char *cable = of_get_property(np, "cable-type", NULL); | 926 | const char *cable = of_get_property(np, "cable-type", NULL); |
922 | 927 | ||
@@ -1058,7 +1063,6 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | |||
1058 | default_hwif_mmiops(hwif); | 1063 | default_hwif_mmiops(hwif); |
1059 | hwif->OUTBSYNC = pmac_outbsync; | 1064 | hwif->OUTBSYNC = pmac_outbsync; |
1060 | 1065 | ||
1061 | hwif->hwif_data = pmif; | ||
1062 | ide_init_port_hw(hwif, hw); | 1066 | ide_init_port_hw(hwif, hw); |
1063 | 1067 | ||
1064 | printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", | 1068 | printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", |
@@ -1164,7 +1168,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match) | |||
1164 | } else | 1168 | } else |
1165 | pmif->dma_regs = NULL; | 1169 | pmif->dma_regs = NULL; |
1166 | #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ | 1170 | #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ |
1167 | dev_set_drvdata(&mdev->ofdev.dev, hwif); | 1171 | dev_set_drvdata(&mdev->ofdev.dev, pmif); |
1168 | 1172 | ||
1169 | memset(&hw, 0, sizeof(hw)); | 1173 | memset(&hw, 0, sizeof(hw)); |
1170 | pmac_ide_init_ports(&hw, pmif->regbase); | 1174 | pmac_ide_init_ports(&hw, pmif->regbase); |
@@ -1195,12 +1199,13 @@ out_free_pmif: | |||
1195 | static int | 1199 | static int |
1196 | pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) | 1200 | pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) |
1197 | { | 1201 | { |
1198 | ide_hwif_t *hwif = (ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); | 1202 | pmac_ide_hwif_t *pmif = |
1199 | int rc = 0; | 1203 | (pmac_ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); |
1204 | int rc = 0; | ||
1200 | 1205 | ||
1201 | if (mesg.event != mdev->ofdev.dev.power.power_state.event | 1206 | if (mesg.event != mdev->ofdev.dev.power.power_state.event |
1202 | && (mesg.event & PM_EVENT_SLEEP)) { | 1207 | && (mesg.event & PM_EVENT_SLEEP)) { |
1203 | rc = pmac_ide_do_suspend(hwif); | 1208 | rc = pmac_ide_do_suspend(pmif); |
1204 | if (rc == 0) | 1209 | if (rc == 0) |
1205 | mdev->ofdev.dev.power.power_state = mesg; | 1210 | mdev->ofdev.dev.power.power_state = mesg; |
1206 | } | 1211 | } |
@@ -1211,11 +1216,12 @@ pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) | |||
1211 | static int | 1216 | static int |
1212 | pmac_ide_macio_resume(struct macio_dev *mdev) | 1217 | pmac_ide_macio_resume(struct macio_dev *mdev) |
1213 | { | 1218 | { |
1214 | ide_hwif_t *hwif = (ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); | 1219 | pmac_ide_hwif_t *pmif = |
1215 | int rc = 0; | 1220 | (pmac_ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); |
1216 | 1221 | int rc = 0; | |
1222 | |||
1217 | if (mdev->ofdev.dev.power.power_state.event != PM_EVENT_ON) { | 1223 | if (mdev->ofdev.dev.power.power_state.event != PM_EVENT_ON) { |
1218 | rc = pmac_ide_do_resume(hwif); | 1224 | rc = pmac_ide_do_resume(pmif); |
1219 | if (rc == 0) | 1225 | if (rc == 0) |
1220 | mdev->ofdev.dev.power.power_state = PMSG_ON; | 1226 | mdev->ofdev.dev.power.power_state = PMSG_ON; |
1221 | } | 1227 | } |
@@ -1284,7 +1290,7 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1284 | pmif->kauai_fcr = base; | 1290 | pmif->kauai_fcr = base; |
1285 | pmif->irq = pdev->irq; | 1291 | pmif->irq = pdev->irq; |
1286 | 1292 | ||
1287 | pci_set_drvdata(pdev, hwif); | 1293 | pci_set_drvdata(pdev, pmif); |
1288 | 1294 | ||
1289 | memset(&hw, 0, sizeof(hw)); | 1295 | memset(&hw, 0, sizeof(hw)); |
1290 | pmac_ide_init_ports(&hw, pmif->regbase); | 1296 | pmac_ide_init_ports(&hw, pmif->regbase); |
@@ -1310,12 +1316,12 @@ out_free_pmif: | |||
1310 | static int | 1316 | static int |
1311 | pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) | 1317 | pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) |
1312 | { | 1318 | { |
1313 | ide_hwif_t *hwif = (ide_hwif_t *)pci_get_drvdata(pdev); | 1319 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)pci_get_drvdata(pdev); |
1314 | int rc = 0; | 1320 | int rc = 0; |
1315 | 1321 | ||
1316 | if (mesg.event != pdev->dev.power.power_state.event | 1322 | if (mesg.event != pdev->dev.power.power_state.event |
1317 | && (mesg.event & PM_EVENT_SLEEP)) { | 1323 | && (mesg.event & PM_EVENT_SLEEP)) { |
1318 | rc = pmac_ide_do_suspend(hwif); | 1324 | rc = pmac_ide_do_suspend(pmif); |
1319 | if (rc == 0) | 1325 | if (rc == 0) |
1320 | pdev->dev.power.power_state = mesg; | 1326 | pdev->dev.power.power_state = mesg; |
1321 | } | 1327 | } |
@@ -1326,11 +1332,11 @@ pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) | |||
1326 | static int | 1332 | static int |
1327 | pmac_ide_pci_resume(struct pci_dev *pdev) | 1333 | pmac_ide_pci_resume(struct pci_dev *pdev) |
1328 | { | 1334 | { |
1329 | ide_hwif_t *hwif = (ide_hwif_t *)pci_get_drvdata(pdev); | 1335 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)pci_get_drvdata(pdev); |
1330 | int rc = 0; | 1336 | int rc = 0; |
1331 | 1337 | ||
1332 | if (pdev->dev.power.power_state.event != PM_EVENT_ON) { | 1338 | if (pdev->dev.power.power_state.event != PM_EVENT_ON) { |
1333 | rc = pmac_ide_do_resume(hwif); | 1339 | rc = pmac_ide_do_resume(pmif); |
1334 | if (rc == 0) | 1340 | if (rc == 0) |
1335 | pdev->dev.power.power_state = PMSG_ON; | 1341 | pdev->dev.power.power_state = PMSG_ON; |
1336 | } | 1342 | } |
@@ -1421,10 +1427,11 @@ out: | |||
1421 | static int | 1427 | static int |
1422 | pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq) | 1428 | pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq) |
1423 | { | 1429 | { |
1430 | ide_hwif_t *hwif = drive->hwif; | ||
1431 | pmac_ide_hwif_t *pmif = | ||
1432 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1424 | struct dbdma_cmd *table; | 1433 | struct dbdma_cmd *table; |
1425 | int i, count = 0; | 1434 | int i, count = 0; |
1426 | ide_hwif_t *hwif = HWIF(drive); | ||
1427 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)hwif->hwif_data; | ||
1428 | volatile struct dbdma_regs __iomem *dma = pmif->dma_regs; | 1435 | volatile struct dbdma_regs __iomem *dma = pmif->dma_regs; |
1429 | struct scatterlist *sg; | 1436 | struct scatterlist *sg; |
1430 | int wr = (rq_data_dir(rq) == WRITE); | 1437 | int wr = (rq_data_dir(rq) == WRITE); |
@@ -1520,7 +1527,8 @@ static int | |||
1520 | pmac_ide_dma_setup(ide_drive_t *drive) | 1527 | pmac_ide_dma_setup(ide_drive_t *drive) |
1521 | { | 1528 | { |
1522 | ide_hwif_t *hwif = HWIF(drive); | 1529 | ide_hwif_t *hwif = HWIF(drive); |
1523 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)hwif->hwif_data; | 1530 | pmac_ide_hwif_t *pmif = |
1531 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1524 | struct request *rq = HWGROUP(drive)->rq; | 1532 | struct request *rq = HWGROUP(drive)->rq; |
1525 | u8 unit = (drive->select.b.unit & 0x01); | 1533 | u8 unit = (drive->select.b.unit & 0x01); |
1526 | u8 ata4; | 1534 | u8 ata4; |
@@ -1560,7 +1568,9 @@ pmac_ide_dma_exec_cmd(ide_drive_t *drive, u8 command) | |||
1560 | static void | 1568 | static void |
1561 | pmac_ide_dma_start(ide_drive_t *drive) | 1569 | pmac_ide_dma_start(ide_drive_t *drive) |
1562 | { | 1570 | { |
1563 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 1571 | ide_hwif_t *hwif = drive->hwif; |
1572 | pmac_ide_hwif_t *pmif = | ||
1573 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1564 | volatile struct dbdma_regs __iomem *dma; | 1574 | volatile struct dbdma_regs __iomem *dma; |
1565 | 1575 | ||
1566 | dma = pmif->dma_regs; | 1576 | dma = pmif->dma_regs; |
@@ -1576,7 +1586,9 @@ pmac_ide_dma_start(ide_drive_t *drive) | |||
1576 | static int | 1586 | static int |
1577 | pmac_ide_dma_end (ide_drive_t *drive) | 1587 | pmac_ide_dma_end (ide_drive_t *drive) |
1578 | { | 1588 | { |
1579 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 1589 | ide_hwif_t *hwif = drive->hwif; |
1590 | pmac_ide_hwif_t *pmif = | ||
1591 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1580 | volatile struct dbdma_regs __iomem *dma; | 1592 | volatile struct dbdma_regs __iomem *dma; |
1581 | u32 dstat; | 1593 | u32 dstat; |
1582 | 1594 | ||
@@ -1604,7 +1616,9 @@ pmac_ide_dma_end (ide_drive_t *drive) | |||
1604 | static int | 1616 | static int |
1605 | pmac_ide_dma_test_irq (ide_drive_t *drive) | 1617 | pmac_ide_dma_test_irq (ide_drive_t *drive) |
1606 | { | 1618 | { |
1607 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 1619 | ide_hwif_t *hwif = drive->hwif; |
1620 | pmac_ide_hwif_t *pmif = | ||
1621 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1608 | volatile struct dbdma_regs __iomem *dma; | 1622 | volatile struct dbdma_regs __iomem *dma; |
1609 | unsigned long status, timeout; | 1623 | unsigned long status, timeout; |
1610 | 1624 | ||
@@ -1664,7 +1678,9 @@ static void pmac_ide_dma_host_set(ide_drive_t *drive, int on) | |||
1664 | static void | 1678 | static void |
1665 | pmac_ide_dma_lost_irq (ide_drive_t *drive) | 1679 | pmac_ide_dma_lost_irq (ide_drive_t *drive) |
1666 | { | 1680 | { |
1667 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 1681 | ide_hwif_t *hwif = drive->hwif; |
1682 | pmac_ide_hwif_t *pmif = | ||
1683 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1668 | volatile struct dbdma_regs __iomem *dma; | 1684 | volatile struct dbdma_regs __iomem *dma; |
1669 | unsigned long status; | 1685 | unsigned long status; |
1670 | 1686 | ||
@@ -1694,7 +1710,8 @@ static const struct ide_dma_ops pmac_dma_ops = { | |||
1694 | static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif, | 1710 | static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif, |
1695 | const struct ide_port_info *d) | 1711 | const struct ide_port_info *d) |
1696 | { | 1712 | { |
1697 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data; | 1713 | pmac_ide_hwif_t *pmif = |
1714 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1698 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 1715 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
1699 | 1716 | ||
1700 | /* We won't need pci_dev if we switch to generic consistent | 1717 | /* We won't need pci_dev if we switch to generic consistent |