TC: Error handling clean-ups

Rewrite TURBOchannel error handling to use a common failure path, making
sure put_device is called for devices that failed initialization.  While
at it update printk calls to use pr_err rather than KERN_ERR.

Signed-off-by: Maciej W. Rozycki <macro@linux-mips.org>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/6701/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
Maciej W. Rozycki 2014-04-06 20:52:37 +01:00 committed by Ralf Baechle
parent 187c26ddf0
commit e2afb7de6e

View File

@ -83,8 +83,7 @@ static void __init tc_bus_add_devices(struct tc_bus *tbus)
/* Found a board, allocate it an entry in the list */ /* Found a board, allocate it an entry in the list */
tdev = kzalloc(sizeof(*tdev), GFP_KERNEL); tdev = kzalloc(sizeof(*tdev), GFP_KERNEL);
if (!tdev) { if (!tdev) {
printk(KERN_ERR "tc%x: unable to allocate tc_dev\n", pr_err("tc%x: unable to allocate tc_dev\n", slot);
slot);
goto out_err; goto out_err;
} }
dev_set_name(&tdev->dev, "tc%x", slot); dev_set_name(&tdev->dev, "tc%x", slot);
@ -117,10 +116,10 @@ static void __init tc_bus_add_devices(struct tc_bus *tbus)
tdev->resource.start = extslotaddr; tdev->resource.start = extslotaddr;
tdev->resource.end = extslotaddr + devsize - 1; tdev->resource.end = extslotaddr + devsize - 1;
} else { } else {
printk(KERN_ERR "%s: Cannot provide slot space " pr_err("%s: Cannot provide slot space "
"(%dMiB required, up to %dMiB supported)\n", "(%ldMiB required, up to %ldMiB supported)\n",
dev_name(&tdev->dev), devsize >> 20, dev_name(&tdev->dev), (long)(devsize >> 20),
max(slotsize, extslotsize) >> 20); (long)(max(slotsize, extslotsize) >> 20));
kfree(tdev); kfree(tdev);
goto out_err; goto out_err;
} }
@ -147,14 +146,12 @@ static int __init tc_init(void)
{ {
/* Initialize the TURBOchannel bus */ /* Initialize the TURBOchannel bus */
if (tc_bus_get_info(&tc_bus)) if (tc_bus_get_info(&tc_bus))
return 0; goto out_err;
INIT_LIST_HEAD(&tc_bus.devices); INIT_LIST_HEAD(&tc_bus.devices);
dev_set_name(&tc_bus.dev, "tc"); dev_set_name(&tc_bus.dev, "tc");
if (device_register(&tc_bus.dev)) { if (device_register(&tc_bus.dev))
put_device(&tc_bus.dev); goto out_err_device;
return 0;
}
if (tc_bus.info.slot_size) { if (tc_bus.info.slot_size) {
unsigned int tc_clock = tc_get_speed(&tc_bus) / 100000; unsigned int tc_clock = tc_get_speed(&tc_bus) / 100000;
@ -172,8 +169,8 @@ static int __init tc_init(void)
tc_bus.resource[0].flags = IORESOURCE_MEM; tc_bus.resource[0].flags = IORESOURCE_MEM;
if (request_resource(&iomem_resource, if (request_resource(&iomem_resource,
&tc_bus.resource[0]) < 0) { &tc_bus.resource[0]) < 0) {
printk(KERN_ERR "tc: Cannot reserve resource\n"); pr_err("tc: Cannot reserve resource\n");
return 0; goto out_err_device;
} }
if (tc_bus.ext_slot_size) { if (tc_bus.ext_slot_size) {
tc_bus.resource[1].start = tc_bus.ext_slot_base; tc_bus.resource[1].start = tc_bus.ext_slot_base;
@ -184,10 +181,8 @@ static int __init tc_init(void)
tc_bus.resource[1].flags = IORESOURCE_MEM; tc_bus.resource[1].flags = IORESOURCE_MEM;
if (request_resource(&iomem_resource, if (request_resource(&iomem_resource,
&tc_bus.resource[1]) < 0) { &tc_bus.resource[1]) < 0) {
printk(KERN_ERR pr_err("tc: Cannot reserve resource\n");
"tc: Cannot reserve resource\n"); goto out_err_resource;
release_resource(&tc_bus.resource[0]);
return 0;
} }
} }
@ -195,6 +190,13 @@ static int __init tc_init(void)
} }
return 0; return 0;
out_err_resource:
release_resource(&tc_bus.resource[0]);
out_err_device:
put_device(&tc_bus.dev);
out_err:
return 0;
} }
subsys_initcall(tc_init); subsys_initcall(tc_init);