mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
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 @@ out_unregister_device_notifier:
|
||||||
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…
Add table
Reference in a new issue