@@ -112,8 +112,8 @@ const char *gpiod_get_label(struct gpio_desc *desc)
112
112
if (!test_bit (FLAG_REQUESTED , & flags ))
113
113
return NULL ;
114
114
115
- label = srcu_dereference_check (desc -> label , & desc -> srcu ,
116
- srcu_read_lock_held (& desc -> srcu ));
115
+ label = srcu_dereference_check (desc -> label , & desc -> gdev -> desc_srcu ,
116
+ srcu_read_lock_held (& desc -> gdev -> desc_srcu ));
117
117
118
118
return label -> str ;
119
119
}
@@ -138,7 +138,7 @@ static int desc_set_label(struct gpio_desc *desc, const char *label)
138
138
139
139
old = rcu_replace_pointer (desc -> label , new , 1 );
140
140
if (old )
141
- call_srcu (& desc -> srcu , & old -> rh , desc_free_label );
141
+ call_srcu (& desc -> gdev -> desc_srcu , & old -> rh , desc_free_label );
142
142
143
143
return 0 ;
144
144
}
@@ -709,13 +709,10 @@ EXPORT_SYMBOL_GPL(gpiochip_line_is_valid);
709
709
static void gpiodev_release (struct device * dev )
710
710
{
711
711
struct gpio_device * gdev = to_gpio_device (dev );
712
- unsigned int i ;
713
712
714
- for (i = 0 ; i < gdev -> ngpio ; i ++ ) {
715
- /* Free pending label. */
716
- synchronize_srcu (& gdev -> descs [i ].srcu );
717
- cleanup_srcu_struct (& gdev -> descs [i ].srcu );
718
- }
713
+ /* Call pending kfree()s for descriptor labels. */
714
+ synchronize_srcu (& gdev -> desc_srcu );
715
+ cleanup_srcu_struct (& gdev -> desc_srcu );
719
716
720
717
ida_free (& gpio_ida , gdev -> id );
721
718
kfree_const (gdev -> label );
@@ -992,30 +989,30 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
992
989
if (ret )
993
990
goto err_remove_from_list ;
994
991
992
+ ret = init_srcu_struct (& gdev -> desc_srcu );
993
+ if (ret )
994
+ goto err_cleanup_gdev_srcu ;
995
+
995
996
#ifdef CONFIG_PINCTRL
996
997
INIT_LIST_HEAD (& gdev -> pin_ranges );
997
998
#endif
998
999
999
1000
if (gc -> names ) {
1000
1001
ret = gpiochip_set_desc_names (gc );
1001
1002
if (ret )
1002
- goto err_cleanup_gdev_srcu ;
1003
+ goto err_cleanup_desc_srcu ;
1003
1004
}
1004
1005
ret = gpiochip_set_names (gc );
1005
1006
if (ret )
1006
- goto err_cleanup_gdev_srcu ;
1007
+ goto err_cleanup_desc_srcu ;
1007
1008
1008
1009
ret = gpiochip_init_valid_mask (gc );
1009
1010
if (ret )
1010
- goto err_cleanup_gdev_srcu ;
1011
+ goto err_cleanup_desc_srcu ;
1011
1012
1012
1013
for (desc_index = 0 ; desc_index < gc -> ngpio ; desc_index ++ ) {
1013
1014
struct gpio_desc * desc = & gdev -> descs [desc_index ];
1014
1015
1015
- ret = init_srcu_struct (& desc -> srcu );
1016
- if (ret )
1017
- goto err_cleanup_desc_srcu ;
1018
-
1019
1016
if (gc -> get_direction && gpiochip_line_is_valid (gc , desc_index )) {
1020
1017
assign_bit (FLAG_IS_OUT ,
1021
1018
& desc -> flags , !gc -> get_direction (gc , desc_index ));
@@ -1027,7 +1024,7 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
1027
1024
1028
1025
ret = of_gpiochip_add (gc );
1029
1026
if (ret )
1030
- goto err_cleanup_desc_srcu ;
1027
+ goto err_free_valid_mask ;
1031
1028
1032
1029
ret = gpiochip_add_pin_ranges (gc );
1033
1030
if (ret )
@@ -1074,10 +1071,10 @@ int gpiochip_add_data_with_key(struct gpio_chip *gc, void *data,
1074
1071
gpiochip_remove_pin_ranges (gc );
1075
1072
err_remove_of_chip :
1076
1073
of_gpiochip_remove (gc );
1077
- err_cleanup_desc_srcu :
1078
- while (desc_index -- )
1079
- cleanup_srcu_struct (& gdev -> descs [desc_index ].srcu );
1074
+ err_free_valid_mask :
1080
1075
gpiochip_free_valid_mask (gc );
1076
+ err_cleanup_desc_srcu :
1077
+ cleanup_srcu_struct (& gdev -> desc_srcu );
1081
1078
err_cleanup_gdev_srcu :
1082
1079
cleanup_srcu_struct (& gdev -> srcu );
1083
1080
err_remove_from_list :
@@ -2407,7 +2404,7 @@ char *gpiochip_dup_line_label(struct gpio_chip *gc, unsigned int offset)
2407
2404
if (!test_bit (FLAG_REQUESTED , & desc -> flags ))
2408
2405
return NULL ;
2409
2406
2410
- guard (srcu )(& desc -> srcu );
2407
+ guard (srcu )(& desc -> gdev -> desc_srcu );
2411
2408
2412
2409
label = kstrdup (gpiod_get_label (desc ), GFP_KERNEL );
2413
2410
if (!label )
@@ -4798,7 +4795,7 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_device *gdev)
4798
4795
}
4799
4796
4800
4797
for_each_gpio_desc (gc , desc ) {
4801
- guard (srcu )(& desc -> srcu );
4798
+ guard (srcu )(& desc -> gdev -> desc_srcu );
4802
4799
if (test_bit (FLAG_REQUESTED , & desc -> flags )) {
4803
4800
gpiod_get_direction (desc );
4804
4801
is_out = test_bit (FLAG_IS_OUT , & desc -> flags );
0 commit comments