diff options
author | Sergei Shtylyov <sshtylyov@ru.mvista.com> | 2007-07-09 17:17:56 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2007-07-09 17:17:56 -0400 |
commit | b1d19db4e770a752ec032971388fa69a73c84919 (patch) | |
tree | 5e4f9bf005b2ede5dbf658b10d42c835511c0ada /drivers/ide/pci | |
parent | 83a6d4ab3b09c0c1921b657bbaac5ada3c9c3623 (diff) |
aec62xx: rework init_setup_aec6x80()
Rework init_setup_aec6x80() so that it won't rewrite the constant name strings
anymore -- in order to do this:
- in aec62xx_init_one(), pass a local copy of 'struct pci_device_id' down the
call chain;
- change the names for in aec62xx_chipsets[] to default to AEC-6280[R];
- override the 'name' field in init_setup_aec6x80() only if bit 4 of the DMA
status register is set.
While at it, also change the 'udma_mask' field for AEC-6x80R chips in this
function and remove the code doing the same from the init_hwif() method...
Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/pci')
-rw-r--r-- | drivers/ide/pci/aec62xx.c | 35 |
1 files changed, 13 insertions, 22 deletions
diff --git a/drivers/ide/pci/aec62xx.c b/drivers/ide/pci/aec62xx.c index bed32d0eaa37..7067df2590c3 100644 --- a/drivers/ide/pci/aec62xx.c +++ b/drivers/ide/pci/aec62xx.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * linux/drivers/ide/pci/aec62xx.c Version 0.21 Apr 21, 2007 | 2 | * linux/drivers/ide/pci/aec62xx.c Version 0.22 Apr 23, 2007 |
3 | * | 3 | * |
4 | * Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org> | 4 | * Copyright (C) 1999-2002 Andre Hedrick <andre@linux-ide.org> |
5 | * Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com> | 5 | * Copyright (C) 2007 MontaVista Software, Inc. <source@mvista.com> |
@@ -239,14 +239,6 @@ static void __devinit init_hwif_aec62xx(ide_hwif_t *hwif) | |||
239 | } | 239 | } |
240 | 240 | ||
241 | hwif->ultra_mask = hwif->cds->udma_mask; | 241 | hwif->ultra_mask = hwif->cds->udma_mask; |
242 | |||
243 | /* atp865 and atp865r */ | ||
244 | if (hwif->ultra_mask == 0x3f) { | ||
245 | /* check bit 0x10 of DMA status register */ | ||
246 | if (inb(pci_resource_start(dev, 4) + 2) & 0x10) | ||
247 | hwif->ultra_mask = 0x7f; /* udma0-6 */ | ||
248 | } | ||
249 | |||
250 | hwif->mwdma_mask = 0x07; | 242 | hwif->mwdma_mask = 0x07; |
251 | 243 | ||
252 | hwif->ide_dma_check = &aec62xx_config_drive_xfer_rate; | 244 | hwif->ide_dma_check = &aec62xx_config_drive_xfer_rate; |
@@ -287,16 +279,12 @@ static int __devinit init_setup_aec62xx(struct pci_dev *dev, ide_pci_device_t *d | |||
287 | 279 | ||
288 | static int __devinit init_setup_aec6x80(struct pci_dev *dev, ide_pci_device_t *d) | 280 | static int __devinit init_setup_aec6x80(struct pci_dev *dev, ide_pci_device_t *d) |
289 | { | 281 | { |
290 | unsigned long bar4reg = pci_resource_start(dev, 4); | 282 | unsigned long dma_base = pci_resource_start(dev, 4); |
291 | 283 | ||
292 | if (inb(bar4reg+2) & 0x10) { | 284 | if (inb(dma_base + 2) & 0x10) { |
293 | strcpy(d->name, "AEC6880"); | 285 | d->name = (dev->device == PCI_DEVICE_ID_ARTOP_ATP865R) ? |
294 | if (dev->device == PCI_DEVICE_ID_ARTOP_ATP865R) | 286 | "AEC6880R" : "AEC6880"; |
295 | strcpy(d->name, "AEC6880R"); | 287 | d->udma_mask = 0x7f; /* udma0-6 */ |
296 | } else { | ||
297 | strcpy(d->name, "AEC6280"); | ||
298 | if (dev->device == PCI_DEVICE_ID_ARTOP_ATP865R) | ||
299 | strcpy(d->name, "AEC6280R"); | ||
300 | } | 288 | } |
301 | 289 | ||
302 | return ide_setup_pci_device(dev, d); | 290 | return ide_setup_pci_device(dev, d); |
@@ -336,7 +324,7 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { | |||
336 | .bootable = NEVER_BOARD, | 324 | .bootable = NEVER_BOARD, |
337 | .udma_mask = 0x1f, /* udma0-4 */ | 325 | .udma_mask = 0x1f, /* udma0-4 */ |
338 | },{ /* 3 */ | 326 | },{ /* 3 */ |
339 | .name = "AEC6X80", | 327 | .name = "AEC6280", |
340 | .init_setup = init_setup_aec6x80, | 328 | .init_setup = init_setup_aec6x80, |
341 | .init_chipset = init_chipset_aec62xx, | 329 | .init_chipset = init_chipset_aec62xx, |
342 | .init_hwif = init_hwif_aec62xx, | 330 | .init_hwif = init_hwif_aec62xx, |
@@ -346,7 +334,7 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { | |||
346 | .bootable = OFF_BOARD, | 334 | .bootable = OFF_BOARD, |
347 | .udma_mask = 0x3f, /* udma0-5 */ | 335 | .udma_mask = 0x3f, /* udma0-5 */ |
348 | },{ /* 4 */ | 336 | },{ /* 4 */ |
349 | .name = "AEC6X80R", | 337 | .name = "AEC6280R", |
350 | .init_setup = init_setup_aec6x80, | 338 | .init_setup = init_setup_aec6x80, |
351 | .init_chipset = init_chipset_aec62xx, | 339 | .init_chipset = init_chipset_aec62xx, |
352 | .init_hwif = init_hwif_aec62xx, | 340 | .init_hwif = init_hwif_aec62xx, |
@@ -366,13 +354,16 @@ static ide_pci_device_t aec62xx_chipsets[] __devinitdata = { | |||
366 | * | 354 | * |
367 | * Called when the PCI registration layer (or the IDE initialization) | 355 | * Called when the PCI registration layer (or the IDE initialization) |
368 | * finds a device matching our IDE device tables. | 356 | * finds a device matching our IDE device tables. |
357 | * | ||
358 | * NOTE: since we're going to modify the 'name' field for AEC-6[26]80[R] | ||
359 | * chips, pass a local copy of 'struct pci_device_id' down the call chain. | ||
369 | */ | 360 | */ |
370 | 361 | ||
371 | static int __devinit aec62xx_init_one(struct pci_dev *dev, const struct pci_device_id *id) | 362 | static int __devinit aec62xx_init_one(struct pci_dev *dev, const struct pci_device_id *id) |
372 | { | 363 | { |
373 | ide_pci_device_t *d = &aec62xx_chipsets[id->driver_data]; | 364 | ide_pci_device_t d = aec62xx_chipsets[id->driver_data]; |
374 | 365 | ||
375 | return d->init_setup(dev, d); | 366 | return d.init_setup(dev, &d); |
376 | } | 367 | } |
377 | 368 | ||
378 | static struct pci_device_id aec62xx_pci_tbl[] = { | 369 | static struct pci_device_id aec62xx_pci_tbl[] = { |