MIPS: TXx9: Add missing put_device call

This is required so that we give up the last reference to the device.

Also, rework error path so that it is easier to read.

[ralf@linux-mips.org: Reformat to Linux coding style and make
txx9_device_release static; folded in build fix by Levente for the
original patch.]

Signed-off-by: Levente Kurusa <levex@linux.com>
Cc: LKML <linux-kernel@vger.kernel.org>
Cc: Aaro Koskinen <aaro.koskinen@iki.fi>
Cc: Markos Chandras <markos.chandras@imgtec.com>
Cc: Steven J. Hill <Steven.Hill@imgtec.com>
Cc: linux-mips@linux-mips.org
Patchwork: https://patchwork.linux-mips.org/patch/6259/
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
Levente Kurusa 2013-12-19 16:03:25 +01:00 committed by Ralf Baechle
parent 1795cd9b3a
commit 1610c8a8f2
1 changed files with 19 additions and 10 deletions

View File

@ -937,6 +937,14 @@ static ssize_t txx9_sram_write(struct file *filp, struct kobject *kobj,
return size; return size;
} }
static void txx9_device_release(struct device *dev)
{
struct txx9_sramc_dev *tdev;
tdev = container_of(dev, struct txx9_sramc_dev, dev);
kfree(tdev);
}
void __init txx9_sramc_init(struct resource *r) void __init txx9_sramc_init(struct resource *r)
{ {
struct txx9_sramc_dev *dev; struct txx9_sramc_dev *dev;
@ -951,8 +959,11 @@ void __init txx9_sramc_init(struct resource *r)
return; return;
size = resource_size(r); size = resource_size(r);
dev->base = ioremap(r->start, size); dev->base = ioremap(r->start, size);
if (!dev->base) if (!dev->base) {
goto exit; kfree(dev);
return;
}
dev->dev.release = &txx9_device_release;
dev->dev.bus = &txx9_sramc_subsys; dev->dev.bus = &txx9_sramc_subsys;
sysfs_bin_attr_init(&dev->bindata_attr); sysfs_bin_attr_init(&dev->bindata_attr);
dev->bindata_attr.attr.name = "bindata"; dev->bindata_attr.attr.name = "bindata";
@ -963,17 +974,15 @@ void __init txx9_sramc_init(struct resource *r)
dev->bindata_attr.private = dev; dev->bindata_attr.private = dev;
err = device_register(&dev->dev); err = device_register(&dev->dev);
if (err) if (err)
goto exit; goto exit_put;
err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr); err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr);
if (err) { if (err) {
device_unregister(&dev->dev); device_unregister(&dev->dev);
goto exit; iounmap(dev->base);
}
return;
exit:
if (dev) {
if (dev->base)
iounmap(dev->base);
kfree(dev); kfree(dev);
} }
return;
exit_put:
put_device(&dev->dev);
return;
} }