diff options
Diffstat (limited to 'drivers/ata/pata_platform.c')
-rw-r--r-- | drivers/ata/pata_platform.c | 50 |
1 files changed, 15 insertions, 35 deletions
diff --git a/drivers/ata/pata_platform.c b/drivers/ata/pata_platform.c index 8a261a3daeda..b35fc29f4db5 100644 --- a/drivers/ata/pata_platform.c +++ b/drivers/ata/pata_platform.c | |||
@@ -83,7 +83,7 @@ static struct ata_port_operations pata_platform_port_ops = { | |||
83 | .qc_prep = ata_qc_prep, | 83 | .qc_prep = ata_qc_prep, |
84 | .qc_issue = ata_qc_issue_prot, | 84 | .qc_issue = ata_qc_issue_prot, |
85 | 85 | ||
86 | .data_xfer = ata_pio_data_xfer_noirq, | 86 | .data_xfer = ata_data_xfer_noirq, |
87 | 87 | ||
88 | .irq_handler = ata_interrupt, | 88 | .irq_handler = ata_interrupt, |
89 | .irq_clear = ata_bmdma_irq_clear, | 89 | .irq_clear = ata_bmdma_irq_clear, |
@@ -134,7 +134,6 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) | |||
134 | struct resource *io_res, *ctl_res; | 134 | struct resource *io_res, *ctl_res; |
135 | struct ata_probe_ent ae; | 135 | struct ata_probe_ent ae; |
136 | unsigned int mmio; | 136 | unsigned int mmio; |
137 | int ret; | ||
138 | 137 | ||
139 | /* | 138 | /* |
140 | * Simple resource validation .. | 139 | * Simple resource validation .. |
@@ -188,48 +187,29 @@ static int __devinit pata_platform_probe(struct platform_device *pdev) | |||
188 | * Handle the MMIO case | 187 | * Handle the MMIO case |
189 | */ | 188 | */ |
190 | if (mmio) { | 189 | if (mmio) { |
191 | ae.port_flags |= ATA_FLAG_MMIO; | 190 | ae.port[0].cmd_addr = devm_ioremap(&pdev->dev, io_res->start, |
192 | 191 | io_res->end - io_res->start + 1); | |
193 | ae.port[0].cmd_addr = (unsigned long) | 192 | ae.port[0].ctl_addr = devm_ioremap(&pdev->dev, ctl_res->start, |
194 | devm_ioremap(&pdev->dev, io_res->start, | 193 | ctl_res->end - ctl_res->start + 1); |
195 | io_res->end - io_res->start + 1); | ||
196 | if (unlikely(!ae.port[0].cmd_addr)) { | ||
197 | dev_err(&pdev->dev, "failed to remap IO base\n"); | ||
198 | return -ENXIO; | ||
199 | } | ||
200 | |||
201 | ae.port[0].ctl_addr = (unsigned long) | ||
202 | devm_ioremap(&pdev->dev, ctl_res->start, | ||
203 | ctl_res->end - ctl_res->start + 1); | ||
204 | if (unlikely(!ae.port[0].ctl_addr)) { | ||
205 | dev_err(&pdev->dev, "failed to remap CTL base\n"); | ||
206 | ret = -ENXIO; | ||
207 | goto bad_remap; | ||
208 | } | ||
209 | } else { | 194 | } else { |
210 | ae.port[0].cmd_addr = io_res->start; | 195 | ae.port[0].cmd_addr = devm_ioport_map(&pdev->dev, io_res->start, |
211 | ae.port[0].ctl_addr = ctl_res->start; | 196 | io_res->end - io_res->start + 1); |
197 | ae.port[0].ctl_addr = devm_ioport_map(&pdev->dev, ctl_res->start, | ||
198 | ctl_res->end - ctl_res->start + 1); | ||
199 | } | ||
200 | if (!ae.port[0].cmd_addr || !ae.port[0].ctl_addr) { | ||
201 | dev_err(&pdev->dev, "failed to map IO/CTL base\n"); | ||
202 | return -ENOMEM; | ||
212 | } | 203 | } |
213 | 204 | ||
214 | ae.port[0].altstatus_addr = ae.port[0].ctl_addr; | 205 | ae.port[0].altstatus_addr = ae.port[0].ctl_addr; |
215 | 206 | ||
216 | pata_platform_setup_port(&ae.port[0], pdev->dev.platform_data); | 207 | pata_platform_setup_port(&ae.port[0], pdev->dev.platform_data); |
217 | 208 | ||
218 | if (unlikely(ata_device_add(&ae) == 0)) { | 209 | if (unlikely(ata_device_add(&ae) == 0)) |
219 | ret = -ENODEV; | 210 | return -ENODEV; |
220 | goto add_failed; | ||
221 | } | ||
222 | 211 | ||
223 | return 0; | 212 | return 0; |
224 | |||
225 | add_failed: | ||
226 | if (ae.port[0].ctl_addr && mmio) | ||
227 | iounmap((void __iomem *)ae.port[0].ctl_addr); | ||
228 | bad_remap: | ||
229 | if (ae.port[0].cmd_addr && mmio) | ||
230 | iounmap((void __iomem *)ae.port[0].cmd_addr); | ||
231 | |||
232 | return ret; | ||
233 | } | 213 | } |
234 | 214 | ||
235 | /** | 215 | /** |