1*88358ab0SBenjamin Herrenschmidt /* 2*88358ab0SBenjamin Herrenschmidt * Libata based driver for Apple "macio" family of PATA controllers 3*88358ab0SBenjamin Herrenschmidt * 4*88358ab0SBenjamin Herrenschmidt * Copyright 2008/2009 Benjamin Herrenschmidt, IBM Corp 5*88358ab0SBenjamin Herrenschmidt * <benh@kernel.crashing.org> 6*88358ab0SBenjamin Herrenschmidt * 7*88358ab0SBenjamin Herrenschmidt * Some bits and pieces from drivers/ide/ppc/pmac.c 8*88358ab0SBenjamin Herrenschmidt * 9*88358ab0SBenjamin Herrenschmidt */ 10*88358ab0SBenjamin Herrenschmidt 11*88358ab0SBenjamin Herrenschmidt #undef DEBUG 12*88358ab0SBenjamin Herrenschmidt #undef DEBUG_DMA 13*88358ab0SBenjamin Herrenschmidt 14*88358ab0SBenjamin Herrenschmidt #include <linux/kernel.h> 15*88358ab0SBenjamin Herrenschmidt #include <linux/module.h> 16*88358ab0SBenjamin Herrenschmidt #include <linux/init.h> 17*88358ab0SBenjamin Herrenschmidt #include <linux/blkdev.h> 18*88358ab0SBenjamin Herrenschmidt #include <linux/ata.h> 19*88358ab0SBenjamin Herrenschmidt #include <linux/libata.h> 20*88358ab0SBenjamin Herrenschmidt #include <linux/adb.h> 21*88358ab0SBenjamin Herrenschmidt #include <linux/pmu.h> 22*88358ab0SBenjamin Herrenschmidt #include <linux/scatterlist.h> 23*88358ab0SBenjamin Herrenschmidt #include <linux/of.h> 24*88358ab0SBenjamin Herrenschmidt 25*88358ab0SBenjamin Herrenschmidt #include <scsi/scsi.h> 26*88358ab0SBenjamin Herrenschmidt #include <scsi/scsi_host.h> 27*88358ab0SBenjamin Herrenschmidt #include <scsi/scsi_device.h> 28*88358ab0SBenjamin Herrenschmidt 29*88358ab0SBenjamin Herrenschmidt #include <asm/macio.h> 30*88358ab0SBenjamin Herrenschmidt #include <asm/io.h> 31*88358ab0SBenjamin Herrenschmidt #include <asm/dbdma.h> 32*88358ab0SBenjamin Herrenschmidt #include <asm/pci-bridge.h> 33*88358ab0SBenjamin Herrenschmidt #include <asm/machdep.h> 34*88358ab0SBenjamin Herrenschmidt #include <asm/pmac_feature.h> 35*88358ab0SBenjamin Herrenschmidt #include <asm/mediabay.h> 36*88358ab0SBenjamin Herrenschmidt 37*88358ab0SBenjamin Herrenschmidt #ifdef DEBUG_DMA 38*88358ab0SBenjamin Herrenschmidt #define dev_dbgdma(dev, format, arg...) \ 39*88358ab0SBenjamin Herrenschmidt dev_printk(KERN_DEBUG , dev , format , ## arg) 40*88358ab0SBenjamin Herrenschmidt #else 41*88358ab0SBenjamin Herrenschmidt #define dev_dbgdma(dev, format, arg...) \ 42*88358ab0SBenjamin Herrenschmidt ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; }) 43*88358ab0SBenjamin Herrenschmidt #endif 44*88358ab0SBenjamin Herrenschmidt 45*88358ab0SBenjamin Herrenschmidt #define DRV_NAME "pata_macio" 46*88358ab0SBenjamin Herrenschmidt #define DRV_VERSION "0.9" 47*88358ab0SBenjamin Herrenschmidt 48*88358ab0SBenjamin Herrenschmidt /* Models of macio ATA controller */ 49*88358ab0SBenjamin Herrenschmidt enum { 50*88358ab0SBenjamin Herrenschmidt controller_ohare, /* OHare based */ 51*88358ab0SBenjamin Herrenschmidt controller_heathrow, /* Heathrow/Paddington */ 52*88358ab0SBenjamin Herrenschmidt controller_kl_ata3, /* KeyLargo ATA-3 */ 53*88358ab0SBenjamin Herrenschmidt controller_kl_ata4, /* KeyLargo ATA-4 */ 54*88358ab0SBenjamin Herrenschmidt controller_un_ata6, /* UniNorth2 ATA-6 */ 55*88358ab0SBenjamin Herrenschmidt controller_k2_ata6, /* K2 ATA-6 */ 56*88358ab0SBenjamin Herrenschmidt controller_sh_ata6, /* Shasta ATA-6 */ 57*88358ab0SBenjamin Herrenschmidt }; 58*88358ab0SBenjamin Herrenschmidt 59*88358ab0SBenjamin Herrenschmidt static const char* macio_ata_names[] = { 60*88358ab0SBenjamin Herrenschmidt "OHare ATA", /* OHare based */ 61*88358ab0SBenjamin Herrenschmidt "Heathrow ATA", /* Heathrow/Paddington */ 62*88358ab0SBenjamin Herrenschmidt "KeyLargo ATA-3", /* KeyLargo ATA-3 (MDMA only) */ 63*88358ab0SBenjamin Herrenschmidt "KeyLargo ATA-4", /* KeyLargo ATA-4 (UDMA/66) */ 64*88358ab0SBenjamin Herrenschmidt "UniNorth ATA-6", /* UniNorth2 ATA-6 (UDMA/100) */ 65*88358ab0SBenjamin Herrenschmidt "K2 ATA-6", /* K2 ATA-6 (UDMA/100) */ 66*88358ab0SBenjamin Herrenschmidt "Shasta ATA-6", /* Shasta ATA-6 (UDMA/133) */ 67*88358ab0SBenjamin Herrenschmidt }; 68*88358ab0SBenjamin Herrenschmidt 69*88358ab0SBenjamin Herrenschmidt /* 70*88358ab0SBenjamin Herrenschmidt * Extra registers, both 32-bit little-endian 71*88358ab0SBenjamin Herrenschmidt */ 72*88358ab0SBenjamin Herrenschmidt #define IDE_TIMING_CONFIG 0x200 73*88358ab0SBenjamin Herrenschmidt #define IDE_INTERRUPT 0x300 74*88358ab0SBenjamin Herrenschmidt 75*88358ab0SBenjamin Herrenschmidt /* Kauai (U2) ATA has different register setup */ 76*88358ab0SBenjamin Herrenschmidt #define IDE_KAUAI_PIO_CONFIG 0x200 77*88358ab0SBenjamin Herrenschmidt #define IDE_KAUAI_ULTRA_CONFIG 0x210 78*88358ab0SBenjamin Herrenschmidt #define IDE_KAUAI_POLL_CONFIG 0x220 79*88358ab0SBenjamin Herrenschmidt 80*88358ab0SBenjamin Herrenschmidt /* 81*88358ab0SBenjamin Herrenschmidt * Timing configuration register definitions 82*88358ab0SBenjamin Herrenschmidt */ 83*88358ab0SBenjamin Herrenschmidt 84*88358ab0SBenjamin Herrenschmidt /* Number of IDE_SYSCLK_NS ticks, argument is in nanoseconds */ 85*88358ab0SBenjamin Herrenschmidt #define SYSCLK_TICKS(t) (((t) + IDE_SYSCLK_NS - 1) / IDE_SYSCLK_NS) 86*88358ab0SBenjamin Herrenschmidt #define SYSCLK_TICKS_66(t) (((t) + IDE_SYSCLK_66_NS - 1) / IDE_SYSCLK_66_NS) 87*88358ab0SBenjamin Herrenschmidt #define IDE_SYSCLK_NS 30 /* 33Mhz cell */ 88*88358ab0SBenjamin Herrenschmidt #define IDE_SYSCLK_66_NS 15 /* 66Mhz cell */ 89*88358ab0SBenjamin Herrenschmidt 90*88358ab0SBenjamin Herrenschmidt /* 133Mhz cell, found in shasta. 91*88358ab0SBenjamin Herrenschmidt * See comments about 100 Mhz Uninorth 2... 92*88358ab0SBenjamin Herrenschmidt * Note that PIO_MASK and MDMA_MASK seem to overlap, that's just 93*88358ab0SBenjamin Herrenschmidt * weird and I don't now why .. at this stage 94*88358ab0SBenjamin Herrenschmidt */ 95*88358ab0SBenjamin Herrenschmidt #define TR_133_PIOREG_PIO_MASK 0xff000fff 96*88358ab0SBenjamin Herrenschmidt #define TR_133_PIOREG_MDMA_MASK 0x00fff800 97*88358ab0SBenjamin Herrenschmidt #define TR_133_UDMAREG_UDMA_MASK 0x0003ffff 98*88358ab0SBenjamin Herrenschmidt #define TR_133_UDMAREG_UDMA_EN 0x00000001 99*88358ab0SBenjamin Herrenschmidt 100*88358ab0SBenjamin Herrenschmidt /* 100Mhz cell, found in Uninorth 2 and K2. It appears as a pci device 101*88358ab0SBenjamin Herrenschmidt * (106b/0033) on uninorth or K2 internal PCI bus and it's clock is 102*88358ab0SBenjamin Herrenschmidt * controlled like gem or fw. It appears to be an evolution of keylargo 103*88358ab0SBenjamin Herrenschmidt * ATA4 with a timing register extended to 2x32bits registers (one 104*88358ab0SBenjamin Herrenschmidt * for PIO & MWDMA and one for UDMA, and a similar DBDMA channel. 105*88358ab0SBenjamin Herrenschmidt * It has it's own local feature control register as well. 106*88358ab0SBenjamin Herrenschmidt * 107*88358ab0SBenjamin Herrenschmidt * After scratching my mind over the timing values, at least for PIO 108*88358ab0SBenjamin Herrenschmidt * and MDMA, I think I've figured the format of the timing register, 109*88358ab0SBenjamin Herrenschmidt * though I use pre-calculated tables for UDMA as usual... 110*88358ab0SBenjamin Herrenschmidt */ 111*88358ab0SBenjamin Herrenschmidt #define TR_100_PIO_ADDRSETUP_MASK 0xff000000 /* Size of field unknown */ 112*88358ab0SBenjamin Herrenschmidt #define TR_100_PIO_ADDRSETUP_SHIFT 24 113*88358ab0SBenjamin Herrenschmidt #define TR_100_MDMA_MASK 0x00fff000 114*88358ab0SBenjamin Herrenschmidt #define TR_100_MDMA_RECOVERY_MASK 0x00fc0000 115*88358ab0SBenjamin Herrenschmidt #define TR_100_MDMA_RECOVERY_SHIFT 18 116*88358ab0SBenjamin Herrenschmidt #define TR_100_MDMA_ACCESS_MASK 0x0003f000 117*88358ab0SBenjamin Herrenschmidt #define TR_100_MDMA_ACCESS_SHIFT 12 118*88358ab0SBenjamin Herrenschmidt #define TR_100_PIO_MASK 0xff000fff 119*88358ab0SBenjamin Herrenschmidt #define TR_100_PIO_RECOVERY_MASK 0x00000fc0 120*88358ab0SBenjamin Herrenschmidt #define TR_100_PIO_RECOVERY_SHIFT 6 121*88358ab0SBenjamin Herrenschmidt #define TR_100_PIO_ACCESS_MASK 0x0000003f 122*88358ab0SBenjamin Herrenschmidt #define TR_100_PIO_ACCESS_SHIFT 0 123*88358ab0SBenjamin Herrenschmidt 124*88358ab0SBenjamin Herrenschmidt #define TR_100_UDMAREG_UDMA_MASK 0x0000ffff 125*88358ab0SBenjamin Herrenschmidt #define TR_100_UDMAREG_UDMA_EN 0x00000001 126*88358ab0SBenjamin Herrenschmidt 127*88358ab0SBenjamin Herrenschmidt 128*88358ab0SBenjamin Herrenschmidt /* 66Mhz cell, found in KeyLargo. Can do ultra mode 0 to 2 on 129*88358ab0SBenjamin Herrenschmidt * 40 connector cable and to 4 on 80 connector one. 130*88358ab0SBenjamin Herrenschmidt * Clock unit is 15ns (66Mhz) 131*88358ab0SBenjamin Herrenschmidt * 132*88358ab0SBenjamin Herrenschmidt * 3 Values can be programmed: 133*88358ab0SBenjamin Herrenschmidt * - Write data setup, which appears to match the cycle time. They 134*88358ab0SBenjamin Herrenschmidt * also call it DIOW setup. 135*88358ab0SBenjamin Herrenschmidt * - Ready to pause time (from spec) 136*88358ab0SBenjamin Herrenschmidt * - Address setup. That one is weird. I don't see where exactly 137*88358ab0SBenjamin Herrenschmidt * it fits in UDMA cycles, I got it's name from an obscure piece 138*88358ab0SBenjamin Herrenschmidt * of commented out code in Darwin. They leave it to 0, we do as 139*88358ab0SBenjamin Herrenschmidt * well, despite a comment that would lead to think it has a 140*88358ab0SBenjamin Herrenschmidt * min value of 45ns. 141*88358ab0SBenjamin Herrenschmidt * Apple also add 60ns to the write data setup (or cycle time ?) on 142*88358ab0SBenjamin Herrenschmidt * reads. 143*88358ab0SBenjamin Herrenschmidt */ 144*88358ab0SBenjamin Herrenschmidt #define TR_66_UDMA_MASK 0xfff00000 145*88358ab0SBenjamin Herrenschmidt #define TR_66_UDMA_EN 0x00100000 /* Enable Ultra mode for DMA */ 146*88358ab0SBenjamin Herrenschmidt #define TR_66_PIO_ADDRSETUP_MASK 0xe0000000 /* Address setup */ 147*88358ab0SBenjamin Herrenschmidt #define TR_66_PIO_ADDRSETUP_SHIFT 29 148*88358ab0SBenjamin Herrenschmidt #define TR_66_UDMA_RDY2PAUS_MASK 0x1e000000 /* Ready 2 pause time */ 149*88358ab0SBenjamin Herrenschmidt #define TR_66_UDMA_RDY2PAUS_SHIFT 25 150*88358ab0SBenjamin Herrenschmidt #define TR_66_UDMA_WRDATASETUP_MASK 0x01e00000 /* Write data setup time */ 151*88358ab0SBenjamin Herrenschmidt #define TR_66_UDMA_WRDATASETUP_SHIFT 21 152*88358ab0SBenjamin Herrenschmidt #define TR_66_MDMA_MASK 0x000ffc00 153*88358ab0SBenjamin Herrenschmidt #define TR_66_MDMA_RECOVERY_MASK 0x000f8000 154*88358ab0SBenjamin Herrenschmidt #define TR_66_MDMA_RECOVERY_SHIFT 15 155*88358ab0SBenjamin Herrenschmidt #define TR_66_MDMA_ACCESS_MASK 0x00007c00 156*88358ab0SBenjamin Herrenschmidt #define TR_66_MDMA_ACCESS_SHIFT 10 157*88358ab0SBenjamin Herrenschmidt #define TR_66_PIO_MASK 0xe00003ff 158*88358ab0SBenjamin Herrenschmidt #define TR_66_PIO_RECOVERY_MASK 0x000003e0 159*88358ab0SBenjamin Herrenschmidt #define TR_66_PIO_RECOVERY_SHIFT 5 160*88358ab0SBenjamin Herrenschmidt #define TR_66_PIO_ACCESS_MASK 0x0000001f 161*88358ab0SBenjamin Herrenschmidt #define TR_66_PIO_ACCESS_SHIFT 0 162*88358ab0SBenjamin Herrenschmidt 163*88358ab0SBenjamin Herrenschmidt /* 33Mhz cell, found in OHare, Heathrow (& Paddington) and KeyLargo 164*88358ab0SBenjamin Herrenschmidt * Can do pio & mdma modes, clock unit is 30ns (33Mhz) 165*88358ab0SBenjamin Herrenschmidt * 166*88358ab0SBenjamin Herrenschmidt * The access time and recovery time can be programmed. Some older 167*88358ab0SBenjamin Herrenschmidt * Darwin code base limit OHare to 150ns cycle time. I decided to do 168*88358ab0SBenjamin Herrenschmidt * the same here fore safety against broken old hardware ;) 169*88358ab0SBenjamin Herrenschmidt * The HalfTick bit, when set, adds half a clock (15ns) to the access 170*88358ab0SBenjamin Herrenschmidt * time and removes one from recovery. It's not supported on KeyLargo 171*88358ab0SBenjamin Herrenschmidt * implementation afaik. The E bit appears to be set for PIO mode 0 and 172*88358ab0SBenjamin Herrenschmidt * is used to reach long timings used in this mode. 173*88358ab0SBenjamin Herrenschmidt */ 174*88358ab0SBenjamin Herrenschmidt #define TR_33_MDMA_MASK 0x003ff800 175*88358ab0SBenjamin Herrenschmidt #define TR_33_MDMA_RECOVERY_MASK 0x001f0000 176*88358ab0SBenjamin Herrenschmidt #define TR_33_MDMA_RECOVERY_SHIFT 16 177*88358ab0SBenjamin Herrenschmidt #define TR_33_MDMA_ACCESS_MASK 0x0000f800 178*88358ab0SBenjamin Herrenschmidt #define TR_33_MDMA_ACCESS_SHIFT 11 179*88358ab0SBenjamin Herrenschmidt #define TR_33_MDMA_HALFTICK 0x00200000 180*88358ab0SBenjamin Herrenschmidt #define TR_33_PIO_MASK 0x000007ff 181*88358ab0SBenjamin Herrenschmidt #define TR_33_PIO_E 0x00000400 182*88358ab0SBenjamin Herrenschmidt #define TR_33_PIO_RECOVERY_MASK 0x000003e0 183*88358ab0SBenjamin Herrenschmidt #define TR_33_PIO_RECOVERY_SHIFT 5 184*88358ab0SBenjamin Herrenschmidt #define TR_33_PIO_ACCESS_MASK 0x0000001f 185*88358ab0SBenjamin Herrenschmidt #define TR_33_PIO_ACCESS_SHIFT 0 186*88358ab0SBenjamin Herrenschmidt 187*88358ab0SBenjamin Herrenschmidt /* 188*88358ab0SBenjamin Herrenschmidt * Interrupt register definitions. Only present on newer cells 189*88358ab0SBenjamin Herrenschmidt * (Keylargo and later afaik) so we don't use it. 190*88358ab0SBenjamin Herrenschmidt */ 191*88358ab0SBenjamin Herrenschmidt #define IDE_INTR_DMA 0x80000000 192*88358ab0SBenjamin Herrenschmidt #define IDE_INTR_DEVICE 0x40000000 193*88358ab0SBenjamin Herrenschmidt 194*88358ab0SBenjamin Herrenschmidt /* 195*88358ab0SBenjamin Herrenschmidt * FCR Register on Kauai. Not sure what bit 0x4 is ... 196*88358ab0SBenjamin Herrenschmidt */ 197*88358ab0SBenjamin Herrenschmidt #define KAUAI_FCR_UATA_MAGIC 0x00000004 198*88358ab0SBenjamin Herrenschmidt #define KAUAI_FCR_UATA_RESET_N 0x00000002 199*88358ab0SBenjamin Herrenschmidt #define KAUAI_FCR_UATA_ENABLE 0x00000001 200*88358ab0SBenjamin Herrenschmidt 201*88358ab0SBenjamin Herrenschmidt 202*88358ab0SBenjamin Herrenschmidt /* Allow up to 256 DBDMA commands per xfer */ 203*88358ab0SBenjamin Herrenschmidt #define MAX_DCMDS 256 204*88358ab0SBenjamin Herrenschmidt 205*88358ab0SBenjamin Herrenschmidt /* Don't let a DMA segment go all the way to 64K */ 206*88358ab0SBenjamin Herrenschmidt #define MAX_DBDMA_SEG 0xff00 207*88358ab0SBenjamin Herrenschmidt 208*88358ab0SBenjamin Herrenschmidt 209*88358ab0SBenjamin Herrenschmidt /* 210*88358ab0SBenjamin Herrenschmidt * Wait 1s for disk to answer on IDE bus after a hard reset 211*88358ab0SBenjamin Herrenschmidt * of the device (via GPIO/FCR). 212*88358ab0SBenjamin Herrenschmidt * 213*88358ab0SBenjamin Herrenschmidt * Some devices seem to "pollute" the bus even after dropping 214*88358ab0SBenjamin Herrenschmidt * the BSY bit (typically some combo drives slave on the UDMA 215*88358ab0SBenjamin Herrenschmidt * bus) after a hard reset. Since we hard reset all drives on 216*88358ab0SBenjamin Herrenschmidt * KeyLargo ATA66, we have to keep that delay around. I may end 217*88358ab0SBenjamin Herrenschmidt * up not hard resetting anymore on these and keep the delay only 218*88358ab0SBenjamin Herrenschmidt * for older interfaces instead (we have to reset when coming 219*88358ab0SBenjamin Herrenschmidt * from MacOS...) --BenH. 220*88358ab0SBenjamin Herrenschmidt */ 221*88358ab0SBenjamin Herrenschmidt #define IDE_WAKEUP_DELAY_MS 1000 222*88358ab0SBenjamin Herrenschmidt 223*88358ab0SBenjamin Herrenschmidt struct pata_macio_timing; 224*88358ab0SBenjamin Herrenschmidt 225*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv { 226*88358ab0SBenjamin Herrenschmidt int kind; 227*88358ab0SBenjamin Herrenschmidt int aapl_bus_id; 228*88358ab0SBenjamin Herrenschmidt int mediabay : 1; 229*88358ab0SBenjamin Herrenschmidt struct device_node *node; 230*88358ab0SBenjamin Herrenschmidt struct macio_dev *mdev; 231*88358ab0SBenjamin Herrenschmidt struct pci_dev *pdev; 232*88358ab0SBenjamin Herrenschmidt struct device *dev; 233*88358ab0SBenjamin Herrenschmidt int irq; 234*88358ab0SBenjamin Herrenschmidt u32 treg[2][2]; 235*88358ab0SBenjamin Herrenschmidt void __iomem *tfregs; 236*88358ab0SBenjamin Herrenschmidt void __iomem *kauai_fcr; 237*88358ab0SBenjamin Herrenschmidt struct dbdma_cmd * dma_table_cpu; 238*88358ab0SBenjamin Herrenschmidt dma_addr_t dma_table_dma; 239*88358ab0SBenjamin Herrenschmidt struct ata_host *host; 240*88358ab0SBenjamin Herrenschmidt const struct pata_macio_timing *timings; 241*88358ab0SBenjamin Herrenschmidt }; 242*88358ab0SBenjamin Herrenschmidt 243*88358ab0SBenjamin Herrenschmidt /* Previous variants of this driver used to calculate timings 244*88358ab0SBenjamin Herrenschmidt * for various variants of the chip and use tables for others. 245*88358ab0SBenjamin Herrenschmidt * 246*88358ab0SBenjamin Herrenschmidt * Not only was this confusing, but in addition, it isn't clear 247*88358ab0SBenjamin Herrenschmidt * whether our calculation code was correct. It didn't entirely 248*88358ab0SBenjamin Herrenschmidt * match the darwin code and whatever documentation I could find 249*88358ab0SBenjamin Herrenschmidt * on these cells 250*88358ab0SBenjamin Herrenschmidt * 251*88358ab0SBenjamin Herrenschmidt * I decided to entirely rely on a table instead for this version 252*88358ab0SBenjamin Herrenschmidt * of the driver. Also, because I don't really care about derated 253*88358ab0SBenjamin Herrenschmidt * modes and really old HW other than making it work, I'm not going 254*88358ab0SBenjamin Herrenschmidt * to calculate / snoop timing values for something else than the 255*88358ab0SBenjamin Herrenschmidt * standard modes. 256*88358ab0SBenjamin Herrenschmidt */ 257*88358ab0SBenjamin Herrenschmidt struct pata_macio_timing { 258*88358ab0SBenjamin Herrenschmidt int mode; 259*88358ab0SBenjamin Herrenschmidt u32 reg1; /* Bits to set in first timing reg */ 260*88358ab0SBenjamin Herrenschmidt u32 reg2; /* Bits to set in second timing reg */ 261*88358ab0SBenjamin Herrenschmidt }; 262*88358ab0SBenjamin Herrenschmidt 263*88358ab0SBenjamin Herrenschmidt static const struct pata_macio_timing pata_macio_ohare_timings[] = { 264*88358ab0SBenjamin Herrenschmidt { XFER_PIO_0, 0x00000526, 0, }, 265*88358ab0SBenjamin Herrenschmidt { XFER_PIO_1, 0x00000085, 0, }, 266*88358ab0SBenjamin Herrenschmidt { XFER_PIO_2, 0x00000025, 0, }, 267*88358ab0SBenjamin Herrenschmidt { XFER_PIO_3, 0x00000025, 0, }, 268*88358ab0SBenjamin Herrenschmidt { XFER_PIO_4, 0x00000025, 0, }, 269*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_0, 0x00074000, 0, }, 270*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_1, 0x00221000, 0, }, 271*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_2, 0x00211000, 0, }, 272*88358ab0SBenjamin Herrenschmidt { -1, 0, 0 } 273*88358ab0SBenjamin Herrenschmidt }; 274*88358ab0SBenjamin Herrenschmidt 275*88358ab0SBenjamin Herrenschmidt static const struct pata_macio_timing pata_macio_heathrow_timings[] = { 276*88358ab0SBenjamin Herrenschmidt { XFER_PIO_0, 0x00000526, 0, }, 277*88358ab0SBenjamin Herrenschmidt { XFER_PIO_1, 0x00000085, 0, }, 278*88358ab0SBenjamin Herrenschmidt { XFER_PIO_2, 0x00000025, 0, }, 279*88358ab0SBenjamin Herrenschmidt { XFER_PIO_3, 0x00000025, 0, }, 280*88358ab0SBenjamin Herrenschmidt { XFER_PIO_4, 0x00000025, 0, }, 281*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_0, 0x00074000, 0, }, 282*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_1, 0x00221000, 0, }, 283*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_2, 0x00211000, 0, }, 284*88358ab0SBenjamin Herrenschmidt { -1, 0, 0 } 285*88358ab0SBenjamin Herrenschmidt }; 286*88358ab0SBenjamin Herrenschmidt 287*88358ab0SBenjamin Herrenschmidt static const struct pata_macio_timing pata_macio_kl33_timings[] = { 288*88358ab0SBenjamin Herrenschmidt { XFER_PIO_0, 0x00000526, 0, }, 289*88358ab0SBenjamin Herrenschmidt { XFER_PIO_1, 0x00000085, 0, }, 290*88358ab0SBenjamin Herrenschmidt { XFER_PIO_2, 0x00000025, 0, }, 291*88358ab0SBenjamin Herrenschmidt { XFER_PIO_3, 0x00000025, 0, }, 292*88358ab0SBenjamin Herrenschmidt { XFER_PIO_4, 0x00000025, 0, }, 293*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_0, 0x00084000, 0, }, 294*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_1, 0x00021800, 0, }, 295*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_2, 0x00011800, 0, }, 296*88358ab0SBenjamin Herrenschmidt { -1, 0, 0 } 297*88358ab0SBenjamin Herrenschmidt }; 298*88358ab0SBenjamin Herrenschmidt 299*88358ab0SBenjamin Herrenschmidt static const struct pata_macio_timing pata_macio_kl66_timings[] = { 300*88358ab0SBenjamin Herrenschmidt { XFER_PIO_0, 0x0000038c, 0, }, 301*88358ab0SBenjamin Herrenschmidt { XFER_PIO_1, 0x0000020a, 0, }, 302*88358ab0SBenjamin Herrenschmidt { XFER_PIO_2, 0x00000127, 0, }, 303*88358ab0SBenjamin Herrenschmidt { XFER_PIO_3, 0x000000c6, 0, }, 304*88358ab0SBenjamin Herrenschmidt { XFER_PIO_4, 0x00000065, 0, }, 305*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_0, 0x00084000, 0, }, 306*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_1, 0x00029800, 0, }, 307*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_2, 0x00019400, 0, }, 308*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_0, 0x19100000, 0, }, 309*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_1, 0x14d00000, 0, }, 310*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_2, 0x10900000, 0, }, 311*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_3, 0x0c700000, 0, }, 312*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_4, 0x0c500000, 0, }, 313*88358ab0SBenjamin Herrenschmidt { -1, 0, 0 } 314*88358ab0SBenjamin Herrenschmidt }; 315*88358ab0SBenjamin Herrenschmidt 316*88358ab0SBenjamin Herrenschmidt static const struct pata_macio_timing pata_macio_kauai_timings[] = { 317*88358ab0SBenjamin Herrenschmidt { XFER_PIO_0, 0x08000a92, 0, }, 318*88358ab0SBenjamin Herrenschmidt { XFER_PIO_1, 0x0800060f, 0, }, 319*88358ab0SBenjamin Herrenschmidt { XFER_PIO_2, 0x0800038b, 0, }, 320*88358ab0SBenjamin Herrenschmidt { XFER_PIO_3, 0x05000249, 0, }, 321*88358ab0SBenjamin Herrenschmidt { XFER_PIO_4, 0x04000148, 0, }, 322*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_0, 0x00618000, 0, }, 323*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_1, 0x00209000, 0, }, 324*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_2, 0x00148000, 0, }, 325*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_0, 0, 0x000070c1, }, 326*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_1, 0, 0x00005d81, }, 327*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_2, 0, 0x00004a61, }, 328*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_3, 0, 0x00003a51, }, 329*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_4, 0, 0x00002a31, }, 330*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_5, 0, 0x00002921, }, 331*88358ab0SBenjamin Herrenschmidt { -1, 0, 0 } 332*88358ab0SBenjamin Herrenschmidt }; 333*88358ab0SBenjamin Herrenschmidt 334*88358ab0SBenjamin Herrenschmidt static const struct pata_macio_timing pata_macio_shasta_timings[] = { 335*88358ab0SBenjamin Herrenschmidt { XFER_PIO_0, 0x0a000c97, 0, }, 336*88358ab0SBenjamin Herrenschmidt { XFER_PIO_1, 0x07000712, 0, }, 337*88358ab0SBenjamin Herrenschmidt { XFER_PIO_2, 0x040003cd, 0, }, 338*88358ab0SBenjamin Herrenschmidt { XFER_PIO_3, 0x0500028b, 0, }, 339*88358ab0SBenjamin Herrenschmidt { XFER_PIO_4, 0x0400010a, 0, }, 340*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_0, 0x00820800, 0, }, 341*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_1, 0x0028b000, 0, }, 342*88358ab0SBenjamin Herrenschmidt { XFER_MW_DMA_2, 0x001ca000, 0, }, 343*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_0, 0, 0x00035901, }, 344*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_1, 0, 0x000348b1, }, 345*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_2, 0, 0x00033881, }, 346*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_3, 0, 0x00033861, }, 347*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_4, 0, 0x00033841, }, 348*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_5, 0, 0x00033031, }, 349*88358ab0SBenjamin Herrenschmidt { XFER_UDMA_6, 0, 0x00033021, }, 350*88358ab0SBenjamin Herrenschmidt { -1, 0, 0 } 351*88358ab0SBenjamin Herrenschmidt }; 352*88358ab0SBenjamin Herrenschmidt 353*88358ab0SBenjamin Herrenschmidt static const struct pata_macio_timing *pata_macio_find_timing( 354*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv, 355*88358ab0SBenjamin Herrenschmidt int mode) 356*88358ab0SBenjamin Herrenschmidt { 357*88358ab0SBenjamin Herrenschmidt int i; 358*88358ab0SBenjamin Herrenschmidt 359*88358ab0SBenjamin Herrenschmidt for (i = 0; priv->timings[i].mode > 0; i++) { 360*88358ab0SBenjamin Herrenschmidt if (priv->timings[i].mode == mode) 361*88358ab0SBenjamin Herrenschmidt return &priv->timings[i]; 362*88358ab0SBenjamin Herrenschmidt } 363*88358ab0SBenjamin Herrenschmidt return NULL; 364*88358ab0SBenjamin Herrenschmidt } 365*88358ab0SBenjamin Herrenschmidt 366*88358ab0SBenjamin Herrenschmidt 367*88358ab0SBenjamin Herrenschmidt static void pata_macio_apply_timings(struct ata_port *ap, unsigned int device) 368*88358ab0SBenjamin Herrenschmidt { 369*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 370*88358ab0SBenjamin Herrenschmidt void __iomem *rbase = ap->ioaddr.cmd_addr; 371*88358ab0SBenjamin Herrenschmidt 372*88358ab0SBenjamin Herrenschmidt if (priv->kind == controller_sh_ata6 || 373*88358ab0SBenjamin Herrenschmidt priv->kind == controller_un_ata6 || 374*88358ab0SBenjamin Herrenschmidt priv->kind == controller_k2_ata6) { 375*88358ab0SBenjamin Herrenschmidt writel(priv->treg[device][0], rbase + IDE_KAUAI_PIO_CONFIG); 376*88358ab0SBenjamin Herrenschmidt writel(priv->treg[device][1], rbase + IDE_KAUAI_ULTRA_CONFIG); 377*88358ab0SBenjamin Herrenschmidt } else 378*88358ab0SBenjamin Herrenschmidt writel(priv->treg[device][0], rbase + IDE_TIMING_CONFIG); 379*88358ab0SBenjamin Herrenschmidt } 380*88358ab0SBenjamin Herrenschmidt 381*88358ab0SBenjamin Herrenschmidt static void pata_macio_dev_select(struct ata_port *ap, unsigned int device) 382*88358ab0SBenjamin Herrenschmidt { 383*88358ab0SBenjamin Herrenschmidt ata_sff_dev_select(ap, device); 384*88358ab0SBenjamin Herrenschmidt 385*88358ab0SBenjamin Herrenschmidt /* Apply timings */ 386*88358ab0SBenjamin Herrenschmidt pata_macio_apply_timings(ap, device); 387*88358ab0SBenjamin Herrenschmidt } 388*88358ab0SBenjamin Herrenschmidt 389*88358ab0SBenjamin Herrenschmidt static void pata_macio_set_timings(struct ata_port *ap, 390*88358ab0SBenjamin Herrenschmidt struct ata_device *adev) 391*88358ab0SBenjamin Herrenschmidt { 392*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 393*88358ab0SBenjamin Herrenschmidt const struct pata_macio_timing *t; 394*88358ab0SBenjamin Herrenschmidt 395*88358ab0SBenjamin Herrenschmidt dev_dbg(priv->dev, "Set timings: DEV=%d,PIO=0x%x (%s),DMA=0x%x (%s)\n", 396*88358ab0SBenjamin Herrenschmidt adev->devno, 397*88358ab0SBenjamin Herrenschmidt adev->pio_mode, 398*88358ab0SBenjamin Herrenschmidt ata_mode_string(ata_xfer_mode2mask(adev->pio_mode)), 399*88358ab0SBenjamin Herrenschmidt adev->dma_mode, 400*88358ab0SBenjamin Herrenschmidt ata_mode_string(ata_xfer_mode2mask(adev->dma_mode))); 401*88358ab0SBenjamin Herrenschmidt 402*88358ab0SBenjamin Herrenschmidt /* First clear timings */ 403*88358ab0SBenjamin Herrenschmidt priv->treg[adev->devno][0] = priv->treg[adev->devno][1] = 0; 404*88358ab0SBenjamin Herrenschmidt 405*88358ab0SBenjamin Herrenschmidt /* Now get the PIO timings */ 406*88358ab0SBenjamin Herrenschmidt t = pata_macio_find_timing(priv, adev->pio_mode); 407*88358ab0SBenjamin Herrenschmidt if (t == NULL) { 408*88358ab0SBenjamin Herrenschmidt dev_warn(priv->dev, "Invalid PIO timing requested: 0x%x\n", 409*88358ab0SBenjamin Herrenschmidt adev->pio_mode); 410*88358ab0SBenjamin Herrenschmidt t = pata_macio_find_timing(priv, XFER_PIO_0); 411*88358ab0SBenjamin Herrenschmidt } 412*88358ab0SBenjamin Herrenschmidt BUG_ON(t == NULL); 413*88358ab0SBenjamin Herrenschmidt 414*88358ab0SBenjamin Herrenschmidt /* PIO timings only ever use the first treg */ 415*88358ab0SBenjamin Herrenschmidt priv->treg[adev->devno][0] |= t->reg1; 416*88358ab0SBenjamin Herrenschmidt 417*88358ab0SBenjamin Herrenschmidt /* Now get DMA timings */ 418*88358ab0SBenjamin Herrenschmidt t = pata_macio_find_timing(priv, adev->dma_mode); 419*88358ab0SBenjamin Herrenschmidt if (t == NULL || (t->reg1 == 0 && t->reg2 == 0)) { 420*88358ab0SBenjamin Herrenschmidt dev_dbg(priv->dev, "DMA timing not set yet, using MW_DMA_0\n"); 421*88358ab0SBenjamin Herrenschmidt t = pata_macio_find_timing(priv, XFER_MW_DMA_0); 422*88358ab0SBenjamin Herrenschmidt } 423*88358ab0SBenjamin Herrenschmidt BUG_ON(t == NULL); 424*88358ab0SBenjamin Herrenschmidt 425*88358ab0SBenjamin Herrenschmidt /* DMA timings can use both tregs */ 426*88358ab0SBenjamin Herrenschmidt priv->treg[adev->devno][0] |= t->reg1; 427*88358ab0SBenjamin Herrenschmidt priv->treg[adev->devno][1] |= t->reg2; 428*88358ab0SBenjamin Herrenschmidt 429*88358ab0SBenjamin Herrenschmidt dev_dbg(priv->dev, " -> %08x %08x\n", 430*88358ab0SBenjamin Herrenschmidt priv->treg[adev->devno][0], 431*88358ab0SBenjamin Herrenschmidt priv->treg[adev->devno][1]); 432*88358ab0SBenjamin Herrenschmidt 433*88358ab0SBenjamin Herrenschmidt /* Apply to hardware */ 434*88358ab0SBenjamin Herrenschmidt pata_macio_apply_timings(ap, adev->devno); 435*88358ab0SBenjamin Herrenschmidt } 436*88358ab0SBenjamin Herrenschmidt 437*88358ab0SBenjamin Herrenschmidt /* 438*88358ab0SBenjamin Herrenschmidt * Blast some well known "safe" values to the timing registers at init or 439*88358ab0SBenjamin Herrenschmidt * wakeup from sleep time, before we do real calculation 440*88358ab0SBenjamin Herrenschmidt */ 441*88358ab0SBenjamin Herrenschmidt static void pata_macio_default_timings(struct pata_macio_priv *priv) 442*88358ab0SBenjamin Herrenschmidt { 443*88358ab0SBenjamin Herrenschmidt unsigned int value, value2 = 0; 444*88358ab0SBenjamin Herrenschmidt 445*88358ab0SBenjamin Herrenschmidt switch(priv->kind) { 446*88358ab0SBenjamin Herrenschmidt case controller_sh_ata6: 447*88358ab0SBenjamin Herrenschmidt value = 0x0a820c97; 448*88358ab0SBenjamin Herrenschmidt value2 = 0x00033031; 449*88358ab0SBenjamin Herrenschmidt break; 450*88358ab0SBenjamin Herrenschmidt case controller_un_ata6: 451*88358ab0SBenjamin Herrenschmidt case controller_k2_ata6: 452*88358ab0SBenjamin Herrenschmidt value = 0x08618a92; 453*88358ab0SBenjamin Herrenschmidt value2 = 0x00002921; 454*88358ab0SBenjamin Herrenschmidt break; 455*88358ab0SBenjamin Herrenschmidt case controller_kl_ata4: 456*88358ab0SBenjamin Herrenschmidt value = 0x0008438c; 457*88358ab0SBenjamin Herrenschmidt break; 458*88358ab0SBenjamin Herrenschmidt case controller_kl_ata3: 459*88358ab0SBenjamin Herrenschmidt value = 0x00084526; 460*88358ab0SBenjamin Herrenschmidt break; 461*88358ab0SBenjamin Herrenschmidt case controller_heathrow: 462*88358ab0SBenjamin Herrenschmidt case controller_ohare: 463*88358ab0SBenjamin Herrenschmidt default: 464*88358ab0SBenjamin Herrenschmidt value = 0x00074526; 465*88358ab0SBenjamin Herrenschmidt break; 466*88358ab0SBenjamin Herrenschmidt } 467*88358ab0SBenjamin Herrenschmidt priv->treg[0][0] = priv->treg[1][0] = value; 468*88358ab0SBenjamin Herrenschmidt priv->treg[0][1] = priv->treg[1][1] = value2; 469*88358ab0SBenjamin Herrenschmidt } 470*88358ab0SBenjamin Herrenschmidt 471*88358ab0SBenjamin Herrenschmidt static int pata_macio_cable_detect(struct ata_port *ap) 472*88358ab0SBenjamin Herrenschmidt { 473*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 474*88358ab0SBenjamin Herrenschmidt 475*88358ab0SBenjamin Herrenschmidt /* Get cable type from device-tree */ 476*88358ab0SBenjamin Herrenschmidt if (priv->kind == controller_kl_ata4 || 477*88358ab0SBenjamin Herrenschmidt priv->kind == controller_un_ata6 || 478*88358ab0SBenjamin Herrenschmidt priv->kind == controller_k2_ata6 || 479*88358ab0SBenjamin Herrenschmidt priv->kind == controller_sh_ata6) { 480*88358ab0SBenjamin Herrenschmidt const char* cable = of_get_property(priv->node, "cable-type", 481*88358ab0SBenjamin Herrenschmidt NULL); 482*88358ab0SBenjamin Herrenschmidt struct device_node *root = of_find_node_by_path("/"); 483*88358ab0SBenjamin Herrenschmidt const char *model = of_get_property(root, "model", NULL); 484*88358ab0SBenjamin Herrenschmidt 485*88358ab0SBenjamin Herrenschmidt if (cable && !strncmp(cable, "80-", 3)) { 486*88358ab0SBenjamin Herrenschmidt /* Some drives fail to detect 80c cable in PowerBook 487*88358ab0SBenjamin Herrenschmidt * These machine use proprietary short IDE cable 488*88358ab0SBenjamin Herrenschmidt * anyway 489*88358ab0SBenjamin Herrenschmidt */ 490*88358ab0SBenjamin Herrenschmidt if (!strncmp(model, "PowerBook", 9)) 491*88358ab0SBenjamin Herrenschmidt return ATA_CBL_PATA40_SHORT; 492*88358ab0SBenjamin Herrenschmidt else 493*88358ab0SBenjamin Herrenschmidt return ATA_CBL_PATA80; 494*88358ab0SBenjamin Herrenschmidt } 495*88358ab0SBenjamin Herrenschmidt } 496*88358ab0SBenjamin Herrenschmidt 497*88358ab0SBenjamin Herrenschmidt /* G5's seem to have incorrect cable type in device-tree. 498*88358ab0SBenjamin Herrenschmidt * Let's assume they always have a 80 conductor cable, this seem to 499*88358ab0SBenjamin Herrenschmidt * be always the case unless the user mucked around 500*88358ab0SBenjamin Herrenschmidt */ 501*88358ab0SBenjamin Herrenschmidt if (of_device_is_compatible(priv->node, "K2-UATA") || 502*88358ab0SBenjamin Herrenschmidt of_device_is_compatible(priv->node, "shasta-ata")) 503*88358ab0SBenjamin Herrenschmidt return ATA_CBL_PATA80; 504*88358ab0SBenjamin Herrenschmidt 505*88358ab0SBenjamin Herrenschmidt /* Anything else is 40 connectors */ 506*88358ab0SBenjamin Herrenschmidt return ATA_CBL_PATA40; 507*88358ab0SBenjamin Herrenschmidt } 508*88358ab0SBenjamin Herrenschmidt 509*88358ab0SBenjamin Herrenschmidt static void pata_macio_qc_prep(struct ata_queued_cmd *qc) 510*88358ab0SBenjamin Herrenschmidt { 511*88358ab0SBenjamin Herrenschmidt unsigned int write = (qc->tf.flags & ATA_TFLAG_WRITE); 512*88358ab0SBenjamin Herrenschmidt struct ata_port *ap = qc->ap; 513*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 514*88358ab0SBenjamin Herrenschmidt struct scatterlist *sg; 515*88358ab0SBenjamin Herrenschmidt struct dbdma_cmd *table; 516*88358ab0SBenjamin Herrenschmidt unsigned int si, pi; 517*88358ab0SBenjamin Herrenschmidt 518*88358ab0SBenjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: qc %p flags %lx, write %d dev %d\n", 519*88358ab0SBenjamin Herrenschmidt __func__, qc, qc->flags, write, qc->dev->devno); 520*88358ab0SBenjamin Herrenschmidt 521*88358ab0SBenjamin Herrenschmidt if (!(qc->flags & ATA_QCFLAG_DMAMAP)) 522*88358ab0SBenjamin Herrenschmidt return; 523*88358ab0SBenjamin Herrenschmidt 524*88358ab0SBenjamin Herrenschmidt table = (struct dbdma_cmd *) priv->dma_table_cpu; 525*88358ab0SBenjamin Herrenschmidt 526*88358ab0SBenjamin Herrenschmidt pi = 0; 527*88358ab0SBenjamin Herrenschmidt for_each_sg(qc->sg, sg, qc->n_elem, si) { 528*88358ab0SBenjamin Herrenschmidt u32 addr, sg_len, len; 529*88358ab0SBenjamin Herrenschmidt 530*88358ab0SBenjamin Herrenschmidt /* determine if physical DMA addr spans 64K boundary. 531*88358ab0SBenjamin Herrenschmidt * Note h/w doesn't support 64-bit, so we unconditionally 532*88358ab0SBenjamin Herrenschmidt * truncate dma_addr_t to u32. 533*88358ab0SBenjamin Herrenschmidt */ 534*88358ab0SBenjamin Herrenschmidt addr = (u32) sg_dma_address(sg); 535*88358ab0SBenjamin Herrenschmidt sg_len = sg_dma_len(sg); 536*88358ab0SBenjamin Herrenschmidt 537*88358ab0SBenjamin Herrenschmidt while (sg_len) { 538*88358ab0SBenjamin Herrenschmidt /* table overflow should never happen */ 539*88358ab0SBenjamin Herrenschmidt BUG_ON (pi++ >= MAX_DCMDS); 540*88358ab0SBenjamin Herrenschmidt 541*88358ab0SBenjamin Herrenschmidt len = (sg_len < MAX_DBDMA_SEG) ? sg_len : MAX_DBDMA_SEG; 542*88358ab0SBenjamin Herrenschmidt st_le16(&table->command, write ? OUTPUT_MORE: INPUT_MORE); 543*88358ab0SBenjamin Herrenschmidt st_le16(&table->req_count, len); 544*88358ab0SBenjamin Herrenschmidt st_le32(&table->phy_addr, addr); 545*88358ab0SBenjamin Herrenschmidt table->cmd_dep = 0; 546*88358ab0SBenjamin Herrenschmidt table->xfer_status = 0; 547*88358ab0SBenjamin Herrenschmidt table->res_count = 0; 548*88358ab0SBenjamin Herrenschmidt addr += len; 549*88358ab0SBenjamin Herrenschmidt sg_len -= len; 550*88358ab0SBenjamin Herrenschmidt ++table; 551*88358ab0SBenjamin Herrenschmidt } 552*88358ab0SBenjamin Herrenschmidt } 553*88358ab0SBenjamin Herrenschmidt 554*88358ab0SBenjamin Herrenschmidt /* Should never happen according to Tejun */ 555*88358ab0SBenjamin Herrenschmidt BUG_ON(!pi); 556*88358ab0SBenjamin Herrenschmidt 557*88358ab0SBenjamin Herrenschmidt /* Convert the last command to an input/output */ 558*88358ab0SBenjamin Herrenschmidt table--; 559*88358ab0SBenjamin Herrenschmidt st_le16(&table->command, write ? OUTPUT_LAST: INPUT_LAST); 560*88358ab0SBenjamin Herrenschmidt table++; 561*88358ab0SBenjamin Herrenschmidt 562*88358ab0SBenjamin Herrenschmidt /* Add the stop command to the end of the list */ 563*88358ab0SBenjamin Herrenschmidt memset(table, 0, sizeof(struct dbdma_cmd)); 564*88358ab0SBenjamin Herrenschmidt st_le16(&table->command, DBDMA_STOP); 565*88358ab0SBenjamin Herrenschmidt 566*88358ab0SBenjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: %d DMA list entries\n", __func__, pi); 567*88358ab0SBenjamin Herrenschmidt } 568*88358ab0SBenjamin Herrenschmidt 569*88358ab0SBenjamin Herrenschmidt 570*88358ab0SBenjamin Herrenschmidt static void pata_macio_freeze(struct ata_port *ap) 571*88358ab0SBenjamin Herrenschmidt { 572*88358ab0SBenjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 573*88358ab0SBenjamin Herrenschmidt 574*88358ab0SBenjamin Herrenschmidt if (dma_regs) { 575*88358ab0SBenjamin Herrenschmidt unsigned int timeout = 1000000; 576*88358ab0SBenjamin Herrenschmidt 577*88358ab0SBenjamin Herrenschmidt /* Make sure DMA controller is stopped */ 578*88358ab0SBenjamin Herrenschmidt writel((RUN|PAUSE|FLUSH|WAKE|DEAD) << 16, &dma_regs->control); 579*88358ab0SBenjamin Herrenschmidt while (--timeout && (readl(&dma_regs->status) & RUN)) 580*88358ab0SBenjamin Herrenschmidt udelay(1); 581*88358ab0SBenjamin Herrenschmidt } 582*88358ab0SBenjamin Herrenschmidt 583*88358ab0SBenjamin Herrenschmidt ata_sff_freeze(ap); 584*88358ab0SBenjamin Herrenschmidt } 585*88358ab0SBenjamin Herrenschmidt 586*88358ab0SBenjamin Herrenschmidt 587*88358ab0SBenjamin Herrenschmidt static void pata_macio_bmdma_setup(struct ata_queued_cmd *qc) 588*88358ab0SBenjamin Herrenschmidt { 589*88358ab0SBenjamin Herrenschmidt struct ata_port *ap = qc->ap; 590*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 591*88358ab0SBenjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 592*88358ab0SBenjamin Herrenschmidt int dev = qc->dev->devno; 593*88358ab0SBenjamin Herrenschmidt 594*88358ab0SBenjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: qc %p\n", __func__, qc); 595*88358ab0SBenjamin Herrenschmidt 596*88358ab0SBenjamin Herrenschmidt /* Make sure DMA commands updates are visible */ 597*88358ab0SBenjamin Herrenschmidt writel(priv->dma_table_dma, &dma_regs->cmdptr); 598*88358ab0SBenjamin Herrenschmidt 599*88358ab0SBenjamin Herrenschmidt /* On KeyLargo 66Mhz cell, we need to add 60ns to wrDataSetup on 600*88358ab0SBenjamin Herrenschmidt * UDMA reads 601*88358ab0SBenjamin Herrenschmidt */ 602*88358ab0SBenjamin Herrenschmidt if (priv->kind == controller_kl_ata4 && 603*88358ab0SBenjamin Herrenschmidt (priv->treg[dev][0] & TR_66_UDMA_EN)) { 604*88358ab0SBenjamin Herrenschmidt void __iomem *rbase = ap->ioaddr.cmd_addr; 605*88358ab0SBenjamin Herrenschmidt u32 reg = priv->treg[dev][0]; 606*88358ab0SBenjamin Herrenschmidt 607*88358ab0SBenjamin Herrenschmidt if (!(qc->tf.flags & ATA_TFLAG_WRITE)) 608*88358ab0SBenjamin Herrenschmidt reg += 0x00800000; 609*88358ab0SBenjamin Herrenschmidt writel(reg, rbase + IDE_TIMING_CONFIG); 610*88358ab0SBenjamin Herrenschmidt } 611*88358ab0SBenjamin Herrenschmidt 612*88358ab0SBenjamin Herrenschmidt /* issue r/w command */ 613*88358ab0SBenjamin Herrenschmidt ap->ops->sff_exec_command(ap, &qc->tf); 614*88358ab0SBenjamin Herrenschmidt } 615*88358ab0SBenjamin Herrenschmidt 616*88358ab0SBenjamin Herrenschmidt static void pata_macio_bmdma_start(struct ata_queued_cmd *qc) 617*88358ab0SBenjamin Herrenschmidt { 618*88358ab0SBenjamin Herrenschmidt struct ata_port *ap = qc->ap; 619*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 620*88358ab0SBenjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 621*88358ab0SBenjamin Herrenschmidt 622*88358ab0SBenjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: qc %p\n", __func__, qc); 623*88358ab0SBenjamin Herrenschmidt 624*88358ab0SBenjamin Herrenschmidt writel((RUN << 16) | RUN, &dma_regs->control); 625*88358ab0SBenjamin Herrenschmidt /* Make sure it gets to the controller right now */ 626*88358ab0SBenjamin Herrenschmidt (void)readl(&dma_regs->control); 627*88358ab0SBenjamin Herrenschmidt } 628*88358ab0SBenjamin Herrenschmidt 629*88358ab0SBenjamin Herrenschmidt static void pata_macio_bmdma_stop(struct ata_queued_cmd *qc) 630*88358ab0SBenjamin Herrenschmidt { 631*88358ab0SBenjamin Herrenschmidt struct ata_port *ap = qc->ap; 632*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 633*88358ab0SBenjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 634*88358ab0SBenjamin Herrenschmidt unsigned int timeout = 1000000; 635*88358ab0SBenjamin Herrenschmidt 636*88358ab0SBenjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: qc %p\n", __func__, qc); 637*88358ab0SBenjamin Herrenschmidt 638*88358ab0SBenjamin Herrenschmidt /* Stop the DMA engine and wait for it to full halt */ 639*88358ab0SBenjamin Herrenschmidt writel (((RUN|WAKE|DEAD) << 16), &dma_regs->control); 640*88358ab0SBenjamin Herrenschmidt while (--timeout && (readl(&dma_regs->status) & RUN)) 641*88358ab0SBenjamin Herrenschmidt udelay(1); 642*88358ab0SBenjamin Herrenschmidt } 643*88358ab0SBenjamin Herrenschmidt 644*88358ab0SBenjamin Herrenschmidt static u8 pata_macio_bmdma_status(struct ata_port *ap) 645*88358ab0SBenjamin Herrenschmidt { 646*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 647*88358ab0SBenjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 648*88358ab0SBenjamin Herrenschmidt u32 dstat, rstat = ATA_DMA_INTR; 649*88358ab0SBenjamin Herrenschmidt unsigned long timeout = 0; 650*88358ab0SBenjamin Herrenschmidt 651*88358ab0SBenjamin Herrenschmidt dstat = readl(&dma_regs->status); 652*88358ab0SBenjamin Herrenschmidt 653*88358ab0SBenjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: dstat=%x\n", __func__, dstat); 654*88358ab0SBenjamin Herrenschmidt 655*88358ab0SBenjamin Herrenschmidt /* We have two things to deal with here: 656*88358ab0SBenjamin Herrenschmidt * 657*88358ab0SBenjamin Herrenschmidt * - The dbdma won't stop if the command was started 658*88358ab0SBenjamin Herrenschmidt * but completed with an error without transferring all 659*88358ab0SBenjamin Herrenschmidt * datas. This happens when bad blocks are met during 660*88358ab0SBenjamin Herrenschmidt * a multi-block transfer. 661*88358ab0SBenjamin Herrenschmidt * 662*88358ab0SBenjamin Herrenschmidt * - The dbdma fifo hasn't yet finished flushing to 663*88358ab0SBenjamin Herrenschmidt * to system memory when the disk interrupt occurs. 664*88358ab0SBenjamin Herrenschmidt * 665*88358ab0SBenjamin Herrenschmidt */ 666*88358ab0SBenjamin Herrenschmidt 667*88358ab0SBenjamin Herrenschmidt /* First check for errors */ 668*88358ab0SBenjamin Herrenschmidt if ((dstat & (RUN|DEAD)) != RUN) 669*88358ab0SBenjamin Herrenschmidt rstat |= ATA_DMA_ERR; 670*88358ab0SBenjamin Herrenschmidt 671*88358ab0SBenjamin Herrenschmidt /* If ACTIVE is cleared, the STOP command has been hit and 672*88358ab0SBenjamin Herrenschmidt * the transfer is complete. If not, we have to flush the 673*88358ab0SBenjamin Herrenschmidt * channel. 674*88358ab0SBenjamin Herrenschmidt */ 675*88358ab0SBenjamin Herrenschmidt if ((dstat & ACTIVE) == 0) 676*88358ab0SBenjamin Herrenschmidt return rstat; 677*88358ab0SBenjamin Herrenschmidt 678*88358ab0SBenjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: DMA still active, flushing...\n", __func__); 679*88358ab0SBenjamin Herrenschmidt 680*88358ab0SBenjamin Herrenschmidt /* If dbdma didn't execute the STOP command yet, the 681*88358ab0SBenjamin Herrenschmidt * active bit is still set. We consider that we aren't 682*88358ab0SBenjamin Herrenschmidt * sharing interrupts (which is hopefully the case with 683*88358ab0SBenjamin Herrenschmidt * those controllers) and so we just try to flush the 684*88358ab0SBenjamin Herrenschmidt * channel for pending data in the fifo 685*88358ab0SBenjamin Herrenschmidt */ 686*88358ab0SBenjamin Herrenschmidt udelay(1); 687*88358ab0SBenjamin Herrenschmidt writel((FLUSH << 16) | FLUSH, &dma_regs->control); 688*88358ab0SBenjamin Herrenschmidt for (;;) { 689*88358ab0SBenjamin Herrenschmidt udelay(1); 690*88358ab0SBenjamin Herrenschmidt dstat = readl(&dma_regs->status); 691*88358ab0SBenjamin Herrenschmidt if ((dstat & FLUSH) == 0) 692*88358ab0SBenjamin Herrenschmidt break; 693*88358ab0SBenjamin Herrenschmidt if (++timeout > 1000) { 694*88358ab0SBenjamin Herrenschmidt dev_warn(priv->dev, "timeout flushing DMA\n"); 695*88358ab0SBenjamin Herrenschmidt rstat |= ATA_DMA_ERR; 696*88358ab0SBenjamin Herrenschmidt break; 697*88358ab0SBenjamin Herrenschmidt } 698*88358ab0SBenjamin Herrenschmidt } 699*88358ab0SBenjamin Herrenschmidt return rstat; 700*88358ab0SBenjamin Herrenschmidt } 701*88358ab0SBenjamin Herrenschmidt 702*88358ab0SBenjamin Herrenschmidt /* port_start is when we allocate the DMA command list */ 703*88358ab0SBenjamin Herrenschmidt static int pata_macio_port_start(struct ata_port *ap) 704*88358ab0SBenjamin Herrenschmidt { 705*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 706*88358ab0SBenjamin Herrenschmidt 707*88358ab0SBenjamin Herrenschmidt if (ap->ioaddr.bmdma_addr == NULL) 708*88358ab0SBenjamin Herrenschmidt return 0; 709*88358ab0SBenjamin Herrenschmidt 710*88358ab0SBenjamin Herrenschmidt /* Allocate space for the DBDMA commands. 711*88358ab0SBenjamin Herrenschmidt * 712*88358ab0SBenjamin Herrenschmidt * The +2 is +1 for the stop command and +1 to allow for 713*88358ab0SBenjamin Herrenschmidt * aligning the start address to a multiple of 16 bytes. 714*88358ab0SBenjamin Herrenschmidt */ 715*88358ab0SBenjamin Herrenschmidt priv->dma_table_cpu = 716*88358ab0SBenjamin Herrenschmidt dmam_alloc_coherent(priv->dev, 717*88358ab0SBenjamin Herrenschmidt (MAX_DCMDS + 2) * sizeof(struct dbdma_cmd), 718*88358ab0SBenjamin Herrenschmidt &priv->dma_table_dma, GFP_KERNEL); 719*88358ab0SBenjamin Herrenschmidt if (priv->dma_table_cpu == NULL) { 720*88358ab0SBenjamin Herrenschmidt dev_err(priv->dev, "Unable to allocate DMA command list\n"); 721*88358ab0SBenjamin Herrenschmidt ap->ioaddr.bmdma_addr = NULL; 722*88358ab0SBenjamin Herrenschmidt } 723*88358ab0SBenjamin Herrenschmidt return 0; 724*88358ab0SBenjamin Herrenschmidt } 725*88358ab0SBenjamin Herrenschmidt 726*88358ab0SBenjamin Herrenschmidt static void pata_macio_irq_clear(struct ata_port *ap) 727*88358ab0SBenjamin Herrenschmidt { 728*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 729*88358ab0SBenjamin Herrenschmidt 730*88358ab0SBenjamin Herrenschmidt /* Nothing to do here */ 731*88358ab0SBenjamin Herrenschmidt 732*88358ab0SBenjamin Herrenschmidt dev_dbgdma(priv->dev, "%s\n", __func__); 733*88358ab0SBenjamin Herrenschmidt } 734*88358ab0SBenjamin Herrenschmidt 735*88358ab0SBenjamin Herrenschmidt static void pata_macio_reset_hw(struct pata_macio_priv *priv, int resume) 736*88358ab0SBenjamin Herrenschmidt { 737*88358ab0SBenjamin Herrenschmidt dev_dbg(priv->dev, "Enabling & resetting... \n"); 738*88358ab0SBenjamin Herrenschmidt 739*88358ab0SBenjamin Herrenschmidt if (priv->mediabay) 740*88358ab0SBenjamin Herrenschmidt return; 741*88358ab0SBenjamin Herrenschmidt 742*88358ab0SBenjamin Herrenschmidt if (priv->kind == controller_ohare && !resume) { 743*88358ab0SBenjamin Herrenschmidt /* The code below is having trouble on some ohare machines 744*88358ab0SBenjamin Herrenschmidt * (timing related ?). Until I can put my hand on one of these 745*88358ab0SBenjamin Herrenschmidt * units, I keep the old way 746*88358ab0SBenjamin Herrenschmidt */ 747*88358ab0SBenjamin Herrenschmidt ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, priv->node, 0, 1); 748*88358ab0SBenjamin Herrenschmidt } else { 749*88358ab0SBenjamin Herrenschmidt int rc; 750*88358ab0SBenjamin Herrenschmidt 751*88358ab0SBenjamin Herrenschmidt /* Reset and enable controller */ 752*88358ab0SBenjamin Herrenschmidt rc = ppc_md.feature_call(PMAC_FTR_IDE_RESET, 753*88358ab0SBenjamin Herrenschmidt priv->node, priv->aapl_bus_id, 1); 754*88358ab0SBenjamin Herrenschmidt ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, 755*88358ab0SBenjamin Herrenschmidt priv->node, priv->aapl_bus_id, 1); 756*88358ab0SBenjamin Herrenschmidt msleep(10); 757*88358ab0SBenjamin Herrenschmidt /* Only bother waiting if there's a reset control */ 758*88358ab0SBenjamin Herrenschmidt if (rc == 0) { 759*88358ab0SBenjamin Herrenschmidt ppc_md.feature_call(PMAC_FTR_IDE_RESET, 760*88358ab0SBenjamin Herrenschmidt priv->node, priv->aapl_bus_id, 0); 761*88358ab0SBenjamin Herrenschmidt msleep(IDE_WAKEUP_DELAY_MS); 762*88358ab0SBenjamin Herrenschmidt } 763*88358ab0SBenjamin Herrenschmidt } 764*88358ab0SBenjamin Herrenschmidt 765*88358ab0SBenjamin Herrenschmidt /* If resuming a PCI device, restore the config space here */ 766*88358ab0SBenjamin Herrenschmidt if (priv->pdev && resume) { 767*88358ab0SBenjamin Herrenschmidt int rc; 768*88358ab0SBenjamin Herrenschmidt 769*88358ab0SBenjamin Herrenschmidt pci_restore_state(priv->pdev); 770*88358ab0SBenjamin Herrenschmidt rc = pcim_enable_device(priv->pdev); 771*88358ab0SBenjamin Herrenschmidt if (rc) 772*88358ab0SBenjamin Herrenschmidt dev_printk(KERN_ERR, &priv->pdev->dev, 773*88358ab0SBenjamin Herrenschmidt "Failed to enable device after resume (%d)\n", rc); 774*88358ab0SBenjamin Herrenschmidt else 775*88358ab0SBenjamin Herrenschmidt pci_set_master(priv->pdev); 776*88358ab0SBenjamin Herrenschmidt } 777*88358ab0SBenjamin Herrenschmidt 778*88358ab0SBenjamin Herrenschmidt /* On Kauai, initialize the FCR. We don't perform a reset, doesn't really 779*88358ab0SBenjamin Herrenschmidt * seem necessary and speeds up the boot process 780*88358ab0SBenjamin Herrenschmidt */ 781*88358ab0SBenjamin Herrenschmidt if (priv->kauai_fcr) 782*88358ab0SBenjamin Herrenschmidt writel(KAUAI_FCR_UATA_MAGIC | 783*88358ab0SBenjamin Herrenschmidt KAUAI_FCR_UATA_RESET_N | 784*88358ab0SBenjamin Herrenschmidt KAUAI_FCR_UATA_ENABLE, priv->kauai_fcr); 785*88358ab0SBenjamin Herrenschmidt } 786*88358ab0SBenjamin Herrenschmidt 787*88358ab0SBenjamin Herrenschmidt /* Hook the standard slave config to fixup some HW related alignment 788*88358ab0SBenjamin Herrenschmidt * restrictions 789*88358ab0SBenjamin Herrenschmidt */ 790*88358ab0SBenjamin Herrenschmidt static int pata_macio_slave_config(struct scsi_device *sdev) 791*88358ab0SBenjamin Herrenschmidt { 792*88358ab0SBenjamin Herrenschmidt struct ata_port *ap = ata_shost_to_port(sdev->host); 793*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 794*88358ab0SBenjamin Herrenschmidt struct ata_device *dev; 795*88358ab0SBenjamin Herrenschmidt u16 cmd; 796*88358ab0SBenjamin Herrenschmidt int rc; 797*88358ab0SBenjamin Herrenschmidt 798*88358ab0SBenjamin Herrenschmidt /* First call original */ 799*88358ab0SBenjamin Herrenschmidt rc = ata_scsi_slave_config(sdev); 800*88358ab0SBenjamin Herrenschmidt if (rc) 801*88358ab0SBenjamin Herrenschmidt return rc; 802*88358ab0SBenjamin Herrenschmidt 803*88358ab0SBenjamin Herrenschmidt /* This is lifted from sata_nv */ 804*88358ab0SBenjamin Herrenschmidt dev = &ap->link.device[sdev->id]; 805*88358ab0SBenjamin Herrenschmidt 806*88358ab0SBenjamin Herrenschmidt /* OHare has issues with non cache aligned DMA on some chipsets */ 807*88358ab0SBenjamin Herrenschmidt if (priv->kind == controller_ohare) { 808*88358ab0SBenjamin Herrenschmidt blk_queue_update_dma_alignment(sdev->request_queue, 31); 809*88358ab0SBenjamin Herrenschmidt blk_queue_update_dma_pad(sdev->request_queue, 31); 810*88358ab0SBenjamin Herrenschmidt 811*88358ab0SBenjamin Herrenschmidt /* Tell the world about it */ 812*88358ab0SBenjamin Herrenschmidt ata_dev_printk(dev, KERN_INFO, "OHare alignment limits applied\n"); 813*88358ab0SBenjamin Herrenschmidt return 0; 814*88358ab0SBenjamin Herrenschmidt } 815*88358ab0SBenjamin Herrenschmidt 816*88358ab0SBenjamin Herrenschmidt /* We only have issues with ATAPI */ 817*88358ab0SBenjamin Herrenschmidt if (dev->class != ATA_DEV_ATAPI) 818*88358ab0SBenjamin Herrenschmidt return 0; 819*88358ab0SBenjamin Herrenschmidt 820*88358ab0SBenjamin Herrenschmidt /* Shasta and K2 seem to have "issues" with reads ... */ 821*88358ab0SBenjamin Herrenschmidt if (priv->kind == controller_sh_ata6 || priv->kind == controller_k2_ata6) { 822*88358ab0SBenjamin Herrenschmidt /* Allright these are bad, apply restrictions */ 823*88358ab0SBenjamin Herrenschmidt blk_queue_update_dma_alignment(sdev->request_queue, 15); 824*88358ab0SBenjamin Herrenschmidt blk_queue_update_dma_pad(sdev->request_queue, 15); 825*88358ab0SBenjamin Herrenschmidt 826*88358ab0SBenjamin Herrenschmidt /* We enable MWI and hack cache line size directly here, this 827*88358ab0SBenjamin Herrenschmidt * is specific to this chipset and not normal values, we happen 828*88358ab0SBenjamin Herrenschmidt * to somewhat know what we are doing here (which is basically 829*88358ab0SBenjamin Herrenschmidt * to do the same Apple does and pray they did not get it wrong :-) 830*88358ab0SBenjamin Herrenschmidt */ 831*88358ab0SBenjamin Herrenschmidt BUG_ON(!priv->pdev); 832*88358ab0SBenjamin Herrenschmidt pci_write_config_byte(priv->pdev, PCI_CACHE_LINE_SIZE, 0x08); 833*88358ab0SBenjamin Herrenschmidt pci_read_config_word(priv->pdev, PCI_COMMAND, &cmd); 834*88358ab0SBenjamin Herrenschmidt pci_write_config_word(priv->pdev, PCI_COMMAND, 835*88358ab0SBenjamin Herrenschmidt cmd | PCI_COMMAND_INVALIDATE); 836*88358ab0SBenjamin Herrenschmidt 837*88358ab0SBenjamin Herrenschmidt /* Tell the world about it */ 838*88358ab0SBenjamin Herrenschmidt ata_dev_printk(dev, KERN_INFO, 839*88358ab0SBenjamin Herrenschmidt "K2/Shasta alignment limits applied\n"); 840*88358ab0SBenjamin Herrenschmidt } 841*88358ab0SBenjamin Herrenschmidt 842*88358ab0SBenjamin Herrenschmidt return 0; 843*88358ab0SBenjamin Herrenschmidt } 844*88358ab0SBenjamin Herrenschmidt 845*88358ab0SBenjamin Herrenschmidt #ifdef CONFIG_PM 846*88358ab0SBenjamin Herrenschmidt 847*88358ab0SBenjamin Herrenschmidt static int pata_macio_do_suspend(struct pata_macio_priv *priv, pm_message_t mesg) 848*88358ab0SBenjamin Herrenschmidt { 849*88358ab0SBenjamin Herrenschmidt int rc; 850*88358ab0SBenjamin Herrenschmidt 851*88358ab0SBenjamin Herrenschmidt /* First, core libata suspend to do most of the work */ 852*88358ab0SBenjamin Herrenschmidt rc = ata_host_suspend(priv->host, mesg); 853*88358ab0SBenjamin Herrenschmidt if (rc) 854*88358ab0SBenjamin Herrenschmidt return rc; 855*88358ab0SBenjamin Herrenschmidt 856*88358ab0SBenjamin Herrenschmidt /* Restore to default timings */ 857*88358ab0SBenjamin Herrenschmidt pata_macio_default_timings(priv); 858*88358ab0SBenjamin Herrenschmidt 859*88358ab0SBenjamin Herrenschmidt /* Mask interrupt. Not strictly necessary but old driver did 860*88358ab0SBenjamin Herrenschmidt * it and I'd rather not change that here */ 861*88358ab0SBenjamin Herrenschmidt disable_irq(priv->irq); 862*88358ab0SBenjamin Herrenschmidt 863*88358ab0SBenjamin Herrenschmidt /* The media bay will handle itself just fine */ 864*88358ab0SBenjamin Herrenschmidt if (priv->mediabay) 865*88358ab0SBenjamin Herrenschmidt return 0; 866*88358ab0SBenjamin Herrenschmidt 867*88358ab0SBenjamin Herrenschmidt /* Kauai has bus control FCRs directly here */ 868*88358ab0SBenjamin Herrenschmidt if (priv->kauai_fcr) { 869*88358ab0SBenjamin Herrenschmidt u32 fcr = readl(priv->kauai_fcr); 870*88358ab0SBenjamin Herrenschmidt fcr &= ~(KAUAI_FCR_UATA_RESET_N | KAUAI_FCR_UATA_ENABLE); 871*88358ab0SBenjamin Herrenschmidt writel(fcr, priv->kauai_fcr); 872*88358ab0SBenjamin Herrenschmidt } 873*88358ab0SBenjamin Herrenschmidt 874*88358ab0SBenjamin Herrenschmidt /* For PCI, save state and disable DMA. No need to call 875*88358ab0SBenjamin Herrenschmidt * pci_set_power_state(), the HW doesn't do D states that 876*88358ab0SBenjamin Herrenschmidt * way, the platform code will take care of suspending the 877*88358ab0SBenjamin Herrenschmidt * ASIC properly 878*88358ab0SBenjamin Herrenschmidt */ 879*88358ab0SBenjamin Herrenschmidt if (priv->pdev) { 880*88358ab0SBenjamin Herrenschmidt pci_save_state(priv->pdev); 881*88358ab0SBenjamin Herrenschmidt pci_disable_device(priv->pdev); 882*88358ab0SBenjamin Herrenschmidt } 883*88358ab0SBenjamin Herrenschmidt 884*88358ab0SBenjamin Herrenschmidt /* Disable the bus on older machines and the cell on kauai */ 885*88358ab0SBenjamin Herrenschmidt ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, priv->node, 886*88358ab0SBenjamin Herrenschmidt priv->aapl_bus_id, 0); 887*88358ab0SBenjamin Herrenschmidt 888*88358ab0SBenjamin Herrenschmidt return 0; 889*88358ab0SBenjamin Herrenschmidt } 890*88358ab0SBenjamin Herrenschmidt 891*88358ab0SBenjamin Herrenschmidt static int pata_macio_do_resume(struct pata_macio_priv *priv) 892*88358ab0SBenjamin Herrenschmidt { 893*88358ab0SBenjamin Herrenschmidt /* Reset and re-enable the HW */ 894*88358ab0SBenjamin Herrenschmidt pata_macio_reset_hw(priv, 1); 895*88358ab0SBenjamin Herrenschmidt 896*88358ab0SBenjamin Herrenschmidt /* Sanitize drive timings */ 897*88358ab0SBenjamin Herrenschmidt pata_macio_apply_timings(priv->host->ports[0], 0); 898*88358ab0SBenjamin Herrenschmidt 899*88358ab0SBenjamin Herrenschmidt /* We want our IRQ back ! */ 900*88358ab0SBenjamin Herrenschmidt enable_irq(priv->irq); 901*88358ab0SBenjamin Herrenschmidt 902*88358ab0SBenjamin Herrenschmidt /* Let the libata core take it from there */ 903*88358ab0SBenjamin Herrenschmidt ata_host_resume(priv->host); 904*88358ab0SBenjamin Herrenschmidt 905*88358ab0SBenjamin Herrenschmidt return 0; 906*88358ab0SBenjamin Herrenschmidt } 907*88358ab0SBenjamin Herrenschmidt 908*88358ab0SBenjamin Herrenschmidt #endif /* CONFIG_PM */ 909*88358ab0SBenjamin Herrenschmidt 910*88358ab0SBenjamin Herrenschmidt static struct scsi_host_template pata_macio_sht = { 911*88358ab0SBenjamin Herrenschmidt ATA_BASE_SHT(DRV_NAME), 912*88358ab0SBenjamin Herrenschmidt .sg_tablesize = MAX_DCMDS, 913*88358ab0SBenjamin Herrenschmidt /* We may not need that strict one */ 914*88358ab0SBenjamin Herrenschmidt .dma_boundary = ATA_DMA_BOUNDARY, 915*88358ab0SBenjamin Herrenschmidt .slave_configure = pata_macio_slave_config, 916*88358ab0SBenjamin Herrenschmidt }; 917*88358ab0SBenjamin Herrenschmidt 918*88358ab0SBenjamin Herrenschmidt static struct ata_port_operations pata_macio_ops = { 919*88358ab0SBenjamin Herrenschmidt .inherits = &ata_sff_port_ops, 920*88358ab0SBenjamin Herrenschmidt 921*88358ab0SBenjamin Herrenschmidt .freeze = pata_macio_freeze, 922*88358ab0SBenjamin Herrenschmidt .set_piomode = pata_macio_set_timings, 923*88358ab0SBenjamin Herrenschmidt .set_dmamode = pata_macio_set_timings, 924*88358ab0SBenjamin Herrenschmidt .cable_detect = pata_macio_cable_detect, 925*88358ab0SBenjamin Herrenschmidt .sff_dev_select = pata_macio_dev_select, 926*88358ab0SBenjamin Herrenschmidt .qc_prep = pata_macio_qc_prep, 927*88358ab0SBenjamin Herrenschmidt .mode_filter = ata_bmdma_mode_filter, 928*88358ab0SBenjamin Herrenschmidt .bmdma_setup = pata_macio_bmdma_setup, 929*88358ab0SBenjamin Herrenschmidt .bmdma_start = pata_macio_bmdma_start, 930*88358ab0SBenjamin Herrenschmidt .bmdma_stop = pata_macio_bmdma_stop, 931*88358ab0SBenjamin Herrenschmidt .bmdma_status = pata_macio_bmdma_status, 932*88358ab0SBenjamin Herrenschmidt .port_start = pata_macio_port_start, 933*88358ab0SBenjamin Herrenschmidt .sff_irq_clear = pata_macio_irq_clear, 934*88358ab0SBenjamin Herrenschmidt }; 935*88358ab0SBenjamin Herrenschmidt 936*88358ab0SBenjamin Herrenschmidt static void __devinit pata_macio_invariants(struct pata_macio_priv *priv) 937*88358ab0SBenjamin Herrenschmidt { 938*88358ab0SBenjamin Herrenschmidt const int *bidp; 939*88358ab0SBenjamin Herrenschmidt 940*88358ab0SBenjamin Herrenschmidt /* Identify the type of controller */ 941*88358ab0SBenjamin Herrenschmidt if (of_device_is_compatible(priv->node, "shasta-ata")) { 942*88358ab0SBenjamin Herrenschmidt priv->kind = controller_sh_ata6; 943*88358ab0SBenjamin Herrenschmidt priv->timings = pata_macio_shasta_timings; 944*88358ab0SBenjamin Herrenschmidt } else if (of_device_is_compatible(priv->node, "kauai-ata")) { 945*88358ab0SBenjamin Herrenschmidt priv->kind = controller_un_ata6; 946*88358ab0SBenjamin Herrenschmidt priv->timings = pata_macio_kauai_timings; 947*88358ab0SBenjamin Herrenschmidt } else if (of_device_is_compatible(priv->node, "K2-UATA")) { 948*88358ab0SBenjamin Herrenschmidt priv->kind = controller_k2_ata6; 949*88358ab0SBenjamin Herrenschmidt priv->timings = pata_macio_kauai_timings; 950*88358ab0SBenjamin Herrenschmidt } else if (of_device_is_compatible(priv->node, "keylargo-ata")) { 951*88358ab0SBenjamin Herrenschmidt if (strcmp(priv->node->name, "ata-4") == 0) { 952*88358ab0SBenjamin Herrenschmidt priv->kind = controller_kl_ata4; 953*88358ab0SBenjamin Herrenschmidt priv->timings = pata_macio_kl66_timings; 954*88358ab0SBenjamin Herrenschmidt } else { 955*88358ab0SBenjamin Herrenschmidt priv->kind = controller_kl_ata3; 956*88358ab0SBenjamin Herrenschmidt priv->timings = pata_macio_kl33_timings; 957*88358ab0SBenjamin Herrenschmidt } 958*88358ab0SBenjamin Herrenschmidt } else if (of_device_is_compatible(priv->node, "heathrow-ata")) { 959*88358ab0SBenjamin Herrenschmidt priv->kind = controller_heathrow; 960*88358ab0SBenjamin Herrenschmidt priv->timings = pata_macio_heathrow_timings; 961*88358ab0SBenjamin Herrenschmidt } else { 962*88358ab0SBenjamin Herrenschmidt priv->kind = controller_ohare; 963*88358ab0SBenjamin Herrenschmidt priv->timings = pata_macio_ohare_timings; 964*88358ab0SBenjamin Herrenschmidt } 965*88358ab0SBenjamin Herrenschmidt 966*88358ab0SBenjamin Herrenschmidt /* XXX FIXME --- setup priv->mediabay here */ 967*88358ab0SBenjamin Herrenschmidt 968*88358ab0SBenjamin Herrenschmidt /* Get Apple bus ID (for clock and ASIC control) */ 969*88358ab0SBenjamin Herrenschmidt bidp = of_get_property(priv->node, "AAPL,bus-id", NULL); 970*88358ab0SBenjamin Herrenschmidt priv->aapl_bus_id = bidp ? *bidp : 0; 971*88358ab0SBenjamin Herrenschmidt 972*88358ab0SBenjamin Herrenschmidt /* Fixup missing Apple bus ID in case of media-bay */ 973*88358ab0SBenjamin Herrenschmidt if (priv->mediabay && bidp == 0) 974*88358ab0SBenjamin Herrenschmidt priv->aapl_bus_id = 1; 975*88358ab0SBenjamin Herrenschmidt } 976*88358ab0SBenjamin Herrenschmidt 977*88358ab0SBenjamin Herrenschmidt static void __devinit pata_macio_setup_ios(struct ata_ioports *ioaddr, 978*88358ab0SBenjamin Herrenschmidt void __iomem * base, 979*88358ab0SBenjamin Herrenschmidt void __iomem * dma) 980*88358ab0SBenjamin Herrenschmidt { 981*88358ab0SBenjamin Herrenschmidt /* cmd_addr is the base of regs for that port */ 982*88358ab0SBenjamin Herrenschmidt ioaddr->cmd_addr = base; 983*88358ab0SBenjamin Herrenschmidt 984*88358ab0SBenjamin Herrenschmidt /* taskfile registers */ 985*88358ab0SBenjamin Herrenschmidt ioaddr->data_addr = base + (ATA_REG_DATA << 4); 986*88358ab0SBenjamin Herrenschmidt ioaddr->error_addr = base + (ATA_REG_ERR << 4); 987*88358ab0SBenjamin Herrenschmidt ioaddr->feature_addr = base + (ATA_REG_FEATURE << 4); 988*88358ab0SBenjamin Herrenschmidt ioaddr->nsect_addr = base + (ATA_REG_NSECT << 4); 989*88358ab0SBenjamin Herrenschmidt ioaddr->lbal_addr = base + (ATA_REG_LBAL << 4); 990*88358ab0SBenjamin Herrenschmidt ioaddr->lbam_addr = base + (ATA_REG_LBAM << 4); 991*88358ab0SBenjamin Herrenschmidt ioaddr->lbah_addr = base + (ATA_REG_LBAH << 4); 992*88358ab0SBenjamin Herrenschmidt ioaddr->device_addr = base + (ATA_REG_DEVICE << 4); 993*88358ab0SBenjamin Herrenschmidt ioaddr->status_addr = base + (ATA_REG_STATUS << 4); 994*88358ab0SBenjamin Herrenschmidt ioaddr->command_addr = base + (ATA_REG_CMD << 4); 995*88358ab0SBenjamin Herrenschmidt ioaddr->altstatus_addr = base + 0x160; 996*88358ab0SBenjamin Herrenschmidt ioaddr->ctl_addr = base + 0x160; 997*88358ab0SBenjamin Herrenschmidt ioaddr->bmdma_addr = dma; 998*88358ab0SBenjamin Herrenschmidt } 999*88358ab0SBenjamin Herrenschmidt 1000*88358ab0SBenjamin Herrenschmidt static void __devinit pmac_macio_calc_timing_masks(struct pata_macio_priv *priv, 1001*88358ab0SBenjamin Herrenschmidt struct ata_port_info *pinfo) 1002*88358ab0SBenjamin Herrenschmidt { 1003*88358ab0SBenjamin Herrenschmidt int i = 0; 1004*88358ab0SBenjamin Herrenschmidt 1005*88358ab0SBenjamin Herrenschmidt pinfo->pio_mask = 0; 1006*88358ab0SBenjamin Herrenschmidt pinfo->mwdma_mask = 0; 1007*88358ab0SBenjamin Herrenschmidt pinfo->udma_mask = 0; 1008*88358ab0SBenjamin Herrenschmidt 1009*88358ab0SBenjamin Herrenschmidt while (priv->timings[i].mode > 0) { 1010*88358ab0SBenjamin Herrenschmidt unsigned int mask = 1U << (priv->timings[i].mode & 0x0f); 1011*88358ab0SBenjamin Herrenschmidt switch(priv->timings[i].mode & 0xf0) { 1012*88358ab0SBenjamin Herrenschmidt case 0x00: /* PIO */ 1013*88358ab0SBenjamin Herrenschmidt pinfo->pio_mask |= (mask >> 8); 1014*88358ab0SBenjamin Herrenschmidt break; 1015*88358ab0SBenjamin Herrenschmidt case 0x20: /* MWDMA */ 1016*88358ab0SBenjamin Herrenschmidt pinfo->mwdma_mask |= mask; 1017*88358ab0SBenjamin Herrenschmidt break; 1018*88358ab0SBenjamin Herrenschmidt case 0x40: /* UDMA */ 1019*88358ab0SBenjamin Herrenschmidt pinfo->udma_mask |= mask; 1020*88358ab0SBenjamin Herrenschmidt break; 1021*88358ab0SBenjamin Herrenschmidt } 1022*88358ab0SBenjamin Herrenschmidt i++; 1023*88358ab0SBenjamin Herrenschmidt } 1024*88358ab0SBenjamin Herrenschmidt dev_dbg(priv->dev, "Supported masks: PIO=%lx, MWDMA=%lx, UDMA=%lx\n", 1025*88358ab0SBenjamin Herrenschmidt pinfo->pio_mask, pinfo->mwdma_mask, pinfo->udma_mask); 1026*88358ab0SBenjamin Herrenschmidt } 1027*88358ab0SBenjamin Herrenschmidt 1028*88358ab0SBenjamin Herrenschmidt static int __devinit pata_macio_common_init(struct pata_macio_priv *priv, 1029*88358ab0SBenjamin Herrenschmidt resource_size_t tfregs, 1030*88358ab0SBenjamin Herrenschmidt resource_size_t dmaregs, 1031*88358ab0SBenjamin Herrenschmidt resource_size_t fcregs, 1032*88358ab0SBenjamin Herrenschmidt unsigned long irq) 1033*88358ab0SBenjamin Herrenschmidt { 1034*88358ab0SBenjamin Herrenschmidt struct ata_port_info pinfo; 1035*88358ab0SBenjamin Herrenschmidt const struct ata_port_info *ppi[] = { &pinfo, NULL }; 1036*88358ab0SBenjamin Herrenschmidt void __iomem *dma_regs = NULL; 1037*88358ab0SBenjamin Herrenschmidt 1038*88358ab0SBenjamin Herrenschmidt /* Fill up privates with various invariants collected from the 1039*88358ab0SBenjamin Herrenschmidt * device-tree 1040*88358ab0SBenjamin Herrenschmidt */ 1041*88358ab0SBenjamin Herrenschmidt pata_macio_invariants(priv); 1042*88358ab0SBenjamin Herrenschmidt 1043*88358ab0SBenjamin Herrenschmidt /* Make sure we have sane initial timings in the cache */ 1044*88358ab0SBenjamin Herrenschmidt pata_macio_default_timings(priv); 1045*88358ab0SBenjamin Herrenschmidt 1046*88358ab0SBenjamin Herrenschmidt /* Not sure what the real max is but we know it's less than 64K, let's 1047*88358ab0SBenjamin Herrenschmidt * use 64K minus 256 1048*88358ab0SBenjamin Herrenschmidt */ 1049*88358ab0SBenjamin Herrenschmidt dma_set_max_seg_size(priv->dev, MAX_DBDMA_SEG); 1050*88358ab0SBenjamin Herrenschmidt 1051*88358ab0SBenjamin Herrenschmidt /* Allocate libata host for 1 port */ 1052*88358ab0SBenjamin Herrenschmidt memset(&pinfo, 0, sizeof(struct ata_port_info)); 1053*88358ab0SBenjamin Herrenschmidt pmac_macio_calc_timing_masks(priv, &pinfo); 1054*88358ab0SBenjamin Herrenschmidt pinfo.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_MMIO | 1055*88358ab0SBenjamin Herrenschmidt ATA_FLAG_NO_LEGACY; 1056*88358ab0SBenjamin Herrenschmidt pinfo.port_ops = &pata_macio_ops; 1057*88358ab0SBenjamin Herrenschmidt pinfo.private_data = priv; 1058*88358ab0SBenjamin Herrenschmidt 1059*88358ab0SBenjamin Herrenschmidt priv->host = ata_host_alloc_pinfo(priv->dev, ppi, 1); 1060*88358ab0SBenjamin Herrenschmidt if (priv->host == NULL) { 1061*88358ab0SBenjamin Herrenschmidt dev_err(priv->dev, "Failed to allocate ATA port structure\n"); 1062*88358ab0SBenjamin Herrenschmidt return -ENOMEM; 1063*88358ab0SBenjamin Herrenschmidt } 1064*88358ab0SBenjamin Herrenschmidt 1065*88358ab0SBenjamin Herrenschmidt /* Setup the private data in host too */ 1066*88358ab0SBenjamin Herrenschmidt priv->host->private_data = priv; 1067*88358ab0SBenjamin Herrenschmidt 1068*88358ab0SBenjamin Herrenschmidt /* Map base registers */ 1069*88358ab0SBenjamin Herrenschmidt priv->tfregs = devm_ioremap(priv->dev, tfregs, 0x100); 1070*88358ab0SBenjamin Herrenschmidt if (priv->tfregs == NULL) { 1071*88358ab0SBenjamin Herrenschmidt dev_err(priv->dev, "Failed to map ATA ports\n"); 1072*88358ab0SBenjamin Herrenschmidt return -ENOMEM; 1073*88358ab0SBenjamin Herrenschmidt } 1074*88358ab0SBenjamin Herrenschmidt priv->host->iomap = &priv->tfregs; 1075*88358ab0SBenjamin Herrenschmidt 1076*88358ab0SBenjamin Herrenschmidt /* Map DMA regs */ 1077*88358ab0SBenjamin Herrenschmidt if (dmaregs != 0) { 1078*88358ab0SBenjamin Herrenschmidt dma_regs = devm_ioremap(priv->dev, dmaregs, 1079*88358ab0SBenjamin Herrenschmidt sizeof(struct dbdma_regs)); 1080*88358ab0SBenjamin Herrenschmidt if (dma_regs == NULL) 1081*88358ab0SBenjamin Herrenschmidt dev_warn(priv->dev, "Failed to map ATA DMA registers\n"); 1082*88358ab0SBenjamin Herrenschmidt } 1083*88358ab0SBenjamin Herrenschmidt 1084*88358ab0SBenjamin Herrenschmidt /* If chip has local feature control, map those regs too */ 1085*88358ab0SBenjamin Herrenschmidt if (fcregs != 0) { 1086*88358ab0SBenjamin Herrenschmidt priv->kauai_fcr = devm_ioremap(priv->dev, fcregs, 4); 1087*88358ab0SBenjamin Herrenschmidt if (priv->kauai_fcr == NULL) { 1088*88358ab0SBenjamin Herrenschmidt dev_err(priv->dev, "Failed to map ATA FCR register\n"); 1089*88358ab0SBenjamin Herrenschmidt return -ENOMEM; 1090*88358ab0SBenjamin Herrenschmidt } 1091*88358ab0SBenjamin Herrenschmidt } 1092*88358ab0SBenjamin Herrenschmidt 1093*88358ab0SBenjamin Herrenschmidt /* Setup port data structure */ 1094*88358ab0SBenjamin Herrenschmidt pata_macio_setup_ios(&priv->host->ports[0]->ioaddr, 1095*88358ab0SBenjamin Herrenschmidt priv->tfregs, dma_regs); 1096*88358ab0SBenjamin Herrenschmidt priv->host->ports[0]->private_data = priv; 1097*88358ab0SBenjamin Herrenschmidt 1098*88358ab0SBenjamin Herrenschmidt /* hard-reset the controller */ 1099*88358ab0SBenjamin Herrenschmidt pata_macio_reset_hw(priv, 0); 1100*88358ab0SBenjamin Herrenschmidt pata_macio_apply_timings(priv->host->ports[0], 0); 1101*88358ab0SBenjamin Herrenschmidt 1102*88358ab0SBenjamin Herrenschmidt /* Enable bus master if necessary */ 1103*88358ab0SBenjamin Herrenschmidt if (priv->pdev && dma_regs) 1104*88358ab0SBenjamin Herrenschmidt pci_set_master(priv->pdev); 1105*88358ab0SBenjamin Herrenschmidt 1106*88358ab0SBenjamin Herrenschmidt dev_info(priv->dev, "Activating pata-macio chipset %s, Apple bus ID %d\n", 1107*88358ab0SBenjamin Herrenschmidt macio_ata_names[priv->kind], priv->aapl_bus_id); 1108*88358ab0SBenjamin Herrenschmidt 1109*88358ab0SBenjamin Herrenschmidt /* Start it up */ 1110*88358ab0SBenjamin Herrenschmidt priv->irq = irq; 1111*88358ab0SBenjamin Herrenschmidt return ata_host_activate(priv->host, irq, ata_sff_interrupt, 0, 1112*88358ab0SBenjamin Herrenschmidt &pata_macio_sht); 1113*88358ab0SBenjamin Herrenschmidt } 1114*88358ab0SBenjamin Herrenschmidt 1115*88358ab0SBenjamin Herrenschmidt static int __devinit pata_macio_attach(struct macio_dev *mdev, 1116*88358ab0SBenjamin Herrenschmidt const struct of_device_id *match) 1117*88358ab0SBenjamin Herrenschmidt { 1118*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv; 1119*88358ab0SBenjamin Herrenschmidt resource_size_t tfregs, dmaregs = 0; 1120*88358ab0SBenjamin Herrenschmidt unsigned long irq; 1121*88358ab0SBenjamin Herrenschmidt int rc; 1122*88358ab0SBenjamin Herrenschmidt 1123*88358ab0SBenjamin Herrenschmidt /* Check for broken device-trees */ 1124*88358ab0SBenjamin Herrenschmidt if (macio_resource_count(mdev) == 0) { 1125*88358ab0SBenjamin Herrenschmidt dev_err(&mdev->ofdev.dev, 1126*88358ab0SBenjamin Herrenschmidt "No addresses for controller\n"); 1127*88358ab0SBenjamin Herrenschmidt return -ENXIO; 1128*88358ab0SBenjamin Herrenschmidt } 1129*88358ab0SBenjamin Herrenschmidt 1130*88358ab0SBenjamin Herrenschmidt /* Enable managed resources */ 1131*88358ab0SBenjamin Herrenschmidt macio_enable_devres(mdev); 1132*88358ab0SBenjamin Herrenschmidt 1133*88358ab0SBenjamin Herrenschmidt /* Allocate and init private data structure */ 1134*88358ab0SBenjamin Herrenschmidt priv = devm_kzalloc(&mdev->ofdev.dev, 1135*88358ab0SBenjamin Herrenschmidt sizeof(struct pata_macio_priv), GFP_KERNEL); 1136*88358ab0SBenjamin Herrenschmidt if (priv == NULL) { 1137*88358ab0SBenjamin Herrenschmidt dev_err(&mdev->ofdev.dev, 1138*88358ab0SBenjamin Herrenschmidt "Failed to allocate private memory\n"); 1139*88358ab0SBenjamin Herrenschmidt return -ENOMEM; 1140*88358ab0SBenjamin Herrenschmidt } 1141*88358ab0SBenjamin Herrenschmidt priv->node = of_node_get(mdev->ofdev.node); 1142*88358ab0SBenjamin Herrenschmidt priv->mdev = mdev; 1143*88358ab0SBenjamin Herrenschmidt priv->dev = &mdev->ofdev.dev; 1144*88358ab0SBenjamin Herrenschmidt 1145*88358ab0SBenjamin Herrenschmidt /* Request memory resource for taskfile registers */ 1146*88358ab0SBenjamin Herrenschmidt if (macio_request_resource(mdev, 0, "pata-macio")) { 1147*88358ab0SBenjamin Herrenschmidt dev_err(&mdev->ofdev.dev, 1148*88358ab0SBenjamin Herrenschmidt "Cannot obtain taskfile resource\n"); 1149*88358ab0SBenjamin Herrenschmidt return -EBUSY; 1150*88358ab0SBenjamin Herrenschmidt } 1151*88358ab0SBenjamin Herrenschmidt tfregs = macio_resource_start(mdev, 0); 1152*88358ab0SBenjamin Herrenschmidt 1153*88358ab0SBenjamin Herrenschmidt /* Request resources for DMA registers if any */ 1154*88358ab0SBenjamin Herrenschmidt if (macio_resource_count(mdev) >= 2) { 1155*88358ab0SBenjamin Herrenschmidt if (macio_request_resource(mdev, 1, "pata-macio-dma")) 1156*88358ab0SBenjamin Herrenschmidt dev_err(&mdev->ofdev.dev, 1157*88358ab0SBenjamin Herrenschmidt "Cannot obtain DMA resource\n"); 1158*88358ab0SBenjamin Herrenschmidt else 1159*88358ab0SBenjamin Herrenschmidt dmaregs = macio_resource_start(mdev, 1); 1160*88358ab0SBenjamin Herrenschmidt } 1161*88358ab0SBenjamin Herrenschmidt 1162*88358ab0SBenjamin Herrenschmidt /* 1163*88358ab0SBenjamin Herrenschmidt * Fixup missing IRQ for some old implementations with broken 1164*88358ab0SBenjamin Herrenschmidt * device-trees. 1165*88358ab0SBenjamin Herrenschmidt * 1166*88358ab0SBenjamin Herrenschmidt * This is a bit bogus, it should be fixed in the device-tree itself, 1167*88358ab0SBenjamin Herrenschmidt * via the existing macio fixups, based on the type of interrupt 1168*88358ab0SBenjamin Herrenschmidt * controller in the machine. However, I have no test HW for this case, 1169*88358ab0SBenjamin Herrenschmidt * and this trick works well enough on those old machines... 1170*88358ab0SBenjamin Herrenschmidt */ 1171*88358ab0SBenjamin Herrenschmidt if (macio_irq_count(mdev) == 0) { 1172*88358ab0SBenjamin Herrenschmidt dev_warn(&mdev->ofdev.dev, 1173*88358ab0SBenjamin Herrenschmidt "No interrupts for controller, using 13\n"); 1174*88358ab0SBenjamin Herrenschmidt irq = irq_create_mapping(NULL, 13); 1175*88358ab0SBenjamin Herrenschmidt } else 1176*88358ab0SBenjamin Herrenschmidt irq = macio_irq(mdev, 0); 1177*88358ab0SBenjamin Herrenschmidt 1178*88358ab0SBenjamin Herrenschmidt /* Prevvent media bay callbacks until fully registered */ 1179*88358ab0SBenjamin Herrenschmidt lock_media_bay(priv->mdev->media_bay); 1180*88358ab0SBenjamin Herrenschmidt 1181*88358ab0SBenjamin Herrenschmidt /* Get register addresses and call common initialization */ 1182*88358ab0SBenjamin Herrenschmidt rc = pata_macio_common_init(priv, 1183*88358ab0SBenjamin Herrenschmidt tfregs, /* Taskfile regs */ 1184*88358ab0SBenjamin Herrenschmidt dmaregs, /* DBDMA regs */ 1185*88358ab0SBenjamin Herrenschmidt 0, /* Feature control */ 1186*88358ab0SBenjamin Herrenschmidt irq); 1187*88358ab0SBenjamin Herrenschmidt unlock_media_bay(priv->mdev->media_bay); 1188*88358ab0SBenjamin Herrenschmidt 1189*88358ab0SBenjamin Herrenschmidt return rc; 1190*88358ab0SBenjamin Herrenschmidt } 1191*88358ab0SBenjamin Herrenschmidt 1192*88358ab0SBenjamin Herrenschmidt static int __devexit pata_macio_detach(struct macio_dev *mdev) 1193*88358ab0SBenjamin Herrenschmidt { 1194*88358ab0SBenjamin Herrenschmidt struct ata_host *host = macio_get_drvdata(mdev); 1195*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv = host->private_data; 1196*88358ab0SBenjamin Herrenschmidt 1197*88358ab0SBenjamin Herrenschmidt lock_media_bay(priv->mdev->media_bay); 1198*88358ab0SBenjamin Herrenschmidt 1199*88358ab0SBenjamin Herrenschmidt /* Make sure the mediabay callback doesn't try to access 1200*88358ab0SBenjamin Herrenschmidt * dead stuff 1201*88358ab0SBenjamin Herrenschmidt */ 1202*88358ab0SBenjamin Herrenschmidt priv->host->private_data = NULL; 1203*88358ab0SBenjamin Herrenschmidt 1204*88358ab0SBenjamin Herrenschmidt ata_host_detach(host); 1205*88358ab0SBenjamin Herrenschmidt 1206*88358ab0SBenjamin Herrenschmidt unlock_media_bay(priv->mdev->media_bay); 1207*88358ab0SBenjamin Herrenschmidt 1208*88358ab0SBenjamin Herrenschmidt return 0; 1209*88358ab0SBenjamin Herrenschmidt } 1210*88358ab0SBenjamin Herrenschmidt 1211*88358ab0SBenjamin Herrenschmidt #ifdef CONFIG_PM 1212*88358ab0SBenjamin Herrenschmidt 1213*88358ab0SBenjamin Herrenschmidt static int pata_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) 1214*88358ab0SBenjamin Herrenschmidt { 1215*88358ab0SBenjamin Herrenschmidt struct ata_host *host = macio_get_drvdata(mdev); 1216*88358ab0SBenjamin Herrenschmidt 1217*88358ab0SBenjamin Herrenschmidt return pata_macio_do_suspend(host->private_data, mesg); 1218*88358ab0SBenjamin Herrenschmidt } 1219*88358ab0SBenjamin Herrenschmidt 1220*88358ab0SBenjamin Herrenschmidt static int pata_macio_resume(struct macio_dev *mdev) 1221*88358ab0SBenjamin Herrenschmidt { 1222*88358ab0SBenjamin Herrenschmidt struct ata_host *host = macio_get_drvdata(mdev); 1223*88358ab0SBenjamin Herrenschmidt 1224*88358ab0SBenjamin Herrenschmidt return pata_macio_do_resume(host->private_data); 1225*88358ab0SBenjamin Herrenschmidt } 1226*88358ab0SBenjamin Herrenschmidt 1227*88358ab0SBenjamin Herrenschmidt #endif /* CONFIG_PM */ 1228*88358ab0SBenjamin Herrenschmidt 1229*88358ab0SBenjamin Herrenschmidt #ifdef CONFIG_PMAC_MEDIABAY 1230*88358ab0SBenjamin Herrenschmidt static void pata_macio_mb_event(struct macio_dev* mdev, int mb_state) 1231*88358ab0SBenjamin Herrenschmidt { 1232*88358ab0SBenjamin Herrenschmidt struct ata_host *host = macio_get_drvdata(mdev); 1233*88358ab0SBenjamin Herrenschmidt struct ata_port *ap; 1234*88358ab0SBenjamin Herrenschmidt struct ata_eh_info *ehi; 1235*88358ab0SBenjamin Herrenschmidt struct ata_device *dev; 1236*88358ab0SBenjamin Herrenschmidt unsigned long flags; 1237*88358ab0SBenjamin Herrenschmidt 1238*88358ab0SBenjamin Herrenschmidt if (!host || !host->private_data) 1239*88358ab0SBenjamin Herrenschmidt return; 1240*88358ab0SBenjamin Herrenschmidt ap = host->ports[0]; 1241*88358ab0SBenjamin Herrenschmidt spin_lock_irqsave(ap->lock, flags); 1242*88358ab0SBenjamin Herrenschmidt ehi = &ap->link.eh_info; 1243*88358ab0SBenjamin Herrenschmidt if (mb_state == MB_CD) { 1244*88358ab0SBenjamin Herrenschmidt ata_ehi_push_desc(ehi, "mediabay plug"); 1245*88358ab0SBenjamin Herrenschmidt ata_ehi_hotplugged(ehi); 1246*88358ab0SBenjamin Herrenschmidt ata_port_freeze(ap); 1247*88358ab0SBenjamin Herrenschmidt } else { 1248*88358ab0SBenjamin Herrenschmidt ata_ehi_push_desc(ehi, "mediabay unplug"); 1249*88358ab0SBenjamin Herrenschmidt ata_for_each_dev(dev, &ap->link, ALL) 1250*88358ab0SBenjamin Herrenschmidt dev->flags |= ATA_DFLAG_DETACH; 1251*88358ab0SBenjamin Herrenschmidt ata_port_abort(ap); 1252*88358ab0SBenjamin Herrenschmidt } 1253*88358ab0SBenjamin Herrenschmidt spin_unlock_irqrestore(ap->lock, flags); 1254*88358ab0SBenjamin Herrenschmidt 1255*88358ab0SBenjamin Herrenschmidt } 1256*88358ab0SBenjamin Herrenschmidt #endif /* CONFIG_PMAC_MEDIABAY */ 1257*88358ab0SBenjamin Herrenschmidt 1258*88358ab0SBenjamin Herrenschmidt 1259*88358ab0SBenjamin Herrenschmidt static int __devinit pata_macio_pci_attach(struct pci_dev *pdev, 1260*88358ab0SBenjamin Herrenschmidt const struct pci_device_id *id) 1261*88358ab0SBenjamin Herrenschmidt { 1262*88358ab0SBenjamin Herrenschmidt struct pata_macio_priv *priv; 1263*88358ab0SBenjamin Herrenschmidt struct device_node *np; 1264*88358ab0SBenjamin Herrenschmidt resource_size_t rbase; 1265*88358ab0SBenjamin Herrenschmidt 1266*88358ab0SBenjamin Herrenschmidt /* We cannot use a MacIO controller without its OF device node */ 1267*88358ab0SBenjamin Herrenschmidt np = pci_device_to_OF_node(pdev); 1268*88358ab0SBenjamin Herrenschmidt if (np == NULL) { 1269*88358ab0SBenjamin Herrenschmidt dev_err(&pdev->dev, 1270*88358ab0SBenjamin Herrenschmidt "Cannot find OF device node for controller\n"); 1271*88358ab0SBenjamin Herrenschmidt return -ENODEV; 1272*88358ab0SBenjamin Herrenschmidt } 1273*88358ab0SBenjamin Herrenschmidt 1274*88358ab0SBenjamin Herrenschmidt /* Check that it can be enabled */ 1275*88358ab0SBenjamin Herrenschmidt if (pcim_enable_device(pdev)) { 1276*88358ab0SBenjamin Herrenschmidt dev_err(&pdev->dev, 1277*88358ab0SBenjamin Herrenschmidt "Cannot enable controller PCI device\n"); 1278*88358ab0SBenjamin Herrenschmidt return -ENXIO; 1279*88358ab0SBenjamin Herrenschmidt } 1280*88358ab0SBenjamin Herrenschmidt 1281*88358ab0SBenjamin Herrenschmidt /* Allocate and init private data structure */ 1282*88358ab0SBenjamin Herrenschmidt priv = devm_kzalloc(&pdev->dev, 1283*88358ab0SBenjamin Herrenschmidt sizeof(struct pata_macio_priv), GFP_KERNEL); 1284*88358ab0SBenjamin Herrenschmidt if (priv == NULL) { 1285*88358ab0SBenjamin Herrenschmidt dev_err(&pdev->dev, 1286*88358ab0SBenjamin Herrenschmidt "Failed to allocate private memory\n"); 1287*88358ab0SBenjamin Herrenschmidt return -ENOMEM; 1288*88358ab0SBenjamin Herrenschmidt } 1289*88358ab0SBenjamin Herrenschmidt priv->node = of_node_get(np); 1290*88358ab0SBenjamin Herrenschmidt priv->pdev = pdev; 1291*88358ab0SBenjamin Herrenschmidt priv->dev = &pdev->dev; 1292*88358ab0SBenjamin Herrenschmidt 1293*88358ab0SBenjamin Herrenschmidt /* Get MMIO regions */ 1294*88358ab0SBenjamin Herrenschmidt if (pci_request_regions(pdev, "pata-macio")) { 1295*88358ab0SBenjamin Herrenschmidt dev_err(&pdev->dev, 1296*88358ab0SBenjamin Herrenschmidt "Cannot obtain PCI resources\n"); 1297*88358ab0SBenjamin Herrenschmidt return -EBUSY; 1298*88358ab0SBenjamin Herrenschmidt } 1299*88358ab0SBenjamin Herrenschmidt 1300*88358ab0SBenjamin Herrenschmidt /* Get register addresses and call common initialization */ 1301*88358ab0SBenjamin Herrenschmidt rbase = pci_resource_start(pdev, 0); 1302*88358ab0SBenjamin Herrenschmidt if (pata_macio_common_init(priv, 1303*88358ab0SBenjamin Herrenschmidt rbase + 0x2000, /* Taskfile regs */ 1304*88358ab0SBenjamin Herrenschmidt rbase + 0x1000, /* DBDMA regs */ 1305*88358ab0SBenjamin Herrenschmidt rbase, /* Feature control */ 1306*88358ab0SBenjamin Herrenschmidt pdev->irq)) 1307*88358ab0SBenjamin Herrenschmidt return -ENXIO; 1308*88358ab0SBenjamin Herrenschmidt 1309*88358ab0SBenjamin Herrenschmidt return 0; 1310*88358ab0SBenjamin Herrenschmidt } 1311*88358ab0SBenjamin Herrenschmidt 1312*88358ab0SBenjamin Herrenschmidt static void __devexit pata_macio_pci_detach(struct pci_dev *pdev) 1313*88358ab0SBenjamin Herrenschmidt { 1314*88358ab0SBenjamin Herrenschmidt struct ata_host *host = dev_get_drvdata(&pdev->dev); 1315*88358ab0SBenjamin Herrenschmidt 1316*88358ab0SBenjamin Herrenschmidt ata_host_detach(host); 1317*88358ab0SBenjamin Herrenschmidt } 1318*88358ab0SBenjamin Herrenschmidt 1319*88358ab0SBenjamin Herrenschmidt #ifdef CONFIG_PM 1320*88358ab0SBenjamin Herrenschmidt 1321*88358ab0SBenjamin Herrenschmidt static int pata_macio_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) 1322*88358ab0SBenjamin Herrenschmidt { 1323*88358ab0SBenjamin Herrenschmidt struct ata_host *host = dev_get_drvdata(&pdev->dev); 1324*88358ab0SBenjamin Herrenschmidt 1325*88358ab0SBenjamin Herrenschmidt return pata_macio_do_suspend(host->private_data, mesg); 1326*88358ab0SBenjamin Herrenschmidt } 1327*88358ab0SBenjamin Herrenschmidt 1328*88358ab0SBenjamin Herrenschmidt static int pata_macio_pci_resume(struct pci_dev *pdev) 1329*88358ab0SBenjamin Herrenschmidt { 1330*88358ab0SBenjamin Herrenschmidt struct ata_host *host = dev_get_drvdata(&pdev->dev); 1331*88358ab0SBenjamin Herrenschmidt 1332*88358ab0SBenjamin Herrenschmidt return pata_macio_do_resume(host->private_data); 1333*88358ab0SBenjamin Herrenschmidt } 1334*88358ab0SBenjamin Herrenschmidt 1335*88358ab0SBenjamin Herrenschmidt #endif /* CONFIG_PM */ 1336*88358ab0SBenjamin Herrenschmidt 1337*88358ab0SBenjamin Herrenschmidt static struct of_device_id pata_macio_match[] = 1338*88358ab0SBenjamin Herrenschmidt { 1339*88358ab0SBenjamin Herrenschmidt { 1340*88358ab0SBenjamin Herrenschmidt .name = "IDE", 1341*88358ab0SBenjamin Herrenschmidt }, 1342*88358ab0SBenjamin Herrenschmidt { 1343*88358ab0SBenjamin Herrenschmidt .name = "ATA", 1344*88358ab0SBenjamin Herrenschmidt }, 1345*88358ab0SBenjamin Herrenschmidt { 1346*88358ab0SBenjamin Herrenschmidt .type = "ide", 1347*88358ab0SBenjamin Herrenschmidt }, 1348*88358ab0SBenjamin Herrenschmidt { 1349*88358ab0SBenjamin Herrenschmidt .type = "ata", 1350*88358ab0SBenjamin Herrenschmidt }, 1351*88358ab0SBenjamin Herrenschmidt {}, 1352*88358ab0SBenjamin Herrenschmidt }; 1353*88358ab0SBenjamin Herrenschmidt 1354*88358ab0SBenjamin Herrenschmidt static struct macio_driver pata_macio_driver = 1355*88358ab0SBenjamin Herrenschmidt { 1356*88358ab0SBenjamin Herrenschmidt .name = "pata-macio", 1357*88358ab0SBenjamin Herrenschmidt .match_table = pata_macio_match, 1358*88358ab0SBenjamin Herrenschmidt .probe = pata_macio_attach, 1359*88358ab0SBenjamin Herrenschmidt .remove = pata_macio_detach, 1360*88358ab0SBenjamin Herrenschmidt #ifdef CONFIG_PM 1361*88358ab0SBenjamin Herrenschmidt .suspend = pata_macio_suspend, 1362*88358ab0SBenjamin Herrenschmidt .resume = pata_macio_resume, 1363*88358ab0SBenjamin Herrenschmidt #endif 1364*88358ab0SBenjamin Herrenschmidt #ifdef CONFIG_PMAC_MEDIABAY 1365*88358ab0SBenjamin Herrenschmidt .mediabay_event = pata_macio_mb_event, 1366*88358ab0SBenjamin Herrenschmidt #endif 1367*88358ab0SBenjamin Herrenschmidt .driver = { 1368*88358ab0SBenjamin Herrenschmidt .owner = THIS_MODULE, 1369*88358ab0SBenjamin Herrenschmidt }, 1370*88358ab0SBenjamin Herrenschmidt }; 1371*88358ab0SBenjamin Herrenschmidt 1372*88358ab0SBenjamin Herrenschmidt static const struct pci_device_id pata_macio_pci_match[] = { 1373*88358ab0SBenjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_UNI_N_ATA), 0 }, 1374*88358ab0SBenjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_IPID_ATA100), 0 }, 1375*88358ab0SBenjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_K2_ATA100), 0 }, 1376*88358ab0SBenjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_SH_ATA), 0 }, 1377*88358ab0SBenjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_IPID2_ATA), 0 }, 1378*88358ab0SBenjamin Herrenschmidt {}, 1379*88358ab0SBenjamin Herrenschmidt }; 1380*88358ab0SBenjamin Herrenschmidt 1381*88358ab0SBenjamin Herrenschmidt static struct pci_driver pata_macio_pci_driver = { 1382*88358ab0SBenjamin Herrenschmidt .name = "pata-pci-macio", 1383*88358ab0SBenjamin Herrenschmidt .id_table = pata_macio_pci_match, 1384*88358ab0SBenjamin Herrenschmidt .probe = pata_macio_pci_attach, 1385*88358ab0SBenjamin Herrenschmidt .remove = pata_macio_pci_detach, 1386*88358ab0SBenjamin Herrenschmidt #ifdef CONFIG_PM 1387*88358ab0SBenjamin Herrenschmidt .suspend = pata_macio_pci_suspend, 1388*88358ab0SBenjamin Herrenschmidt .resume = pata_macio_pci_resume, 1389*88358ab0SBenjamin Herrenschmidt #endif 1390*88358ab0SBenjamin Herrenschmidt .driver = { 1391*88358ab0SBenjamin Herrenschmidt .owner = THIS_MODULE, 1392*88358ab0SBenjamin Herrenschmidt }, 1393*88358ab0SBenjamin Herrenschmidt }; 1394*88358ab0SBenjamin Herrenschmidt MODULE_DEVICE_TABLE(pci, pata_macio_pci_match); 1395*88358ab0SBenjamin Herrenschmidt 1396*88358ab0SBenjamin Herrenschmidt 1397*88358ab0SBenjamin Herrenschmidt static int __init pata_macio_init(void) 1398*88358ab0SBenjamin Herrenschmidt { 1399*88358ab0SBenjamin Herrenschmidt int rc; 1400*88358ab0SBenjamin Herrenschmidt 1401*88358ab0SBenjamin Herrenschmidt if (!machine_is(powermac)) 1402*88358ab0SBenjamin Herrenschmidt return -ENODEV; 1403*88358ab0SBenjamin Herrenschmidt 1404*88358ab0SBenjamin Herrenschmidt rc = pci_register_driver(&pata_macio_pci_driver); 1405*88358ab0SBenjamin Herrenschmidt if (rc) 1406*88358ab0SBenjamin Herrenschmidt return rc; 1407*88358ab0SBenjamin Herrenschmidt rc = macio_register_driver(&pata_macio_driver); 1408*88358ab0SBenjamin Herrenschmidt if (rc) { 1409*88358ab0SBenjamin Herrenschmidt pci_unregister_driver(&pata_macio_pci_driver); 1410*88358ab0SBenjamin Herrenschmidt return rc; 1411*88358ab0SBenjamin Herrenschmidt } 1412*88358ab0SBenjamin Herrenschmidt return 0; 1413*88358ab0SBenjamin Herrenschmidt } 1414*88358ab0SBenjamin Herrenschmidt 1415*88358ab0SBenjamin Herrenschmidt static void __exit pata_macio_exit(void) 1416*88358ab0SBenjamin Herrenschmidt { 1417*88358ab0SBenjamin Herrenschmidt macio_unregister_driver(&pata_macio_driver); 1418*88358ab0SBenjamin Herrenschmidt pci_unregister_driver(&pata_macio_pci_driver); 1419*88358ab0SBenjamin Herrenschmidt } 1420*88358ab0SBenjamin Herrenschmidt 1421*88358ab0SBenjamin Herrenschmidt module_init(pata_macio_init); 1422*88358ab0SBenjamin Herrenschmidt module_exit(pata_macio_exit); 1423*88358ab0SBenjamin Herrenschmidt 1424*88358ab0SBenjamin Herrenschmidt MODULE_AUTHOR("Benjamin Herrenschmidt"); 1425*88358ab0SBenjamin Herrenschmidt MODULE_DESCRIPTION("Apple MacIO PATA driver"); 1426*88358ab0SBenjamin Herrenschmidt MODULE_LICENSE("GPL"); 1427*88358ab0SBenjamin Herrenschmidt MODULE_VERSION(DRV_VERSION); 1428