42fed7ba44
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> |
||
---|---|---|
.. | ||
mvebu | ||
sh-pfc | ||
spear | ||
core.c | ||
core.h | ||
devicetree.c | ||
devicetree.h | ||
Kconfig | ||
Makefile | ||
pinconf-generic.c | ||
pinconf.c | ||
pinconf.h | ||
pinctrl-ab8500.c | ||
pinctrl-ab8505.c | ||
pinctrl-ab8540.c | ||
pinctrl-ab9540.c | ||
pinctrl-abx500.c | ||
pinctrl-abx500.h | ||
pinctrl-at91.c | ||
pinctrl-bcm2835.c | ||
pinctrl-coh901.c | ||
pinctrl-coh901.h | ||
pinctrl-exynos5440.c | ||
pinctrl-exynos.c | ||
pinctrl-exynos.h | ||
pinctrl-falcon.c | ||
pinctrl-imx6q.c | ||
pinctrl-imx23.c | ||
pinctrl-imx28.c | ||
pinctrl-imx35.c | ||
pinctrl-imx51.c | ||
pinctrl-imx53.c | ||
pinctrl-imx.c | ||
pinctrl-imx.h | ||
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-samsung.c | ||
pinctrl-samsung.h | ||
pinctrl-single.c | ||
pinctrl-sirf.c | ||
pinctrl-sunxi.c | ||
pinctrl-sunxi.h | ||
pinctrl-tegra20.c | ||
pinctrl-tegra30.c | ||
pinctrl-tegra114.c | ||
pinctrl-tegra.c | ||
pinctrl-tegra.h | ||
pinctrl-u300.c | ||
pinctrl-xway.c | ||
pinmux.c | ||
pinmux.h |