forked from mirrors/linux
		
	gpiolib: switch the line state notifier to atomic
With everything else ready, we can now switch to using the atomic notifier for line state events which will allow us to notify user-space about direction changes from atomic context. Reviewed-by: Kent Gibson <warthog618@gmail.com> Link: https://lore.kernel.org/r/20241018-gpio-notify-in-kernel-events-v5-7-c79135e58a1c@linaro.org Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
This commit is contained in:
		
							parent
							
								
									40b7c49950
								
							
						
					
					
						commit
						fcc8b637c5
					
				
					 3 changed files with 10 additions and 10 deletions
				
			
		|  | @ -2729,8 +2729,8 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file) | ||||||
| 	cdev->gdev = gpio_device_get(gdev); | 	cdev->gdev = gpio_device_get(gdev); | ||||||
| 
 | 
 | ||||||
| 	cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify; | 	cdev->lineinfo_changed_nb.notifier_call = lineinfo_changed_notify; | ||||||
| 	ret = blocking_notifier_chain_register(&gdev->line_state_notifier, | 	ret = atomic_notifier_chain_register(&gdev->line_state_notifier, | ||||||
| 					       &cdev->lineinfo_changed_nb); | 					     &cdev->lineinfo_changed_nb); | ||||||
| 	if (ret) | 	if (ret) | ||||||
| 		goto out_free_bitmap; | 		goto out_free_bitmap; | ||||||
| 
 | 
 | ||||||
|  | @ -2754,8 +2754,8 @@ static int gpio_chrdev_open(struct inode *inode, struct file *file) | ||||||
| 	blocking_notifier_chain_unregister(&gdev->device_notifier, | 	blocking_notifier_chain_unregister(&gdev->device_notifier, | ||||||
| 					   &cdev->device_unregistered_nb); | 					   &cdev->device_unregistered_nb); | ||||||
| out_unregister_line_notifier: | out_unregister_line_notifier: | ||||||
| 	blocking_notifier_chain_unregister(&gdev->line_state_notifier, | 	atomic_notifier_chain_unregister(&gdev->line_state_notifier, | ||||||
| 					   &cdev->lineinfo_changed_nb); | 					 &cdev->lineinfo_changed_nb); | ||||||
| out_free_bitmap: | out_free_bitmap: | ||||||
| 	gpio_device_put(gdev); | 	gpio_device_put(gdev); | ||||||
| 	bitmap_free(cdev->watched_lines); | 	bitmap_free(cdev->watched_lines); | ||||||
|  | @ -2779,8 +2779,8 @@ static int gpio_chrdev_release(struct inode *inode, struct file *file) | ||||||
| 
 | 
 | ||||||
| 	blocking_notifier_chain_unregister(&gdev->device_notifier, | 	blocking_notifier_chain_unregister(&gdev->device_notifier, | ||||||
| 					   &cdev->device_unregistered_nb); | 					   &cdev->device_unregistered_nb); | ||||||
| 	blocking_notifier_chain_unregister(&gdev->line_state_notifier, | 	atomic_notifier_chain_unregister(&gdev->line_state_notifier, | ||||||
| 					   &cdev->lineinfo_changed_nb); | 					 &cdev->lineinfo_changed_nb); | ||||||
| 	bitmap_free(cdev->watched_lines); | 	bitmap_free(cdev->watched_lines); | ||||||
| 	gpio_device_put(gdev); | 	gpio_device_put(gdev); | ||||||
| 	kfree(cdev); | 	kfree(cdev); | ||||||
|  |  | ||||||
|  | @ -1026,7 +1026,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data, | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	BLOCKING_INIT_NOTIFIER_HEAD(&gdev->line_state_notifier); | 	ATOMIC_INIT_NOTIFIER_HEAD(&gdev->line_state_notifier); | ||||||
| 	BLOCKING_INIT_NOTIFIER_HEAD(&gdev->device_notifier); | 	BLOCKING_INIT_NOTIFIER_HEAD(&gdev->device_notifier); | ||||||
| 
 | 
 | ||||||
| 	ret = init_srcu_struct(&gdev->srcu); | 	ret = init_srcu_struct(&gdev->srcu); | ||||||
|  | @ -4098,8 +4098,8 @@ EXPORT_SYMBOL_GPL(gpiod_set_array_value_cansleep); | ||||||
| 
 | 
 | ||||||
| void gpiod_line_state_notify(struct gpio_desc *desc, unsigned long action) | void gpiod_line_state_notify(struct gpio_desc *desc, unsigned long action) | ||||||
| { | { | ||||||
| 	blocking_notifier_call_chain(&desc->gdev->line_state_notifier, | 	atomic_notifier_call_chain(&desc->gdev->line_state_notifier, | ||||||
| 				     action, desc); | 				   action, desc); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| /**
 | /**
 | ||||||
|  |  | ||||||
|  | @ -72,7 +72,7 @@ struct gpio_device { | ||||||
| 	const char		*label; | 	const char		*label; | ||||||
| 	void			*data; | 	void			*data; | ||||||
| 	struct list_head        list; | 	struct list_head        list; | ||||||
| 	struct blocking_notifier_head line_state_notifier; | 	struct atomic_notifier_head line_state_notifier; | ||||||
| 	struct workqueue_struct	*line_state_wq; | 	struct workqueue_struct	*line_state_wq; | ||||||
| 	struct blocking_notifier_head device_notifier; | 	struct blocking_notifier_head device_notifier; | ||||||
| 	struct srcu_struct	srcu; | 	struct srcu_struct	srcu; | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 Bartosz Golaszewski
						Bartosz Golaszewski