Blame view
drivers/ata/pata_cypress.c
4.26 KB
669a5db41 [libata] Add a bu... |
1 2 3 |
/* * pata_cypress.c - Cypress PATA for new ATA layer * (C) 2006 Red Hat Inc |
ab7716300 ata: Switch all m... |
4 |
* Alan Cox |
669a5db41 [libata] Add a bu... |
5 6 7 8 9 |
* * Based heavily on * linux/drivers/ide/pci/cy82c693.c Version 0.40 Sep. 10, 2002 * */ |
85cd7251b [libata #pata-dri... |
10 |
|
669a5db41 [libata] Add a bu... |
11 12 13 |
#include <linux/kernel.h> #include <linux/module.h> #include <linux/pci.h> |
669a5db41 [libata] Add a bu... |
14 15 16 17 18 19 |
#include <linux/blkdev.h> #include <linux/delay.h> #include <scsi/scsi_host.h> #include <linux/libata.h> #define DRV_NAME "pata_cypress" |
8bc3fc470 libata: bump vers... |
20 |
#define DRV_VERSION "0.1.5" |
669a5db41 [libata] Add a bu... |
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
/* here are the offset definitions for the registers */ enum { CY82_IDE_CMDREG = 0x04, CY82_IDE_ADDRSETUP = 0x48, CY82_IDE_MASTER_IOR = 0x4C, CY82_IDE_MASTER_IOW = 0x4D, CY82_IDE_SLAVE_IOR = 0x4E, CY82_IDE_SLAVE_IOW = 0x4F, CY82_IDE_MASTER_8BIT = 0x50, CY82_IDE_SLAVE_8BIT = 0x51, CY82_INDEX_PORT = 0x22, CY82_DATA_PORT = 0x23, CY82_INDEX_CTRLREG1 = 0x01, CY82_INDEX_CHANNEL0 = 0x30, CY82_INDEX_CHANNEL1 = 0x31, CY82_INDEX_TIMEOUT = 0x32 }; |
669a5db41 [libata] Add a bu... |
42 43 44 45 46 47 48 |
/** * cy82c693_set_piomode - set initial PIO mode data * @ap: ATA interface * @adev: ATA device * * Called to do the PIO mode setup. */ |
85cd7251b [libata #pata-dri... |
49 |
|
669a5db41 [libata] Add a bu... |
50 51 52 53 54 55 56 |
static void cy82c693_set_piomode(struct ata_port *ap, struct ata_device *adev) { struct pci_dev *pdev = to_pci_dev(ap->host->dev); struct ata_timing t; const unsigned long T = 1000000 / 33; short time_16, time_8; u32 addr; |
85cd7251b [libata #pata-dri... |
57 |
|
669a5db41 [libata] Add a bu... |
58 59 60 61 62 |
if (ata_timing_compute(adev, adev->pio_mode, &t, T, 1) < 0) { printk(KERN_ERR DRV_NAME ": mome computation failed. "); return; } |
3403c2452 pata_cypress: fix... |
63 64 65 66 |
time_16 = clamp_val(t.recover - 1, 0, 15) | (clamp_val(t.active - 1, 0, 15) << 4); time_8 = clamp_val(t.act8b - 1, 0, 15) | (clamp_val(t.rec8b - 1, 0, 15) << 4); |
85cd7251b [libata #pata-dri... |
67 |
|
669a5db41 [libata] Add a bu... |
68 69 |
if (adev->devno == 0) { pci_read_config_dword(pdev, CY82_IDE_ADDRSETUP, &addr); |
85cd7251b [libata #pata-dri... |
70 |
|
669a5db41 [libata] Add a bu... |
71 |
addr &= ~0x0F; /* Mask bits */ |
3403c2452 pata_cypress: fix... |
72 |
addr |= clamp_val(t.setup - 1, 0, 15); |
85cd7251b [libata #pata-dri... |
73 |
|
669a5db41 [libata] Add a bu... |
74 75 76 77 78 79 |
pci_write_config_dword(pdev, CY82_IDE_ADDRSETUP, addr); pci_write_config_byte(pdev, CY82_IDE_MASTER_IOR, time_16); pci_write_config_byte(pdev, CY82_IDE_MASTER_IOW, time_16); pci_write_config_byte(pdev, CY82_IDE_MASTER_8BIT, time_8); } else { pci_read_config_dword(pdev, CY82_IDE_ADDRSETUP, &addr); |
85cd7251b [libata #pata-dri... |
80 |
|
669a5db41 [libata] Add a bu... |
81 |
addr &= ~0xF0; /* Mask bits */ |
3403c2452 pata_cypress: fix... |
82 |
addr |= (clamp_val(t.setup - 1, 0, 15) << 4); |
669a5db41 [libata] Add a bu... |
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
pci_write_config_dword(pdev, CY82_IDE_ADDRSETUP, addr); pci_write_config_byte(pdev, CY82_IDE_SLAVE_IOR, time_16); pci_write_config_byte(pdev, CY82_IDE_SLAVE_IOW, time_16); pci_write_config_byte(pdev, CY82_IDE_SLAVE_8BIT, time_8); } } /** * cy82c693_set_dmamode - set initial DMA mode data * @ap: ATA interface * @adev: ATA device * * Called to do the DMA mode setup. */ |
85cd7251b [libata #pata-dri... |
98 |
|
669a5db41 [libata] Add a bu... |
99 100 101 |
static void cy82c693_set_dmamode(struct ata_port *ap, struct ata_device *adev) { int reg = CY82_INDEX_CHANNEL0 + ap->port_no; |
85cd7251b [libata #pata-dri... |
102 |
|
669a5db41 [libata] Add a bu... |
103 104 105 |
/* Be afraid, be very afraid. Magic registers in low I/O space */ outb(reg, 0x22); outb(adev->dma_mode - XFER_MW_DMA_0, 0x23); |
85cd7251b [libata #pata-dri... |
106 |
|
669a5db41 [libata] Add a bu... |
107 108 109 110 111 112 |
/* 0x50 gives the best behaviour on the Alpha's using this chip */ outb(CY82_INDEX_TIMEOUT, 0x22); outb(0x50, 0x23); } static struct scsi_host_template cy82c693_sht = { |
68d1d07b5 libata: implement... |
113 |
ATA_BMDMA_SHT(DRV_NAME), |
669a5db41 [libata] Add a bu... |
114 115 116 |
}; static struct ata_port_operations cy82c693_port_ops = { |
029cfd6b7 libata: implement... |
117 118 |
.inherits = &ata_bmdma_port_ops, .cable_detect = ata_cable_40wire, |
669a5db41 [libata] Add a bu... |
119 120 |
.set_piomode = cy82c693_set_piomode, .set_dmamode = cy82c693_set_dmamode, |
85cd7251b [libata #pata-dri... |
121 |
}; |
669a5db41 [libata] Add a bu... |
122 123 124 |
static int cy82c693_init_one(struct pci_dev *pdev, const struct pci_device_id *id) { |
1626aeb88 libata: clean up ... |
125 |
static const struct ata_port_info info = { |
1d2808fd3 [libata] PATA dri... |
126 |
.flags = ATA_FLAG_SLAVE_POSS, |
14bdef982 [libata] convert ... |
127 128 |
.pio_mask = ATA_PIO4, .mwdma_mask = ATA_MWDMA2, |
669a5db41 [libata] Add a bu... |
129 130 |
.port_ops = &cy82c693_port_ops }; |
1626aeb88 libata: clean up ... |
131 |
const struct ata_port_info *ppi[] = { &info, &ata_dummy_port_info }; |
85cd7251b [libata #pata-dri... |
132 |
|
2d2744fc8 [libata] PCI ID t... |
133 134 |
/* Devfn 1 is the ATA primary. The secondary is magic and on devfn2. For the moment we don't handle the secondary. FIXME */ |
85cd7251b [libata #pata-dri... |
135 |
|
669a5db41 [libata] Add a bu... |
136 137 |
if (PCI_FUNC(pdev->devfn) != 1) return -ENODEV; |
85cd7251b [libata #pata-dri... |
138 |
|
1c5afdf7a libata-sff: separ... |
139 |
return ata_pci_bmdma_init_one(pdev, ppi, &cy82c693_sht, NULL, 0); |
669a5db41 [libata] Add a bu... |
140 |
} |
2d2744fc8 [libata] PCI ID t... |
141 142 143 144 |
static const struct pci_device_id cy82c693[] = { { PCI_VDEVICE(CONTAQ, PCI_DEVICE_ID_CONTAQ_82C693), }, { }, |
669a5db41 [libata] Add a bu... |
145 146 147 |
}; static struct pci_driver cy82c693_pci_driver = { |
2d2744fc8 [libata] PCI ID t... |
148 |
.name = DRV_NAME, |
669a5db41 [libata] Add a bu... |
149 150 |
.id_table = cy82c693, .probe = cy82c693_init_one, |
30ced0f0d [PATCH] PATA liba... |
151 |
.remove = ata_pci_remove_one, |
58eb8cd56 ata: use CONFIG_P... |
152 |
#ifdef CONFIG_PM_SLEEP |
30ced0f0d [PATCH] PATA liba... |
153 154 |
.suspend = ata_pci_device_suspend, .resume = ata_pci_device_resume, |
438ac6d5e libata: add missi... |
155 |
#endif |
669a5db41 [libata] Add a bu... |
156 |
}; |
2fc75da0c ata: use module_p... |
157 |
module_pci_driver(cy82c693_pci_driver); |
669a5db41 [libata] Add a bu... |
158 159 160 161 162 163 |
MODULE_AUTHOR("Alan Cox"); MODULE_DESCRIPTION("low-level driver for the CY82C693 PATA controller"); MODULE_LICENSE("GPL"); MODULE_DEVICE_TABLE(pci, cy82c693); MODULE_VERSION(DRV_VERSION); |