1/*
2 *  linux/include/asm-ia64/ide.h
3 *
4 *  Copyright (C) 1994-1996  Linus Torvalds & authors
5 */
6
7/*
8 *  This file contains the ia64 architecture specific IDE code.
9 */
10
11#ifndef __ASM_IA64_IDE_H
12#define __ASM_IA64_IDE_H
13
14#ifdef __KERNEL__
15
16#include <linux/config.h>
17
18#include <linux/irq.h>
19
20#ifndef MAX_HWIFS
21# ifdef CONFIG_BLK_DEV_IDEPCI
22#define MAX_HWIFS	10
23# else
24#define MAX_HWIFS	6
25# endif
26#endif
27
28#define ide__sti()	__sti()
29
30static __inline__ int ide_default_irq(ide_ioreg_t base)
31{
32	switch (base) {
33		case 0x1f0: return isa_irq_to_vector(14);
34		case 0x170: return isa_irq_to_vector(15);
35		case 0x1e8: return isa_irq_to_vector(11);
36		case 0x168: return isa_irq_to_vector(10);
37		case 0x1e0: return isa_irq_to_vector(8);
38		case 0x160: return isa_irq_to_vector(12);
39		default:
40			return 0;
41	}
42}
43
44static __inline__ ide_ioreg_t ide_default_io_base(int index)
45{
46	switch (index) {
47		case 0:	return 0x1f0;
48		case 1:	return 0x170;
49		case 2: return 0x1e8;
50		case 3: return 0x168;
51		case 4: return 0x1e0;
52		case 5: return 0x160;
53		default:
54			return 0;
55	}
56}
57
58static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq)
59{
60	ide_ioreg_t reg = data_port;
61	int i;
62
63	for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) {
64		hw->io_ports[i] = reg;
65		reg += 1;
66	}
67	if (ctrl_port) {
68		hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port;
69	} else {
70		hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206;
71	}
72	if (irq != NULL)
73		*irq = 0;
74	hw->io_ports[IDE_IRQ_OFFSET] = 0;
75}
76
77static __inline__ void ide_init_default_hwifs(void)
78{
79#ifndef CONFIG_BLK_DEV_IDEPCI
80	hw_regs_t hw;
81	int index;
82
83	for(index = 0; index < MAX_HWIFS; index++) {
84		ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL);
85		hw.irq = ide_default_irq(ide_default_io_base(index));
86		ide_register_hw(&hw, NULL);
87	}
88#endif /* CONFIG_BLK_DEV_IDEPCI */
89}
90
91typedef union {
92	unsigned all			: 8;	/* all of the bits together */
93	struct {
94		unsigned head		: 4;	/* always zeros here */
95		unsigned unit		: 1;	/* drive select number, 0 or 1 */
96		unsigned bit5		: 1;	/* always 1 */
97		unsigned lba		: 1;	/* using LBA instead of CHS */
98		unsigned bit7		: 1;	/* always 1 */
99	} b;
100} select_t;
101
102typedef union {
103	unsigned all			: 8;	/* all of the bits together */
104	struct {
105		unsigned bit0		: 1;
106		unsigned nIEN		: 1;	/* device INTRQ to host */
107		unsigned SRST		: 1;	/* host soft reset bit */
108		unsigned bit3		: 1;	/* ATA-2 thingy */
109		unsigned reserved456	: 3;
110		unsigned HOB		: 1;	/* 48-bit address ordering */
111	} b;
112} control_t;
113
114#define ide_request_irq(irq,hand,flg,dev,id)	request_irq((irq),(hand),(flg),(dev),(id))
115#define ide_free_irq(irq,dev_id)		free_irq((irq), (dev_id))
116#define ide_check_region(from,extent)		check_region((from), (extent))
117#define ide_request_region(from,extent,name)	request_region((from), (extent), (name))
118#define ide_release_region(from,extent)		release_region((from), (extent))
119
120/*
121 * The following are not needed for the non-m68k ports
122 */
123#define ide_ack_intr(hwif)		(1)
124#define ide_fix_driveid(id)		do {} while (0)
125#define ide_release_lock(lock)		do {} while (0)
126#define ide_get_lock(lock, hdlr, data)	do {} while (0)
127
128#endif /* __KERNEL__ */
129
130#endif /* __ASM_IA64_IDE_H */
131