diff options
author | David S. Miller <davem@sunset.davemloft.net> | 2006-12-29 00:01:32 -0500 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2006-12-31 17:06:05 -0500 |
commit | e3a411a3dfc1d633504aa63efab32b7e00318454 (patch) | |
tree | 2ba6117448edd7056c8fa48cc6a696ae73a6c21a /drivers/serial/sunzilog.c | |
parent | 6fc5bae797a6632bbccdd49a1b6a96121368a4b9 (diff) |
[SPARC64]: Fix of_iounmap() region release.
We need to pass in the resource otherwise we cannot
release the region properly. We must know whether it is
an I/O or MEM resource.
Spotted by Eric Brower.
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/serial/sunzilog.c')
-rw-r--r-- | drivers/serial/sunzilog.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/drivers/serial/sunzilog.c b/drivers/serial/sunzilog.c index 75de919a9471..244f796dc625 100644 --- a/drivers/serial/sunzilog.c +++ b/drivers/serial/sunzilog.c | |||
@@ -1379,13 +1379,15 @@ static int __devinit zs_probe(struct of_device *op, const struct of_device_id *m | |||
1379 | if (!keyboard_mouse) { | 1379 | if (!keyboard_mouse) { |
1380 | err = uart_add_one_port(&sunzilog_reg, &up[0].port); | 1380 | err = uart_add_one_port(&sunzilog_reg, &up[0].port); |
1381 | if (err) { | 1381 | if (err) { |
1382 | of_iounmap(rp, sizeof(struct zilog_layout)); | 1382 | of_iounmap(&op->resource[0], |
1383 | rp, sizeof(struct zilog_layout)); | ||
1383 | return err; | 1384 | return err; |
1384 | } | 1385 | } |
1385 | err = uart_add_one_port(&sunzilog_reg, &up[1].port); | 1386 | err = uart_add_one_port(&sunzilog_reg, &up[1].port); |
1386 | if (err) { | 1387 | if (err) { |
1387 | uart_remove_one_port(&sunzilog_reg, &up[0].port); | 1388 | uart_remove_one_port(&sunzilog_reg, &up[0].port); |
1388 | of_iounmap(rp, sizeof(struct zilog_layout)); | 1389 | of_iounmap(&op->resource[0], |
1390 | rp, sizeof(struct zilog_layout)); | ||
1389 | return err; | 1391 | return err; |
1390 | } | 1392 | } |
1391 | } else { | 1393 | } else { |
@@ -1414,18 +1416,18 @@ static void __devexit zs_remove_one(struct uart_sunzilog_port *up) | |||
1414 | uart_remove_one_port(&sunzilog_reg, &up->port); | 1416 | uart_remove_one_port(&sunzilog_reg, &up->port); |
1415 | } | 1417 | } |
1416 | 1418 | ||
1417 | static int __devexit zs_remove(struct of_device *dev) | 1419 | static int __devexit zs_remove(struct of_device *op) |
1418 | { | 1420 | { |
1419 | struct uart_sunzilog_port *up = dev_get_drvdata(&dev->dev); | 1421 | struct uart_sunzilog_port *up = dev_get_drvdata(&op->dev); |
1420 | struct zilog_layout __iomem *regs; | 1422 | struct zilog_layout __iomem *regs; |
1421 | 1423 | ||
1422 | zs_remove_one(&up[0]); | 1424 | zs_remove_one(&up[0]); |
1423 | zs_remove_one(&up[1]); | 1425 | zs_remove_one(&up[1]); |
1424 | 1426 | ||
1425 | regs = sunzilog_chip_regs[up[0].port.line / 2]; | 1427 | regs = sunzilog_chip_regs[up[0].port.line / 2]; |
1426 | of_iounmap(regs, sizeof(struct zilog_layout)); | 1428 | of_iounmap(&op->resource[0], regs, sizeof(struct zilog_layout)); |
1427 | 1429 | ||
1428 | dev_set_drvdata(&dev->dev, NULL); | 1430 | dev_set_drvdata(&op->dev, NULL); |
1429 | 1431 | ||
1430 | return 0; | 1432 | return 0; |
1431 | } | 1433 | } |