desc->gdev = gdev;
 
-               if (gc->get_direction && gpiochip_line_is_valid(gc, desc_index)) {
-                       ret = gpiochip_get_direction(gc, desc_index);
-                       if (ret < 0)
-                               /*
-                                * FIXME: Bail-out here once all GPIO drivers
-                                * are updated to not return errors in
-                                * situations that can be considered normal
-                                * operation.
-                                */
-                               dev_warn(&gdev->dev,
-                                        "%s: get_direction failed: %d\n",
-                                        __func__, ret);
-
-                       assign_bit(FLAG_IS_OUT, &desc->flags, !ret);
-               } else {
+               /*
+                * We would typically want to use gpiochip_get_direction() here
+                * but we must not check the return value and bail-out as pin
+                * controllers can have pins configured to alternate functions
+                * and return -EINVAL. Also: there's no need to take the SRCU
+                * lock here.
+                */
+               if (gc->get_direction && gpiochip_line_is_valid(gc, desc_index))
+                       assign_bit(FLAG_IS_OUT, &desc->flags,
+                                  !gc->get_direction(gc, desc_index));
+               else
                        assign_bit(FLAG_IS_OUT,
                                   &desc->flags, !gc->direction_input);
-               }
        }
 
        ret = of_gpiochip_add(gc);