• Rojhalat Ibrahim's avatar
    gpiolib: allow simultaneous setting of multiple GPIO outputs · 5f424243
    Rojhalat Ibrahim authored
    Introduce new functions gpiod_set_array & gpiod_set_raw_array to the consumer
    interface which allow setting multiple outputs with just one function call.
    Also add an optional set_multiple function to the driver interface. Without an
    implementation of that function in the chip driver outputs are set
    sequentially.
    
    Implementing the set_multiple function in a chip driver allows for:
    - Improved performance for certain use cases. The original motivation for this
      was the task of configuring an FPGA. In that specific case, where 9 GPIO
      lines have to be set many times, configuration time goes down from 48 s to
      20 s when using the new function.
    - Simultaneous glitch-free setting of multiple pins on any kind of parallel
      bus attached to GPIOs provided they all reside on the same chip and bank.
    
    Limitations:
      Performance is only improved for normal high-low outputs. Open drain and
      open source outputs are always set separately from each other. Those kinds
      of outputs could probably be accelerated in a similar way if we could
      forgo the error checking when setting GPIO directions.
    
    Change log:
      v6: - rebase on current linux-gpio devel branch
      v5: - check can_sleep property per chip
          - remove superfluous checks
          - supplement documentation
      v4: - add gpiod_set_array function for setting logical values
          - change interface of the set_multiple driver function to use
            unsigned long as type for the bit fields
          - use generic bitops (which also use unsigned long for bit fields)
          - do not use ARCH_NR_GPIOS any more
      v3: - add documentation
          - change commit message
      v2: - use descriptor interface
          - allow arbitrary groups of GPIOs spanning multiple chips
    Signed-off-by: default avatarRojhalat Ibrahim <imr@rtschenk.de>
    Reviewed-by: default avatarAlexandre Courbot <acourbot@nvidia.com>
    Reviewed-by: default avatarMark Brown <broonie@linaro.org>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    5f424243
gpiolib.c 55.3 KB