diff options
Diffstat (limited to 'drivers/misc/c2port/core.c')
| -rw-r--r-- | drivers/misc/c2port/core.c | 22 | 
1 files changed, 9 insertions, 13 deletions
diff --git a/drivers/misc/c2port/core.c b/drivers/misc/c2port/core.c index f428d86bfc1..f32550a74bd 100644 --- a/drivers/misc/c2port/core.c +++ b/drivers/misc/c2port/core.c @@ -885,7 +885,7 @@ struct c2port_device *c2port_device_register(char *name,  					struct c2port_ops *ops, void *devdata)  {  	struct c2port_device *c2dev; -	int id, ret; +	int ret;  	if (unlikely(!ops) || unlikely(!ops->access) || \  		unlikely(!ops->c2d_dir) || unlikely(!ops->c2ck_set) || \ @@ -897,22 +897,18 @@ struct c2port_device *c2port_device_register(char *name,  	if (unlikely(!c2dev))  		return ERR_PTR(-ENOMEM); -	ret = idr_pre_get(&c2port_idr, GFP_KERNEL); -	if (!ret) { -		ret = -ENOMEM; -		goto error_idr_get_new; -	} - +	idr_preload(GFP_KERNEL);  	spin_lock_irq(&c2port_idr_lock); -	ret = idr_get_new(&c2port_idr, c2dev, &id); +	ret = idr_alloc(&c2port_idr, c2dev, 0, 0, GFP_NOWAIT);  	spin_unlock_irq(&c2port_idr_lock); +	idr_preload_end();  	if (ret < 0) -		goto error_idr_get_new; -	c2dev->id = id; +		goto error_idr_alloc; +	c2dev->id = ret;  	c2dev->dev = device_create(c2port_class, NULL, 0, c2dev, -					"c2port%d", id); +				   "c2port%d", c2dev->id);  	if (unlikely(IS_ERR(c2dev->dev))) {  		ret = PTR_ERR(c2dev->dev);  		goto error_device_create; @@ -946,10 +942,10 @@ error_device_create_bin_file:  error_device_create:  	spin_lock_irq(&c2port_idr_lock); -	idr_remove(&c2port_idr, id); +	idr_remove(&c2port_idr, c2dev->id);  	spin_unlock_irq(&c2port_idr_lock); -error_idr_get_new: +error_idr_alloc:  	kfree(c2dev);  	return ERR_PTR(ret);  | 
