forked from mirrors/linux
		
	gpiolib: cdev: refactor lineevent cleanup into lineevent_free
Consolidate the cleanup of lineevents, currently duplicated in lineevent_create and lineevent_release, into a helper function lineevent_free. Signed-off-by: Kent Gibson <warthog618@gmail.com> Signed-off-by: Bartosz Golaszewski <bgolaszewski@baylibre.com>
This commit is contained in:
		
							parent
							
								
									883f919818
								
							
						
					
					
						commit
						4682427241
					
				
					 1 changed files with 22 additions and 24 deletions
				
			
		|  | @ -478,16 +478,20 @@ static ssize_t lineevent_read(struct file *file, | ||||||
| 	return bytes_read; | 	return bytes_read; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static int lineevent_release(struct inode *inode, struct file *file) | static void lineevent_free(struct lineevent_state *le) | ||||||
| { | { | ||||||
| 	struct lineevent_state *le = file->private_data; | 	if (le->irq) | ||||||
| 	struct gpio_device *gdev = le->gdev; |  | ||||||
| 
 |  | ||||||
| 		free_irq(le->irq, le); | 		free_irq(le->irq, le); | ||||||
|  | 	if (le->desc) | ||||||
| 		gpiod_free(le->desc); | 		gpiod_free(le->desc); | ||||||
| 	kfree(le->label); | 	kfree(le->label); | ||||||
|  | 	put_device(&le->gdev->dev); | ||||||
| 	kfree(le); | 	kfree(le); | ||||||
| 	put_device(&gdev->dev); | } | ||||||
|  | 
 | ||||||
|  | static int lineevent_release(struct inode *inode, struct file *file) | ||||||
|  | { | ||||||
|  | 	lineevent_free(file->private_data); | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -612,7 +616,7 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) | ||||||
| 	u32 eflags; | 	u32 eflags; | ||||||
| 	int fd; | 	int fd; | ||||||
| 	int ret; | 	int ret; | ||||||
| 	int irqflags = 0; | 	int irq, irqflags = 0; | ||||||
| 
 | 
 | ||||||
| 	if (copy_from_user(&eventreq, ip, sizeof(eventreq))) | 	if (copy_from_user(&eventreq, ip, sizeof(eventreq))) | ||||||
| 		return -EFAULT; | 		return -EFAULT; | ||||||
|  | @ -663,7 +667,7 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) | ||||||
| 
 | 
 | ||||||
| 	ret = gpiod_request(desc, le->label); | 	ret = gpiod_request(desc, le->label); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		goto out_free_label; | 		goto out_free_le; | ||||||
| 	le->desc = desc; | 	le->desc = desc; | ||||||
| 	le->eflags = eflags; | 	le->eflags = eflags; | ||||||
| 
 | 
 | ||||||
|  | @ -671,16 +675,17 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) | ||||||
| 
 | 
 | ||||||
| 	ret = gpiod_direction_input(desc); | 	ret = gpiod_direction_input(desc); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		goto out_free_desc; | 		goto out_free_le; | ||||||
| 
 | 
 | ||||||
| 	blocking_notifier_call_chain(&desc->gdev->notifier, | 	blocking_notifier_call_chain(&desc->gdev->notifier, | ||||||
| 				     GPIOLINE_CHANGED_REQUESTED, desc); | 				     GPIOLINE_CHANGED_REQUESTED, desc); | ||||||
| 
 | 
 | ||||||
| 	le->irq = gpiod_to_irq(desc); | 	irq = gpiod_to_irq(desc); | ||||||
| 	if (le->irq <= 0) { | 	if (irq <= 0) { | ||||||
| 		ret = -ENODEV; | 		ret = -ENODEV; | ||||||
| 		goto out_free_desc; | 		goto out_free_le; | ||||||
| 	} | 	} | ||||||
|  | 	le->irq = irq; | ||||||
| 
 | 
 | ||||||
| 	if (eflags & GPIOEVENT_REQUEST_RISING_EDGE) | 	if (eflags & GPIOEVENT_REQUEST_RISING_EDGE) | ||||||
| 		irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? | 		irqflags |= test_bit(FLAG_ACTIVE_LOW, &desc->flags) ? | ||||||
|  | @ -701,12 +706,12 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) | ||||||
| 				   le->label, | 				   le->label, | ||||||
| 				   le); | 				   le); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		goto out_free_desc; | 		goto out_free_le; | ||||||
| 
 | 
 | ||||||
| 	fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC); | 	fd = get_unused_fd_flags(O_RDONLY | O_CLOEXEC); | ||||||
| 	if (fd < 0) { | 	if (fd < 0) { | ||||||
| 		ret = fd; | 		ret = fd; | ||||||
| 		goto out_free_irq; | 		goto out_free_le; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	file = anon_inode_getfile("gpio-event", | 	file = anon_inode_getfile("gpio-event", | ||||||
|  | @ -735,15 +740,8 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip) | ||||||
| 
 | 
 | ||||||
| out_put_unused_fd: | out_put_unused_fd: | ||||||
| 	put_unused_fd(fd); | 	put_unused_fd(fd); | ||||||
| out_free_irq: |  | ||||||
| 	free_irq(le->irq, le); |  | ||||||
| out_free_desc: |  | ||||||
| 	gpiod_free(le->desc); |  | ||||||
| out_free_label: |  | ||||||
| 	kfree(le->label); |  | ||||||
| out_free_le: | out_free_le: | ||||||
| 	kfree(le); | 	lineevent_free(le); | ||||||
| 	put_device(&gdev->dev); |  | ||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Kent Gibson
						Kent Gibson