1. 20 Feb, 2014 1 commit
  2. 30 Apr, 2013 1 commit
  3. 26 Apr, 2013 1 commit
    • Patrice Chotard's avatar
      pinctrl: move subsystem mutex to pinctrl_dev struct · 42fed7ba
      Patrice Chotard authored
      This mutex avoids deadlock in case of use of multiple pin
      controllers. Before this modification, by using a global
      mutex, deadlock appeared when, for example, a call to
      pinctrl_pins_show() locked the pinctrl_mutex, called the
      ops->pin_dbg_show of a particular pin controller. If this
      pin controller needs I2C access to retrieve configuration
      information and I2C driver is using pinctrl to drive its
      pins, a call to pinctrl_select_state() try to lock again
      pinctrl_mutex which leads to a deadlock.
      Notice that the mutex grab from the two direction functions
      was moved into pinctrl_gpio_direction().
      For several cases, we can't replace pinctrl_mutex by
      pctldev->mutex, because at this stage, pctldev is
      not accessible :
      	- pinctrl_get()/pinctrl_put()
      	- pinctrl_register_maps()
      So add respectively pinctrl_list_mutex and
      pinctrl_maps_mutex in order to protect
      pinctrl_list and pinctrl_maps list instead.
      Reintroduce pinctrldev_list_mutex in
      pinctrl_request_gpio(), pinctrl_free_gpio(),
      pinctrl_gpio_direction(), pinctrl_devices_show(),
      pinctrl_register() and pinctrl_unregister() to
      protect pinctrldev_list.
      Changes v2->v3:
      - Fix a missing EXPORT_SYMBOL_GPL() for pinctrl_select_state().
      Changes v1->v2:
      - pinctrl_select_state_locked() is removed, all lock mechanism
        is located inside pinctrl_select_state(). When parsing
        the state->setting list, take the per-pin-controller driver
        lock. (Patrice).
      - Introduce pinctrldev_list_mutex to protect pinctrldev_list
        in all functions which parse or modify pictrldev_list.
      - move find_pinctrl_by_of_node() from pinctrl/devicetree.c to
        pinctrl/core.c in order to protect pinctrldev_list.
      - Sink mutex:es into some functions and remove some _locked
        variants down to where the lists are actually accessed to
        make things simpler. (Linus)
      - Drop *all* mutexes completely from pinctrl_lookup_state()
        and pinctrl_select_state() - no relevant mutex was taken
        and it was unclear what this was protecting against. (Linus)
      Reported by : Seraphin Bonnaffe <seraphin.bonnaffe@stericsson.com>
      Signed-off-by: default avatarPatrice Chotard <patrice.chotard@st.com>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
  4. 03 Apr, 2013 6 commits
  5. 27 Mar, 2013 3 commits
  6. 07 Mar, 2013 2 commits
  7. 10 Feb, 2013 1 commit
    • Laurent Meunier's avatar
      pinctrl/pinconfig: add debug interface · 6f9e41f4
      Laurent Meunier authored
      This update adds a debugfs interface to modify a pin configuration
      for a given state in the pinctrl map. This allows to modify the
      configuration for a non-active state, typically sleep state.
      This configuration is not applied right away, but only when the state
      will be entered.
      This solution is mandated for us by HW validation: in order
      to test and verify several pin configurations during sleep without
      recompiling the software.
      Signed-off-by: default avatarLaurent Meunier <laurent.meunier@st.com>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
  8. 30 Jan, 2013 1 commit
  9. 23 Jan, 2013 1 commit
    • Linus Walleij's avatar
      drivers/pinctrl: grab default handles from device core · ab78029e
      Linus Walleij authored
      This makes the device core auto-grab the pinctrl handle and set
      the "default" (PINCTRL_STATE_DEFAULT) state for every device
      that is present in the device model right before probe. This will
      account for the lion's share of embedded silicon devcies.
      A modification of the semantics for pinctrl_get() is also done:
      previously if the pinctrl handle for a certain device was already
      taken, the pinctrl core would return an error. Now, since the
      core may have already default-grabbed the handle and set its
      state to "default", if the handle was already taken, this will
      be disregarded and the located, previously instanitated handle
      will be returned to the caller.
      This way all code in drivers explicitly requesting their pinctrl
      handlers will still be functional, and drivers that want to
      explicitly retrieve and switch their handles can still do that.
      But if the desired functionality is just boilerplate of this
      type in the probe() function:
      struct pinctrl  *p;
      p = devm_pinctrl_get_select_default(&dev);
      if (IS_ERR(p)) {
         if (PTR_ERR(p) == -EPROBE_DEFER)
              return -EPROBE_DEFER;
              dev_warn(&dev, "no pinctrl handle\n");
      The discussion began with the addition of such boilerplate
      to the omap4 keypad driver:
      A previous approach using notifiers was discussed:
      This failed because it could not handle deferred probes.
      This patch alone does not solve the entire dilemma faced:
      whether code should be distributed into the drivers or
      if it should be centralized to e.g. a PM domain. But it
      solves the immediate issue of the addition of boilerplate
      to a lot of drivers that just want to grab the default
      state. As mentioned, they can later explicitly retrieve
      the handle and set different states, and this could as
      well be done by e.g. PM domains as it is only related
      to a certain struct device * pointer.
      ChangeLog v4->v5 (Stephen):
      - Simplified the devicecore grab code.
      - Deleted a piece of documentation recommending that pins
        be mapped to a device rather than hogged.
      ChangeLog v3->v4 (Linus):
      - Drop overzealous NULL checks.
      - Move kref initialization to pinctrl_create().
      - Seeking Tested-by from Stephen Warren so we do not disturb
        the Tegra platform.
      - Seeking ACK on this from Greg (and others who like it) so I
        can merge it through the pinctrl subsystem.
      ChangeLog v2->v3 (Linus):
      - Abstain from using IS_ERR_OR_NULL() in the driver core,
        Russell recently sent a patch to remove it. Handle the
        NULL case explicitly even though it's a bogus case.
      - Make sure we handle probe deferral correctly in the device
        core file. devm_kfree() the container on error so we don't
        waste memory for devices without pinctrl handles.
      - Introduce reference counting into the pinctrl core using
        <linux/kref.h> so that we don't release pinctrl handles
        that have been obtained for two or more places.
      ChangeLog v1->v2 (Linus):
      - Only store a pointer in the device struct, and only allocate
        this if it's really used by the device.
      Cc: Felipe Balbi <balbi@ti.com>
      Cc: Benoit Cousson <b-cousson@ti.com>
      Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com>
      Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
      Cc: Mitch Bradley <wmb@firmworks.com>
      Cc: Ulf Hansson <ulf.hansson@linaro.org>
      Cc: Rafael J. Wysocki <rjw@sisk.pl>
      Cc: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
      Cc: Rickard Andersson <rickard.andersson@stericsson.com>
      Cc: Russell King <linux@arm.linux.org.uk>
      Reviewed-by: default avatarMark Brown <broonie@opensource.wolfsonmicro.com>
      Acked-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
      [swarren: fixed and simplified error-handling in pinctrl_bind_pins(), to
      correctly handle deferred probe. Removed admonition from docs not to use
      pinctrl hogs for devices]
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
  10. 21 Jan, 2013 1 commit
  11. 11 Jan, 2013 2 commits
  12. 26 Dec, 2012 1 commit
  13. 21 Nov, 2012 3 commits
  14. 11 Nov, 2012 3 commits
    • Shiraz Hashim's avatar
      gpiolib: provide provision to register pin ranges · f23f1516
      Shiraz Hashim authored
      pinctrl subsystem needs gpio chip base to prepare set of gpio
      pin ranges, which a given pinctrl driver can handle. This is
      important to handle pinctrl gpio request calls in order to
      program a given pin properly for gpio operation.
      As gpio base is allocated dynamically during gpiochip
      registration, presently there exists no clean way to pass this
      information to the pinctrl subsystem.
      After few discussions from [1], it was concluded that may be
      gpio controller reporting the pin range it supports, is a
      better way than pinctrl subsystem directly registering it.
      [1] http://comments.gmane.org/gmane.linux.ports.arm.kernel/184816
      Cc: Grant Likely <grant.likely@secretlab.ca>
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: default avatarShiraz Hashim <shiraz.hashim@st.com>
      [Edited documentation a bit]
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    • Viresh Kumar's avatar
      Revert "pinctrl: remove pinctrl_remove_gpio_range" · 7e10ee68
      Viresh Kumar authored
      This reverts earlier commit which removed
      pinctrl_remove_gpio_range(), because at that time there
      weren't any more users of that routine. It was removed as the
      removal of ranges was done in unregister of pinctrl.
      But as we are now registering stuff from gpiolib, we may
      remove and insert a gpio module multiple times. So, we
      need this routine again.
      Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    • Linus Walleij's avatar
      pinctrl: reserve pins when states are activated · 1a78958d
      Linus Walleij authored
      This switches the way that pins are reserved for multiplexing:
      We used to do this when the map was parsed, at the creation of
      the settings inside the pinctrl handle, in pinmux_map_to_setting().
      However this does not work for us, because we want to use the
      same set of pins with different devices at different times: the
      current code assumes that the pin groups in a pinmux state will
      only be used with one single device, albeit different groups can
      be active at different times. For example if a single I2C driver
      block is used to drive two different busses located on two
      pin groups A and B, then the pins for all possible states of a
      function are reserved when fetching the pinctrl handle: the
      I2C bus can choose either set A or set B by a mux state at
      runtime, but all pins in both group A and B (the superset) are
      effectively reserved for that I2C function and mapped to the
      device. Another device can never get in and use the pins in
      group A, even if the device/function is using group B at the
      Instead: let use reserve the pins when the state is activated
      and drop them when the state is disabled, i.e. when we move to
      another state. This way different devices/functions can use the
      same pins at different times.
      We know that this is an odd way of doing things, but we really
      need to switch e.g. an SD-card slot to become a tracing output
      sink at runtime: we plug in a special "tracing card" then mux
      the pins that used to be an SD slot around to the tracing
      unit and push out tracing data there instead of SD-card
      As a side effect pinmux_free_setting() is unused but the stubs
      are kept for future additions of code.
      Cc: Patrice Chotard <patrice.chotard@st.com>
      Cc: Loic Pallardy <loic.pallardy@st.com>
      Acked-by: default avatarStephen Warren <swarren@nvidia.com>
      Tested-by: default avatarJean Nicolas Graux <jean-nicolas.graux@stericsson.com>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
  15. 23 Oct, 2012 1 commit
  16. 27 Sep, 2012 1 commit
  17. 17 Aug, 2012 1 commit
  18. 03 Jul, 2012 3 commits
  19. 04 Jun, 2012 1 commit
  20. 01 May, 2012 1 commit
  21. 26 Apr, 2012 3 commits
    • Dong Aisheng's avatar
      pinctrl: add pinctrl_provide_dummies interface for platforms to use · 5b3aa5f7
      Dong Aisheng authored
      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
      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: default avatarStephen Warren <swarren@wwwdotorg.org>
      Signed-off-by: default avatarDong Aisheng <dong.aisheng@linaro.org>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    • John Crispin's avatar
      pinctrl: enhance reporting of errors when loading from DT · ad6e1107
      John Crispin authored
      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
      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: default avatarJohn Crispin <blogic@openwrt.org>
      Acked-by: default avatarStephen Warren <swarren@wwwdotorg.org>
      Cc: linux-kernel@vger.kernel.org
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
    • Stephen Warren's avatar
      pinctrl: propagate map validation errors · fde04f41
      Stephen Warren authored
      pinctrl_register_map() was returning early if pinmux_validate_map() or
      pinconf_validate_map() failed, but was not actually returning the error
      Signed-off-by: default avatarStephen Warren <swarren@nvidia.com>
      Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
  22. 18 Apr, 2012 2 commits