Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f7e37ba8 authored by Alan Cox's avatar Alan Cox Committed by Jeff Garzik
Browse files

[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
Loading
Loading
Loading
Loading
+62 −37
Original line number Original line Diff line number Diff line
@@ -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 = {
	.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)
	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)
	}
	}


	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)


	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 @@ static int cs5530_init_one(struct pci_dev *dev, const struct pci_device_id *id)
	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 = {
	.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)