linux/drivers/pinctrl
Patrice Chotard 42fed7ba44 pinctrl: move subsystem mutex to pinctrl_dev struct
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
find_pinctrl_by_of_node(),
pinctrl_find_and_add_gpio_range()
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.
  (Patrice).
- move find_pinctrl_by_of_node() from pinctrl/devicetree.c to
  pinctrl/core.c in order to protect pinctrldev_list.
  (Patrice).
- 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: Patrice Chotard <patrice.chotard@st.com>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2013-04-26 17:01:35 +02:00
..
mvebu
sh-pfc
spear
core.c pinctrl: move subsystem mutex to pinctrl_dev struct 2013-04-26 17:01:35 +02:00
core.h pinctrl: move subsystem mutex to pinctrl_dev struct 2013-04-26 17:01:35 +02:00
devicetree.c pinctrl: move subsystem mutex to pinctrl_dev struct 2013-04-26 17:01:35 +02:00
devicetree.h
Kconfig pinctrl: Add pinctrl-s3c64xx driver 2013-04-09 09:45:10 +02:00
Makefile pinctrl: Add pinctrl-s3c64xx driver 2013-04-09 09:45:10 +02:00
pinconf-generic.c
pinconf.c pinctrl: move subsystem mutex to pinctrl_dev struct 2013-04-26 17:01:35 +02:00
pinconf.h
pinctrl-ab8500.c pinctrl: ab8500: Staticize some symbols 2013-04-09 09:54:00 +02:00
pinctrl-ab8505.c pinctrl: ab8505: Staticize some symbols 2013-04-09 09:59:42 +02:00
pinctrl-ab8540.c pinctrl: ab8540: Staticize some symbols 2013-04-09 09:58:02 +02:00
pinctrl-ab9540.c pinctrl: ab9540: Staticize some symbols 2013-04-09 09:55:59 +02:00
pinctrl-abx500.c pinctrl: abx500: fix issue when no pdata 2013-04-18 10:28:04 +02:00
pinctrl-abx500.h
pinctrl-at91.c
pinctrl-bcm2835.c
pinctrl-coh901.c
pinctrl-coh901.h
pinctrl-exynos.c pinctrl: samsung: Remove hardcoded register offsets 2013-04-09 09:42:25 +02:00
pinctrl-exynos.h pinctrl: samsung: Split pin bank description into two structures 2013-04-09 09:41:09 +02:00
pinctrl-exynos5440.c pinctrl: exynos5440: add gpio interrupt support 2013-04-09 10:16:53 +02:00
pinctrl-falcon.c
pinctrl-imx.c
pinctrl-imx.h
pinctrl-imx6q.c
pinctrl-imx23.c
pinctrl-imx28.c
pinctrl-imx35.c
pinctrl-imx51.c
pinctrl-imx53.c
pinctrl-lantiq.c
pinctrl-lantiq.h
pinctrl-mxs.c
pinctrl-mxs.h
pinctrl-nomadik-db8500.c
pinctrl-nomadik-db8540.c
pinctrl-nomadik-stn8815.c
pinctrl-nomadik.c
pinctrl-nomadik.h
pinctrl-s3c64xx.c pinctrl: s3c64xx: Fix build error caused by undefined chained_irq_enter 2013-04-23 13:59:45 +02:00
pinctrl-samsung.c pinctrl: Add pinctrl-s3c64xx driver 2013-04-09 09:45:10 +02:00
pinctrl-samsung.h pinctrl: Add pinctrl-s3c64xx driver 2013-04-09 09:45:10 +02:00
pinctrl-single.c
pinctrl-sirf.c
pinctrl-sunxi.c pinctrl: sunxi: Rename wemac functions to emac 2013-04-09 10:47:52 +02:00
pinctrl-sunxi.h
pinctrl-tegra.c
pinctrl-tegra.h
pinctrl-tegra20.c
pinctrl-tegra30.c
pinctrl-tegra114.c
pinctrl-u300.c
pinctrl-xway.c
pinmux.c pinctrl: move subsystem mutex to pinctrl_dev struct 2013-04-26 17:01:35 +02:00
pinmux.h