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

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

pata_cmd640: Multiple updates



Fix suspend/resume support
Write 0x5B to 0 not 0x5C

The former is important as we must kill the FIFO on a resume

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 97cb81c3
Loading
Loading
Loading
Loading
+20 −14
Original line number Diff line number Diff line
@@ -23,7 +23,7 @@
#include <linux/libata.h>

#define DRV_NAME "pata_cmd640"
#define DRV_VERSION "0.0.3"
#define DRV_VERSION "0.0.5"

struct cmd640_reg {
	int last;
@@ -43,6 +43,7 @@ enum {

/**
 *	cmd640_set_piomode	-	set initial PIO mode data
 *	@ap: ATA port
 *	@adev: ATA device
 *
 *	Called to do the PIO mode setup.
@@ -219,22 +220,13 @@ static struct ata_port_operations cmd640_port_ops = {
	.port_start	= cmd640_port_start,
};

static int cmd640_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
static void cmd640_hardware_init(struct pci_dev *pdev)
{
	u8 r;
	u8 ctrl;

	static struct ata_port_info info = {
		.sht = &cmd640_sht,
		.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
		.pio_mask = 0x1f,
		.port_ops = &cmd640_port_ops
	};

	static struct ata_port_info *port_info[2] = { &info, &info };

	/* CMD640 detected, commiserations */
	pci_write_config_byte(pdev, 0x5C, 0x00);
	pci_write_config_byte(pdev, 0x5B, 0x00);
	/* Get version info */
	pci_read_config_byte(pdev, CFR, &r);
	/* PIO0 command cycles */
@@ -255,12 +247,26 @@ static int cmd640_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
	pci_read_config_byte(pdev, ARTIM23, &ctrl);
	ctrl |= 0x0C;
	pci_write_config_byte(pdev, ARTIM23, ctrl);
}

static int cmd640_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
{
	static struct ata_port_info info = {
		.sht = &cmd640_sht,
		.flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST,
		.pio_mask = 0x1f,
		.port_ops = &cmd640_port_ops
	};

	static struct ata_port_info *port_info[2] = { &info, &info };

	cmd640_hardware_init(pdev);
	return ata_pci_init_one(pdev, port_info, 2);
}

static int cmd640_reinit_one(struct pci_dev *pdev)
{
	cmd640_hardware_init(pdev);
	return ata_pci_device_resume(pdev);
}