03 Jan, 2012

1 commit

  • This add per-pin and per-group pin config interfaces for biasing,
    driving and other such electronic properties. The details of passed
    configurations are passed in an opaque unsigned long which may be
    dereferences to integer types, structs or lists on either side
    of the configuration interface.

    ChangeLog v1->v2:
    - Clear split of terminology: we now have pin controllers, and
    those may support two interfaces using vtables: pin
    multiplexing and pin configuration.
    - Break out pin configuration to its own C file, controllers may
    implement only config without mux, and vice versa, so keep each
    sub-functionality of pin controllers separate. Introduce
    CONFIG_PINCONF in Kconfig.
    - Implement some core logic around pin configuration in the
    pinconf.c file.
    - Remove UNKNOWN config states, these were just surplus baggage.
    - Remove FLOAT config state - HIGH_IMPEDANCE should be enough for
    everyone.
    - PIN_CONFIG_POWER_SOURCE added to handle switching the power
    supply for the pin logic between different sources
    - Explicit DISABLE config enums to turn schmitt-trigger,
    wakeup etc OFF.
    - Update documentation to reflect all the recent reasoning.
    ChangeLog v2->v3:
    - Twist API around to pass around arrays of config tuples instead
    of (param, value) pairs everywhere.
    - Explicit drive strength semantics for push/pull and similar
    drive modes, this shall be the number of drive stages vs
    nominal load impedance, which should match the actual
    electronics used in push/pull CMOS or TTY totempoles.
    - Drop load capacitance configuration - I probably don't know
    what I'm doing here so leave it out.
    - Drop PIN_CONFIG_INPUT_SCHMITT_OFF, instead the argument zero to
    PIN_CONFIG_INPUT_SCHMITT turns schmitt trigger off.
    - Drop PIN_CONFIG_NORMAL_POWER_MODE and have a well defined
    argument to PIN_CONFIG_LOW_POWER_MODE to get out of it instead.
    - Drop PIN_CONFIG_WAKEUP_ENABLE/DISABLE and just use
    PIN_CONFIG_WAKEUP with defined value zero to turn wakeup off.
    - Add PIN_CONFIG_INPUT_DEBOUNCE for configuring debounce time
    on input lines.
    - Fix a bug when we tried to configure pins for pin controllers
    without pinconf support.
    - Initialized debugfs properly so it works.
    - Initialize the mutex properly and lock around config tampering
    sections.
    - Check the return value from get_initial_config() properly.
    ChangeLog v3->v4:
    - Export the pin_config_get(), pin_config_set() and
    pin_config_group() functions.
    - Drop the entire concept of just getting initial config and
    keeping track of pin states internally, instead ask the pins
    what state they are in. Previous idea was plain wrong, if the
    device cannot keep track of its state, the driver should do
    it.
    - Drop the generic configuration layout, it seems this impose
    too much restriction on some pin controllers, so let them do
    things the way they want and split off support for generic
    config as an optional add-on.
    ChangeLog v4->v5:
    - Introduce two symmetric driver calls for group configuration,
    .pin_config_group_[get|set] and corresponding external calls.
    - Remove generic semantic meanings of return values from config
    calls, these belong in the generic config patch. Just pass the
    return value through instead.
    - Add a debugfs entry "pinconf-groups" to read status from group
    configuration only, also slam in a per-group debug callback in
    the pinconf_ops so custom drivers can display something
    meaningful for their pins.
    - Fix some dangling newline.
    - Drop dangling #else clause.
    - Update documentation to match the above.
    ChangeLog v5->v6:
    - Change to using a pin name as parameter for the
    [get|set]_config() functions, as suggested by Stephen Warren.
    This is more natural as names will be what a developer has
    access to in written documentation etc.
    ChangeLog v6->v7:
    - Refactor out by-pin and by-name get/set functions, only expose
    the by-name functions externally, expose the by-pin functions
    internally.
    - Show supported pin control functionality in the debugfs
    pinctrl-devices file.

    Acked-by: Stephen Warren
    Signed-off-by: Linus Walleij

    Linus Walleij