diff options
Diffstat (limited to 'drivers/ide/legacy/ide-cs.c')
-rw-r--r-- | drivers/ide/legacy/ide-cs.c | 54 |
1 files changed, 24 insertions, 30 deletions
diff --git a/drivers/ide/legacy/ide-cs.c b/drivers/ide/legacy/ide-cs.c index 27b1e0b7ecb4..21bfac137844 100644 --- a/drivers/ide/legacy/ide-cs.c +++ b/drivers/ide/legacy/ide-cs.c | |||
@@ -74,7 +74,7 @@ INT_MODULE_PARM(pc_debug, 0); | |||
74 | 74 | ||
75 | typedef struct ide_info_t { | 75 | typedef struct ide_info_t { |
76 | struct pcmcia_device *p_dev; | 76 | struct pcmcia_device *p_dev; |
77 | ide_hwif_t *hwif; | 77 | struct ide_host *host; |
78 | int ndev; | 78 | int ndev; |
79 | dev_node_t node; | 79 | dev_node_t node; |
80 | } ide_info_t; | 80 | } ide_info_t; |
@@ -132,7 +132,7 @@ static int ide_probe(struct pcmcia_device *link) | |||
132 | static void ide_detach(struct pcmcia_device *link) | 132 | static void ide_detach(struct pcmcia_device *link) |
133 | { | 133 | { |
134 | ide_info_t *info = link->priv; | 134 | ide_info_t *info = link->priv; |
135 | ide_hwif_t *hwif = info->hwif; | 135 | ide_hwif_t *hwif = info->host->ports[0]; |
136 | unsigned long data_addr, ctl_addr; | 136 | unsigned long data_addr, ctl_addr; |
137 | 137 | ||
138 | DEBUG(0, "ide_detach(0x%p)\n", link); | 138 | DEBUG(0, "ide_detach(0x%p)\n", link); |
@@ -157,13 +157,13 @@ static const struct ide_port_info idecs_port_info = { | |||
157 | .host_flags = IDE_HFLAG_NO_DMA, | 157 | .host_flags = IDE_HFLAG_NO_DMA, |
158 | }; | 158 | }; |
159 | 159 | ||
160 | static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl, | 160 | static struct ide_host *idecs_register(unsigned long io, unsigned long ctl, |
161 | unsigned long irq, struct pcmcia_device *handle) | 161 | unsigned long irq, struct pcmcia_device *handle) |
162 | { | 162 | { |
163 | struct ide_host *host; | ||
163 | ide_hwif_t *hwif; | 164 | ide_hwif_t *hwif; |
164 | hw_regs_t hw; | 165 | int i, rc; |
165 | int i; | 166 | hw_regs_t hw, *hws[] = { &hw, NULL, NULL, NULL }; |
166 | u8 idx[4] = { 0xff, 0xff, 0xff, 0xff }; | ||
167 | 167 | ||
168 | if (!request_region(io, 8, DRV_NAME)) { | 168 | if (!request_region(io, 8, DRV_NAME)) { |
169 | printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n", | 169 | printk(KERN_ERR "%s: I/O resource 0x%lX-0x%lX not free.\n", |
@@ -184,30 +184,24 @@ static ide_hwif_t *idecs_register(unsigned long io, unsigned long ctl, | |||
184 | hw.chipset = ide_pci; | 184 | hw.chipset = ide_pci; |
185 | hw.dev = &handle->dev; | 185 | hw.dev = &handle->dev; |
186 | 186 | ||
187 | hwif = ide_find_port(); | 187 | rc = ide_host_add(&idecs_port_info, hws, &host); |
188 | if (hwif == NULL) | 188 | if (rc) |
189 | goto out_release; | 189 | goto out_release; |
190 | 190 | ||
191 | i = hwif->index; | 191 | hwif = host->ports[0]; |
192 | |||
193 | ide_init_port_hw(hwif, &hw); | ||
194 | |||
195 | idx[0] = i; | ||
196 | |||
197 | ide_device_add(idx, &idecs_port_info); | ||
198 | 192 | ||
199 | if (hwif->present) | 193 | if (hwif->present) |
200 | return hwif; | 194 | return host; |
201 | 195 | ||
202 | /* retry registration in case device is still spinning up */ | 196 | /* retry registration in case device is still spinning up */ |
203 | for (i = 0; i < 10; i++) { | 197 | for (i = 0; i < 10; i++) { |
204 | msleep(100); | 198 | msleep(100); |
205 | ide_port_scan(hwif); | 199 | ide_port_scan(hwif); |
206 | if (hwif->present) | 200 | if (hwif->present) |
207 | return hwif; | 201 | return host; |
208 | } | 202 | } |
209 | 203 | ||
210 | return hwif; | 204 | return host; |
211 | 205 | ||
212 | out_release: | 206 | out_release: |
213 | release_region(ctl, 1); | 207 | release_region(ctl, 1); |
@@ -239,7 +233,7 @@ static int ide_config(struct pcmcia_device *link) | |||
239 | cistpl_cftable_entry_t *cfg; | 233 | cistpl_cftable_entry_t *cfg; |
240 | int pass, last_ret = 0, last_fn = 0, is_kme = 0; | 234 | int pass, last_ret = 0, last_fn = 0, is_kme = 0; |
241 | unsigned long io_base, ctl_base; | 235 | unsigned long io_base, ctl_base; |
242 | ide_hwif_t *hwif; | 236 | struct ide_host *host; |
243 | 237 | ||
244 | DEBUG(0, "ide_config(0x%p)\n", link); | 238 | DEBUG(0, "ide_config(0x%p)\n", link); |
245 | 239 | ||
@@ -334,21 +328,21 @@ static int ide_config(struct pcmcia_device *link) | |||
334 | if (is_kme) | 328 | if (is_kme) |
335 | outb(0x81, ctl_base+1); | 329 | outb(0x81, ctl_base+1); |
336 | 330 | ||
337 | hwif = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); | 331 | host = idecs_register(io_base, ctl_base, link->irq.AssignedIRQ, link); |
338 | if (hwif == NULL && link->io.NumPorts1 == 0x20) { | 332 | if (host == NULL && link->io.NumPorts1 == 0x20) { |
339 | outb(0x02, ctl_base + 0x10); | 333 | outb(0x02, ctl_base + 0x10); |
340 | hwif = idecs_register(io_base + 0x10, ctl_base + 0x10, | 334 | host = idecs_register(io_base + 0x10, ctl_base + 0x10, |
341 | link->irq.AssignedIRQ, link); | 335 | link->irq.AssignedIRQ, link); |
342 | } | 336 | } |
343 | 337 | ||
344 | if (hwif == NULL) | 338 | if (host == NULL) |
345 | goto failed; | 339 | goto failed; |
346 | 340 | ||
347 | info->ndev = 1; | 341 | info->ndev = 1; |
348 | sprintf(info->node.dev_name, "hd%c", 'a' + hwif->index * 2); | 342 | sprintf(info->node.dev_name, "hd%c", 'a' + host->ports[0]->index * 2); |
349 | info->node.major = hwif->major; | 343 | info->node.major = host->ports[0]->major; |
350 | info->node.minor = 0; | 344 | info->node.minor = 0; |
351 | info->hwif = hwif; | 345 | info->host = host; |
352 | link->dev_node = &info->node; | 346 | link->dev_node = &info->node; |
353 | printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n", | 347 | printk(KERN_INFO "ide-cs: %s: Vpp = %d.%d\n", |
354 | info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10); | 348 | info->node.dev_name, link->conf.Vpp / 10, link->conf.Vpp % 10); |
@@ -379,15 +373,15 @@ failed: | |||
379 | static void ide_release(struct pcmcia_device *link) | 373 | static void ide_release(struct pcmcia_device *link) |
380 | { | 374 | { |
381 | ide_info_t *info = link->priv; | 375 | ide_info_t *info = link->priv; |
382 | ide_hwif_t *hwif = info->hwif; | 376 | struct ide_host *host = info->host; |
383 | 377 | ||
384 | DEBUG(0, "ide_release(0x%p)\n", link); | 378 | DEBUG(0, "ide_release(0x%p)\n", link); |
385 | 379 | ||
386 | if (info->ndev) { | 380 | if (info->ndev) |
387 | /* FIXME: if this fails we need to queue the cleanup somehow | 381 | /* FIXME: if this fails we need to queue the cleanup somehow |
388 | -- need to investigate the required PCMCIA magic */ | 382 | -- need to investigate the required PCMCIA magic */ |
389 | ide_unregister(hwif); | 383 | ide_host_remove(host); |
390 | } | 384 | |
391 | info->ndev = 0; | 385 | info->ndev = 0; |
392 | 386 | ||
393 | pcmcia_disable_device(link); | 387 | pcmcia_disable_device(link); |