pata_macio.c revision 88358ab08944da726e948d216977ad499dfc15c6
188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Libata based driver for Apple "macio" family of PATA controllers 388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Copyright 2008/2009 Benjamin Herrenschmidt, IBM Corp 588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * <benh@kernel.crashing.org> 688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Some bits and pieces from drivers/ide/ppc/pmac.c 888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 1088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 1188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#undef DEBUG 1288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#undef DEBUG_DMA 1388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 1488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/kernel.h> 1588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/module.h> 1688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/init.h> 1788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/blkdev.h> 1888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/ata.h> 1988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/libata.h> 2088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/adb.h> 2188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/pmu.h> 2288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/scatterlist.h> 2388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <linux/of.h> 2488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 2588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <scsi/scsi.h> 2688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <scsi/scsi_host.h> 2788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <scsi/scsi_device.h> 2888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 2988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <asm/macio.h> 3088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <asm/io.h> 3188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <asm/dbdma.h> 3288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <asm/pci-bridge.h> 3388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <asm/machdep.h> 3488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <asm/pmac_feature.h> 3588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#include <asm/mediabay.h> 3688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 3788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#ifdef DEBUG_DMA 3888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define dev_dbgdma(dev, format, arg...) \ 3988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_printk(KERN_DEBUG , dev , format , ## arg) 4088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#else 4188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define dev_dbgdma(dev, format, arg...) \ 4288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ({ if (0) dev_printk(KERN_DEBUG, dev, format, ##arg); 0; }) 4388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#endif 4488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 4588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define DRV_NAME "pata_macio" 4688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define DRV_VERSION "0.9" 4788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 4888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* Models of macio ATA controller */ 4988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtenum { 5088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt controller_ohare, /* OHare based */ 5188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt controller_heathrow, /* Heathrow/Paddington */ 5288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt controller_kl_ata3, /* KeyLargo ATA-3 */ 5388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt controller_kl_ata4, /* KeyLargo ATA-4 */ 5488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt controller_un_ata6, /* UniNorth2 ATA-6 */ 5588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt controller_k2_ata6, /* K2 ATA-6 */ 5688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt controller_sh_ata6, /* Shasta ATA-6 */ 5788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 5888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 5988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const char* macio_ata_names[] = { 6088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "OHare ATA", /* OHare based */ 6188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Heathrow ATA", /* Heathrow/Paddington */ 6288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "KeyLargo ATA-3", /* KeyLargo ATA-3 (MDMA only) */ 6388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "KeyLargo ATA-4", /* KeyLargo ATA-4 (UDMA/66) */ 6488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "UniNorth ATA-6", /* UniNorth2 ATA-6 (UDMA/100) */ 6588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "K2 ATA-6", /* K2 ATA-6 (UDMA/100) */ 6688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Shasta ATA-6", /* Shasta ATA-6 (UDMA/133) */ 6788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 6888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 6988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 7088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Extra registers, both 32-bit little-endian 7188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 7288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_TIMING_CONFIG 0x200 7388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_INTERRUPT 0x300 7488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 7588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* Kauai (U2) ATA has different register setup */ 7688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_KAUAI_PIO_CONFIG 0x200 7788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_KAUAI_ULTRA_CONFIG 0x210 7888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_KAUAI_POLL_CONFIG 0x220 7988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 8088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 8188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Timing configuration register definitions 8288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 8388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 8488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* Number of IDE_SYSCLK_NS ticks, argument is in nanoseconds */ 8588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define SYSCLK_TICKS(t) (((t) + IDE_SYSCLK_NS - 1) / IDE_SYSCLK_NS) 8688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define SYSCLK_TICKS_66(t) (((t) + IDE_SYSCLK_66_NS - 1) / IDE_SYSCLK_66_NS) 8788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_SYSCLK_NS 30 /* 33Mhz cell */ 8888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_SYSCLK_66_NS 15 /* 66Mhz cell */ 8988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 9088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 133Mhz cell, found in shasta. 9188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * See comments about 100 Mhz Uninorth 2... 9288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Note that PIO_MASK and MDMA_MASK seem to overlap, that's just 9388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * weird and I don't now why .. at this stage 9488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 9588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_133_PIOREG_PIO_MASK 0xff000fff 9688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_133_PIOREG_MDMA_MASK 0x00fff800 9788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_133_UDMAREG_UDMA_MASK 0x0003ffff 9888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_133_UDMAREG_UDMA_EN 0x00000001 9988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 10088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 100Mhz cell, found in Uninorth 2 and K2. It appears as a pci device 10188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * (106b/0033) on uninorth or K2 internal PCI bus and it's clock is 10288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * controlled like gem or fw. It appears to be an evolution of keylargo 10388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * ATA4 with a timing register extended to 2x32bits registers (one 10488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * for PIO & MWDMA and one for UDMA, and a similar DBDMA channel. 10588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * It has it's own local feature control register as well. 10688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 10788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * After scratching my mind over the timing values, at least for PIO 10888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * and MDMA, I think I've figured the format of the timing register, 10988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * though I use pre-calculated tables for UDMA as usual... 11088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 11188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_PIO_ADDRSETUP_MASK 0xff000000 /* Size of field unknown */ 11288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_PIO_ADDRSETUP_SHIFT 24 11388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_MDMA_MASK 0x00fff000 11488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_MDMA_RECOVERY_MASK 0x00fc0000 11588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_MDMA_RECOVERY_SHIFT 18 11688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_MDMA_ACCESS_MASK 0x0003f000 11788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_MDMA_ACCESS_SHIFT 12 11888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_PIO_MASK 0xff000fff 11988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_PIO_RECOVERY_MASK 0x00000fc0 12088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_PIO_RECOVERY_SHIFT 6 12188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_PIO_ACCESS_MASK 0x0000003f 12288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_PIO_ACCESS_SHIFT 0 12388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 12488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_UDMAREG_UDMA_MASK 0x0000ffff 12588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_100_UDMAREG_UDMA_EN 0x00000001 12688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 12788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 12888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 66Mhz cell, found in KeyLargo. Can do ultra mode 0 to 2 on 12988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 40 connector cable and to 4 on 80 connector one. 13088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Clock unit is 15ns (66Mhz) 13188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 13288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 3 Values can be programmed: 13388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * - Write data setup, which appears to match the cycle time. They 13488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * also call it DIOW setup. 13588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * - Ready to pause time (from spec) 13688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * - Address setup. That one is weird. I don't see where exactly 13788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * it fits in UDMA cycles, I got it's name from an obscure piece 13888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * of commented out code in Darwin. They leave it to 0, we do as 13988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * well, despite a comment that would lead to think it has a 14088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * min value of 45ns. 14188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Apple also add 60ns to the write data setup (or cycle time ?) on 14288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * reads. 14388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 14488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_UDMA_MASK 0xfff00000 14588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_UDMA_EN 0x00100000 /* Enable Ultra mode for DMA */ 14688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_PIO_ADDRSETUP_MASK 0xe0000000 /* Address setup */ 14788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_PIO_ADDRSETUP_SHIFT 29 14888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_UDMA_RDY2PAUS_MASK 0x1e000000 /* Ready 2 pause time */ 14988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_UDMA_RDY2PAUS_SHIFT 25 15088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_UDMA_WRDATASETUP_MASK 0x01e00000 /* Write data setup time */ 15188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_UDMA_WRDATASETUP_SHIFT 21 15288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_MDMA_MASK 0x000ffc00 15388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_MDMA_RECOVERY_MASK 0x000f8000 15488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_MDMA_RECOVERY_SHIFT 15 15588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_MDMA_ACCESS_MASK 0x00007c00 15688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_MDMA_ACCESS_SHIFT 10 15788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_PIO_MASK 0xe00003ff 15888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_PIO_RECOVERY_MASK 0x000003e0 15988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_PIO_RECOVERY_SHIFT 5 16088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_PIO_ACCESS_MASK 0x0000001f 16188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_66_PIO_ACCESS_SHIFT 0 16288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 16388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 33Mhz cell, found in OHare, Heathrow (& Paddington) and KeyLargo 16488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Can do pio & mdma modes, clock unit is 30ns (33Mhz) 16588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 16688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * The access time and recovery time can be programmed. Some older 16788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Darwin code base limit OHare to 150ns cycle time. I decided to do 16888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * the same here fore safety against broken old hardware ;) 16988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * The HalfTick bit, when set, adds half a clock (15ns) to the access 17088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * time and removes one from recovery. It's not supported on KeyLargo 17188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * implementation afaik. The E bit appears to be set for PIO mode 0 and 17288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * is used to reach long timings used in this mode. 17388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 17488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_MDMA_MASK 0x003ff800 17588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_MDMA_RECOVERY_MASK 0x001f0000 17688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_MDMA_RECOVERY_SHIFT 16 17788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_MDMA_ACCESS_MASK 0x0000f800 17888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_MDMA_ACCESS_SHIFT 11 17988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_MDMA_HALFTICK 0x00200000 18088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_PIO_MASK 0x000007ff 18188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_PIO_E 0x00000400 18288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_PIO_RECOVERY_MASK 0x000003e0 18388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_PIO_RECOVERY_SHIFT 5 18488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_PIO_ACCESS_MASK 0x0000001f 18588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define TR_33_PIO_ACCESS_SHIFT 0 18688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 18788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 18888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Interrupt register definitions. Only present on newer cells 18988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * (Keylargo and later afaik) so we don't use it. 19088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 19188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_INTR_DMA 0x80000000 19288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_INTR_DEVICE 0x40000000 19388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 19488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 19588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * FCR Register on Kauai. Not sure what bit 0x4 is ... 19688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 19788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define KAUAI_FCR_UATA_MAGIC 0x00000004 19888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define KAUAI_FCR_UATA_RESET_N 0x00000002 19988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define KAUAI_FCR_UATA_ENABLE 0x00000001 20088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 20188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 20288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* Allow up to 256 DBDMA commands per xfer */ 20388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define MAX_DCMDS 256 20488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 20588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* Don't let a DMA segment go all the way to 64K */ 20688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define MAX_DBDMA_SEG 0xff00 20788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 20888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 20988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 21088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Wait 1s for disk to answer on IDE bus after a hard reset 21188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * of the device (via GPIO/FCR). 21288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 21388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Some devices seem to "pollute" the bus even after dropping 21488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * the BSY bit (typically some combo drives slave on the UDMA 21588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * bus) after a hard reset. Since we hard reset all drives on 21688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * KeyLargo ATA66, we have to keep that delay around. I may end 21788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * up not hard resetting anymore on these and keep the delay only 21888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * for older interfaces instead (we have to reset when coming 21988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * from MacOS...) --BenH. 22088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 22188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#define IDE_WAKEUP_DELAY_MS 1000 22288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 22388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstruct pata_macio_timing; 22488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 22588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstruct pata_macio_priv { 22688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int kind; 22788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int aapl_bus_id; 22888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int mediabay : 1; 22988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct device_node *node; 23088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct macio_dev *mdev; 23188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pci_dev *pdev; 23288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct device *dev; 23388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int irq; 23488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt u32 treg[2][2]; 23588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt void __iomem *tfregs; 23688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt void __iomem *kauai_fcr; 23788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct dbdma_cmd * dma_table_cpu; 23888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dma_addr_t dma_table_dma; 23988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_host *host; 24088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt const struct pata_macio_timing *timings; 24188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 24288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 24388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* Previous variants of this driver used to calculate timings 24488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * for various variants of the chip and use tables for others. 24588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 24688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Not only was this confusing, but in addition, it isn't clear 24788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * whether our calculation code was correct. It didn't entirely 24888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * match the darwin code and whatever documentation I could find 24988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * on these cells 25088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 25188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * I decided to entirely rely on a table instead for this version 25288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * of the driver. Also, because I don't really care about derated 25388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * modes and really old HW other than making it work, I'm not going 25488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * to calculate / snoop timing values for something else than the 25588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * standard modes. 25688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 25788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstruct pata_macio_timing { 25888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int mode; 25988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt u32 reg1; /* Bits to set in first timing reg */ 26088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt u32 reg2; /* Bits to set in second timing reg */ 26188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 26288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 26388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const struct pata_macio_timing pata_macio_ohare_timings[] = { 26488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_0, 0x00000526, 0, }, 26588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_1, 0x00000085, 0, }, 26688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_2, 0x00000025, 0, }, 26788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_3, 0x00000025, 0, }, 26888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_4, 0x00000025, 0, }, 26988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_0, 0x00074000, 0, }, 27088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_1, 0x00221000, 0, }, 27188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_2, 0x00211000, 0, }, 27288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { -1, 0, 0 } 27388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 27488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 27588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const struct pata_macio_timing pata_macio_heathrow_timings[] = { 27688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_0, 0x00000526, 0, }, 27788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_1, 0x00000085, 0, }, 27888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_2, 0x00000025, 0, }, 27988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_3, 0x00000025, 0, }, 28088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_4, 0x00000025, 0, }, 28188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_0, 0x00074000, 0, }, 28288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_1, 0x00221000, 0, }, 28388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_2, 0x00211000, 0, }, 28488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { -1, 0, 0 } 28588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 28688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 28788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const struct pata_macio_timing pata_macio_kl33_timings[] = { 28888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_0, 0x00000526, 0, }, 28988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_1, 0x00000085, 0, }, 29088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_2, 0x00000025, 0, }, 29188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_3, 0x00000025, 0, }, 29288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_4, 0x00000025, 0, }, 29388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_0, 0x00084000, 0, }, 29488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_1, 0x00021800, 0, }, 29588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_2, 0x00011800, 0, }, 29688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { -1, 0, 0 } 29788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 29888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 29988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const struct pata_macio_timing pata_macio_kl66_timings[] = { 30088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_0, 0x0000038c, 0, }, 30188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_1, 0x0000020a, 0, }, 30288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_2, 0x00000127, 0, }, 30388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_3, 0x000000c6, 0, }, 30488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_4, 0x00000065, 0, }, 30588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_0, 0x00084000, 0, }, 30688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_1, 0x00029800, 0, }, 30788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_2, 0x00019400, 0, }, 30888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_0, 0x19100000, 0, }, 30988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_1, 0x14d00000, 0, }, 31088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_2, 0x10900000, 0, }, 31188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_3, 0x0c700000, 0, }, 31288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_4, 0x0c500000, 0, }, 31388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { -1, 0, 0 } 31488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 31588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 31688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const struct pata_macio_timing pata_macio_kauai_timings[] = { 31788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_0, 0x08000a92, 0, }, 31888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_1, 0x0800060f, 0, }, 31988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_2, 0x0800038b, 0, }, 32088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_3, 0x05000249, 0, }, 32188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_4, 0x04000148, 0, }, 32288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_0, 0x00618000, 0, }, 32388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_1, 0x00209000, 0, }, 32488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_2, 0x00148000, 0, }, 32588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_0, 0, 0x000070c1, }, 32688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_1, 0, 0x00005d81, }, 32788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_2, 0, 0x00004a61, }, 32888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_3, 0, 0x00003a51, }, 32988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_4, 0, 0x00002a31, }, 33088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_5, 0, 0x00002921, }, 33188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { -1, 0, 0 } 33288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 33388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 33488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const struct pata_macio_timing pata_macio_shasta_timings[] = { 33588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_0, 0x0a000c97, 0, }, 33688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_1, 0x07000712, 0, }, 33788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_2, 0x040003cd, 0, }, 33888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_3, 0x0500028b, 0, }, 33988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_PIO_4, 0x0400010a, 0, }, 34088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_0, 0x00820800, 0, }, 34188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_1, 0x0028b000, 0, }, 34288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_MW_DMA_2, 0x001ca000, 0, }, 34388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_0, 0, 0x00035901, }, 34488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_1, 0, 0x000348b1, }, 34588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_2, 0, 0x00033881, }, 34688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_3, 0, 0x00033861, }, 34788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_4, 0, 0x00033841, }, 34888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_5, 0, 0x00033031, }, 34988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { XFER_UDMA_6, 0, 0x00033021, }, 35088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { -1, 0, 0 } 35188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 35288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 35388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const struct pata_macio_timing *pata_macio_find_timing( 35488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv, 35588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int mode) 35688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 35788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int i; 35888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 35988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt for (i = 0; priv->timings[i].mode > 0; i++) { 36088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->timings[i].mode == mode) 36188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return &priv->timings[i]; 36288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 36388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return NULL; 36488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 36588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 36688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 36788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_apply_timings(struct ata_port *ap, unsigned int device) 36888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 36988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 37088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt void __iomem *rbase = ap->ioaddr.cmd_addr; 37188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 37288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kind == controller_sh_ata6 || 37388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind == controller_un_ata6 || 37488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind == controller_k2_ata6) { 37588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel(priv->treg[device][0], rbase + IDE_KAUAI_PIO_CONFIG); 37688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel(priv->treg[device][1], rbase + IDE_KAUAI_ULTRA_CONFIG); 37788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else 37888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel(priv->treg[device][0], rbase + IDE_TIMING_CONFIG); 37988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 38088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 38188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_dev_select(struct ata_port *ap, unsigned int device) 38288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 38388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_sff_dev_select(ap, device); 38488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 38588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Apply timings */ 38688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_apply_timings(ap, device); 38788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 38888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 38988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_set_timings(struct ata_port *ap, 39088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_device *adev) 39188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 39288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 39388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt const struct pata_macio_timing *t; 39488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 39588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbg(priv->dev, "Set timings: DEV=%d,PIO=0x%x (%s),DMA=0x%x (%s)\n", 39688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt adev->devno, 39788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt adev->pio_mode, 39888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_mode_string(ata_xfer_mode2mask(adev->pio_mode)), 39988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt adev->dma_mode, 40088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_mode_string(ata_xfer_mode2mask(adev->dma_mode))); 40188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 40288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* First clear timings */ 40388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->treg[adev->devno][0] = priv->treg[adev->devno][1] = 0; 40488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 40588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Now get the PIO timings */ 40688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt t = pata_macio_find_timing(priv, adev->pio_mode); 40788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (t == NULL) { 40888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_warn(priv->dev, "Invalid PIO timing requested: 0x%x\n", 40988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt adev->pio_mode); 41088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt t = pata_macio_find_timing(priv, XFER_PIO_0); 41188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 41288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt BUG_ON(t == NULL); 41388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 41488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* PIO timings only ever use the first treg */ 41588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->treg[adev->devno][0] |= t->reg1; 41688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 41788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Now get DMA timings */ 41888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt t = pata_macio_find_timing(priv, adev->dma_mode); 41988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (t == NULL || (t->reg1 == 0 && t->reg2 == 0)) { 42088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbg(priv->dev, "DMA timing not set yet, using MW_DMA_0\n"); 42188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt t = pata_macio_find_timing(priv, XFER_MW_DMA_0); 42288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 42388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt BUG_ON(t == NULL); 42488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 42588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* DMA timings can use both tregs */ 42688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->treg[adev->devno][0] |= t->reg1; 42788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->treg[adev->devno][1] |= t->reg2; 42888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 42988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbg(priv->dev, " -> %08x %08x\n", 43088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->treg[adev->devno][0], 43188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->treg[adev->devno][1]); 43288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 43388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Apply to hardware */ 43488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_apply_timings(ap, adev->devno); 43588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 43688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 43788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* 43888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Blast some well known "safe" values to the timing registers at init or 43988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * wakeup from sleep time, before we do real calculation 44088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 44188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_default_timings(struct pata_macio_priv *priv) 44288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 44388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned int value, value2 = 0; 44488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 44588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt switch(priv->kind) { 44688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case controller_sh_ata6: 44788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt value = 0x0a820c97; 44888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt value2 = 0x00033031; 44988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 45088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case controller_un_ata6: 45188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case controller_k2_ata6: 45288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt value = 0x08618a92; 45388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt value2 = 0x00002921; 45488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 45588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case controller_kl_ata4: 45688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt value = 0x0008438c; 45788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 45888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case controller_kl_ata3: 45988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt value = 0x00084526; 46088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 46188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case controller_heathrow: 46288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case controller_ohare: 46388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt default: 46488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt value = 0x00074526; 46588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 46688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 46788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->treg[0][0] = priv->treg[1][0] = value; 46888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->treg[0][1] = priv->treg[1][1] = value2; 46988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 47088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 47188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_cable_detect(struct ata_port *ap) 47288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 47388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 47488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 47588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Get cable type from device-tree */ 47688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kind == controller_kl_ata4 || 47788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind == controller_un_ata6 || 47888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind == controller_k2_ata6 || 47988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind == controller_sh_ata6) { 48088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt const char* cable = of_get_property(priv->node, "cable-type", 48188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt NULL); 48288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct device_node *root = of_find_node_by_path("/"); 48388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt const char *model = of_get_property(root, "model", NULL); 48488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 48588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (cable && !strncmp(cable, "80-", 3)) { 48688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Some drives fail to detect 80c cable in PowerBook 48788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * These machine use proprietary short IDE cable 48888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * anyway 48988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 49088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (!strncmp(model, "PowerBook", 9)) 49188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return ATA_CBL_PATA40_SHORT; 49288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt else 49388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return ATA_CBL_PATA80; 49488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 49588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 49688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 49788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* G5's seem to have incorrect cable type in device-tree. 49888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Let's assume they always have a 80 conductor cable, this seem to 49988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * be always the case unless the user mucked around 50088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 50188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (of_device_is_compatible(priv->node, "K2-UATA") || 50288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt of_device_is_compatible(priv->node, "shasta-ata")) 50388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return ATA_CBL_PATA80; 50488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 50588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Anything else is 40 connectors */ 50688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return ATA_CBL_PATA40; 50788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 50888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 50988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_qc_prep(struct ata_queued_cmd *qc) 51088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 51188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned int write = (qc->tf.flags & ATA_TFLAG_WRITE); 51288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_port *ap = qc->ap; 51388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 51488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct scatterlist *sg; 51588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct dbdma_cmd *table; 51688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned int si, pi; 51788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 51888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: qc %p flags %lx, write %d dev %d\n", 51988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt __func__, qc, qc->flags, write, qc->dev->devno); 52088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 52188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (!(qc->flags & ATA_QCFLAG_DMAMAP)) 52288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return; 52388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 52488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt table = (struct dbdma_cmd *) priv->dma_table_cpu; 52588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 52688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pi = 0; 52788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt for_each_sg(qc->sg, sg, qc->n_elem, si) { 52888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt u32 addr, sg_len, len; 52988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 53088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* determine if physical DMA addr spans 64K boundary. 53188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Note h/w doesn't support 64-bit, so we unconditionally 53288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * truncate dma_addr_t to u32. 53388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 53488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt addr = (u32) sg_dma_address(sg); 53588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt sg_len = sg_dma_len(sg); 53688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 53788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt while (sg_len) { 53888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* table overflow should never happen */ 53988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt BUG_ON (pi++ >= MAX_DCMDS); 54088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 54188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt len = (sg_len < MAX_DBDMA_SEG) ? sg_len : MAX_DBDMA_SEG; 54288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt st_le16(&table->command, write ? OUTPUT_MORE: INPUT_MORE); 54388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt st_le16(&table->req_count, len); 54488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt st_le32(&table->phy_addr, addr); 54588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt table->cmd_dep = 0; 54688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt table->xfer_status = 0; 54788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt table->res_count = 0; 54888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt addr += len; 54988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt sg_len -= len; 55088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ++table; 55188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 55288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 55388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 55488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Should never happen according to Tejun */ 55588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt BUG_ON(!pi); 55688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 55788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Convert the last command to an input/output */ 55888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt table--; 55988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt st_le16(&table->command, write ? OUTPUT_LAST: INPUT_LAST); 56088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt table++; 56188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 56288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Add the stop command to the end of the list */ 56388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt memset(table, 0, sizeof(struct dbdma_cmd)); 56488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt st_le16(&table->command, DBDMA_STOP); 56588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 56688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: %d DMA list entries\n", __func__, pi); 56788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 56888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 56988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 57088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_freeze(struct ata_port *ap) 57188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 57288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 57388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 57488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (dma_regs) { 57588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned int timeout = 1000000; 57688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 57788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Make sure DMA controller is stopped */ 57888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel((RUN|PAUSE|FLUSH|WAKE|DEAD) << 16, &dma_regs->control); 57988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt while (--timeout && (readl(&dma_regs->status) & RUN)) 58088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt udelay(1); 58188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 58288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 58388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_sff_freeze(ap); 58488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 58588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 58688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 58788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_bmdma_setup(struct ata_queued_cmd *qc) 58888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 58988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_port *ap = qc->ap; 59088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 59188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 59288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int dev = qc->dev->devno; 59388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 59488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: qc %p\n", __func__, qc); 59588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 59688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Make sure DMA commands updates are visible */ 59788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel(priv->dma_table_dma, &dma_regs->cmdptr); 59888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 59988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* On KeyLargo 66Mhz cell, we need to add 60ns to wrDataSetup on 60088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * UDMA reads 60188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 60288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kind == controller_kl_ata4 && 60388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt (priv->treg[dev][0] & TR_66_UDMA_EN)) { 60488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt void __iomem *rbase = ap->ioaddr.cmd_addr; 60588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt u32 reg = priv->treg[dev][0]; 60688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 60788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (!(qc->tf.flags & ATA_TFLAG_WRITE)) 60888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt reg += 0x00800000; 60988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel(reg, rbase + IDE_TIMING_CONFIG); 61088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 61188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 61288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* issue r/w command */ 61388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ap->ops->sff_exec_command(ap, &qc->tf); 61488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 61588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 61688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_bmdma_start(struct ata_queued_cmd *qc) 61788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 61888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_port *ap = qc->ap; 61988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 62088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 62188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 62288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: qc %p\n", __func__, qc); 62388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 62488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel((RUN << 16) | RUN, &dma_regs->control); 62588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Make sure it gets to the controller right now */ 62688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt (void)readl(&dma_regs->control); 62788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 62888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 62988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_bmdma_stop(struct ata_queued_cmd *qc) 63088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 63188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_port *ap = qc->ap; 63288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 63388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 63488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned int timeout = 1000000; 63588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 63688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: qc %p\n", __func__, qc); 63788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 63888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Stop the DMA engine and wait for it to full halt */ 63988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel (((RUN|WAKE|DEAD) << 16), &dma_regs->control); 64088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt while (--timeout && (readl(&dma_regs->status) & RUN)) 64188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt udelay(1); 64288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 64388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 64488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic u8 pata_macio_bmdma_status(struct ata_port *ap) 64588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 64688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 64788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct dbdma_regs __iomem *dma_regs = ap->ioaddr.bmdma_addr; 64888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt u32 dstat, rstat = ATA_DMA_INTR; 64988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned long timeout = 0; 65088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 65188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dstat = readl(&dma_regs->status); 65288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 65388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: dstat=%x\n", __func__, dstat); 65488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 65588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* We have two things to deal with here: 65688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 65788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * - The dbdma won't stop if the command was started 65888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * but completed with an error without transferring all 65988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * datas. This happens when bad blocks are met during 66088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * a multi-block transfer. 66188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 66288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * - The dbdma fifo hasn't yet finished flushing to 66388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * to system memory when the disk interrupt occurs. 66488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 66588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 66688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 66788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* First check for errors */ 66888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if ((dstat & (RUN|DEAD)) != RUN) 66988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rstat |= ATA_DMA_ERR; 67088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 67188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* If ACTIVE is cleared, the STOP command has been hit and 67288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * the transfer is complete. If not, we have to flush the 67388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * channel. 67488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 67588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if ((dstat & ACTIVE) == 0) 67688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return rstat; 67788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 67888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbgdma(priv->dev, "%s: DMA still active, flushing...\n", __func__); 67988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 68088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* If dbdma didn't execute the STOP command yet, the 68188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * active bit is still set. We consider that we aren't 68288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * sharing interrupts (which is hopefully the case with 68388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * those controllers) and so we just try to flush the 68488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * channel for pending data in the fifo 68588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 68688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt udelay(1); 68788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel((FLUSH << 16) | FLUSH, &dma_regs->control); 68888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt for (;;) { 68988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt udelay(1); 69088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dstat = readl(&dma_regs->status); 69188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if ((dstat & FLUSH) == 0) 69288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 69388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (++timeout > 1000) { 69488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_warn(priv->dev, "timeout flushing DMA\n"); 69588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rstat |= ATA_DMA_ERR; 69688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 69788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 69888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 69988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return rstat; 70088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 70188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 70288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* port_start is when we allocate the DMA command list */ 70388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_port_start(struct ata_port *ap) 70488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 70588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 70688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 70788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (ap->ioaddr.bmdma_addr == NULL) 70888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 70988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 71088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Allocate space for the DBDMA commands. 71188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 71288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * The +2 is +1 for the stop command and +1 to allow for 71388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * aligning the start address to a multiple of 16 bytes. 71488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 71588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->dma_table_cpu = 71688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dmam_alloc_coherent(priv->dev, 71788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt (MAX_DCMDS + 2) * sizeof(struct dbdma_cmd), 71888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt &priv->dma_table_dma, GFP_KERNEL); 71988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->dma_table_cpu == NULL) { 72088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(priv->dev, "Unable to allocate DMA command list\n"); 72188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ap->ioaddr.bmdma_addr = NULL; 72288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 72388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 72488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 72588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 72688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_irq_clear(struct ata_port *ap) 72788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 72888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 72988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 73088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Nothing to do here */ 73188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 73288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbgdma(priv->dev, "%s\n", __func__); 73388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 73488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 73588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_reset_hw(struct pata_macio_priv *priv, int resume) 73688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 73788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbg(priv->dev, "Enabling & resetting... \n"); 73888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 73988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->mediabay) 74088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return; 74188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 74288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kind == controller_ohare && !resume) { 74388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* The code below is having trouble on some ohare machines 74488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * (timing related ?). Until I can put my hand on one of these 74588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * units, I keep the old way 74688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 74788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, priv->node, 0, 1); 74888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else { 74988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int rc; 75088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 75188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Reset and enable controller */ 75288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rc = ppc_md.feature_call(PMAC_FTR_IDE_RESET, 75388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->node, priv->aapl_bus_id, 1); 75488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, 75588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->node, priv->aapl_bus_id, 1); 75688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt msleep(10); 75788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Only bother waiting if there's a reset control */ 75888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (rc == 0) { 75988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ppc_md.feature_call(PMAC_FTR_IDE_RESET, 76088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->node, priv->aapl_bus_id, 0); 76188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt msleep(IDE_WAKEUP_DELAY_MS); 76288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 76388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 76488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 76588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* If resuming a PCI device, restore the config space here */ 76688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->pdev && resume) { 76788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int rc; 76888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 76988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_restore_state(priv->pdev); 77088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rc = pcim_enable_device(priv->pdev); 77188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (rc) 77288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_printk(KERN_ERR, &priv->pdev->dev, 77388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Failed to enable device after resume (%d)\n", rc); 77488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt else 77588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_set_master(priv->pdev); 77688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 77788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 77888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* On Kauai, initialize the FCR. We don't perform a reset, doesn't really 77988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * seem necessary and speeds up the boot process 78088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 78188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kauai_fcr) 78288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel(KAUAI_FCR_UATA_MAGIC | 78388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt KAUAI_FCR_UATA_RESET_N | 78488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt KAUAI_FCR_UATA_ENABLE, priv->kauai_fcr); 78588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 78688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 78788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt/* Hook the standard slave config to fixup some HW related alignment 78888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * restrictions 78988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 79088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_slave_config(struct scsi_device *sdev) 79188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 79288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_port *ap = ata_shost_to_port(sdev->host); 79388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = ap->private_data; 79488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_device *dev; 79588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt u16 cmd; 79688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int rc; 79788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 79888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* First call original */ 79988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rc = ata_scsi_slave_config(sdev); 80088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (rc) 80188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return rc; 80288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 80388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* This is lifted from sata_nv */ 80488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev = &ap->link.device[sdev->id]; 80588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 80688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* OHare has issues with non cache aligned DMA on some chipsets */ 80788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kind == controller_ohare) { 80888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt blk_queue_update_dma_alignment(sdev->request_queue, 31); 80988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt blk_queue_update_dma_pad(sdev->request_queue, 31); 81088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 81188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Tell the world about it */ 81288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_dev_printk(dev, KERN_INFO, "OHare alignment limits applied\n"); 81388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 81488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 81588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 81688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* We only have issues with ATAPI */ 81788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (dev->class != ATA_DEV_ATAPI) 81888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 81988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 82088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Shasta and K2 seem to have "issues" with reads ... */ 82188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kind == controller_sh_ata6 || priv->kind == controller_k2_ata6) { 82288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Allright these are bad, apply restrictions */ 82388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt blk_queue_update_dma_alignment(sdev->request_queue, 15); 82488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt blk_queue_update_dma_pad(sdev->request_queue, 15); 82588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 82688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* We enable MWI and hack cache line size directly here, this 82788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * is specific to this chipset and not normal values, we happen 82888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * to somewhat know what we are doing here (which is basically 82988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * to do the same Apple does and pray they did not get it wrong :-) 83088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 83188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt BUG_ON(!priv->pdev); 83288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_write_config_byte(priv->pdev, PCI_CACHE_LINE_SIZE, 0x08); 83388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_read_config_word(priv->pdev, PCI_COMMAND, &cmd); 83488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_write_config_word(priv->pdev, PCI_COMMAND, 83588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt cmd | PCI_COMMAND_INVALIDATE); 83688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 83788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Tell the world about it */ 83888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_dev_printk(dev, KERN_INFO, 83988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "K2/Shasta alignment limits applied\n"); 84088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 84188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 84288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 84388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 84488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 84588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#ifdef CONFIG_PM 84688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 84788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_do_suspend(struct pata_macio_priv *priv, pm_message_t mesg) 84888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 84988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int rc; 85088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 85188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* First, core libata suspend to do most of the work */ 85288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rc = ata_host_suspend(priv->host, mesg); 85388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (rc) 85488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return rc; 85588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 85688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Restore to default timings */ 85788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_default_timings(priv); 85888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 85988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Mask interrupt. Not strictly necessary but old driver did 86088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * it and I'd rather not change that here */ 86188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt disable_irq(priv->irq); 86288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 86388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* The media bay will handle itself just fine */ 86488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->mediabay) 86588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 86688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 86788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Kauai has bus control FCRs directly here */ 86888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kauai_fcr) { 86988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt u32 fcr = readl(priv->kauai_fcr); 87088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt fcr &= ~(KAUAI_FCR_UATA_RESET_N | KAUAI_FCR_UATA_ENABLE); 87188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt writel(fcr, priv->kauai_fcr); 87288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 87388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 87488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* For PCI, save state and disable DMA. No need to call 87588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * pci_set_power_state(), the HW doesn't do D states that 87688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * way, the platform code will take care of suspending the 87788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * ASIC properly 87888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 87988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->pdev) { 88088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_save_state(priv->pdev); 88188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_disable_device(priv->pdev); 88288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 88388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 88488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Disable the bus on older machines and the cell on kauai */ 88588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ppc_md.feature_call(PMAC_FTR_IDE_ENABLE, priv->node, 88688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->aapl_bus_id, 0); 88788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 88888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 88988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 89088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 89188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_do_resume(struct pata_macio_priv *priv) 89288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 89388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Reset and re-enable the HW */ 89488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_reset_hw(priv, 1); 89588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 89688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Sanitize drive timings */ 89788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_apply_timings(priv->host->ports[0], 0); 89888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 89988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* We want our IRQ back ! */ 90088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt enable_irq(priv->irq); 90188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 90288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Let the libata core take it from there */ 90388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_host_resume(priv->host); 90488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 90588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 90688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 90788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 90888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#endif /* CONFIG_PM */ 90988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 91088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic struct scsi_host_template pata_macio_sht = { 91188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ATA_BASE_SHT(DRV_NAME), 91288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .sg_tablesize = MAX_DCMDS, 91388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* We may not need that strict one */ 91488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .dma_boundary = ATA_DMA_BOUNDARY, 91588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .slave_configure = pata_macio_slave_config, 91688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 91788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 91888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic struct ata_port_operations pata_macio_ops = { 91988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .inherits = &ata_sff_port_ops, 92088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 92188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .freeze = pata_macio_freeze, 92288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .set_piomode = pata_macio_set_timings, 92388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .set_dmamode = pata_macio_set_timings, 92488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .cable_detect = pata_macio_cable_detect, 92588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .sff_dev_select = pata_macio_dev_select, 92688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .qc_prep = pata_macio_qc_prep, 92788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .mode_filter = ata_bmdma_mode_filter, 92888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .bmdma_setup = pata_macio_bmdma_setup, 92988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .bmdma_start = pata_macio_bmdma_start, 93088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .bmdma_stop = pata_macio_bmdma_stop, 93188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .bmdma_status = pata_macio_bmdma_status, 93288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .port_start = pata_macio_port_start, 93388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .sff_irq_clear = pata_macio_irq_clear, 93488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 93588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 93688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void __devinit pata_macio_invariants(struct pata_macio_priv *priv) 93788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 93888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt const int *bidp; 93988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 94088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Identify the type of controller */ 94188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (of_device_is_compatible(priv->node, "shasta-ata")) { 94288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind = controller_sh_ata6; 94388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->timings = pata_macio_shasta_timings; 94488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else if (of_device_is_compatible(priv->node, "kauai-ata")) { 94588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind = controller_un_ata6; 94688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->timings = pata_macio_kauai_timings; 94788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else if (of_device_is_compatible(priv->node, "K2-UATA")) { 94888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind = controller_k2_ata6; 94988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->timings = pata_macio_kauai_timings; 95088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else if (of_device_is_compatible(priv->node, "keylargo-ata")) { 95188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (strcmp(priv->node->name, "ata-4") == 0) { 95288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind = controller_kl_ata4; 95388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->timings = pata_macio_kl66_timings; 95488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else { 95588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind = controller_kl_ata3; 95688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->timings = pata_macio_kl33_timings; 95788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 95888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else if (of_device_is_compatible(priv->node, "heathrow-ata")) { 95988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind = controller_heathrow; 96088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->timings = pata_macio_heathrow_timings; 96188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else { 96288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kind = controller_ohare; 96388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->timings = pata_macio_ohare_timings; 96488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 96588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 96688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* XXX FIXME --- setup priv->mediabay here */ 96788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 96888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Get Apple bus ID (for clock and ASIC control) */ 96988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt bidp = of_get_property(priv->node, "AAPL,bus-id", NULL); 97088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->aapl_bus_id = bidp ? *bidp : 0; 97188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 97288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Fixup missing Apple bus ID in case of media-bay */ 97388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->mediabay && bidp == 0) 97488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->aapl_bus_id = 1; 97588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 97688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 97788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void __devinit pata_macio_setup_ios(struct ata_ioports *ioaddr, 97888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt void __iomem * base, 97988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt void __iomem * dma) 98088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 98188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* cmd_addr is the base of regs for that port */ 98288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->cmd_addr = base; 98388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 98488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* taskfile registers */ 98588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->data_addr = base + (ATA_REG_DATA << 4); 98688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->error_addr = base + (ATA_REG_ERR << 4); 98788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->feature_addr = base + (ATA_REG_FEATURE << 4); 98888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->nsect_addr = base + (ATA_REG_NSECT << 4); 98988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->lbal_addr = base + (ATA_REG_LBAL << 4); 99088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->lbam_addr = base + (ATA_REG_LBAM << 4); 99188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->lbah_addr = base + (ATA_REG_LBAH << 4); 99288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->device_addr = base + (ATA_REG_DEVICE << 4); 99388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->status_addr = base + (ATA_REG_STATUS << 4); 99488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->command_addr = base + (ATA_REG_CMD << 4); 99588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->altstatus_addr = base + 0x160; 99688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->ctl_addr = base + 0x160; 99788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ioaddr->bmdma_addr = dma; 99888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 99988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 100088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void __devinit pmac_macio_calc_timing_masks(struct pata_macio_priv *priv, 100188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_port_info *pinfo) 100288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 100388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int i = 0; 100488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 100588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo->pio_mask = 0; 100688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo->mwdma_mask = 0; 100788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo->udma_mask = 0; 100888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 100988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt while (priv->timings[i].mode > 0) { 101088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned int mask = 1U << (priv->timings[i].mode & 0x0f); 101188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt switch(priv->timings[i].mode & 0xf0) { 101288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case 0x00: /* PIO */ 101388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo->pio_mask |= (mask >> 8); 101488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 101588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case 0x20: /* MWDMA */ 101688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo->mwdma_mask |= mask; 101788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 101888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt case 0x40: /* UDMA */ 101988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo->udma_mask |= mask; 102088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt break; 102188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 102288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt i++; 102388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 102488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_dbg(priv->dev, "Supported masks: PIO=%lx, MWDMA=%lx, UDMA=%lx\n", 102588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo->pio_mask, pinfo->mwdma_mask, pinfo->udma_mask); 102688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 102788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 102888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int __devinit pata_macio_common_init(struct pata_macio_priv *priv, 102988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt resource_size_t tfregs, 103088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt resource_size_t dmaregs, 103188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt resource_size_t fcregs, 103288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned long irq) 103388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 103488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_port_info pinfo; 103588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt const struct ata_port_info *ppi[] = { &pinfo, NULL }; 103688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt void __iomem *dma_regs = NULL; 103788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 103888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Fill up privates with various invariants collected from the 103988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * device-tree 104088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 104188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_invariants(priv); 104288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 104388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Make sure we have sane initial timings in the cache */ 104488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_default_timings(priv); 104588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 104688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Not sure what the real max is but we know it's less than 64K, let's 104788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * use 64K minus 256 104888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 104988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dma_set_max_seg_size(priv->dev, MAX_DBDMA_SEG); 105088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 105188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Allocate libata host for 1 port */ 105288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt memset(&pinfo, 0, sizeof(struct ata_port_info)); 105388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pmac_macio_calc_timing_masks(priv, &pinfo); 105488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_MMIO | 105588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ATA_FLAG_NO_LEGACY; 105688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo.port_ops = &pata_macio_ops; 105788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pinfo.private_data = priv; 105888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 105988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->host = ata_host_alloc_pinfo(priv->dev, ppi, 1); 106088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->host == NULL) { 106188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(priv->dev, "Failed to allocate ATA port structure\n"); 106288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENOMEM; 106388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 106488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 106588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Setup the private data in host too */ 106688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->host->private_data = priv; 106788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 106888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Map base registers */ 106988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->tfregs = devm_ioremap(priv->dev, tfregs, 0x100); 107088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->tfregs == NULL) { 107188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(priv->dev, "Failed to map ATA ports\n"); 107288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENOMEM; 107388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 107488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->host->iomap = &priv->tfregs; 107588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 107688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Map DMA regs */ 107788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (dmaregs != 0) { 107888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dma_regs = devm_ioremap(priv->dev, dmaregs, 107988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt sizeof(struct dbdma_regs)); 108088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (dma_regs == NULL) 108188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_warn(priv->dev, "Failed to map ATA DMA registers\n"); 108288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 108388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 108488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* If chip has local feature control, map those regs too */ 108588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (fcregs != 0) { 108688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->kauai_fcr = devm_ioremap(priv->dev, fcregs, 4); 108788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->kauai_fcr == NULL) { 108888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(priv->dev, "Failed to map ATA FCR register\n"); 108988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENOMEM; 109088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 109188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 109288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 109388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Setup port data structure */ 109488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_setup_ios(&priv->host->ports[0]->ioaddr, 109588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->tfregs, dma_regs); 109688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->host->ports[0]->private_data = priv; 109788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 109888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* hard-reset the controller */ 109988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_reset_hw(priv, 0); 110088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pata_macio_apply_timings(priv->host->ports[0], 0); 110188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 110288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Enable bus master if necessary */ 110388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv->pdev && dma_regs) 110488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_set_master(priv->pdev); 110588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 110688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_info(priv->dev, "Activating pata-macio chipset %s, Apple bus ID %d\n", 110788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt macio_ata_names[priv->kind], priv->aapl_bus_id); 110888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 110988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Start it up */ 111088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->irq = irq; 111188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return ata_host_activate(priv->host, irq, ata_sff_interrupt, 0, 111288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt &pata_macio_sht); 111388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 111488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 111588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int __devinit pata_macio_attach(struct macio_dev *mdev, 111688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt const struct of_device_id *match) 111788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 111888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv; 111988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt resource_size_t tfregs, dmaregs = 0; 112088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned long irq; 112188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int rc; 112288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 112388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Check for broken device-trees */ 112488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (macio_resource_count(mdev) == 0) { 112588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(&mdev->ofdev.dev, 112688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "No addresses for controller\n"); 112788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENXIO; 112888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 112988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 113088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Enable managed resources */ 113188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt macio_enable_devres(mdev); 113288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 113388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Allocate and init private data structure */ 113488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv = devm_kzalloc(&mdev->ofdev.dev, 113588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt sizeof(struct pata_macio_priv), GFP_KERNEL); 113688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv == NULL) { 113788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(&mdev->ofdev.dev, 113888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Failed to allocate private memory\n"); 113988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENOMEM; 114088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 114188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->node = of_node_get(mdev->ofdev.node); 114288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->mdev = mdev; 114388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->dev = &mdev->ofdev.dev; 114488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 114588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Request memory resource for taskfile registers */ 114688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (macio_request_resource(mdev, 0, "pata-macio")) { 114788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(&mdev->ofdev.dev, 114888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Cannot obtain taskfile resource\n"); 114988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -EBUSY; 115088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 115188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt tfregs = macio_resource_start(mdev, 0); 115288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 115388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Request resources for DMA registers if any */ 115488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (macio_resource_count(mdev) >= 2) { 115588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (macio_request_resource(mdev, 1, "pata-macio-dma")) 115688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(&mdev->ofdev.dev, 115788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Cannot obtain DMA resource\n"); 115888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt else 115988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dmaregs = macio_resource_start(mdev, 1); 116088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 116188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 116288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* 116388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * Fixup missing IRQ for some old implementations with broken 116488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * device-trees. 116588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * 116688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * This is a bit bogus, it should be fixed in the device-tree itself, 116788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * via the existing macio fixups, based on the type of interrupt 116888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * controller in the machine. However, I have no test HW for this case, 116988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * and this trick works well enough on those old machines... 117088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 117188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (macio_irq_count(mdev) == 0) { 117288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_warn(&mdev->ofdev.dev, 117388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "No interrupts for controller, using 13\n"); 117488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt irq = irq_create_mapping(NULL, 13); 117588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else 117688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt irq = macio_irq(mdev, 0); 117788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 117888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Prevvent media bay callbacks until fully registered */ 117988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt lock_media_bay(priv->mdev->media_bay); 118088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 118188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Get register addresses and call common initialization */ 118288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rc = pata_macio_common_init(priv, 118388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt tfregs, /* Taskfile regs */ 118488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dmaregs, /* DBDMA regs */ 118588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 0, /* Feature control */ 118688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt irq); 118788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unlock_media_bay(priv->mdev->media_bay); 118888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 118988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return rc; 119088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 119188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 119288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int __devexit pata_macio_detach(struct macio_dev *mdev) 119388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 119488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_host *host = macio_get_drvdata(mdev); 119588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv = host->private_data; 119688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 119788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt lock_media_bay(priv->mdev->media_bay); 119888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 119988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Make sure the mediabay callback doesn't try to access 120088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt * dead stuff 120188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt */ 120288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->host->private_data = NULL; 120388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 120488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_host_detach(host); 120588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 120688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unlock_media_bay(priv->mdev->media_bay); 120788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 120888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 120988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 121088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 121188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#ifdef CONFIG_PM 121288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 121388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_suspend(struct macio_dev *mdev, pm_message_t mesg) 121488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 121588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_host *host = macio_get_drvdata(mdev); 121688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 121788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return pata_macio_do_suspend(host->private_data, mesg); 121888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 121988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 122088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_resume(struct macio_dev *mdev) 122188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 122288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_host *host = macio_get_drvdata(mdev); 122388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 122488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return pata_macio_do_resume(host->private_data); 122588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 122688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 122788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#endif /* CONFIG_PM */ 122888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 122988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#ifdef CONFIG_PMAC_MEDIABAY 123088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void pata_macio_mb_event(struct macio_dev* mdev, int mb_state) 123188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 123288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_host *host = macio_get_drvdata(mdev); 123388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_port *ap; 123488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_eh_info *ehi; 123588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_device *dev; 123688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt unsigned long flags; 123788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 123888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (!host || !host->private_data) 123988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return; 124088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ap = host->ports[0]; 124188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt spin_lock_irqsave(ap->lock, flags); 124288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ehi = &ap->link.eh_info; 124388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (mb_state == MB_CD) { 124488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_ehi_push_desc(ehi, "mediabay plug"); 124588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_ehi_hotplugged(ehi); 124688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_port_freeze(ap); 124788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } else { 124888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_ehi_push_desc(ehi, "mediabay unplug"); 124988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_for_each_dev(dev, &ap->link, ALL) 125088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev->flags |= ATA_DFLAG_DETACH; 125188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_port_abort(ap); 125288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 125388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt spin_unlock_irqrestore(ap->lock, flags); 125488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 125588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 125688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#endif /* CONFIG_PMAC_MEDIABAY */ 125788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 125888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 125988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int __devinit pata_macio_pci_attach(struct pci_dev *pdev, 126088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt const struct pci_device_id *id) 126188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 126288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct pata_macio_priv *priv; 126388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct device_node *np; 126488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt resource_size_t rbase; 126588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 126688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* We cannot use a MacIO controller without its OF device node */ 126788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt np = pci_device_to_OF_node(pdev); 126888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (np == NULL) { 126988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(&pdev->dev, 127088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Cannot find OF device node for controller\n"); 127188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENODEV; 127288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 127388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 127488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Check that it can be enabled */ 127588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (pcim_enable_device(pdev)) { 127688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(&pdev->dev, 127788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Cannot enable controller PCI device\n"); 127888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENXIO; 127988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 128088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 128188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Allocate and init private data structure */ 128288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv = devm_kzalloc(&pdev->dev, 128388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt sizeof(struct pata_macio_priv), GFP_KERNEL); 128488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (priv == NULL) { 128588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(&pdev->dev, 128688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Failed to allocate private memory\n"); 128788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENOMEM; 128888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 128988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->node = of_node_get(np); 129088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->pdev = pdev; 129188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt priv->dev = &pdev->dev; 129288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 129388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Get MMIO regions */ 129488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (pci_request_regions(pdev, "pata-macio")) { 129588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt dev_err(&pdev->dev, 129688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt "Cannot obtain PCI resources\n"); 129788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -EBUSY; 129888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 129988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 130088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt /* Get register addresses and call common initialization */ 130188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rbase = pci_resource_start(pdev, 0); 130288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (pata_macio_common_init(priv, 130388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rbase + 0x2000, /* Taskfile regs */ 130488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rbase + 0x1000, /* DBDMA regs */ 130588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rbase, /* Feature control */ 130688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pdev->irq)) 130788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENXIO; 130888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 130988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 131088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 131188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 131288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void __devexit pata_macio_pci_detach(struct pci_dev *pdev) 131388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 131488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_host *host = dev_get_drvdata(&pdev->dev); 131588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 131688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt ata_host_detach(host); 131788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 131888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 131988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#ifdef CONFIG_PM 132088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 132188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_pci_suspend(struct pci_dev *pdev, pm_message_t mesg) 132288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 132388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_host *host = dev_get_drvdata(&pdev->dev); 132488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 132588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return pata_macio_do_suspend(host->private_data, mesg); 132688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 132788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 132888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int pata_macio_pci_resume(struct pci_dev *pdev) 132988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 133088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt struct ata_host *host = dev_get_drvdata(&pdev->dev); 133188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 133288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return pata_macio_do_resume(host->private_data); 133388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 133488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 133588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#endif /* CONFIG_PM */ 133688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 133788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic struct of_device_id pata_macio_match[] = 133888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 133988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { 134088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .name = "IDE", 134188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt }, 134288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { 134388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .name = "ATA", 134488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt }, 134588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { 134688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .type = "ide", 134788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt }, 134888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { 134988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .type = "ata", 135088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt }, 135188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt {}, 135288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 135388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 135488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic struct macio_driver pata_macio_driver = 135588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 135688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .name = "pata-macio", 135788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .match_table = pata_macio_match, 135888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .probe = pata_macio_attach, 135988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .remove = pata_macio_detach, 136088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#ifdef CONFIG_PM 136188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .suspend = pata_macio_suspend, 136288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .resume = pata_macio_resume, 136388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#endif 136488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#ifdef CONFIG_PMAC_MEDIABAY 136588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .mediabay_event = pata_macio_mb_event, 136688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#endif 136788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .driver = { 136888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .owner = THIS_MODULE, 136988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt }, 137088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 137188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 137288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic const struct pci_device_id pata_macio_pci_match[] = { 137388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_UNI_N_ATA), 0 }, 137488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_IPID_ATA100), 0 }, 137588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_K2_ATA100), 0 }, 137688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_SH_ATA), 0 }, 137788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt { PCI_VDEVICE(APPLE, PCI_DEVICE_ID_APPLE_IPID2_ATA), 0 }, 137888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt {}, 137988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 138088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 138188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic struct pci_driver pata_macio_pci_driver = { 138288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .name = "pata-pci-macio", 138388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .id_table = pata_macio_pci_match, 138488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .probe = pata_macio_pci_attach, 138588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .remove = pata_macio_pci_detach, 138688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#ifdef CONFIG_PM 138788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .suspend = pata_macio_pci_suspend, 138888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .resume = pata_macio_pci_resume, 138988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt#endif 139088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .driver = { 139188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt .owner = THIS_MODULE, 139288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt }, 139388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt}; 139488358ab08944da726e948d216977ad499dfc15c6Benjamin HerrenschmidtMODULE_DEVICE_TABLE(pci, pata_macio_pci_match); 139588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 139688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 139788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic int __init pata_macio_init(void) 139888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 139988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt int rc; 140088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 140188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (!machine_is(powermac)) 140288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return -ENODEV; 140388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 140488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rc = pci_register_driver(&pata_macio_pci_driver); 140588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (rc) 140688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return rc; 140788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt rc = macio_register_driver(&pata_macio_driver); 140888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt if (rc) { 140988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_unregister_driver(&pata_macio_pci_driver); 141088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return rc; 141188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt } 141288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt return 0; 141388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 141488358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 141588358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtstatic void __exit pata_macio_exit(void) 141688358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt{ 141788358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt macio_unregister_driver(&pata_macio_driver); 141888358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt pci_unregister_driver(&pata_macio_pci_driver); 141988358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt} 142088358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 142188358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtmodule_init(pata_macio_init); 142288358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidtmodule_exit(pata_macio_exit); 142388358ab08944da726e948d216977ad499dfc15c6Benjamin Herrenschmidt 142488358ab08944da726e948d216977ad499dfc15c6Benjamin HerrenschmidtMODULE_AUTHOR("Benjamin Herrenschmidt"); 142588358ab08944da726e948d216977ad499dfc15c6Benjamin HerrenschmidtMODULE_DESCRIPTION("Apple MacIO PATA driver"); 142688358ab08944da726e948d216977ad499dfc15c6Benjamin HerrenschmidtMODULE_LICENSE("GPL"); 142788358ab08944da726e948d216977ad499dfc15c6Benjamin HerrenschmidtMODULE_VERSION(DRV_VERSION); 1428