diff options
Diffstat (limited to 'arch/mips/txx9/generic/setup.c')
| -rw-r--r-- | arch/mips/txx9/generic/setup.c | 29 | 
1 files changed, 19 insertions, 10 deletions
diff --git a/arch/mips/txx9/generic/setup.c b/arch/mips/txx9/generic/setup.c index dd2cf25b5ae5..9ff200ae1c9a 100644 --- a/arch/mips/txx9/generic/setup.c +++ b/arch/mips/txx9/generic/setup.c @@ -937,6 +937,14 @@ static ssize_t txx9_sram_write(struct file *filp, struct kobject *kobj,  	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)  {  	struct txx9_sramc_dev *dev; @@ -951,8 +959,11 @@ void __init txx9_sramc_init(struct resource *r)  		return;  	size = resource_size(r);  	dev->base = ioremap(r->start, size); -	if (!dev->base) -		goto exit; +	if (!dev->base) { +		kfree(dev); +		return; +	} +	dev->dev.release = &txx9_device_release;  	dev->dev.bus = &txx9_sramc_subsys;  	sysfs_bin_attr_init(&dev->bindata_attr);  	dev->bindata_attr.attr.name = "bindata"; @@ -963,17 +974,15 @@ void __init txx9_sramc_init(struct resource *r)  	dev->bindata_attr.private = dev;  	err = device_register(&dev->dev);  	if (err) -		goto exit; +		goto exit_put;  	err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr);  	if (err) {  		device_unregister(&dev->dev); -		goto exit; -	} -	return; -exit: -	if (dev) { -		if (dev->base) -			iounmap(dev->base); +		iounmap(dev->base);  		kfree(dev);  	} +	return; +exit_put: +	put_device(&dev->dev); +	return;  }  |