25 #include <linux/kernel.h>
26 #include <linux/module.h>
27 #include <linux/pci.h>
34 #define DRV_NAME "pata_sil680"
35 #define DRV_VERSION "0.4.9"
37 #define SIL680_MMIO_BAR 5
51 static unsigned long sil680_selreg(
struct ata_port *ap,
int r)
53 unsigned long base = 0xA0 +
r;
70 unsigned long base = 0xA0 +
r;
72 base |= adev->
devno ? 2 : 0;
85 static int sil680_cable_detect(
struct ata_port *ap)
88 unsigned long addr = sil680_selreg(ap, 0);
90 pci_read_config_byte(pdev, addr, &ata66);
109 static const u16 speed_p[5] = {
110 0x328A, 0x2283, 0x1104, 0x10C3, 0x10C1
113 0x328A, 0x2283, 0x1281, 0x10C3, 0x10C1
116 unsigned long tfaddr = sil680_selreg(ap, 0x02);
117 unsigned long addr = sil680_seldev(ap, adev, 0x04);
118 unsigned long addr_mask = 0x80 + 4 * ap->
port_no;
121 int lowest_pio =
pio;
122 int port_shift = 4 * adev->
devno;
131 pci_write_config_word(pdev, addr, speed_p[pio]);
132 pci_write_config_word(pdev, tfaddr, speed_t[lowest_pio]);
134 pci_read_config_word(pdev, tfaddr-2, ®);
135 pci_read_config_byte(pdev, addr_mask, &mode);
138 mode &= ~(3 << port_shift);
142 mode |= 1 << port_shift;
144 pci_write_config_word(pdev, tfaddr-2, reg);
145 pci_write_config_byte(pdev, addr_mask, mode);
161 static const u8 ultra_table[2][7] = {
162 { 0x0C, 0x07, 0x05, 0x04, 0x02, 0x01, 0xFF },
163 { 0x0F, 0x0B, 0x07, 0x05, 0x03, 0x02, 0x01 },
165 static const u16 dma_table[3] = { 0x2208, 0x10C2, 0x10C1 };
168 unsigned long ma = sil680_seldev(ap, adev, 0x08);
169 unsigned long ua = sil680_seldev(ap, adev, 0x0C);
170 unsigned long addr_mask = 0x80 + 4 * ap->
port_no;
171 int port_shift = adev->
devno * 4;
175 pci_read_config_byte(pdev, 0x8A, &scsc);
176 pci_read_config_byte(pdev, addr_mask, &mode);
177 pci_read_config_word(pdev, ma, &multi);
178 pci_read_config_word(pdev, ua, &ultra);
182 mode &= ~(0x03 << port_shift);
185 scsc = (scsc & 0x30) ? 1 : 0;
190 mode |= (0x03 << port_shift);
193 mode |= (0x02 << port_shift);
195 pci_write_config_byte(pdev, addr_mask, mode);
196 pci_write_config_word(pdev, ma, multi);
197 pci_write_config_word(pdev, ua, ultra);
212 static void sil680_sff_exec_command(
struct ata_port *ap,
220 static bool sil680_sff_irq_check(
struct ata_port *ap)
223 unsigned long addr = sil680_selreg(ap, 1);
226 pci_read_config_byte(pdev, addr, &val);
237 .inherits = &ata_bmdma32_port_ops,
238 .sff_exec_command = sil680_sff_exec_command,
239 .sff_irq_check = sil680_sff_irq_check,
240 .cable_detect = sil680_cable_detect,
241 .set_piomode = sil680_set_piomode,
242 .set_dmamode = sil680_set_dmamode,
254 static u8 sil680_init_chip(
struct pci_dev *pdev,
int *try_mmio)
262 pci_write_config_byte(pdev, 0x80, 0x00);
263 pci_write_config_byte(pdev, 0x84, 0x00);
265 pci_read_config_byte(pdev, 0x8A, &tmpbyte);
267 dev_dbg(&pdev->
dev,
"sil680: BA5_EN = %d clock = %02X\n",
268 tmpbyte & 1, tmpbyte & 0x30);
272 if (machine_is(cell))
276 switch (tmpbyte & 0x30) {
279 pci_write_config_byte(pdev, 0x8A, tmpbyte|0x10);
284 pci_write_config_byte(pdev, 0x8A, tmpbyte & ~0x20);
294 pci_read_config_byte(pdev, 0x8A, &tmpbyte);
295 dev_dbg(&pdev->
dev,
"sil680: BA5_EN = %d clock = %02X\n",
296 tmpbyte & 1, tmpbyte & 0x30);
298 pci_write_config_byte(pdev, 0xA1, 0x72);
299 pci_write_config_word(pdev, 0xA2, 0x328A);
300 pci_write_config_dword(pdev, 0xA4, 0x62DD62DD);
301 pci_write_config_dword(pdev, 0xA8, 0x43924392);
302 pci_write_config_dword(pdev, 0xAC, 0x40094009);
303 pci_write_config_byte(pdev, 0xB1, 0x72);
304 pci_write_config_word(pdev, 0xB2, 0x328A);
305 pci_write_config_dword(pdev, 0xB4, 0x62DD62DD);
306 pci_write_config_dword(pdev, 0xB8, 0x43924392);
307 pci_write_config_dword(pdev, 0xBC, 0x40094009);
309 switch (tmpbyte & 0x30) {
323 return tmpbyte & 0x30;
334 .port_ops = &sil680_port_ops
341 .port_ops = &sil680_port_ops
354 switch (sil680_init_chip(pdev, &try_mmio)) {
389 host->
ports[0]->ioaddr.bmdma_addr = mmio_base + 0x00;
390 host->
ports[0]->ioaddr.cmd_addr = mmio_base + 0x80;
391 host->
ports[0]->ioaddr.ctl_addr = mmio_base + 0x8a;
392 host->
ports[0]->ioaddr.altstatus_addr = mmio_base + 0x8a;
394 host->
ports[1]->ioaddr.bmdma_addr = mmio_base + 0x08;
395 host->
ports[1]->ioaddr.cmd_addr = mmio_base + 0xc0;
396 host->
ports[1]->ioaddr.ctl_addr = mmio_base + 0xca;
397 host->
ports[1]->ioaddr.altstatus_addr = mmio_base + 0xca;
405 return ata_pci_bmdma_init_one(pdev, ppi, &sil680_sht,
NULL, 0);
409 static int sil680_reinit_one(
struct pci_dev *pdev)
414 rc = ata_pci_device_do_resume(pdev);
417 sil680_init_chip(pdev, &try_mmio);
418 ata_host_resume(host);
429 static struct pci_driver sil680_pci_driver = {
432 .probe = sil680_init_one,
433 .remove = ata_pci_remove_one,
435 .suspend = ata_pci_device_suspend,
436 .resume = sil680_reinit_one,