OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [linux/] [linux-2.4/] [drivers/] [ide/] [legacy/] [gayle.c] - Blame information for rev 1765

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 1275 phoenix
/*
2
 *  linux/drivers/ide/legacy/gayle.c -- Amiga Gayle IDE Driver
3
 *
4
 *     Created 9 Jul 1997 by Geert Uytterhoeven
5
 *
6
 *  This file is subject to the terms and conditions of the GNU General Public
7
 *  License.  See the file COPYING in the main directory of this archive for
8
 *  more details.
9
 */
10
 
11
#include <linux/config.h>
12
#include <linux/types.h>
13
#include <linux/mm.h>
14
#include <linux/interrupt.h>
15
#include <linux/blkdev.h>
16
#include <linux/hdreg.h>
17
#include <linux/ide.h>
18
#include <linux/init.h>
19
#include <linux/zorro.h>
20
 
21
#include <asm/setup.h>
22
#include <asm/amigahw.h>
23
#include <asm/amigaints.h>
24
#include <asm/amigayle.h>
25
 
26
 
27
    /*
28
     *  Bases of the IDE interfaces
29
     */
30
 
31
#define GAYLE_BASE_4000 0xdd2020        /* A4000/A4000T */
32
#define GAYLE_BASE_1200 0xda0000        /* A1200/A600 and E-Matrix 530 */
33
 
34
    /*
35
     *  Offsets from one of the above bases
36
     */
37
 
38
#define GAYLE_DATA      0x00
39
#define GAYLE_ERROR     0x06            /* see err-bits */
40
#define GAYLE_NSECTOR   0x0a            /* nr of sectors to read/write */
41
#define GAYLE_SECTOR    0x0e            /* starting sector */
42
#define GAYLE_LCYL      0x12            /* starting cylinder */
43
#define GAYLE_HCYL      0x16            /* high byte of starting cyl */
44
#define GAYLE_SELECT    0x1a            /* 101dhhhh , d=drive, hhhh=head */
45
#define GAYLE_STATUS    0x1e            /* see status-bits */
46
#define GAYLE_CONTROL   0x101a
47
 
48
static int gayle_offsets[IDE_NR_PORTS] __initdata = {
49
    GAYLE_DATA, GAYLE_ERROR, GAYLE_NSECTOR, GAYLE_SECTOR, GAYLE_LCYL,
50
    GAYLE_HCYL, GAYLE_SELECT, GAYLE_STATUS, -1, -1
51
};
52
 
53
 
54
    /*
55
     *  These are at different offsets from the base
56
     */
57
 
58
#define GAYLE_IRQ_4000  0xdd3020        /* MSB = 1, Harddisk is source of */
59
#define GAYLE_IRQ_1200  0xda9000        /* interrupt */
60
 
61
 
62
    /*
63
     *  Offset of the secondary port for IDE doublers
64
     *  Note that GAYLE_CONTROL is NOT available then!
65
     */
66
 
67
#define GAYLE_NEXT_PORT 0x1000
68
 
69
#ifndef CONFIG_BLK_DEV_IDEDOUBLER
70
#define GAYLE_NUM_HWIFS         1
71
#define GAYLE_NUM_PROBE_HWIFS   GAYLE_NUM_HWIFS
72
#define GAYLE_HAS_CONTROL_REG   1
73
#define GAYLE_IDEREG_SIZE       0x2000
74
#else /* CONFIG_BLK_DEV_IDEDOUBLER */
75
#define GAYLE_NUM_HWIFS         2
76
#define GAYLE_NUM_PROBE_HWIFS   (ide_doubler ? GAYLE_NUM_HWIFS : \
77
                                               GAYLE_NUM_HWIFS-1)
78
#define GAYLE_HAS_CONTROL_REG   (!ide_doubler)
79
#define GAYLE_IDEREG_SIZE       (ide_doubler ? 0x1000 : 0x2000)
80
int ide_doubler = 0;     /* support IDE doublers? */
81
#endif /* CONFIG_BLK_DEV_IDEDOUBLER */
82
 
83
 
84
    /*
85
     *  Check and acknowledge the interrupt status
86
     */
87
 
88
static int gayle_ack_intr_a4000(ide_hwif_t *hwif)
89
{
90
    unsigned char ch;
91
 
92
    ch = z_readb(hwif->io_ports[IDE_IRQ_OFFSET]);
93
    if (!(ch & GAYLE_IRQ_IDE))
94
        return 0;
95
    return 1;
96
}
97
 
98
static int gayle_ack_intr_a1200(ide_hwif_t *hwif)
99
{
100
    unsigned char ch;
101
 
102
    ch = z_readb(hwif->io_ports[IDE_IRQ_OFFSET]);
103
    if (!(ch & GAYLE_IRQ_IDE))
104
        return 0;
105
    (void)z_readb(hwif->io_ports[IDE_STATUS_OFFSET]);
106
    z_writeb(0x7c, hwif->io_ports[IDE_IRQ_OFFSET]);
107
    return 1;
108
}
109
 
110
    /*
111
     *  Probe for a Gayle IDE interface (and optionally for an IDE doubler)
112
     */
113
 
114
void __init gayle_init(void)
115
{
116
    int a4000, i;
117
 
118
    if (!MACH_IS_AMIGA)
119
        return;
120
 
121
    if ((a4000 = AMIGAHW_PRESENT(A4000_IDE)) || AMIGAHW_PRESENT(A1200_IDE))
122
        goto found;
123
 
124
#ifdef CONFIG_ZORRO
125
    if (zorro_find_device(ZORRO_PROD_MTEC_VIPER_MK_V_E_MATRIX_530_SCSI_IDE,
126
                          NULL))
127
        goto found;
128
#endif
129
    return;
130
 
131
found:
132
    for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++) {
133
        ide_ioreg_t base, ctrlport, irqport;
134
        ide_ack_intr_t *ack_intr;
135
        hw_regs_t hw;
136
        ide_hwif_t *hwif;
137
        int index;
138
        unsigned long phys_base, res_start, res_n;
139
 
140
        if (a4000) {
141
            phys_base = GAYLE_BASE_4000;
142
            irqport = (ide_ioreg_t)ZTWO_VADDR(GAYLE_IRQ_4000);
143
            ack_intr = gayle_ack_intr_a4000;
144
        } else {
145
            phys_base = GAYLE_BASE_1200;
146
            irqport = (ide_ioreg_t)ZTWO_VADDR(GAYLE_IRQ_1200);
147
            ack_intr = gayle_ack_intr_a1200;
148
        }
149
/*
150
 * FIXME: we now have selectable modes between mmio v/s iomio
151
 */
152
 
153
        phys_base += i*GAYLE_NEXT_PORT;
154
 
155
        res_start = ((unsigned long)phys_base) & ~(GAYLE_NEXT_PORT-1);
156
        res_n = GAYLE_IDEREG_SIZE;
157
 
158
        if (!request_mem_region(res_start, res_n, "IDE"))
159
            continue;
160
 
161
        base = (ide_ioreg_t)ZTWO_VADDR(phys_base);
162
        ctrlport = GAYLE_HAS_CONTROL_REG ? (base + GAYLE_CONTROL) : 0;
163
 
164
        ide_setup_ports(&hw, base, gayle_offsets,
165
                        ctrlport, irqport, ack_intr,
166
//                      &gayle_iops,
167
                        IRQ_AMIGA_PORTS);
168
 
169
        index = ide_register_hw(&hw, &hwif);
170
        if (index != -1) {
171
            hwif->mmio = 2;
172
            switch (i) {
173
                case 0:
174
                    printk("ide%d: Gayle IDE interface (A%d style)\n", index,
175
                           a4000 ? 4000 : 1200);
176
                    break;
177
#ifdef CONFIG_BLK_DEV_IDEDOUBLER
178
                case 1:
179
                    printk("ide%d: IDE doubler\n", index);
180
                    break;
181
#endif /* CONFIG_BLK_DEV_IDEDOUBLER */
182
            }
183
        } else
184
            release_mem_region(res_start, res_n);
185
    }
186
}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.