Blame view

drivers/ide/gayle.c 4.41 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
  /*
58f189fcc   Bartlomiej Zolnierkiewicz   ide: delete filen...
2
   *  Amiga Gayle IDE Driver
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
3
4
5
6
7
8
9
   *
   *     Created 9 Jul 1997 by Geert Uytterhoeven
   *
   *  This file is subject to the terms and conditions of the GNU General Public
   *  License.  See the file COPYING in the main directory of this archive for
   *  more details.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
10
11
12
13
  #include <linux/types.h>
  #include <linux/mm.h>
  #include <linux/interrupt.h>
  #include <linux/blkdev.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
14
15
16
  #include <linux/ide.h>
  #include <linux/init.h>
  #include <linux/zorro.h>
513f3c10d   Adrian Bunk   ide: export ide_d...
17
  #include <linux/module.h>
9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
18
  #include <linux/platform_device.h>
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
19
20
21
22
23
24
25
26
  
  #include <asm/setup.h>
  #include <asm/amigahw.h>
  #include <asm/amigaints.h>
  #include <asm/amigayle.h>
  
  
      /*
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
27
28
       *  Offsets from one of the above bases
       */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
29
  #define GAYLE_CONTROL	0x101a
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
30
31
32
33
34
35
36
37
38
39
40
41
42
43
      /*
       *  These are at different offsets from the base
       */
  
  #define GAYLE_IRQ_4000	0xdd3020	/* MSB = 1, Harddisk is source of */
  #define GAYLE_IRQ_1200	0xda9000	/* interrupt */
  
  
      /*
       *  Offset of the secondary port for IDE doublers
       *  Note that GAYLE_CONTROL is NOT available then!
       */
  
  #define GAYLE_NEXT_PORT	0x1000
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
44
45
46
47
  #define GAYLE_NUM_HWIFS		2
  #define GAYLE_NUM_PROBE_HWIFS	(ide_doubler ? GAYLE_NUM_HWIFS : \
  					       GAYLE_NUM_HWIFS-1)
  #define GAYLE_HAS_CONTROL_REG	(!ide_doubler)
513f3c10d   Adrian Bunk   ide: export ide_d...
48

90ab5ee94   Rusty Russell   module_param: mak...
49
  static bool ide_doubler;
9dcba7f2b   Bartlomiej Zolnierkiewicz   gayle: add "doubl...
50
51
  module_param_named(doubler, ide_doubler, bool, 0);
  MODULE_PARM_DESC(doubler, "enable support for IDE doublers");
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
52
53
54
55
  
      /*
       *  Check and acknowledge the interrupt status
       */
f4d3ffa52   Sergei Shtylyov   ide: move ack_int...
56
  static int gayle_test_irq(ide_hwif_t *hwif)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
57
  {
9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
58
  	unsigned char ch;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
59

9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
60
61
62
63
  	ch = z_readb(hwif->io_ports.irq_addr);
  	if (!(ch & GAYLE_IRQ_IDE))
  		return 0;
  	return 1;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
64
  }
eba8999ce   Sergei Shtylyov   ide: move IRQ cle...
65
  static void gayle_a1200_clear_irq(ide_drive_t *drive)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
  {
9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
67
  	ide_hwif_t *hwif = drive->hwif;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
68

9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
69
70
  	(void)z_readb(hwif->io_ports.status_addr);
  	z_writeb(0x7c, hwif->io_ports.irq_addr);
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
71
  }
9f36d3143   Bartlomiej Zolnierkiewicz   ide: remove hw_re...
72
  static void __init gayle_setup_ports(struct ide_hw *hw, unsigned long base,
f4d3ffa52   Sergei Shtylyov   ide: move ack_int...
73
  				     unsigned long ctl, unsigned long irq_port)
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
74
75
76
77
  {
  	int i;
  
  	memset(hw, 0, sizeof(*hw));
4c3032d8a   Bartlomiej Zolnierkiewicz   ide: add struct i...
78
  	hw->io_ports.data_addr = base;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
79
80
  
  	for (i = 1; i < 8; i++)
4c3032d8a   Bartlomiej Zolnierkiewicz   ide: add struct i...
81
  		hw->io_ports_array[i] = base + 2 + i * 4;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
82

4c3032d8a   Bartlomiej Zolnierkiewicz   ide: add struct i...
83
84
  	hw->io_ports.ctl_addr = ctl;
  	hw->io_ports.irq_addr = irq_port;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
85
86
  
  	hw->irq = IRQ_AMIGA_PORTS;
29dd59755   Bartlomiej Zolnierkiewicz   ide: remove ide_s...
87
  }
f4d3ffa52   Sergei Shtylyov   ide: move ack_int...
88
89
90
  static const struct ide_port_ops gayle_a4000_port_ops = {
  	.test_irq		= gayle_test_irq,
  };
eba8999ce   Sergei Shtylyov   ide: move IRQ cle...
91
92
  static const struct ide_port_ops gayle_a1200_port_ops = {
  	.clear_irq		= gayle_a1200_clear_irq,
f4d3ffa52   Sergei Shtylyov   ide: move ack_int...
93
  	.test_irq		= gayle_test_irq,
eba8999ce   Sergei Shtylyov   ide: move IRQ cle...
94
  };
a4cd1a344   Bartlomiej Zolnierkiewicz   gayle: set IDE_HF...
95
  static const struct ide_port_info gayle_port_info = {
09a3e7918   Bartlomiej Zolnierkiewicz   ide: make m68k ho...
96
97
  	.host_flags		= IDE_HFLAG_MMIO | IDE_HFLAG_SERIALIZE |
  				  IDE_HFLAG_NO_DMA,
255115fb3   Bartlomiej Zolnierkiewicz   ide: allow host d...
98
  	.irq_flags		= IRQF_SHARED,
29e52cf79   Bartlomiej Zolnierkiewicz   ide: remove chips...
99
  	.chipset		= ide_generic,
a4cd1a344   Bartlomiej Zolnierkiewicz   gayle: set IDE_HF...
100
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
101
102
103
      /*
       *  Probe for a Gayle IDE interface (and optionally for an IDE doubler)
       */
9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
104
  static int __init amiga_gayle_ide_probe(struct platform_device *pdev)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
105
  {
9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
  	struct resource *res;
  	struct gayle_ide_platform_data *pdata;
  	unsigned long base, ctrlport, irqport;
  	unsigned int i;
  	int error;
  	struct ide_hw hw[GAYLE_NUM_HWIFS], *hws[GAYLE_NUM_HWIFS];
  	struct ide_port_info d = gayle_port_info;
  	struct ide_host *host;
  
  	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  	if (!res)
  		return -ENODEV;
  
  	if (!request_mem_region(res->start, resource_size(res), "IDE"))
  		return -EBUSY;
7b6b56123   Jingoo Han   ide: use dev_get_...
121
  	pdata = dev_get_platdata(&pdev->dev);
9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
  	pr_info("ide: Gayle IDE controller (A%u style%s)
  ",
  		pdata->explicit_ack ? 1200 : 4000,
  		ide_doubler ? ", IDE doubler" : "");
  
  	base = (unsigned long)ZTWO_VADDR(pdata->base);
  	ctrlport = 0;
  	irqport = (unsigned long)ZTWO_VADDR(pdata->irqport);
  	if (pdata->explicit_ack)
  		d.port_ops = &gayle_a1200_port_ops;
  	else
  		d.port_ops = &gayle_a4000_port_ops;
  
  	for (i = 0; i < GAYLE_NUM_PROBE_HWIFS; i++, base += GAYLE_NEXT_PORT) {
  		if (GAYLE_HAS_CONTROL_REG)
  			ctrlport = base + GAYLE_CONTROL;
  
  		gayle_setup_ports(&hw[i], base, ctrlport, irqport);
  		hws[i] = &hw[i];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
141
  	}
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
142

9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
143
144
145
  	error = ide_host_add(&d, hws, i, &host);
  	if (error)
  		goto out;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
146

9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
147
148
  	platform_set_drvdata(pdev, host);
  	return 0;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
149

9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
150
151
152
153
154
155
156
157
158
159
160
161
162
163
  out:
  	release_mem_region(res->start, resource_size(res));
  	return error;
  }
  
  static int __exit amiga_gayle_ide_remove(struct platform_device *pdev)
  {
  	struct ide_host *host = platform_get_drvdata(pdev);
  	struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  
  	ide_host_remove(host);
  	release_mem_region(res->start, resource_size(res));
  	return 0;
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
164

9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
165
166
167
168
  static struct platform_driver amiga_gayle_ide_driver = {
  	.remove = __exit_p(amiga_gayle_ide_remove),
  	.driver   = {
  		.name	= "amiga-gayle-ide",
9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
169
170
  	},
  };
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
171

bf6b4388c   Jingoo Han   ide: gayle: use m...
172
  module_platform_driver_probe(amiga_gayle_ide_driver, amiga_gayle_ide_probe);
6e1d17da7   Adrian Bunk   ide/legacy/gayle....
173
174
  
  MODULE_LICENSE("GPL");
9aed23026   Geert Uytterhoeven   m68k: amiga - Ami...
175
  MODULE_ALIAS("platform:amiga-gayle-ide");