diff options
Diffstat (limited to 'include/asm-ppc/ide.h')
-rw-r--r-- | include/asm-ppc/ide.h | 294 |
1 files changed, 58 insertions, 236 deletions
diff --git a/include/asm-ppc/ide.h b/include/asm-ppc/ide.h index cad526b12..c53267b77 100644 --- a/include/asm-ppc/ide.h +++ b/include/asm-ppc/ide.h @@ -11,61 +11,20 @@ #ifndef __ASMPPC_IDE_H #define __ASMPPC_IDE_H -#include <linux/config.h> -#ifdef CONFIG_APUS -#include <linux/hdreg.h> - -#define ide_init_hwif_ports m68k_ide_init_hwif_ports -#include <asm-m68k/ide.h> -#undef ide_init_hwif_ports -#undef insw - -void ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); -void ide_insw(ide_ioreg_t port, void *buf, int ns); -void ide_outsw(ide_ioreg_t port, void *buf, int ns); -#define insw(port, buf, ns) do { \ - if ( _machine != _MACH_Pmac && _machine != _MACH_apus ) \ - /* this must be the same as insw in io.h!! */ \ - _insw((unsigned short *)((port)+_IO_BASE), (buf), (ns)); \ - else \ - ide_insw((port), (buf), (ns)); \ -} while (0) -#undef outsw -#define outsw(port, buf, ns) do { \ - if ( _machine != _MACH_Pmac && _machine != _MACH_apus ) \ - /* this must be the same as outsw in io.h!! */ \ - _outsw((unsigned short *)((port)+_IO_BASE), (buf), (ns)); \ - else \ - ide_outsw((port), (buf), (ns)); \ -} while (0) -#else /* CONFIG_APUS */ - -#ifdef __KERNEL__ - -#include <linux/hdreg.h> -#include <linux/ioport.h> -#include <asm/io.h> /* so we can redefine insw/outsw */ +#include <linux/sched.h> +#include <asm/processor.h> #ifndef MAX_HWIFS #define MAX_HWIFS 4 #endif -#undef SUPPORT_SLOW_DATA_PORTS -#define SUPPORT_SLOW_DATA_PORTS 0 -#undef SUPPORT_VLB_SYNC -#define SUPPORT_VLB_SYNC 0 - +typedef unsigned int ide_ioreg_t; -#define ide__sti() __sti() +#ifdef __KERNEL__ -typedef unsigned int ide_ioreg_t; -void ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); -void prep_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); -void mbx_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); -void pmac_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); -void chrp_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); -void ide_insw(ide_ioreg_t port, void *buf, int ns); -void ide_outsw(ide_ioreg_t port, void *buf, int ns); +#include <linux/hdreg.h> +#include <linux/ioport.h> +#include <asm/io.h> extern int pmac_ide_ports_known; extern ide_ioreg_t pmac_ide_regbase[MAX_HWIFS]; @@ -78,222 +37,86 @@ extern ide_ioreg_t chrp_idedma_regbase; /* one for both channels */ extern unsigned int chrp_ide_irq; extern void chrp_ide_probe(void); +struct ide_machdep_calls { + void (*insw)(ide_ioreg_t port, void *buf, int ns); + void (*outsw)(ide_ioreg_t port, void *buf, int ns); + int (*default_irq)(ide_ioreg_t base); + ide_ioreg_t (*default_io_base)(int index); + int (*check_region)(ide_ioreg_t from, unsigned int extent); + void (*request_region)(ide_ioreg_t from, + unsigned int extent, + const char *name); + void (*release_region)(ide_ioreg_t from, + unsigned int extent); + void (*fix_driveid)(struct hd_driveid *id); + void (*ide_init_hwif)(ide_ioreg_t *p, + ide_ioreg_t base, + int *irq); + + int io_base; +}; + +extern struct ide_machdep_calls ppc_ide_md; + +void ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); +void ide_insw(ide_ioreg_t port, void *buf, int ns); +void ide_outsw(ide_ioreg_t port, void *buf, int ns); +void ppc_generic_ide_fix_driveid(struct hd_driveid *id); + +#undef insw +#define insw(port, buf, ns) do { \ + ppc_ide_md.insw((port), (buf), (ns)); \ +} while (0) + +#undef outsw +#define outsw(port, buf, ns) do { \ + ppc_ide_md.outsw((port), (buf), (ns)); \ +} while (0) + +#undef SUPPORT_SLOW_DATA_PORTS +#define SUPPORT_SLOW_DATA_PORTS 0 +#undef SUPPORT_VLB_SYNC +#define SUPPORT_VLB_SYNC 0 + +#define ide__sti() __sti() + static __inline__ int ide_default_irq(ide_ioreg_t base) { - if ( _machine == _MACH_Pmac ) - return 0; - else if ( _machine == _MACH_mbx ) - /* hardcode IRQ 14 on the MBX */ - return 14+16; - else if ( _machine == _MACH_chrp) { - if (chrp_ide_ports_known == 0) - chrp_ide_probe(); - return chrp_ide_irq; - } - switch (base) { - case 0x1f0: return 13; - case 0x170: return 13; - case 0x1e8: return 11; - case 0x168: return 10; - default: - return 0; - } + return ppc_ide_md.default_irq(base); } static __inline__ ide_ioreg_t ide_default_io_base(int index) { -#if defined(CONFIG_BLK_DEV_IDE_PMAC) - if (_machine == _MACH_Pmac) { - return pmac_ide_regbase[index]; - } -#endif - if (_machine == _MACH_mbx) return index; - if ( _machine == _MACH_chrp ) { - if (chrp_ide_ports_known == 0) - chrp_ide_probe(); - return chrp_ide_regbase[index]; - } - switch (index) { - case 0: return 0x1f0; - case 1: return 0x170; - case 2: return 0x1e8; - case 3: return 0x168; - default: - return 0; - } + return ppc_ide_md.default_io_base(index); } static __inline__ int ide_check_region (ide_ioreg_t from, unsigned int extent) { - if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx)) - return 0; - return check_region(from, extent); + return ppc_ide_md.check_region(from, extent); } static __inline__ void ide_request_region (ide_ioreg_t from, unsigned int extent, const char *name) { - if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) - return; - request_region(from, extent, name); + ppc_ide_md.request_region(from, extent, name); } static __inline__ void ide_release_region (ide_ioreg_t from, unsigned int extent) { - if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) - return; - release_region(from, extent); + ppc_ide_md.release_region(from, extent); } -/* Convert the shorts/longs in hd_driveid from little to big endian; - chars are endian independent, of course, but strings need to be flipped. - (Despite what it says in drivers/block/ide.h, they come up as little endian...) - Changes to linux/hdreg.h may require changes here. */ static __inline__ void ide_fix_driveid (struct hd_driveid *id) { - if (( _machine == _MACH_Pmac ) || (_machine == _MACH_chrp)|| (_machine == _MACH_mbx) ) { - int i; - unsigned short *stringcast; - id->config = __le16_to_cpu(id->config); - id->cyls = __le16_to_cpu(id->cyls); - id->reserved2 = __le16_to_cpu(id->reserved2); - id->heads = __le16_to_cpu(id->heads); - id->track_bytes = __le16_to_cpu(id->track_bytes); - id->sector_bytes = __le16_to_cpu(id->sector_bytes); - id->sectors = __le16_to_cpu(id->sectors); - id->vendor0 = __le16_to_cpu(id->vendor0); - id->vendor1 = __le16_to_cpu(id->vendor1); - id->vendor2 = __le16_to_cpu(id->vendor2); - stringcast = (unsigned short *)&id->serial_no[0]; - for (i=0; i<(20/2); i++) - stringcast[i] = __le16_to_cpu(stringcast[i]); - id->buf_type = __le16_to_cpu(id->buf_type); - id->buf_size = __le16_to_cpu(id->buf_size); - id->ecc_bytes = __le16_to_cpu(id->ecc_bytes); - stringcast = (unsigned short *)&id->fw_rev[0]; - for (i=0; i<(8/2); i++) - stringcast[i] = __le16_to_cpu(stringcast[i]); - stringcast = (unsigned short *)&id->model[0]; - for (i=0; i<(40/2); i++) - stringcast[i] = __le16_to_cpu(stringcast[i]); - id->dword_io = __le16_to_cpu(id->dword_io); - id->reserved50 = __le16_to_cpu(id->reserved50); - id->field_valid = __le16_to_cpu(id->field_valid); - id->cur_cyls = __le16_to_cpu(id->cur_cyls); - id->cur_heads = __le16_to_cpu(id->cur_heads); - id->cur_sectors = __le16_to_cpu(id->cur_sectors); - id->cur_capacity0 = __le16_to_cpu(id->cur_capacity0); - id->cur_capacity1 = __le16_to_cpu(id->cur_capacity1); - id->lba_capacity = __le32_to_cpu(id->lba_capacity); - id->dma_1word = __le16_to_cpu(id->dma_1word); - id->dma_mword = __le16_to_cpu(id->dma_mword); - id->eide_pio_modes = __le16_to_cpu(id->eide_pio_modes); - id->eide_dma_min = __le16_to_cpu(id->eide_dma_min); - id->eide_dma_time = __le16_to_cpu(id->eide_dma_time); - id->eide_pio = __le16_to_cpu(id->eide_pio); - id->eide_pio_iordy = __le16_to_cpu(id->eide_pio_iordy); - id->word69 = __le16_to_cpu(id->word69); - id->word70 = __le16_to_cpu(id->word70); - id->word71 = __le16_to_cpu(id->word71); - id->word72 = __le16_to_cpu(id->word72); - id->word73 = __le16_to_cpu(id->word73); - id->word74 = __le16_to_cpu(id->word74); - id->word75 = __le16_to_cpu(id->word75); - id->word76 = __le16_to_cpu(id->word76); - id->word77 = __le16_to_cpu(id->word77); - id->word78 = __le16_to_cpu(id->word78); - id->word79 = __le16_to_cpu(id->word79); - id->word80 = __le16_to_cpu(id->word80); - id->word81 = __le16_to_cpu(id->word81); - id->command_sets = __le16_to_cpu(id->command_sets); - id->word83 = __le16_to_cpu(id->word83); - id->word84 = __le16_to_cpu(id->word84); - id->word85 = __le16_to_cpu(id->word85); - id->word86 = __le16_to_cpu(id->word86); - id->word87 = __le16_to_cpu(id->word87); - id->dma_ultra = __le16_to_cpu(id->dma_ultra); - id->word89 = __le16_to_cpu(id->word89); - id->word90 = __le16_to_cpu(id->word90); - id->word91 = __le16_to_cpu(id->word91); - id->word92 = __le16_to_cpu(id->word92); - id->word93 = __le16_to_cpu(id->word93); - id->word94 = __le16_to_cpu(id->word94); - id->word95 = __le16_to_cpu(id->word95); - id->word96 = __le16_to_cpu(id->word96); - id->word97 = __le16_to_cpu(id->word97); - id->word98 = __le16_to_cpu(id->word98); - id->word99 = __le16_to_cpu(id->word99); - id->word100 = __le16_to_cpu(id->word100); - id->word101 = __le16_to_cpu(id->word101); - id->word102 = __le16_to_cpu(id->word102); - id->word103 = __le16_to_cpu(id->word103); - id->word104 = __le16_to_cpu(id->word104); - id->word105 = __le16_to_cpu(id->word105); - id->word106 = __le16_to_cpu(id->word106); - id->word107 = __le16_to_cpu(id->word107); - id->word108 = __le16_to_cpu(id->word108); - id->word109 = __le16_to_cpu(id->word109); - id->word110 = __le16_to_cpu(id->word110); - id->word111 = __le16_to_cpu(id->word111); - id->word112 = __le16_to_cpu(id->word112); - id->word113 = __le16_to_cpu(id->word113); - id->word114 = __le16_to_cpu(id->word114); - id->word115 = __le16_to_cpu(id->word115); - id->word116 = __le16_to_cpu(id->word116); - id->word117 = __le16_to_cpu(id->word117); - id->word118 = __le16_to_cpu(id->word118); - id->word119 = __le16_to_cpu(id->word119); - id->word120 = __le16_to_cpu(id->word120); - id->word121 = __le16_to_cpu(id->word121); - id->word122 = __le16_to_cpu(id->word122); - id->word123 = __le16_to_cpu(id->word123); - id->word124 = __le16_to_cpu(id->word124); - id->word125 = __le16_to_cpu(id->word125); - id->word126 = __le16_to_cpu(id->word126); - id->word127 = __le16_to_cpu(id->word127); - id->security = __le16_to_cpu(id->security); - for (i=0; i<127; i++) - id->reserved[i] = __le16_to_cpu(id->reserved[i]); - } + ppc_ide_md.fix_driveid(id); } -#undef insw -#define insw(port, buf, ns) do { \ - if ( _machine == _MACH_chrp) {\ - ide_insw((port)+_IO_BASE, (buf), (ns)); \ - }\ - else if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) \ - ide_insw((port)+((_machine==_MACH_mbx)? 0x80000000: 0), \ - (buf), (ns)); \ - else \ - /* this must be the same as insw in io.h!! */ \ - _insw((unsigned short *)((port)+_IO_BASE), (buf), (ns)); \ -} while (0) -#undef outsw -/* printk("port: %x buf: %p ns: %d\n",port,buf,ns); \ */ -#define outsw(port, buf, ns) do { \ - if ( _machine == _MACH_chrp) {\ - ide_outsw((port)+_IO_BASE, (buf), (ns)); \ - }\ - else if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) \ - ide_outsw((port)+((_machine==_MACH_mbx)? 0x80000000: 0), \ - (buf), (ns)); \ - else \ - /* this must be the same as outsw in io.h!! */ \ - _outsw((unsigned short *)((port)+_IO_BASE), (buf), (ns)); \ -} while (0) - #undef inb -#define inb(port) \ - in_8((unsigned char *)((port) + \ - ((_machine==_MACH_Pmac)? 0: _IO_BASE) + \ - ((_machine==_MACH_mbx)? 0x80000000: 0)) ) +#define inb(port) in_8((unsigned char *)((port) + ppc_ide_md.io_base)) #undef inb_p #define inb_p(port) inb(port) #undef outb #define outb(val, port) \ - out_8((unsigned char *)((port) + \ - ((_machine==_MACH_Pmac)? 0: _IO_BASE) + \ - ((_machine==_MACH_mbx)? 0x80000000: 0)), (val) ) + out_8((unsigned char *)((port) + ppc_ide_md.io_base), (val) ) #undef outb_p #define outb_p(val, port) outb(val, port) @@ -327,6 +150,5 @@ static __inline__ void ide_free_irq(unsigned int irq, void *dev_id) #define ide_get_lock(lock, hdlr, data) do {} while (0) #endif /* __KERNEL__ */ -#endif /* CONFIG_APUS */ #endif /* __ASMPPC_IDE_H */ |