2 * pata_cypress.c - Cypress PATA for new ATA layer
4 * Alan Cox <alan@redhat.com>
7 * linux/drivers/ide/pci/cy82c693.c Version 0.40 Sep. 10, 2002
11 #include <linux/kernel.h>
12 #include <linux/module.h>
13 #include <linux/pci.h>
14 #include <linux/init.h>
15 #include <linux/blkdev.h>
16 #include <linux/delay.h>
17 #include <scsi/scsi_host.h>
18 #include <linux/libata.h>
20 #define DRV_NAME "pata_cypress"
21 #define DRV_VERSION "0.1.4"
23 /* here are the offset definitions for the registers */
26 CY82_IDE_CMDREG
= 0x04,
27 CY82_IDE_ADDRSETUP
= 0x48,
28 CY82_IDE_MASTER_IOR
= 0x4C,
29 CY82_IDE_MASTER_IOW
= 0x4D,
30 CY82_IDE_SLAVE_IOR
= 0x4E,
31 CY82_IDE_SLAVE_IOW
= 0x4F,
32 CY82_IDE_MASTER_8BIT
= 0x50,
33 CY82_IDE_SLAVE_8BIT
= 0x51,
35 CY82_INDEX_PORT
= 0x22,
36 CY82_DATA_PORT
= 0x23,
38 CY82_INDEX_CTRLREG1
= 0x01,
39 CY82_INDEX_CHANNEL0
= 0x30,
40 CY82_INDEX_CHANNEL1
= 0x31,
41 CY82_INDEX_TIMEOUT
= 0x32
44 static int cy82c693_pre_reset(struct ata_port
*ap
)
46 ap
->cbl
= ATA_CBL_PATA40
;
47 return ata_std_prereset(ap
);
50 static void cy82c693_error_handler(struct ata_port
*ap
)
52 ata_bmdma_drive_eh(ap
, cy82c693_pre_reset
, ata_std_softreset
, NULL
, ata_std_postreset
);
56 * cy82c693_set_piomode - set initial PIO mode data
60 * Called to do the PIO mode setup.
63 static void cy82c693_set_piomode(struct ata_port
*ap
, struct ata_device
*adev
)
65 struct pci_dev
*pdev
= to_pci_dev(ap
->host
->dev
);
67 const unsigned long T
= 1000000 / 33;
68 short time_16
, time_8
;
71 if (ata_timing_compute(adev
, adev
->pio_mode
, &t
, T
, 1) < 0) {
72 printk(KERN_ERR DRV_NAME
": mome computation failed.\n");
76 time_16
= FIT(t
.recover
, 0, 15) | (FIT(t
.active
, 0, 15) << 4);
77 time_8
= FIT(t
.act8b
, 0, 15) | (FIT(t
.rec8b
, 0, 15) << 4);
79 if (adev
->devno
== 0) {
80 pci_read_config_dword(pdev
, CY82_IDE_ADDRSETUP
, &addr
);
82 addr
&= ~0x0F; /* Mask bits */
83 addr
|= FIT(t
.setup
, 0, 15);
85 pci_write_config_dword(pdev
, CY82_IDE_ADDRSETUP
, addr
);
86 pci_write_config_byte(pdev
, CY82_IDE_MASTER_IOR
, time_16
);
87 pci_write_config_byte(pdev
, CY82_IDE_MASTER_IOW
, time_16
);
88 pci_write_config_byte(pdev
, CY82_IDE_MASTER_8BIT
, time_8
);
90 pci_read_config_dword(pdev
, CY82_IDE_ADDRSETUP
, &addr
);
92 addr
&= ~0xF0; /* Mask bits */
93 addr
|= (FIT(t
.setup
, 0, 15) << 4);
95 pci_write_config_dword(pdev
, CY82_IDE_ADDRSETUP
, addr
);
96 pci_write_config_byte(pdev
, CY82_IDE_SLAVE_IOR
, time_16
);
97 pci_write_config_byte(pdev
, CY82_IDE_SLAVE_IOW
, time_16
);
98 pci_write_config_byte(pdev
, CY82_IDE_SLAVE_8BIT
, time_8
);
103 * cy82c693_set_dmamode - set initial DMA mode data
107 * Called to do the DMA mode setup.
110 static void cy82c693_set_dmamode(struct ata_port
*ap
, struct ata_device
*adev
)
112 int reg
= CY82_INDEX_CHANNEL0
+ ap
->port_no
;
114 /* Be afraid, be very afraid. Magic registers in low I/O space */
116 outb(adev
->dma_mode
- XFER_MW_DMA_0
, 0x23);
118 /* 0x50 gives the best behaviour on the Alpha's using this chip */
119 outb(CY82_INDEX_TIMEOUT
, 0x22);
123 static struct scsi_host_template cy82c693_sht
= {
124 .module
= THIS_MODULE
,
126 .ioctl
= ata_scsi_ioctl
,
127 .queuecommand
= ata_scsi_queuecmd
,
128 .can_queue
= ATA_DEF_QUEUE
,
129 .this_id
= ATA_SHT_THIS_ID
,
130 .sg_tablesize
= LIBATA_MAX_PRD
,
131 .cmd_per_lun
= ATA_SHT_CMD_PER_LUN
,
132 .emulated
= ATA_SHT_EMULATED
,
133 .use_clustering
= ATA_SHT_USE_CLUSTERING
,
134 .proc_name
= DRV_NAME
,
135 .dma_boundary
= ATA_DMA_BOUNDARY
,
136 .slave_configure
= ata_scsi_slave_config
,
137 .slave_destroy
= ata_scsi_slave_destroy
,
138 .bios_param
= ata_std_bios_param
,
139 .resume
= ata_scsi_device_resume
,
140 .suspend
= ata_scsi_device_suspend
,
143 static struct ata_port_operations cy82c693_port_ops
= {
144 .port_disable
= ata_port_disable
,
145 .set_piomode
= cy82c693_set_piomode
,
146 .set_dmamode
= cy82c693_set_dmamode
,
147 .mode_filter
= ata_pci_default_filter
,
149 .tf_load
= ata_tf_load
,
150 .tf_read
= ata_tf_read
,
151 .check_status
= ata_check_status
,
152 .exec_command
= ata_exec_command
,
153 .dev_select
= ata_std_dev_select
,
155 .freeze
= ata_bmdma_freeze
,
156 .thaw
= ata_bmdma_thaw
,
157 .error_handler
= cy82c693_error_handler
,
158 .post_internal_cmd
= ata_bmdma_post_internal_cmd
,
160 .bmdma_setup
= ata_bmdma_setup
,
161 .bmdma_start
= ata_bmdma_start
,
162 .bmdma_stop
= ata_bmdma_stop
,
163 .bmdma_status
= ata_bmdma_status
,
165 .qc_prep
= ata_qc_prep
,
166 .qc_issue
= ata_qc_issue_prot
,
168 .data_xfer
= ata_pio_data_xfer
,
170 .irq_handler
= ata_interrupt
,
171 .irq_clear
= ata_bmdma_irq_clear
,
173 .port_start
= ata_port_start
,
174 .port_stop
= ata_port_stop
,
175 .host_stop
= ata_host_stop
178 static int cy82c693_init_one(struct pci_dev
*pdev
, const struct pci_device_id
*id
)
180 static struct ata_port_info info
= {
181 .sht
= &cy82c693_sht
,
182 .flags
= ATA_FLAG_SLAVE_POSS
| ATA_FLAG_SRST
,
185 .port_ops
= &cy82c693_port_ops
187 static struct ata_port_info
*port_info
[1] = { &info
};
189 /* Devfn 1 is the ATA primary. The secondary is magic and on devfn2.
190 For the moment we don't handle the secondary. FIXME */
192 if (PCI_FUNC(pdev
->devfn
) != 1)
195 return ata_pci_init_one(pdev
, port_info
, 1);
198 static const struct pci_device_id cy82c693
[] = {
199 { PCI_VDEVICE(CONTAQ
, PCI_DEVICE_ID_CONTAQ_82C693
), },
204 static struct pci_driver cy82c693_pci_driver
= {
206 .id_table
= cy82c693
,
207 .probe
= cy82c693_init_one
,
208 .remove
= ata_pci_remove_one
,
209 .suspend
= ata_pci_device_suspend
,
210 .resume
= ata_pci_device_resume
,
213 static int __init
cy82c693_init(void)
215 return pci_register_driver(&cy82c693_pci_driver
);
219 static void __exit
cy82c693_exit(void)
221 pci_unregister_driver(&cy82c693_pci_driver
);
225 MODULE_AUTHOR("Alan Cox");
226 MODULE_DESCRIPTION("low-level driver for the CY82C693 PATA controller");
227 MODULE_LICENSE("GPL");
228 MODULE_DEVICE_TABLE(pci
, cy82c693
);
229 MODULE_VERSION(DRV_VERSION
);
231 module_init(cy82c693_init
);
232 module_exit(cy82c693_exit
);