diff options
Diffstat (limited to 'drivers/ide/ppc/pmac.c')
-rw-r--r-- | drivers/ide/ppc/pmac.c | 222 |
1 files changed, 131 insertions, 91 deletions
diff --git a/drivers/ide/ppc/pmac.c b/drivers/ide/ppc/pmac.c index 93fb9067c043..c521bf6e1bf2 100644 --- a/drivers/ide/ppc/pmac.c +++ b/drivers/ide/ppc/pmac.c | |||
@@ -48,6 +48,8 @@ | |||
48 | #include <asm/mediabay.h> | 48 | #include <asm/mediabay.h> |
49 | #endif | 49 | #endif |
50 | 50 | ||
51 | #define DRV_NAME "ide-pmac" | ||
52 | |||
51 | #undef IDE_PMAC_DEBUG | 53 | #undef IDE_PMAC_DEBUG |
52 | 54 | ||
53 | #define DMA_WAIT_TIMEOUT 50 | 55 | #define DMA_WAIT_TIMEOUT 50 |
@@ -424,7 +426,9 @@ static void pmac_ide_kauai_selectproc(ide_drive_t *drive); | |||
424 | static void | 426 | static void |
425 | pmac_ide_selectproc(ide_drive_t *drive) | 427 | pmac_ide_selectproc(ide_drive_t *drive) |
426 | { | 428 | { |
427 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 429 | ide_hwif_t *hwif = drive->hwif; |
430 | pmac_ide_hwif_t *pmif = | ||
431 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
428 | 432 | ||
429 | if (pmif == NULL) | 433 | if (pmif == NULL) |
430 | return; | 434 | return; |
@@ -444,7 +448,9 @@ pmac_ide_selectproc(ide_drive_t *drive) | |||
444 | static void | 448 | static void |
445 | pmac_ide_kauai_selectproc(ide_drive_t *drive) | 449 | pmac_ide_kauai_selectproc(ide_drive_t *drive) |
446 | { | 450 | { |
447 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 451 | ide_hwif_t *hwif = drive->hwif; |
452 | pmac_ide_hwif_t *pmif = | ||
453 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
448 | 454 | ||
449 | if (pmif == NULL) | 455 | if (pmif == NULL) |
450 | return; | 456 | return; |
@@ -465,7 +471,9 @@ pmac_ide_kauai_selectproc(ide_drive_t *drive) | |||
465 | static void | 471 | static void |
466 | pmac_ide_do_update_timings(ide_drive_t *drive) | 472 | pmac_ide_do_update_timings(ide_drive_t *drive) |
467 | { | 473 | { |
468 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 474 | ide_hwif_t *hwif = drive->hwif; |
475 | pmac_ide_hwif_t *pmif = | ||
476 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
469 | 477 | ||
470 | if (pmif == NULL) | 478 | if (pmif == NULL) |
471 | return; | 479 | return; |
@@ -478,12 +486,26 @@ pmac_ide_do_update_timings(ide_drive_t *drive) | |||
478 | pmac_ide_selectproc(drive); | 486 | pmac_ide_selectproc(drive); |
479 | } | 487 | } |
480 | 488 | ||
481 | static void pmac_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port) | 489 | static void pmac_exec_command(ide_hwif_t *hwif, u8 cmd) |
482 | { | 490 | { |
483 | u32 tmp; | 491 | writeb(cmd, (void __iomem *)hwif->io_ports.command_addr); |
484 | 492 | (void)readl((void __iomem *)(hwif->io_ports.data_addr | |
485 | writeb(value, (void __iomem *) port); | 493 | + IDE_TIMING_CONFIG)); |
486 | tmp = readl((void __iomem *)(hwif->io_ports.data_addr | 494 | } |
495 | |||
496 | static void pmac_set_irq(ide_hwif_t *hwif, int on) | ||
497 | { | ||
498 | u8 ctl = ATA_DEVCTL_OBS; | ||
499 | |||
500 | if (on == 4) { /* hack for SRST */ | ||
501 | ctl |= 4; | ||
502 | on &= ~4; | ||
503 | } | ||
504 | |||
505 | ctl |= on ? 0 : 2; | ||
506 | |||
507 | writeb(ctl, (void __iomem *)hwif->io_ports.ctl_addr); | ||
508 | (void)readl((void __iomem *)(hwif->io_ports.data_addr | ||
487 | + IDE_TIMING_CONFIG)); | 509 | + IDE_TIMING_CONFIG)); |
488 | } | 510 | } |
489 | 511 | ||
@@ -493,11 +515,13 @@ static void pmac_outbsync(ide_hwif_t *hwif, u8 value, unsigned long port) | |||
493 | static void | 515 | static void |
494 | pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) | 516 | pmac_ide_set_pio_mode(ide_drive_t *drive, const u8 pio) |
495 | { | 517 | { |
518 | ide_hwif_t *hwif = drive->hwif; | ||
519 | pmac_ide_hwif_t *pmif = | ||
520 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
496 | struct ide_timing *tim = ide_timing_find_mode(XFER_PIO_0 + pio); | 521 | struct ide_timing *tim = ide_timing_find_mode(XFER_PIO_0 + pio); |
497 | u32 *timings, t; | 522 | u32 *timings, t; |
498 | unsigned accessTicks, recTicks; | 523 | unsigned accessTicks, recTicks; |
499 | unsigned accessTime, recTime; | 524 | unsigned accessTime, recTime; |
500 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | ||
501 | unsigned int cycle_time; | 525 | unsigned int cycle_time; |
502 | 526 | ||
503 | if (pmif == NULL) | 527 | if (pmif == NULL) |
@@ -778,9 +802,11 @@ set_timings_mdma(ide_drive_t *drive, int intf_type, u32 *timings, u32 *timings2, | |||
778 | 802 | ||
779 | static void pmac_ide_set_dma_mode(ide_drive_t *drive, const u8 speed) | 803 | static void pmac_ide_set_dma_mode(ide_drive_t *drive, const u8 speed) |
780 | { | 804 | { |
805 | ide_hwif_t *hwif = drive->hwif; | ||
806 | pmac_ide_hwif_t *pmif = | ||
807 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
781 | int unit = (drive->select.b.unit & 0x01); | 808 | int unit = (drive->select.b.unit & 0x01); |
782 | int ret = 0; | 809 | int ret = 0; |
783 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | ||
784 | u32 *timings, *timings2, tl[2]; | 810 | u32 *timings, *timings2, tl[2]; |
785 | 811 | ||
786 | timings = &pmif->timings[unit]; | 812 | timings = &pmif->timings[unit]; |
@@ -852,11 +878,8 @@ sanitize_timings(pmac_ide_hwif_t *pmif) | |||
852 | /* Suspend call back, should be called after the child devices | 878 | /* Suspend call back, should be called after the child devices |
853 | * have actually been suspended | 879 | * have actually been suspended |
854 | */ | 880 | */ |
855 | static int | 881 | static int pmac_ide_do_suspend(pmac_ide_hwif_t *pmif) |
856 | pmac_ide_do_suspend(ide_hwif_t *hwif) | ||
857 | { | 882 | { |
858 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data; | ||
859 | |||
860 | /* We clear the timings */ | 883 | /* We clear the timings */ |
861 | pmif->timings[0] = 0; | 884 | pmif->timings[0] = 0; |
862 | pmif->timings[1] = 0; | 885 | pmif->timings[1] = 0; |
@@ -884,11 +907,8 @@ pmac_ide_do_suspend(ide_hwif_t *hwif) | |||
884 | /* Resume call back, should be called before the child devices | 907 | /* Resume call back, should be called before the child devices |
885 | * are resumed | 908 | * are resumed |
886 | */ | 909 | */ |
887 | static int | 910 | static int pmac_ide_do_resume(pmac_ide_hwif_t *pmif) |
888 | pmac_ide_do_resume(ide_hwif_t *hwif) | ||
889 | { | 911 | { |
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) */ | 912 | /* Hard reset & re-enable controller (do we really need to reset ? -BenH) */ |
893 | if (!pmif->mediabay) { | 913 | if (!pmif->mediabay) { |
894 | ppc_md.feature_call(PMAC_FTR_IDE_RESET, pmif->node, pmif->aapl_bus_id, 1); | 914 | ppc_md.feature_call(PMAC_FTR_IDE_RESET, pmif->node, pmif->aapl_bus_id, 1); |
@@ -916,7 +936,8 @@ pmac_ide_do_resume(ide_hwif_t *hwif) | |||
916 | 936 | ||
917 | static u8 pmac_ide_cable_detect(ide_hwif_t *hwif) | 937 | static u8 pmac_ide_cable_detect(ide_hwif_t *hwif) |
918 | { | 938 | { |
919 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)ide_get_hwifdata(hwif); | 939 | pmac_ide_hwif_t *pmif = |
940 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
920 | struct device_node *np = pmif->node; | 941 | struct device_node *np = pmif->node; |
921 | const char *cable = of_get_property(np, "cable-type", NULL); | 942 | const char *cable = of_get_property(np, "cable-type", NULL); |
922 | 943 | ||
@@ -936,7 +957,40 @@ static u8 pmac_ide_cable_detect(ide_hwif_t *hwif) | |||
936 | return ATA_CBL_PATA40; | 957 | return ATA_CBL_PATA40; |
937 | } | 958 | } |
938 | 959 | ||
960 | static void pmac_ide_init_dev(ide_drive_t *drive) | ||
961 | { | ||
962 | ide_hwif_t *hwif = drive->hwif; | ||
963 | pmac_ide_hwif_t *pmif = | ||
964 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
965 | |||
966 | if (pmif->mediabay) { | ||
967 | #ifdef CONFIG_PMAC_MEDIABAY | ||
968 | if (check_media_bay_by_base(pmif->regbase, MB_CD) == 0) { | ||
969 | drive->noprobe = 0; | ||
970 | return; | ||
971 | } | ||
972 | #endif | ||
973 | drive->noprobe = 1; | ||
974 | } | ||
975 | } | ||
976 | |||
977 | static const struct ide_tp_ops pmac_tp_ops = { | ||
978 | .exec_command = pmac_exec_command, | ||
979 | .read_status = ide_read_status, | ||
980 | .read_altstatus = ide_read_altstatus, | ||
981 | .read_sff_dma_status = ide_read_sff_dma_status, | ||
982 | |||
983 | .set_irq = pmac_set_irq, | ||
984 | |||
985 | .tf_load = ide_tf_load, | ||
986 | .tf_read = ide_tf_read, | ||
987 | |||
988 | .input_data = ide_input_data, | ||
989 | .output_data = ide_output_data, | ||
990 | }; | ||
991 | |||
939 | static const struct ide_port_ops pmac_ide_ata6_port_ops = { | 992 | static const struct ide_port_ops pmac_ide_ata6_port_ops = { |
993 | .init_dev = pmac_ide_init_dev, | ||
940 | .set_pio_mode = pmac_ide_set_pio_mode, | 994 | .set_pio_mode = pmac_ide_set_pio_mode, |
941 | .set_dma_mode = pmac_ide_set_dma_mode, | 995 | .set_dma_mode = pmac_ide_set_dma_mode, |
942 | .selectproc = pmac_ide_kauai_selectproc, | 996 | .selectproc = pmac_ide_kauai_selectproc, |
@@ -944,6 +998,7 @@ static const struct ide_port_ops pmac_ide_ata6_port_ops = { | |||
944 | }; | 998 | }; |
945 | 999 | ||
946 | static const struct ide_port_ops pmac_ide_ata4_port_ops = { | 1000 | static const struct ide_port_ops pmac_ide_ata4_port_ops = { |
1001 | .init_dev = pmac_ide_init_dev, | ||
947 | .set_pio_mode = pmac_ide_set_pio_mode, | 1002 | .set_pio_mode = pmac_ide_set_pio_mode, |
948 | .set_dma_mode = pmac_ide_set_dma_mode, | 1003 | .set_dma_mode = pmac_ide_set_dma_mode, |
949 | .selectproc = pmac_ide_selectproc, | 1004 | .selectproc = pmac_ide_selectproc, |
@@ -951,6 +1006,7 @@ static const struct ide_port_ops pmac_ide_ata4_port_ops = { | |||
951 | }; | 1006 | }; |
952 | 1007 | ||
953 | static const struct ide_port_ops pmac_ide_port_ops = { | 1008 | static const struct ide_port_ops pmac_ide_port_ops = { |
1009 | .init_dev = pmac_ide_init_dev, | ||
954 | .set_pio_mode = pmac_ide_set_pio_mode, | 1010 | .set_pio_mode = pmac_ide_set_pio_mode, |
955 | .set_dma_mode = pmac_ide_set_dma_mode, | 1011 | .set_dma_mode = pmac_ide_set_dma_mode, |
956 | .selectproc = pmac_ide_selectproc, | 1012 | .selectproc = pmac_ide_selectproc, |
@@ -959,12 +1015,14 @@ static const struct ide_port_ops pmac_ide_port_ops = { | |||
959 | static const struct ide_dma_ops pmac_dma_ops; | 1015 | static const struct ide_dma_ops pmac_dma_ops; |
960 | 1016 | ||
961 | static const struct ide_port_info pmac_port_info = { | 1017 | static const struct ide_port_info pmac_port_info = { |
1018 | .name = DRV_NAME, | ||
962 | .init_dma = pmac_ide_init_dma, | 1019 | .init_dma = pmac_ide_init_dma, |
963 | .chipset = ide_pmac, | 1020 | .chipset = ide_pmac, |
1021 | .tp_ops = &pmac_tp_ops, | ||
1022 | .port_ops = &pmac_ide_port_ops, | ||
964 | #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC | 1023 | #ifdef CONFIG_BLK_DEV_IDEDMA_PMAC |
965 | .dma_ops = &pmac_dma_ops, | 1024 | .dma_ops = &pmac_dma_ops, |
966 | #endif | 1025 | #endif |
967 | .port_ops = &pmac_ide_port_ops, | ||
968 | .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA | | 1026 | .host_flags = IDE_HFLAG_SET_PIO_MODE_KEEP_DMA | |
969 | IDE_HFLAG_POST_SET_MODE | | 1027 | IDE_HFLAG_POST_SET_MODE | |
970 | IDE_HFLAG_MMIO | | 1028 | IDE_HFLAG_MMIO | |
@@ -977,13 +1035,15 @@ static const struct ide_port_info pmac_port_info = { | |||
977 | * Setup, register & probe an IDE channel driven by this driver, this is | 1035 | * Setup, register & probe an IDE channel driven by this driver, this is |
978 | * called by one of the 2 probe functions (macio or PCI). | 1036 | * called by one of the 2 probe functions (macio or PCI). |
979 | */ | 1037 | */ |
980 | static int __devinit | 1038 | static int __devinit pmac_ide_setup_device(pmac_ide_hwif_t *pmif, hw_regs_t *hw) |
981 | pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | ||
982 | { | 1039 | { |
983 | struct device_node *np = pmif->node; | 1040 | struct device_node *np = pmif->node; |
984 | const int *bidp; | 1041 | const int *bidp; |
985 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | 1042 | struct ide_host *host; |
1043 | ide_hwif_t *hwif; | ||
1044 | hw_regs_t *hws[] = { hw, NULL, NULL, NULL }; | ||
986 | struct ide_port_info d = pmac_port_info; | 1045 | struct ide_port_info d = pmac_port_info; |
1046 | int rc; | ||
987 | 1047 | ||
988 | pmif->broken_dma = pmif->broken_dma_warn = 0; | 1048 | pmif->broken_dma = pmif->broken_dma_warn = 0; |
989 | if (of_device_is_compatible(np, "shasta-ata")) { | 1049 | if (of_device_is_compatible(np, "shasta-ata")) { |
@@ -1054,31 +1114,16 @@ pmac_ide_setup_device(pmac_ide_hwif_t *pmif, ide_hwif_t *hwif, hw_regs_t *hw) | |||
1054 | msleep(jiffies_to_msecs(IDE_WAKEUP_DELAY)); | 1114 | msleep(jiffies_to_msecs(IDE_WAKEUP_DELAY)); |
1055 | } | 1115 | } |
1056 | 1116 | ||
1057 | /* Setup MMIO ops */ | 1117 | printk(KERN_INFO DRV_NAME ": Found Apple %s controller (%s), " |
1058 | default_hwif_mmiops(hwif); | 1118 | "bus ID %d%s, irq %d\n", model_name[pmif->kind], |
1059 | hwif->OUTBSYNC = pmac_outbsync; | 1119 | pmif->mdev ? "macio" : "PCI", pmif->aapl_bus_id, |
1120 | pmif->mediabay ? " (mediabay)" : "", hw->irq); | ||
1060 | 1121 | ||
1061 | hwif->hwif_data = pmif; | 1122 | rc = ide_host_add(&d, hws, &host); |
1062 | ide_init_port_hw(hwif, hw); | 1123 | if (rc) |
1124 | return rc; | ||
1063 | 1125 | ||
1064 | printk(KERN_INFO "ide%d: Found Apple %s controller, bus ID %d%s, irq %d\n", | 1126 | hwif = host->ports[0]; |
1065 | hwif->index, model_name[pmif->kind], pmif->aapl_bus_id, | ||
1066 | pmif->mediabay ? " (mediabay)" : "", hwif->irq); | ||
1067 | |||
1068 | if (pmif->mediabay) { | ||
1069 | #ifdef CONFIG_PMAC_MEDIABAY | ||
1070 | if (check_media_bay_by_base(pmif->regbase, MB_CD)) { | ||
1071 | #else | ||
1072 | if (1) { | ||
1073 | #endif | ||
1074 | hwif->drives[0].noprobe = 1; | ||
1075 | hwif->drives[1].noprobe = 1; | ||
1076 | } | ||
1077 | } | ||
1078 | |||
1079 | idx[0] = hwif->index; | ||
1080 | |||
1081 | ide_device_add(idx, &d); | ||
1082 | 1127 | ||
1083 | return 0; | 1128 | return 0; |
1084 | } | 1129 | } |
@@ -1101,7 +1146,6 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match) | |||
1101 | { | 1146 | { |
1102 | void __iomem *base; | 1147 | void __iomem *base; |
1103 | unsigned long regbase; | 1148 | unsigned long regbase; |
1104 | ide_hwif_t *hwif; | ||
1105 | pmac_ide_hwif_t *pmif; | 1149 | pmac_ide_hwif_t *pmif; |
1106 | int irq, rc; | 1150 | int irq, rc; |
1107 | hw_regs_t hw; | 1151 | hw_regs_t hw; |
@@ -1110,14 +1154,6 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match) | |||
1110 | if (pmif == NULL) | 1154 | if (pmif == NULL) |
1111 | return -ENOMEM; | 1155 | return -ENOMEM; |
1112 | 1156 | ||
1113 | hwif = ide_find_port(); | ||
1114 | if (hwif == NULL) { | ||
1115 | printk(KERN_ERR "ide-pmac: MacIO interface attach with no slot\n"); | ||
1116 | printk(KERN_ERR " %s\n", mdev->ofdev.node->full_name); | ||
1117 | rc = -ENODEV; | ||
1118 | goto out_free_pmif; | ||
1119 | } | ||
1120 | |||
1121 | if (macio_resource_count(mdev) == 0) { | 1157 | if (macio_resource_count(mdev) == 0) { |
1122 | printk(KERN_WARNING "ide-pmac: no address for %s\n", | 1158 | printk(KERN_WARNING "ide-pmac: no address for %s\n", |
1123 | mdev->ofdev.node->full_name); | 1159 | mdev->ofdev.node->full_name); |
@@ -1164,7 +1200,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match) | |||
1164 | } else | 1200 | } else |
1165 | pmif->dma_regs = NULL; | 1201 | pmif->dma_regs = NULL; |
1166 | #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ | 1202 | #endif /* CONFIG_BLK_DEV_IDEDMA_PMAC */ |
1167 | dev_set_drvdata(&mdev->ofdev.dev, hwif); | 1203 | dev_set_drvdata(&mdev->ofdev.dev, pmif); |
1168 | 1204 | ||
1169 | memset(&hw, 0, sizeof(hw)); | 1205 | memset(&hw, 0, sizeof(hw)); |
1170 | pmac_ide_init_ports(&hw, pmif->regbase); | 1206 | pmac_ide_init_ports(&hw, pmif->regbase); |
@@ -1172,7 +1208,7 @@ pmac_ide_macio_attach(struct macio_dev *mdev, const struct of_device_id *match) | |||
1172 | hw.dev = &mdev->bus->pdev->dev; | 1208 | hw.dev = &mdev->bus->pdev->dev; |
1173 | hw.parent = &mdev->ofdev.dev; | 1209 | hw.parent = &mdev->ofdev.dev; |
1174 | 1210 | ||
1175 | rc = pmac_ide_setup_device(pmif, hwif, &hw); | 1211 | rc = pmac_ide_setup_device(pmif, &hw); |
1176 | if (rc != 0) { | 1212 | if (rc != 0) { |
1177 | /* The inteface is released to the common IDE layer */ | 1213 | /* The inteface is released to the common IDE layer */ |
1178 | dev_set_drvdata(&mdev->ofdev.dev, NULL); | 1214 | dev_set_drvdata(&mdev->ofdev.dev, NULL); |
@@ -1195,12 +1231,13 @@ out_free_pmif: | |||
1195 | static int | 1231 | static int |
1196 | pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) | 1232 | pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) |
1197 | { | 1233 | { |
1198 | ide_hwif_t *hwif = (ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); | 1234 | pmac_ide_hwif_t *pmif = |
1199 | int rc = 0; | 1235 | (pmac_ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); |
1236 | int rc = 0; | ||
1200 | 1237 | ||
1201 | if (mesg.event != mdev->ofdev.dev.power.power_state.event | 1238 | if (mesg.event != mdev->ofdev.dev.power.power_state.event |
1202 | && (mesg.event & PM_EVENT_SLEEP)) { | 1239 | && (mesg.event & PM_EVENT_SLEEP)) { |
1203 | rc = pmac_ide_do_suspend(hwif); | 1240 | rc = pmac_ide_do_suspend(pmif); |
1204 | if (rc == 0) | 1241 | if (rc == 0) |
1205 | mdev->ofdev.dev.power.power_state = mesg; | 1242 | mdev->ofdev.dev.power.power_state = mesg; |
1206 | } | 1243 | } |
@@ -1211,11 +1248,12 @@ pmac_ide_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) | |||
1211 | static int | 1248 | static int |
1212 | pmac_ide_macio_resume(struct macio_dev *mdev) | 1249 | pmac_ide_macio_resume(struct macio_dev *mdev) |
1213 | { | 1250 | { |
1214 | ide_hwif_t *hwif = (ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); | 1251 | pmac_ide_hwif_t *pmif = |
1215 | int rc = 0; | 1252 | (pmac_ide_hwif_t *)dev_get_drvdata(&mdev->ofdev.dev); |
1216 | 1253 | int rc = 0; | |
1254 | |||
1217 | if (mdev->ofdev.dev.power.power_state.event != PM_EVENT_ON) { | 1255 | if (mdev->ofdev.dev.power.power_state.event != PM_EVENT_ON) { |
1218 | rc = pmac_ide_do_resume(hwif); | 1256 | rc = pmac_ide_do_resume(pmif); |
1219 | if (rc == 0) | 1257 | if (rc == 0) |
1220 | mdev->ofdev.dev.power.power_state = PMSG_ON; | 1258 | mdev->ofdev.dev.power.power_state = PMSG_ON; |
1221 | } | 1259 | } |
@@ -1229,7 +1267,6 @@ pmac_ide_macio_resume(struct macio_dev *mdev) | |||
1229 | static int __devinit | 1267 | static int __devinit |
1230 | pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) | 1268 | pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) |
1231 | { | 1269 | { |
1232 | ide_hwif_t *hwif; | ||
1233 | struct device_node *np; | 1270 | struct device_node *np; |
1234 | pmac_ide_hwif_t *pmif; | 1271 | pmac_ide_hwif_t *pmif; |
1235 | void __iomem *base; | 1272 | void __iomem *base; |
@@ -1247,14 +1284,6 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1247 | if (pmif == NULL) | 1284 | if (pmif == NULL) |
1248 | return -ENOMEM; | 1285 | return -ENOMEM; |
1249 | 1286 | ||
1250 | hwif = ide_find_port(); | ||
1251 | if (hwif == NULL) { | ||
1252 | printk(KERN_ERR "ide-pmac: PCI interface attach with no slot\n"); | ||
1253 | printk(KERN_ERR " %s\n", np->full_name); | ||
1254 | rc = -ENODEV; | ||
1255 | goto out_free_pmif; | ||
1256 | } | ||
1257 | |||
1258 | if (pci_enable_device(pdev)) { | 1287 | if (pci_enable_device(pdev)) { |
1259 | printk(KERN_WARNING "ide-pmac: Can't enable PCI device for " | 1288 | printk(KERN_WARNING "ide-pmac: Can't enable PCI device for " |
1260 | "%s\n", np->full_name); | 1289 | "%s\n", np->full_name); |
@@ -1284,14 +1313,14 @@ pmac_ide_pci_attach(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1284 | pmif->kauai_fcr = base; | 1313 | pmif->kauai_fcr = base; |
1285 | pmif->irq = pdev->irq; | 1314 | pmif->irq = pdev->irq; |
1286 | 1315 | ||
1287 | pci_set_drvdata(pdev, hwif); | 1316 | pci_set_drvdata(pdev, pmif); |
1288 | 1317 | ||
1289 | memset(&hw, 0, sizeof(hw)); | 1318 | memset(&hw, 0, sizeof(hw)); |
1290 | pmac_ide_init_ports(&hw, pmif->regbase); | 1319 | pmac_ide_init_ports(&hw, pmif->regbase); |
1291 | hw.irq = pdev->irq; | 1320 | hw.irq = pdev->irq; |
1292 | hw.dev = &pdev->dev; | 1321 | hw.dev = &pdev->dev; |
1293 | 1322 | ||
1294 | rc = pmac_ide_setup_device(pmif, hwif, &hw); | 1323 | rc = pmac_ide_setup_device(pmif, &hw); |
1295 | if (rc != 0) { | 1324 | if (rc != 0) { |
1296 | /* The inteface is released to the common IDE layer */ | 1325 | /* The inteface is released to the common IDE layer */ |
1297 | pci_set_drvdata(pdev, NULL); | 1326 | pci_set_drvdata(pdev, NULL); |
@@ -1310,12 +1339,12 @@ out_free_pmif: | |||
1310 | static int | 1339 | static int |
1311 | pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) | 1340 | pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) |
1312 | { | 1341 | { |
1313 | ide_hwif_t *hwif = (ide_hwif_t *)pci_get_drvdata(pdev); | 1342 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)pci_get_drvdata(pdev); |
1314 | int rc = 0; | 1343 | int rc = 0; |
1315 | 1344 | ||
1316 | if (mesg.event != pdev->dev.power.power_state.event | 1345 | if (mesg.event != pdev->dev.power.power_state.event |
1317 | && (mesg.event & PM_EVENT_SLEEP)) { | 1346 | && (mesg.event & PM_EVENT_SLEEP)) { |
1318 | rc = pmac_ide_do_suspend(hwif); | 1347 | rc = pmac_ide_do_suspend(pmif); |
1319 | if (rc == 0) | 1348 | if (rc == 0) |
1320 | pdev->dev.power.power_state = mesg; | 1349 | pdev->dev.power.power_state = mesg; |
1321 | } | 1350 | } |
@@ -1326,11 +1355,11 @@ pmac_ide_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) | |||
1326 | static int | 1355 | static int |
1327 | pmac_ide_pci_resume(struct pci_dev *pdev) | 1356 | pmac_ide_pci_resume(struct pci_dev *pdev) |
1328 | { | 1357 | { |
1329 | ide_hwif_t *hwif = (ide_hwif_t *)pci_get_drvdata(pdev); | 1358 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)pci_get_drvdata(pdev); |
1330 | int rc = 0; | 1359 | int rc = 0; |
1331 | 1360 | ||
1332 | if (pdev->dev.power.power_state.event != PM_EVENT_ON) { | 1361 | if (pdev->dev.power.power_state.event != PM_EVENT_ON) { |
1333 | rc = pmac_ide_do_resume(hwif); | 1362 | rc = pmac_ide_do_resume(pmif); |
1334 | if (rc == 0) | 1363 | if (rc == 0) |
1335 | pdev->dev.power.power_state = PMSG_ON; | 1364 | pdev->dev.power.power_state = PMSG_ON; |
1336 | } | 1365 | } |
@@ -1421,10 +1450,11 @@ out: | |||
1421 | static int | 1450 | static int |
1422 | pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq) | 1451 | pmac_ide_build_dmatable(ide_drive_t *drive, struct request *rq) |
1423 | { | 1452 | { |
1453 | ide_hwif_t *hwif = drive->hwif; | ||
1454 | pmac_ide_hwif_t *pmif = | ||
1455 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1424 | struct dbdma_cmd *table; | 1456 | struct dbdma_cmd *table; |
1425 | int i, count = 0; | 1457 | 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; | 1458 | volatile struct dbdma_regs __iomem *dma = pmif->dma_regs; |
1429 | struct scatterlist *sg; | 1459 | struct scatterlist *sg; |
1430 | int wr = (rq_data_dir(rq) == WRITE); | 1460 | int wr = (rq_data_dir(rq) == WRITE); |
@@ -1520,7 +1550,8 @@ static int | |||
1520 | pmac_ide_dma_setup(ide_drive_t *drive) | 1550 | pmac_ide_dma_setup(ide_drive_t *drive) |
1521 | { | 1551 | { |
1522 | ide_hwif_t *hwif = HWIF(drive); | 1552 | ide_hwif_t *hwif = HWIF(drive); |
1523 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)hwif->hwif_data; | 1553 | pmac_ide_hwif_t *pmif = |
1554 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1524 | struct request *rq = HWGROUP(drive)->rq; | 1555 | struct request *rq = HWGROUP(drive)->rq; |
1525 | u8 unit = (drive->select.b.unit & 0x01); | 1556 | u8 unit = (drive->select.b.unit & 0x01); |
1526 | u8 ata4; | 1557 | u8 ata4; |
@@ -1560,7 +1591,9 @@ pmac_ide_dma_exec_cmd(ide_drive_t *drive, u8 command) | |||
1560 | static void | 1591 | static void |
1561 | pmac_ide_dma_start(ide_drive_t *drive) | 1592 | pmac_ide_dma_start(ide_drive_t *drive) |
1562 | { | 1593 | { |
1563 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 1594 | ide_hwif_t *hwif = drive->hwif; |
1595 | pmac_ide_hwif_t *pmif = | ||
1596 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1564 | volatile struct dbdma_regs __iomem *dma; | 1597 | volatile struct dbdma_regs __iomem *dma; |
1565 | 1598 | ||
1566 | dma = pmif->dma_regs; | 1599 | dma = pmif->dma_regs; |
@@ -1576,7 +1609,9 @@ pmac_ide_dma_start(ide_drive_t *drive) | |||
1576 | static int | 1609 | static int |
1577 | pmac_ide_dma_end (ide_drive_t *drive) | 1610 | pmac_ide_dma_end (ide_drive_t *drive) |
1578 | { | 1611 | { |
1579 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 1612 | ide_hwif_t *hwif = drive->hwif; |
1613 | pmac_ide_hwif_t *pmif = | ||
1614 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1580 | volatile struct dbdma_regs __iomem *dma; | 1615 | volatile struct dbdma_regs __iomem *dma; |
1581 | u32 dstat; | 1616 | u32 dstat; |
1582 | 1617 | ||
@@ -1604,7 +1639,9 @@ pmac_ide_dma_end (ide_drive_t *drive) | |||
1604 | static int | 1639 | static int |
1605 | pmac_ide_dma_test_irq (ide_drive_t *drive) | 1640 | pmac_ide_dma_test_irq (ide_drive_t *drive) |
1606 | { | 1641 | { |
1607 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 1642 | ide_hwif_t *hwif = drive->hwif; |
1643 | pmac_ide_hwif_t *pmif = | ||
1644 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1608 | volatile struct dbdma_regs __iomem *dma; | 1645 | volatile struct dbdma_regs __iomem *dma; |
1609 | unsigned long status, timeout; | 1646 | unsigned long status, timeout; |
1610 | 1647 | ||
@@ -1664,7 +1701,9 @@ static void pmac_ide_dma_host_set(ide_drive_t *drive, int on) | |||
1664 | static void | 1701 | static void |
1665 | pmac_ide_dma_lost_irq (ide_drive_t *drive) | 1702 | pmac_ide_dma_lost_irq (ide_drive_t *drive) |
1666 | { | 1703 | { |
1667 | pmac_ide_hwif_t* pmif = (pmac_ide_hwif_t *)HWIF(drive)->hwif_data; | 1704 | ide_hwif_t *hwif = drive->hwif; |
1705 | pmac_ide_hwif_t *pmif = | ||
1706 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1668 | volatile struct dbdma_regs __iomem *dma; | 1707 | volatile struct dbdma_regs __iomem *dma; |
1669 | unsigned long status; | 1708 | unsigned long status; |
1670 | 1709 | ||
@@ -1694,7 +1733,8 @@ static const struct ide_dma_ops pmac_dma_ops = { | |||
1694 | static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif, | 1733 | static int __devinit pmac_ide_init_dma(ide_hwif_t *hwif, |
1695 | const struct ide_port_info *d) | 1734 | const struct ide_port_info *d) |
1696 | { | 1735 | { |
1697 | pmac_ide_hwif_t *pmif = (pmac_ide_hwif_t *)hwif->hwif_data; | 1736 | pmac_ide_hwif_t *pmif = |
1737 | (pmac_ide_hwif_t *)dev_get_drvdata(hwif->gendev.parent); | ||
1698 | struct pci_dev *dev = to_pci_dev(hwif->dev); | 1738 | struct pci_dev *dev = to_pci_dev(hwif->dev); |
1699 | 1739 | ||
1700 | /* We won't need pci_dev if we switch to generic consistent | 1740 | /* We won't need pci_dev if we switch to generic consistent |