aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/pata_winbond.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/pata_winbond.c')
-rw-r--r--drivers/ata/pata_winbond.c27
1 files changed, 19 insertions, 8 deletions
diff --git a/drivers/ata/pata_winbond.c b/drivers/ata/pata_winbond.c
index bba04a6e3708..d24488bf5644 100644
--- a/drivers/ata/pata_winbond.c
+++ b/drivers/ata/pata_winbond.c
@@ -100,22 +100,24 @@ static void winbond_data_xfer(struct ata_device *adev, unsigned char *buf, unsig
100 100
101 if (ata_id_has_dword_io(adev->id)) { 101 if (ata_id_has_dword_io(adev->id)) {
102 if (write_data) 102 if (write_data)
103 outsl(ap->ioaddr.data_addr, buf, buflen >> 2); 103 iowrite32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
104 else 104 else
105 insl(ap->ioaddr.data_addr, buf, buflen >> 2); 105 ioread32_rep(ap->ioaddr.data_addr, buf, buflen >> 2);
106 106
107 if (unlikely(slop)) { 107 if (unlikely(slop)) {
108 u32 pad; 108 u32 pad;
109 if (write_data) { 109 if (write_data) {
110 memcpy(&pad, buf + buflen - slop, slop); 110 memcpy(&pad, buf + buflen - slop, slop);
111 outl(le32_to_cpu(pad), ap->ioaddr.data_addr); 111 pad = le32_to_cpu(pad);
112 iowrite32(pad, ap->ioaddr.data_addr);
112 } else { 113 } else {
113 pad = cpu_to_le16(inl(ap->ioaddr.data_addr)); 114 pad = ioread32(ap->ioaddr.data_addr);
115 pad = cpu_to_le16(pad);
114 memcpy(buf + buflen - slop, &pad, slop); 116 memcpy(buf + buflen - slop, &pad, slop);
115 } 117 }
116 } 118 }
117 } else 119 } else
118 ata_pio_data_xfer(adev, buf, buflen, write_data); 120 ata_data_xfer(adev, buf, buflen, write_data);
119} 121}
120 122
121static struct scsi_host_template winbond_sht = { 123static struct scsi_host_template winbond_sht = {
@@ -197,6 +199,8 @@ static __init int winbond_init_one(unsigned long port)
197 return 0; 199 return 0;
198 200
199 for (i = 0; i < 2 ; i ++) { 201 for (i = 0; i < 2 ; i ++) {
202 unsigned long cmd_port = 0x1F0 - (0x80 * i);
203 void __iomem *cmd_addr, *ctl_addr;
200 204
201 if (reg & (1 << i)) { 205 if (reg & (1 << i)) {
202 /* 206 /*
@@ -207,6 +211,13 @@ static __init int winbond_init_one(unsigned long port)
207 if (IS_ERR(pdev)) 211 if (IS_ERR(pdev))
208 return PTR_ERR(pdev); 212 return PTR_ERR(pdev);
209 213
214 cmd_addr = devm_ioport_map(&pdev->dev, cmd_port, 8);
215 ctl_addr = devm_ioport_map(&pdev->dev, cmd_port + 0x0206, 1);
216 if (!cmd_addr || !ctl_addr) {
217 platform_device_unregister(pdev);
218 return -ENOMEM;
219 }
220
210 memset(&ae, 0, sizeof(struct ata_probe_ent)); 221 memset(&ae, 0, sizeof(struct ata_probe_ent));
211 INIT_LIST_HEAD(&ae.node); 222 INIT_LIST_HEAD(&ae.node);
212 ae.dev = &pdev->dev; 223 ae.dev = &pdev->dev;
@@ -220,9 +231,9 @@ static __init int winbond_init_one(unsigned long port)
220 ae.irq = 14 + i; 231 ae.irq = 14 + i;
221 ae.irq_flags = 0; 232 ae.irq_flags = 0;
222 ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST; 233 ae.port_flags = ATA_FLAG_SLAVE_POSS | ATA_FLAG_SRST;
223 ae.port[0].cmd_addr = 0x1F0 - (0x80 * i); 234 ae.port[0].cmd_addr = cmd_addr;
224 ae.port[0].altstatus_addr = ae.port[0].cmd_addr + 0x0206; 235 ae.port[0].altstatus_addr = ctl_addr;
225 ae.port[0].ctl_addr = ae.port[0].altstatus_addr; 236 ae.port[0].ctl_addr = ctl_addr;
226 ata_std_ports(&ae.port[0]); 237 ata_std_ports(&ae.port[0]);
227 /* 238 /*
228 * Hook in a private data structure per channel 239 * Hook in a private data structure per channel