aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata/sata_uli.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/sata_uli.c')
-rw-r--r--drivers/ata/sata_uli.c65
1 files changed, 24 insertions, 41 deletions
diff --git a/drivers/ata/sata_uli.c b/drivers/ata/sata_uli.c
index d659ace80f4f..f74e383de083 100644
--- a/drivers/ata/sata_uli.c
+++ b/drivers/ata/sata_uli.c
@@ -115,7 +115,6 @@ static const struct ata_port_operations uli_ops = {
115 .error_handler = ata_bmdma_error_handler, 115 .error_handler = ata_bmdma_error_handler,
116 .post_internal_cmd = ata_bmdma_post_internal_cmd, 116 .post_internal_cmd = ata_bmdma_post_internal_cmd,
117 117
118 .irq_handler = ata_interrupt,
119 .irq_clear = ata_bmdma_irq_clear, 118 .irq_clear = ata_bmdma_irq_clear,
120 .irq_on = ata_irq_on, 119 .irq_on = ata_irq_on,
121 .irq_ack = ata_irq_ack, 120 .irq_ack = ata_irq_ack,
@@ -127,7 +126,6 @@ static const struct ata_port_operations uli_ops = {
127}; 126};
128 127
129static struct ata_port_info uli_port_info = { 128static struct ata_port_info uli_port_info = {
130 .sht = &uli_sht,
131 .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY | 129 .flags = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
132 ATA_FLAG_IGN_SIMPLEX, 130 ATA_FLAG_IGN_SIMPLEX,
133 .pio_mask = 0x1f, /* pio0-4 */ 131 .pio_mask = 0x1f, /* pio0-4 */
@@ -185,12 +183,13 @@ static void uli_scr_write (struct ata_port *ap, unsigned int sc_reg, u32 val)
185static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent) 183static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
186{ 184{
187 static int printed_version; 185 static int printed_version;
188 struct ata_probe_ent *probe_ent; 186 const struct ata_port_info *ppi[] = { &uli_port_info, NULL };
189 struct ata_port_info *ppi[2];
190 int rc;
191 unsigned int board_idx = (unsigned int) ent->driver_data; 187 unsigned int board_idx = (unsigned int) ent->driver_data;
188 struct ata_host *host;
192 struct uli_priv *hpriv; 189 struct uli_priv *hpriv;
193 void __iomem * const *iomap; 190 void __iomem * const *iomap;
191 struct ata_ioports *ioaddr;
192 int n_ports, rc;
194 193
195 if (!printed_version++) 194 if (!printed_version++)
196 dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n"); 195 dev_printk(KERN_INFO, &pdev->dev, "version " DRV_VERSION "\n");
@@ -199,54 +198,42 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
199 if (rc) 198 if (rc)
200 return rc; 199 return rc;
201 200
202 rc = pci_request_regions(pdev, DRV_NAME); 201 n_ports = 2;
203 if (rc) { 202 if (board_idx == uli_5287)
204 pcim_pin_device(pdev); 203 n_ports = 4;
205 return rc; 204 rc = ata_pci_prepare_native_host(pdev, ppi, n_ports, &host);
206 }
207
208 rc = pci_set_dma_mask(pdev, ATA_DMA_MASK);
209 if (rc)
210 return rc;
211 rc = pci_set_consistent_dma_mask(pdev, ATA_DMA_MASK);
212 if (rc) 205 if (rc)
213 return rc; 206 return rc;
214 207
215 ppi[0] = ppi[1] = &uli_port_info;
216 probe_ent = ata_pci_init_native_mode(pdev, ppi, ATA_PORT_PRIMARY | ATA_PORT_SECONDARY);
217 if (!probe_ent)
218 return -ENOMEM;
219
220 hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL); 208 hpriv = devm_kzalloc(&pdev->dev, sizeof(*hpriv), GFP_KERNEL);
221 if (!hpriv) 209 if (!hpriv)
222 return -ENOMEM; 210 return -ENOMEM;
211 host->private_data = hpriv;
223 212
224 probe_ent->private_data = hpriv; 213 iomap = host->iomap;
225
226 iomap = pcim_iomap_table(pdev);
227 214
228 switch (board_idx) { 215 switch (board_idx) {
229 case uli_5287: 216 case uli_5287:
230 hpriv->scr_cfg_addr[0] = ULI5287_BASE; 217 hpriv->scr_cfg_addr[0] = ULI5287_BASE;
231 hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS; 218 hpriv->scr_cfg_addr[1] = ULI5287_BASE + ULI5287_OFFS;
232 probe_ent->n_ports = 4;
233 219
234 probe_ent->port[2].cmd_addr = iomap[0] + 8; 220 ioaddr = &host->ports[2]->ioaddr;
235 probe_ent->port[2].altstatus_addr = 221 ioaddr->cmd_addr = iomap[0] + 8;
236 probe_ent->port[2].ctl_addr = (void __iomem *) 222 ioaddr->altstatus_addr =
223 ioaddr->ctl_addr = (void __iomem *)
237 ((unsigned long)iomap[1] | ATA_PCI_CTL_OFS) + 4; 224 ((unsigned long)iomap[1] | ATA_PCI_CTL_OFS) + 4;
238 probe_ent->port[2].bmdma_addr = iomap[4] + 16; 225 ioaddr->bmdma_addr = iomap[4] + 16;
239 hpriv->scr_cfg_addr[2] = ULI5287_BASE + ULI5287_OFFS*4; 226 hpriv->scr_cfg_addr[2] = ULI5287_BASE + ULI5287_OFFS*4;
227 ata_std_ports(ioaddr);
240 228
241 probe_ent->port[3].cmd_addr = iomap[2] + 8; 229 ioaddr = &host->ports[3]->ioaddr;
242 probe_ent->port[3].altstatus_addr = 230 ioaddr->cmd_addr = iomap[2] + 8;
243 probe_ent->port[3].ctl_addr = (void __iomem *) 231 ioaddr->altstatus_addr =
232 ioaddr->ctl_addr = (void __iomem *)
244 ((unsigned long)iomap[3] | ATA_PCI_CTL_OFS) + 4; 233 ((unsigned long)iomap[3] | ATA_PCI_CTL_OFS) + 4;
245 probe_ent->port[3].bmdma_addr = iomap[4] + 24; 234 ioaddr->bmdma_addr = iomap[4] + 24;
246 hpriv->scr_cfg_addr[3] = ULI5287_BASE + ULI5287_OFFS*5; 235 hpriv->scr_cfg_addr[3] = ULI5287_BASE + ULI5287_OFFS*5;
247 236 ata_std_ports(ioaddr);
248 ata_std_ports(&probe_ent->port[2]);
249 ata_std_ports(&probe_ent->port[3]);
250 break; 237 break;
251 238
252 case uli_5289: 239 case uli_5289:
@@ -266,12 +253,8 @@ static int uli_init_one (struct pci_dev *pdev, const struct pci_device_id *ent)
266 253
267 pci_set_master(pdev); 254 pci_set_master(pdev);
268 pci_intx(pdev, 1); 255 pci_intx(pdev, 1);
269 256 return ata_host_activate(host, pdev->irq, ata_interrupt, IRQF_SHARED,
270 if (!ata_device_add(probe_ent)) 257 &uli_sht);
271 return -ENODEV;
272
273 devm_kfree(&pdev->dev, probe_ent);
274 return 0;
275} 258}
276 259
277static int __init uli_init(void) 260static int __init uli_init(void)