1. 15 6月, 2016 2 次提交
    • L
      gpio: userspace ABI for reading GPIO line events · 61f922db
      Linus Walleij 提交于
      This adds an ABI for listening to events on GPIO lines.
      The mechanism returns an anonymous file handle to a request
      to listen to a specific offset on a specific gpiochip.
      To fetch the stream of events from the file handle, userspace
      simply reads an event.
      
      - Events can be requested with the same flags as ordinary
        handles, i.e. open drain or open source. An ioctl() call
        GPIO_GET_LINEEVENT_IOCTL is issued indicating the desired
        line.
      
      - Events can be requested for falling edge events, rising
        edge events, or both.
      
      - All events are timestamped using the kernel real time
        nanosecond timestamp (the same as is used by IIO).
      
      - The supplied consumer label will appear in "lsgpio"
        listings of the lines, and in /proc/interrupts as the
        mechanism will request an interrupt from the gpio chip.
      
      - Events are not supported on gpiochips that do not serve
        interrupts (no legal .to_irq() call). The event interrupt
        is threaded to avoid any realtime problems.
      
      - It is possible to also directly read the current value
        of the registered GPIO line by issuing the same
        GPIOHANDLE_GET_LINE_VALUES_IOCTL as used by the
        line handles. Setting the value is not supported: we
        do not listen to events on output lines.
      
      This ABI is strongly influenced by Industrial I/O and surpasses
      the old sysfs ABI by providing proper precision timestamps,
      making it possible to set flags like open drain, and put
      consumer names on the GPIO lines.
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      61f922db
    • L
      gpio: userspace ABI for reading/writing GPIO lines · d7c51b47
      Linus Walleij 提交于
      This adds a userspace ABI for reading and writing GPIO lines.
      The mechanism returns an anonymous file handle to a request
      to read/write n offsets from a gpiochip. This file handle
      in turn accepts two ioctl()s: one that reads and one that
      writes values to the selected lines.
      
      - Handles can be requested as input/output, active low,
        open drain, open source, however when you issue a request
        for n lines with GPIO_GET_LINEHANDLE_IOCTL, they must all
        have the same flags, i.e. all inputs or all outputs, all
        open drain etc. If a granular control of the flags for
        each line is desired, they need to be requested
        individually, not in a batch.
      
      - The GPIOHANDLE_GET_LINE_VALUES_IOCTL read ioctl() can be
        issued also to output lines to verify that the hardware
        is in the expected state.
      
      - It reads and writes up to GPIOHANDLES_MAX lines at once,
        utilizing the .set_multiple() call in the driver if
        possible, making the call efficient if several lines
        can be written with a single register update.
      
      The limitation of GPIOHANDLES_MAX to 64 lines is done under
      the assumption that we may expect hardware that can issue a
      transaction updating 64 bits at an instant but unlikely
      anything larger than that.
      
      ChangeLog v2->v3:
      - Use gpiod_get_value_cansleep() so we support also slowpath
        GPIO drivers.
      - Fix up the UAPI docs kerneldoc.
      - Allocate the anonymous fd last, so that the release
        function don't get called until that point of something
        fails. After this point, skip the errorpath.
      ChangeLog v1->v2:
      - Handle ioctl_compat() properly based on a similar patch
        to the other ioctl() handling code.
      - Use _IOWR() as we pass pointers both in and out of the
        ioctl()
      - Use kmalloc() and kfree() for the linehandled, do not
        try to be fancy with devm_* it doesn't work the way I
        thought.
      - Fix const-correctness on the linehandle name field.
      Acked-by: NMichael Welling <mwelling@ieee.org>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      d7c51b47
  2. 10 3月, 2016 1 次提交
  3. 26 2月, 2016 1 次提交
  4. 19 2月, 2016 2 次提交
    • L
      gpio: add userspace ABI for GPIO line information · 521a2ad6
      Linus Walleij 提交于
      This adds a GPIO line ABI for getting name, label and a few select
      flags from the kernel.
      
      This hides the kernel internals and only tells userspace what it
      may need to know: the different in-kernel consumers are masked
      behind the flag "kernel" and that is all userspace needs to know.
      
      However electric characteristics like active low, open drain etc
      are reflected to userspace, as this is important information.
      
      We provide information on all lines on all chips, later on we will
      likely add a flag for the chardev consumer so we can filter and
      display only the lines userspace actually uses in e.g. lsgpio,
      but then we first need an ABI for userspace to grab and use
      (get/set/select direction) a GPIO line.
      
      Sample output from "lsgpio" on ux500:
      
      GPIO chip: gpiochip7, "8011e000.gpio", 32 GPIO lines
              line 0: unnamed unlabeled
              line 1: unnamed unlabeled
      (...)
              line 25: unnamed "SFH7741 Proximity Sensor" [kernel output open-drain]
              line 26: unnamed unlabeled
      (...)
      Tested-by: NMichael Welling <mwelling@ieee.org>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      521a2ad6
    • L
      gpio: store reflect the label to userspace · df4878e9
      Linus Walleij 提交于
      The gpio_chip label is useful for userspace to understand what
      kind of GPIO chip it is dealing with. Let's store a copy of this
      label in the gpio_device, add it to the struct passed to userspace
      for GPIO_GET_CHIPINFO_IOCTL and modify lsgpio to show it.
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      df4878e9
  5. 09 2月, 2016 1 次提交
    • L
      gpio: add a userspace chardev ABI for GPIOs · 3c702e99
      Linus Walleij 提交于
      A new chardev that is to be used for userspace GPIO access is
      added in this patch. It is intended to gradually replace the
      horribly broken sysfs ABI.
      
      Using a chardev has many upsides:
      
      - All operations are per-gpiochip, which is the actual
        device underlying the GPIOs, making us tie in to the
        kernel device model properly.
      
      - Hotpluggable GPIO controllers can come and go, as this
        kind of problem has been know to userspace for character
        devices since ages, and if a gpiochip handle is held in
        userspace we know we will break something, whereas the
        sysfs is stateless.
      
      - The one-value-per-file rule of sysfs is really hard to
        maintain when you want to twist more than one knob at a time,
        for example have in-kernel APIs to switch several GPIO
        lines at the same time, and this will be possible to do
        with a single ioctl() from userspace, saving a lot of
        context switching.
      
      We also need to add a new bus type for GPIO. This is
      necessary for example for userspace coldplug, where sysfs is
      traversed to find the boot-time device nodes and create the
      character devices in /dev.
      
      This new chardev ABI is *non* *optional* and can be counted
      on to be present in the future, emphasizing the preference
      of this ABI.
      
      The ABI only implements one single ioctl() to get the name
      and number of GPIO lines of a chip. Even this is debatable:
      see it as a minimal example for review. This ABI shall be
      ruthlessly reviewed and etched in stone.
      
      The old /sys/class/gpio is still optional to compile in,
      but will be deprecated.
      
      Unique device IDs are created using IDR, which is overkill
      and insanely scalable, but also well tested.
      
      Cc: Johan Hovold <johan@kernel.org>
      Cc: Michael Welling <mwelling@ieee.org>
      Cc: Markus Pargmann <mpa@pengutronix.de>
      Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
      Cc: Arnd Bergmann <arnd@arndb.de>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      3c702e99