Skip to content
  • Simon Arlott's avatar
    pinctrl: add bcm2835 driver · e1b2dc70
    Simon Arlott authored and Linus Walleij's avatar Linus Walleij committed
    
    
    The BCM2835 GPIO module is a combined GPIO controller, (GPIO) interrupt
    controller, and pinmux/control device.
    
    Original driver by Simon Arlott.
    Rewrite including GPIO chip device by Chris Boot.
    
    Upstreaming changes by Stephen Warren:
    * Wrote DT binding documentation.
    * Changed brcm,function to an integer to more directly match the
      datasheet, and to match brcm,pins being an integer.
    * Implemented pull-up/down pin config.
    * Removed read-only DT property and related code. The restriction this
      implemented are driven by the board, not the GPIO HW block, so don't
      really make sense of a HW block binding, were in general incomplete
      (since they could only know about the few pins hard-coded into the
      Raspberry Pi B board design and not the uncommitted GPIOS), and are
      better represented simply by not writing incorrect data into pin
      configuration nodes.
    * Don't set GPIO_IN function select in gpio_request_enable() to avoid
      glitches; defer this to gpio_set_direction(). Consequently, removed
      empty bcm2835_pmx_gpio_request_enable().
    * Simplified enabled_irq_map[]; make it explicitly 1 entry per bank.
    * Lifted use of enabled_irq_map[] outside the per-interrupt loop in
      IRQ handler, thus fixing an issue where the code was indexing into
      enabled_irq_map[] by intra-bank GPIO ID, not global GPIO ID.
    * Removed locking in IRQ handler, since all other code uses
      spin_lock_irqsave() and so guarantees it doesn't run concurrently
      with the handler.
    * Moved duplicated BUILD_BUG_ON()s into probe(). Also check size of
      bcm2835_gpio_pins[].
    * Remove range-checking from bcm2835_pctl_get_groups_count() since we've
      decided to trust the pinctrl core.
    * Made bcm2835_pmx_gpio_disable_free() call bcm2835_pinctrl_fsel_set()
      directly for simplicity.
    * Fixed body of dt_free_map() to match latest dt_node_to_map().
    * Removed GPIO ownership check from bcm2835_pmx_enable() since the pinctrl
      core owns doing this.
    * Made irq_chip and pinctrl_gpio_range .name == MODULE_NAME so it's more
      descriptive.
    * Simplified remove(); removed call to non-existent
      pinctrl_remove_gpio_range(), remove early return on error.
    * Don't force gpiochip's base to 0. Set gpio_range.base to gpiochip's
      base GPIO number.
    * Error-handling cleanups in probe().
    * Switched to module_platform_driver() rather than open-coding.
    * Made pin, group, and function names lower-case.
    * s/broadcom/brcm/ in DT property names.
    * s/2708/2835/.
    * Fixed a couple minor checkpatch warnings, and other minor cleanup.
    
    Signed-off-by: default avatarSimon Arlott <simon@fire.lp0.eu>
    Signed-off-by: default avatarChris Boot <bootc@bootc.net>
    Signed-off-by: default avatarStephen Warren <swarren@wwwdotorg.org>
    Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    e1b2dc70