Commit f7e37ba8 authored by Alan's avatar Alan Committed by Jeff Garzik

[PATCH] pata_cs5530: suspend/resume support

The 5530 needs various set up performing both at init time and resume
time. To keep the code clean the common setup code is moved into a new
function and called from both handlers.
Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 54083f11
...@@ -35,7 +35,7 @@ ...@@ -35,7 +35,7 @@
#include <linux/dmi.h> #include <linux/dmi.h>
#define DRV_NAME "pata_cs5530" #define DRV_NAME "pata_cs5530"
#define DRV_VERSION "0.6" #define DRV_VERSION "0.7.1"
/** /**
* cs5530_set_piomode - PIO setup * cs5530_set_piomode - PIO setup
...@@ -182,6 +182,8 @@ static struct scsi_host_template cs5530_sht = { ...@@ -182,6 +182,8 @@ static struct scsi_host_template cs5530_sht = {
.slave_configure = ata_scsi_slave_config, .slave_configure = ata_scsi_slave_config,
.slave_destroy = ata_scsi_slave_destroy, .slave_destroy = ata_scsi_slave_destroy,
.bios_param = ata_std_bios_param, .bios_param = ata_std_bios_param,
.resume = ata_scsi_device_resume,
.suspend = ata_scsi_device_suspend,
}; };
static struct ata_port_operations cs5530_port_ops = { static struct ata_port_operations cs5530_port_ops = {
...@@ -239,38 +241,18 @@ static int cs5530_is_palmax(void) ...@@ -239,38 +241,18 @@ static int cs5530_is_palmax(void)
return 0; return 0;
} }
/** /**
* cs5530_init_one - Initialise a CS5530 * cs5530_init_chip - Chipset init
* @dev: PCI device
* @id: Entry in match table
* *
* Install a driver for the newly found CS5530 companion chip. Most of * Perform the chip initialisation work that is shared between both
* this is just housekeeping. We have to set the chip up correctly and * setup and resume paths
* turn off various bits of emulation magic.
*/ */
static int cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id) static int cs5530_init_chip(void)
{ {
int compiler_warning_pointless_fix; struct pci_dev *master_0 = NULL, *cs5530_0 = NULL, *dev = NULL;
struct pci_dev *master_0 = NULL, *cs5530_0 = NULL;
static struct ata_port_info info = {
.sht = &cs5530_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST,
.pio_mask = 0x1f,
.mwdma_mask = 0x07,
.udma_mask = 0x07,
.port_ops = &cs5530_port_ops
};
/* The docking connector doesn't do UDMA, and it seems not MWDMA */
static struct ata_port_info info_palmax_secondary = {
.sht = &cs5530_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST,
.pio_mask = 0x1f,
.port_ops = &cs5530_port_ops
};
static struct ata_port_info *port_info[2] = { &info, &info };
dev = NULL;
while ((dev = pci_get_device(PCI_VENDOR_ID_CYRIX, PCI_ANY_ID, dev)) != NULL) { while ((dev = pci_get_device(PCI_VENDOR_ID_CYRIX, PCI_ANY_ID, dev)) != NULL) {
switch (dev->device) { switch (dev->device) {
case PCI_DEVICE_ID_CYRIX_PCI_MASTER: case PCI_DEVICE_ID_CYRIX_PCI_MASTER:
...@@ -291,7 +273,7 @@ static int cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -291,7 +273,7 @@ static int cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id)
} }
pci_set_master(cs5530_0); pci_set_master(cs5530_0);
compiler_warning_pointless_fix = pci_set_mwi(cs5530_0); pci_set_mwi(cs5530_0);
/* /*
* Set PCI CacheLineSize to 16-bytes: * Set PCI CacheLineSize to 16-bytes:
...@@ -339,13 +321,7 @@ static int cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id) ...@@ -339,13 +321,7 @@ static int cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id)
pci_dev_put(master_0); pci_dev_put(master_0);
pci_dev_put(cs5530_0); pci_dev_put(cs5530_0);
return 0;
if (cs5530_is_palmax())
port_info[1] = &info_palmax_secondary;
/* Now kick off ATA set up */
return ata_pci_init_one(dev, port_info, 2);
fail_put: fail_put:
if (master_0) if (master_0)
pci_dev_put(master_0); pci_dev_put(master_0);
...@@ -354,6 +330,53 @@ fail_put: ...@@ -354,6 +330,53 @@ fail_put:
return -ENODEV; return -ENODEV;
} }
/**
* cs5530_init_one - Initialise a CS5530
* @dev: PCI device
* @id: Entry in match table
*
* Install a driver for the newly found CS5530 companion chip. Most of
* this is just housekeeping. We have to set the chip up correctly and
* turn off various bits of emulation magic.
*/
static int cs5530_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
{
static struct ata_port_info info = {
.sht = &cs5530_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST,
.pio_mask = 0x1f,
.mwdma_mask = 0x07,
.udma_mask = 0x07,
.port_ops = &cs5530_port_ops
};
/* The docking connector doesn't do UDMA, and it seems not MWDMA */
static struct ata_port_info info_palmax_secondary = {
.sht = &cs5530_sht,
.flags = ATA_FLAG_SLAVE_POSS|ATA_FLAG_SRST,
.pio_mask = 0x1f,
.port_ops = &cs5530_port_ops
};
static struct ata_port_info *port_info[2] = { &info, &info };
/* Chip initialisation */
if (cs5530_init_chip())
return -ENODEV;
if (cs5530_is_palmax())
port_info[1] = &info_palmax_secondary;
/* Now kick off ATA set up */
return ata_pci_init_one(pdev, port_info, 2);
}
static int cs5530_reinit_one(struct pci_dev *pdev)
{
/* If we fail on resume we are doomed */
BUG_ON(cs5530_init_chip());
return ata_pci_device_resume(pdev);
}
static const struct pci_device_id cs5530[] = { static const struct pci_device_id cs5530[] = {
{ PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5530_IDE), }, { PCI_VDEVICE(CYRIX, PCI_DEVICE_ID_CYRIX_5530_IDE), },
...@@ -364,7 +387,9 @@ static struct pci_driver cs5530_pci_driver = { ...@@ -364,7 +387,9 @@ static struct pci_driver cs5530_pci_driver = {
.name = DRV_NAME, .name = DRV_NAME,
.id_table = cs5530, .id_table = cs5530,
.probe = cs5530_init_one, .probe = cs5530_init_one,
.remove = ata_pci_remove_one .remove = ata_pci_remove_one,
.suspend = ata_pci_device_suspend,
.resume = cs5530_reinit_one,
}; };
static int __init cs5530_init(void) static int __init cs5530_init(void)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment