desc->gdev = gdev;
 
-               if (gc->get_direction && gpiochip_line_is_valid(gc, desc_index)) {
-                       ret = gc->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 check the return value of
+                * 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);