summaryrefslogtreecommitdiffstats
path: root/drivers/ata/intf_platform_ide.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata/intf_platform_ide.c')
-rw-r--r--drivers/ata/intf_platform_ide.c53
1 files changed, 27 insertions, 26 deletions
diff --git a/drivers/ata/intf_platform_ide.c b/drivers/ata/intf_platform_ide.c
index ecc2546d84..0d392d8d4a 100644
--- a/drivers/ata/intf_platform_ide.c
+++ b/drivers/ata/intf_platform_ide.c
@@ -28,6 +28,7 @@
#include <errno.h>
#include <ata_drive.h>
#include <platform_ide.h>
+#include <linux/err.h>
/**
* Setup the register specific addresses for an ATA like divice
@@ -81,44 +82,44 @@ static int platform_ide_probe(struct device_d *dev)
int rc;
struct ide_port_info *pdata = dev->platform_data;
struct ide_port *ide;
- void *reg_base, *alt_base;
+ void *reg_base, *alt_base = NULL;
struct resource *reg, *alt;
- int mmio;
+ int mmio = 0;
if (pdata == NULL) {
dev_err(dev, "No platform data. Cannot continue\n");
return -EINVAL;
}
- alt = NULL;
- reg = dev_get_resource(dev, IORESOURCE_MEM, 0);
- mmio = (reg != NULL);
- if (reg != NULL) {
- reg = request_iomem_region(dev_name(dev), reg->start,
- reg->end);
- alt = dev_get_resource(dev, IORESOURCE_MEM, 1);
- if (alt != NULL)
- alt = request_iomem_region(dev_name(dev), alt->start,
- alt->end);
+ reg_base = dev_request_mem_region(dev, 0);
+
+ if (!IS_ERR(reg_base)) {
+ mmio = 1;
+ alt_base = dev_request_mem_region(dev, 1);
+ if (IS_ERR(alt_base))
+ alt_base = NULL;
} else {
reg = dev_get_resource(dev, IORESOURCE_IO, 0);
- if (reg != NULL) {
- reg = request_ioport_region(dev_name(dev), reg->start,
- reg->end);
- alt = dev_get_resource(dev, IORESOURCE_IO, 1);
- if (alt != NULL)
- alt = request_ioport_region(dev_name(dev),
- alt->start,
- alt->end);
+ if (IS_ERR(reg))
+ return PTR_ERR(reg);
+
+ reg = request_ioport_region(dev_name(dev), reg->start,
+ reg->end);
+ if (!reg)
+ return -ENODEV;
+
+ reg_base = (void __force __iomem *) reg->start;
+
+ alt = dev_get_resource(dev, IORESOURCE_IO, 1);
+ if (!IS_ERR(alt)) {
+ alt = request_ioport_region(dev_name(dev),
+ alt->start,
+ alt->end);
+ if (!alt)
+ return -ENODEV;
}
}
- reg_base = (reg != NULL ? (void __force __iomem *) reg->start : NULL);
- alt_base = (alt != NULL ? (void __force __iomem *) alt->start : NULL);
-
- if (!reg_base)
- return -ENODEV;
-
ide = xzalloc(sizeof(*ide));
ide->io.mmio = mmio;