1. 27 4月, 2012 2 次提交
    • D
      pinctrl: add pinctrl_provide_dummies interface for platforms to use · 5b3aa5f7
      Dong Aisheng 提交于
      Add a interface pinctrl_provide_dummies for platform to indicate
      whether it needs use pinctrl dummy state.
      
      ChangeLog v3->v4:
      * remove dummy gpio support in pinctrl subsystem.
        Let gpio driver decide whether it wants to use pinctrl gpio mux
        function.
      ChangeLog v2->v3:
      * Also changed the missed pinctrl gpio APIs in v1.
      ChangeLog v1->v2:
      * Based on sascha's suggestion, drop using kconfig since it will hide
        pinctrl errors on all other boards.
        See: https://lkml.org/lkml/2012/4/18/282
        It seemed both Linus and Stephen agreed with this way, so i'm ok
        with it too.
      * Add dummy gpio support.
        pinctrl gpio in the same situation as state.
      * Patch name changed.
        Original is pinctrl: handle dummy state in core.
      * Split removing old dt dummy interface into a separate patch
      
      Cc: Linus Walleij <linus.walleij@linaro.org>
      Cc: Sascha Hauer <s.hauer@pengutronix.de>
      Acked-by: NStephen Warren <swarren@wwwdotorg.org>
      Signed-off-by: NDong Aisheng <dong.aisheng@linaro.org>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      5b3aa5f7
    • J
      pinctrl: enhance reporting of errors when loading from DT · ad6e1107
      John Crispin 提交于
      There are a few places in the api where the code simply returns -EINVAL when
      it finds an error. An example is pinmux_map_to_setting() which now reports an
      error if we try to match a group with a function that it does not support.
      
      The reporting of errors in pinconf_check_ops and pinmux_check_ops now has the
      same style and is located inside the according functions and not the calling
      code.
      
      When the map is found in the DT but the default state can not be selected we
      get an error to know that the code at least tried.
      
      The patch also removes a stray word from one comment and a "->" from another
      for the sake of consistency.
      
      Finally we replace a few pr_err/debug() calls with dev_err/dbg().
      
      Thanks go to Stephen Warren for reviewing the patch and enhancing the reporting
      inside pinmux_map_to_setting().
      Signed-off-by: NJohn Crispin <blogic@openwrt.org>
      Acked-by: NStephen Warren <swarren@wwwdotorg.org>
      Cc: linux-kernel@vger.kernel.org
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      ad6e1107
  2. 26 4月, 2012 1 次提交
  3. 18 4月, 2012 6 次提交
  4. 05 3月, 2012 4 次提交
    • S
      pinctrl: enhance mapping table to support pin config operations · 1e2082b5
      Stephen Warren 提交于
      The pinctrl mapping table can now contain entries to:
      * Set the mux function of a pin group
      * Apply a set of pin config options to a pin or a group
      
      This allows pinctrl_select_state() to apply pin configs settings as well
      as mux settings.
      
      v3: Fix find_pinctrl() to iterate over the correct list.
         s/_MUX_CONFIGS_/_CONFIGS_/ in mapping table macros.
         Fix documentation to use correct mapping table macro.
      v2: Added numerous extra PIN_MAP_*() special-case macros.
         Fixed kerneldoc typo. Delete pinctrl_get_pin_id() and
         replace it with pin_get_from_name(). Various minor fixes.
         Updates due to rebase.
      Signed-off-by: NStephen Warren <swarren@nvidia.com>
      Acked-by: NDong Aisheng <dong.aisheng@linaro.org>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      1e2082b5
    • S
      pinctrl: API changes to support multiple states per device · 6e5e959d
      Stephen Warren 提交于
      The API model is changed from:
      
      p = pinctrl_get(dev, "state1");
      pinctrl_enable(p);
      ...
      pinctrl_disable(p);
      pinctrl_put(p);
      p = pinctrl_get(dev, "state2");
      pinctrl_enable(p);
      ...
      pinctrl_disable(p);
      pinctrl_put(p);
      
      to this:
      
      p = pinctrl_get(dev);
      s1 = pinctrl_lookup_state(p, "state1");
      s2 = pinctrl_lookup_state(p, "state2");
      pinctrl_select_state(p, s1);
      ...
      pinctrl_select_state(p, s2);
      ...
      pinctrl_put(p);
      
      This allows devices to directly transition between states without
      disabling the pin controller programming and put()/get()ing the
      configuration data each time. This model will also better suit pinconf
      programming, which doesn't have a concept of "disable".
      
      The special-case hogging feature of pin controllers is re-written to use
      the regular APIs instead of special-case code. Hence, the pinmux-hogs
      debugfs file is removed; see the top-level pinctrl-handles files for
      equivalent data.
      Signed-off-by: NStephen Warren <swarren@nvidia.com>
      Acked-by: NDong Aisheng <dong.aisheng@linaro.org>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      6e5e959d
    • S
      pinctrl: refactor struct pinctrl handling in core.c vs pinmux.c · 7ecdb16f
      Stephen Warren 提交于
      This change separates two aspects of struct pinctrl:
      
      a) The data representation of the parsed mapping table, into:
      
         1) The top-level struct pinctrl object, a single entity returned
            by pinctrl_get().
      
         2) The parsed version of each mapping table entry, struct
            pinctrl_setting, of which there is one per mapping table entry.
      
      b) The code that handles this; the code for (1) above is in core.c, and
         the code to parse/execute each entry in (2) above is in pinmux.c, while
         the iteration over multiple settings is lifted to core.c.
      
      This will allow the following future changes:
      
      1) pinctrl_get() API rework, so that struct pinctrl represents all states
         for the device, and the device can select between them without calling
         put()/get() again.
      
      2) To support that, a struct pinctrl_state object will be inserted into
         the data model between the struct pinctrl and struct pinctrl_setting.
      
      3) The mapping table will be extended to allow specification of pin config
         settings too. To support this, struct pinctrl_setting will be enhanced
         to store either mux settings or config settings, and functions will be
         added to pinconf.c to parse/execute pin configuration settings.
      Signed-off-by: NStephen Warren <swarren@nvidia.com>
      Acked-by: NLinus Walleij <linus.walleij@linaro.org>
      Acked-by: NDong Aisheng <dong.aisheng@linaro.org>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      7ecdb16f
    • S
      pinctrl: fix and simplify locking · 57b676f9
      Stephen Warren 提交于
      There are many problems with the current pinctrl locking:
      
      struct pinctrl_dev's gpio_ranges_lock isn't effective;
      pinctrl_match_gpio_range() only holds this lock while searching for a gpio
      range, but the found range is return and manipulated after releading the
      lock. This could allow pinctrl_remove_gpio_range() for that range while it
      is in use, and the caller may very well delete the range after removing it,
      causing pinctrl code to touch the now-free range object.
      
      Solving this requires the introduction of a higher-level lock, at least
      a lock per pin controller, which both gpio range registration and
      pinctrl_get()/put() will acquire.
      
      There is missing locking on HW programming; pin controllers may pack the
      configuration for different pins/groups/config options/... into one
      register, and hence have to read-modify-write the register. This needs to
      be protected, but currently isn't. Related, a future change will add a
      "complete" op to the pin controller drivers, the idea being that each
      state's programming will be programmed into the pinctrl driver followed
      by the "complete" call, which may e.g. flush a register cache to HW. For
      this to work, it must not be possible to interleave the pinctrl driver
      calls for different devices.
      
      As above, solving this requires the introduction of a higher-level lock,
      at least a lock per pin controller, which will be held for the duration
      of any pinctrl_enable()/disable() call.
      
      However, each pinctrl mapping table entry may affect a different pin
      controller if necessary. Hence, with a per-pin-controller lock, almost
      any pinctrl API may need to acquire multiple locks, one per controller.
      To avoid deadlock, these would need to be acquired in the same order in
      all cases. This is extremely difficult to implement in the case of
      pinctrl_get(), which doesn't know which pin controllers to lock until it
      has parsed the entire mapping table, since it contains somewhat arbitrary
      data.
      
      The simplest solution here is to introduce a single lock that covers all
      pin controllers at once. This will be acquired by all pinctrl APIs.
      
      This then makes struct pinctrl's mutex irrelevant, since that single lock
      will always be held whenever this mutex is currently held.
      Signed-off-by: NStephen Warren <swarren@nvidia.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      57b676f9
  5. 02 3月, 2012 2 次提交
  6. 01 3月, 2012 1 次提交
  7. 24 2月, 2012 4 次提交
  8. 23 2月, 2012 8 次提交
  9. 11 2月, 2012 3 次提交
  10. 02 2月, 2012 2 次提交
  11. 26 1月, 2012 1 次提交
    • T
      pinctrl: add checks for empty function names · b9130b77
      Tony Lindgren 提交于
      This is needed as otherwise we can get the following when
      dealing with buggy data in a pinmux driver for
      pinmux_search_function:
      
      Unable to handle kernel NULL pointer dereference at virtual
      address 00000000
      ...
      PC is at strcmp+0xc/0x34
      LR is at pinmux_get+0x350/0x8f4
      ...
      
      As we need pctldev initialized to call ops->list_functions,
      let's initialize it before check_ops calls and pass the
      pctldev to the check_ops functions. Do this for both pinmux
      and pinconf check_ops functions.
      Signed-off-by: NTony Lindgren <tony@atomide.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      b9130b77
  12. 25 1月, 2012 1 次提交
  13. 03 1月, 2012 5 次提交
    • C
      pinctrl: remove unnecessary max pin number · 0d2006bb
      Chanho Park 提交于
      This patch removes maxpin member in the pin control descriptor
      because we don't need this value as we enumerate a pin space
      using offset.
      Signed-off-by: NChanho Park <chanho61.park@samsung.com>
      Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      0d2006bb
    • C
      pinctrl: correct a offset while enumerating pins · 706e8520
      Chanho Park 提交于
      This patch modifies a offset while enumerating pins to support a
      partial pin space. If we use a pin number for enumerating pins,
      the pin space always starts with zero base. Indeed, we always check
      the pin is in the pin space. An extreme example, there is only two pins.
      One is 0. Another is 1000. We always enumerate whole offsets until 1000.
      For solving this problem, we use the offset of the pin array instead
      of the zero-based pin number.
      Signed-off-by: NChanho Park <chanho61.park@samsung.com>
      Signed-off-by: NKyungmin Park <kyungmin.park@samsung.com>
      [Restored sparse pin space comment]
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      706e8520
    • L
      pinctrl: conjure names for unnamed pins · ca53c5f1
      Linus Walleij 提交于
      If pins with blank names are registered, we assign them names on-the-fly
      on the form "PINn" where n is the pin number for that pin on the specific
      controller.
      Acked-by: NStephen Warren <swarren@nvidia.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      ca53c5f1
    • S
      pinctrl: don't create a device for each pin controller · 51cd24ee
      Stephen Warren 提交于
      Pin controllers should already be instantiated as a device, so there's
      no need for the pinctrl core to create a new struct device for each
      controller.
      
      This allows the controller's real name to be used in the mux mapping
      table, rather than e.g. "pinctrl.0", "pinctrl.1", etc.
      
      This necessitates removal of the PINMUX_MAP_PRIMARY*() macros, since
      their sole purpose was to hard-code the .ctrl_dev_name field to be
      "pinctrl.0".
      Signed-off-by: NStephen Warren <swarren@nvidia.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      51cd24ee
    • L
      pinctrl: add a pin config interface · ae6b4d85
      Linus Walleij 提交于
      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: NStephen Warren <swarren@nvidia.com>
      Signed-off-by: NLinus Walleij <linus.walleij@linaro.org>
      ae6b4d85