mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 20:54:10 +08:00
pata_via: add via_fixup()
* Fix via_init_one() to enable clock on 66 MHz devices
(bug introduced in commit 460f531
"pata_via: store UDMA masks
in via_isa_bridges table").
* Factor out common code from via_[re]init_one() to via_fixup().
Acked-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
This commit is contained in:
parent
bff00256f1
commit
d9d579842e
@ -509,6 +509,27 @@ static void via_config_fifo(struct pci_dev *pdev, unsigned int flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void via_fixup(struct pci_dev *pdev, const struct via_isa_bridge *config)
|
||||||
|
{
|
||||||
|
u32 timing;
|
||||||
|
|
||||||
|
/* Initialise the FIFO for the enabled channels. */
|
||||||
|
via_config_fifo(pdev, config->flags);
|
||||||
|
|
||||||
|
if (config->udma_mask == ATA_UDMA4) {
|
||||||
|
/* The 66 MHz devices require we enable the clock */
|
||||||
|
pci_read_config_dword(pdev, 0x50, &timing);
|
||||||
|
timing |= 0x80008;
|
||||||
|
pci_write_config_dword(pdev, 0x50, timing);
|
||||||
|
}
|
||||||
|
if (config->flags & VIA_BAD_CLK66) {
|
||||||
|
/* Disable the 66MHz clock on problem devices */
|
||||||
|
pci_read_config_dword(pdev, 0x50, &timing);
|
||||||
|
timing &= ~0x80008;
|
||||||
|
pci_write_config_dword(pdev, 0x50, timing);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* via_init_one - discovery callback
|
* via_init_one - discovery callback
|
||||||
* @pdev: PCI device
|
* @pdev: PCI device
|
||||||
@ -570,7 +591,6 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
struct pci_dev *isa;
|
struct pci_dev *isa;
|
||||||
const struct via_isa_bridge *config;
|
const struct via_isa_bridge *config;
|
||||||
u8 enable;
|
u8 enable;
|
||||||
u32 timing;
|
|
||||||
unsigned long flags = id->driver_data;
|
unsigned long flags = id->driver_data;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
@ -609,9 +629,6 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialise the FIFO for the enabled channels. */
|
|
||||||
via_config_fifo(pdev, config->flags);
|
|
||||||
|
|
||||||
/* Clock set up */
|
/* Clock set up */
|
||||||
switch (config->udma_mask) {
|
switch (config->udma_mask) {
|
||||||
case 0x00:
|
case 0x00:
|
||||||
@ -637,12 +654,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (config->flags & VIA_BAD_CLK66) {
|
via_fixup(pdev, config);
|
||||||
/* Disable the 66MHz clock on problem devices */
|
|
||||||
pci_read_config_dword(pdev, 0x50, &timing);
|
|
||||||
timing &= ~0x80008;
|
|
||||||
pci_write_config_dword(pdev, 0x50, timing);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* We have established the device type, now fire it up */
|
/* We have established the device type, now fire it up */
|
||||||
return ata_pci_bmdma_init_one(pdev, ppi, &via_sht, (void *)config, 0);
|
return ata_pci_bmdma_init_one(pdev, ppi, &via_sht, (void *)config, 0);
|
||||||
@ -661,29 +673,14 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
|
|||||||
|
|
||||||
static int via_reinit_one(struct pci_dev *pdev)
|
static int via_reinit_one(struct pci_dev *pdev)
|
||||||
{
|
{
|
||||||
u32 timing;
|
|
||||||
struct ata_host *host = dev_get_drvdata(&pdev->dev);
|
struct ata_host *host = dev_get_drvdata(&pdev->dev);
|
||||||
const struct via_isa_bridge *config = host->private_data;
|
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = ata_pci_device_do_resume(pdev);
|
rc = ata_pci_device_do_resume(pdev);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
via_config_fifo(pdev, config->flags);
|
via_fixup(pdev, host->private_data);
|
||||||
|
|
||||||
if (config->udma_mask == ATA_UDMA4) {
|
|
||||||
/* The 66 MHz devices require we enable the clock */
|
|
||||||
pci_read_config_dword(pdev, 0x50, &timing);
|
|
||||||
timing |= 0x80008;
|
|
||||||
pci_write_config_dword(pdev, 0x50, timing);
|
|
||||||
}
|
|
||||||
if (config->flags & VIA_BAD_CLK66) {
|
|
||||||
/* Disable the 66MHz clock on problem devices */
|
|
||||||
pci_read_config_dword(pdev, 0x50, &timing);
|
|
||||||
timing &= ~0x80008;
|
|
||||||
pci_write_config_dword(pdev, 0x50, timing);
|
|
||||||
}
|
|
||||||
|
|
||||||
ata_host_resume(host);
|
ata_host_resume(host);
|
||||||
return 0;
|
return 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user