浏览代码

rapidio: remove mport resource reservation from common RIO code

Removes resource reservation from the common sybsystem initialization code
and make it part of mport driver initialization.  This resolves conflict
with resource reservation by device specific mport drivers.

Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com>
Cc: Kumar Gala <galak@kernel.crashing.org>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Li Yang <leoli@freescale.com>
Cc: Thomas Moll <thomas.moll@sysgo.com>
Cc: Micha Nelissen <micha@neli.hopto.org>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Alexandre Bounine 14 年之前
父节点
当前提交
c1256ebe6a
共有 2 个文件被更改,包括 10 次插入13 次删除
  1. 9 0
      arch/powerpc/sysdev/fsl_rio.c
  2. 1 13
      drivers/rapidio/rio.c

+ 9 - 0
arch/powerpc/sysdev/fsl_rio.c

@@ -1432,6 +1432,14 @@ int fsl_rio_setup(struct platform_device *dev)
 	port->iores.flags = IORESOURCE_MEM;
 	port->iores.flags = IORESOURCE_MEM;
 	port->iores.name = "rio_io_win";
 	port->iores.name = "rio_io_win";
 
 
+	if (request_resource(&iomem_resource, &port->iores) < 0) {
+		dev_err(&dev->dev, "RIO: Error requesting master port region"
+			" 0x%016llx-0x%016llx\n",
+			(u64)port->iores.start, (u64)port->iores.end);
+			rc = -ENOMEM;
+			goto err_res;
+	}
+
 	priv->pwirq   = irq_of_parse_and_map(dev->dev.of_node, 0);
 	priv->pwirq   = irq_of_parse_and_map(dev->dev.of_node, 0);
 	priv->bellirq = irq_of_parse_and_map(dev->dev.of_node, 2);
 	priv->bellirq = irq_of_parse_and_map(dev->dev.of_node, 2);
 	priv->txirq = irq_of_parse_and_map(dev->dev.of_node, 3);
 	priv->txirq = irq_of_parse_and_map(dev->dev.of_node, 3);
@@ -1536,6 +1544,7 @@ int fsl_rio_setup(struct platform_device *dev)
 	return 0;
 	return 0;
 err:
 err:
 	iounmap(priv->regs_win);
 	iounmap(priv->regs_win);
+err_res:
 	kfree(priv);
 	kfree(priv);
 err_priv:
 err_priv:
 	kfree(port);
 	kfree(port);

+ 1 - 13
drivers/rapidio/rio.c

@@ -1137,20 +1137,9 @@ static int __devinit rio_init(void)
 
 
 int __devinit rio_init_mports(void)
 int __devinit rio_init_mports(void)
 {
 {
-	int rc = 0;
 	struct rio_mport *port;
 	struct rio_mport *port;
 
 
 	list_for_each_entry(port, &rio_mports, node) {
 	list_for_each_entry(port, &rio_mports, node) {
-		if (!request_mem_region(port->iores.start,
-					resource_size(&port->iores),
-					port->name)) {
-			printk(KERN_ERR
-			       "RIO: Error requesting master port region 0x%016llx-0x%016llx\n",
-			       (u64)port->iores.start, (u64)port->iores.end);
-			rc = -ENOMEM;
-			goto out;
-		}
-
 		if (port->host_deviceid >= 0)
 		if (port->host_deviceid >= 0)
 			rio_enum_mport(port);
 			rio_enum_mport(port);
 		else
 		else
@@ -1159,8 +1148,7 @@ int __devinit rio_init_mports(void)
 
 
 	rio_init();
 	rio_init();
 
 
-      out:
-	return rc;
+	return 0;
 }
 }
 
 
 device_initcall_sync(rio_init_mports);
 device_initcall_sync(rio_init_mports);