linux/drivers/pinctrl
Andrew Jeffery 5366f1460c pinctrl: aspeed: "Not enabled" is a significant mux state
Consider a scenario with one pin P that has two signals A and B, where A
is defined to be higher priority than B: That is, if the mux IP is in a
state that would consider both A and B to be active on P, then A will be
the active signal.

To instead configure B as the active signal we must configure the mux so
that A is inactive. The mux state for signals can be described by
logical operations on one or more bits from one or more registers (a
"signal expression"), which in some cases leads to aliased mux states for
a particular signal. Further, signals described by multi-bit bitfields
often do not only need to record the states that would make them active
(the "enable" expressions), but also the states that makes them inactive
(the "disable" expressions). All of this combined leads to four possible
states for a signal:

         1. A signal is active with respect to an "enable" expression
         2. A signal is not active with respect to an "enable" expression
         3. A signal is inactive with respect to a "disable" expression
         4. A signal is not inactive with respect to a "disable" expression

In the case of P, if we are looking to activate B without explicitly
having configured A it's enough to consider A inactive if all of A's
"enable" signal expressions evaluate to "not active". If any evaluate to
"active" then the corresponding "disable" states must be applied so it
becomes inactive.

For example, on the AST2400 the pins composing GPIO bank H provide
signals ROMD8 through ROMD15 (high priority) and those for UART6 (low
priority). The mux states for ROMD8 through ROMD15 are aliased, i.e.
there are two mux states that result in the respective signals being
configured:

         A. SCU90[6]=1
         B. Strap[4,1:0]=100

Further, the second mux state is a 3-bit bitfield that explicitly
defines the enabled state but the disabled state is implicit, i.e. if
Strap[4,1:0] is not exactly "100" then ROMD8 through ROMD15 are not
considered active. This requires the mux function evaluation logic to
use approach 2. above, however the existing code was using approach 3.
The problem was brought to light on the Palmetto machines where the
strap register value is 0x120ce416, and prevented GPIO requests in bank
H from succeeding despite the hardware being in a position to allow
them.

Fixes: 318398c09a8d ("pinctrl: Add core pinctrl support for Aspeed SoCs")
Signed-off-by: Andrew Jeffery <andrew@aj.id.au>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
2016-10-18 14:36:10 +02:00
..
aspeed pinctrl: aspeed: "Not enabled" is a significant mux state 2016-10-18 14:36:10 +02:00
bcm pinctrl: bcm281xx: constify pinctrl_ops and pinmux_ops structures 2016-09-07 22:41:30 +02:00
berlin pinctrl: berlin: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 00:02:13 +02:00
freescale pinctrl: imx: accept gpio request/free from pinctrl 2016-09-12 14:25:52 +02:00
intel Merge branch 'fixes' into devel 2016-09-23 17:41:40 +02:00
mediatek pinctrl: mediatek: constify gpio_chip structures 2016-09-13 10:39:33 +02:00
meson Linux 4.8-rc6 2016-09-23 14:57:16 +02:00
mvebu pinctrl: mvebu: orion5x: Generalise mv88f5181l support for 88f5181 2016-09-21 11:49:18 +02:00
nomadik pinctrl: nomadik: don't default-flag IRQs as falling 2016-09-19 11:01:33 +02:00
pxa pinctrl: pxa: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 00:03:04 +02:00
qcom pinctrl: qcom: fix masking of pinmux functions 2016-10-04 00:36:20 +02:00
samsung Merge branch 'fixes' into devel 2016-09-23 17:41:40 +02:00
sh-pfc pinctrl: sh-pfc: r8a7794: Implement voltage switching for SDHI 2016-09-14 09:26:54 +02:00
sirf pinctrl: sirf: make core support explicitly non-modular 2016-08-27 13:16:12 +02:00
spear pinctrl: spear: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 00:03:18 +02:00
stm32 pinctrl: stm32: add IRQ_DOMAIN_HIERARCHY dependency 2016-09-15 14:13:10 +02:00
sunxi This is the bulk of GPIO changes for the v4.9 series: 2016-10-05 11:49:09 -07:00
tegra This is the bulk of pin control changes for the v4.8 kernel cycle. 2016-07-28 17:06:51 -07:00
uniphier pinctrl: uniphier: add Ethernet pin-mux settings 2016-07-11 09:53:25 +02:00
vt8500 pinctrl: vt8500: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 09:23:20 +02:00
core.c pinctrl: copy per-pin driver private data to struct pin_desc 2016-05-31 10:27:19 +02:00
core.h pinctrl: copy per-pin driver private data to struct pin_desc 2016-05-31 10:27:19 +02:00
devicetree.c pinctrl: OF: Don't create a pinctrl handle if no pinctrl entries exist 2016-06-18 10:40:15 +02:00
devicetree.h
Kconfig pinctrl: Add core support for Aspeed SoCs 2016-09-07 16:48:22 +02:00
Makefile pinctrl: Add core support for Aspeed SoCs 2016-09-07 16:48:22 +02:00
pinconf-generic.c Merge branch 'devel-dt-free-map' into devel 2016-06-23 11:19:14 +02:00
pinconf.c pinctrl: pinconf: separate config parameters with commas for debugfs 2016-05-31 10:29:06 +02:00
pinconf.h pinctrl: pinconf-generic: Allow driver to specify DT params 2015-01-11 22:32:19 +01:00
pinctrl-adi2-bf54x.c
pinctrl-adi2-bf60x.c added tabs instead of spaces 2015-07-16 09:39:01 +02:00
pinctrl-adi2.c pinctrl: adi2: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 09:23:20 +02:00
pinctrl-adi2.h
pinctrl-amd.c Linux 4.8-rc6 2016-09-23 14:57:16 +02:00
pinctrl-amd.h Fix inconsistent spinlock of AMD GPIO driver which can be 2015-04-07 11:36:49 +02:00
pinctrl-as3722.c pinctrl: as3722: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 09:23:21 +02:00
pinctrl-at91-pio4.c pinctrl: at91-pio4: make it explicitly non-modular 2016-06-13 08:40:14 +02:00
pinctrl-at91.c pinctrl/at91: Don't provide a default trigger type 2016-09-12 14:17:02 +02:00
pinctrl-at91.h
pinctrl-coh901.c pinctrl: coh901: fix initconst annotation 2016-02-15 20:40:52 +01:00
pinctrl-coh901.h
pinctrl-digicolor.c Revert "pinctrl: digicolor: add missing platform_set_drvdata() call" 2016-06-23 09:50:05 +02:00
pinctrl-falcon.c staging: drivers: pinctrl: Fixed checkpatch.pl warnings 2015-01-21 11:02:26 +01:00
pinctrl-lantiq.c pinctrl: lantiq: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 09:23:23 +02:00
pinctrl-lantiq.h pinctrl/lantiq: introduce new dedicated devicetree bindings 2015-11-30 13:12:07 +01:00
pinctrl-lpc18xx.c pinctrl: lpc18xx: make it explicitly non-modular 2016-06-13 08:28:18 +02:00
pinctrl-max77620.c pinctrl: max77620: Remove unused structure definition 2016-06-15 08:37:40 +02:00
pinctrl-oxnas.c pinctrl: oxnas: Rename pinctrl_utils_dt_free_map to pinctrl_utils_free_map 2016-05-31 12:59:29 +02:00
pinctrl-palmas.c pinctrl: palmas: fix a possible NULL dereference 2016-08-22 14:11:00 +02:00
pinctrl-pic32.c pinctrl: pic32: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 09:23:24 +02:00
pinctrl-pic32.h pinctrl: pinctrl-pic32: Add PIC32 pin control driver 2016-02-05 23:54:47 +01:00
pinctrl-pistachio.c pinctrl: pistachio: fix mfio pll_lock pinmux 2016-08-22 15:28:35 +02:00
pinctrl-rockchip.c pinctrl: rockchip: make it explicitly non-modular 2016-08-27 13:14:21 +02:00
pinctrl-single.c pinctrl: single: Fix missing flush of posted write for a wakeirq 2016-06-22 17:58:07 +02:00
pinctrl-st.c pinctrl: st: Remove STiH415/6 SoC pinctrl driver support. 2016-09-15 15:55:25 +02:00
pinctrl-tb10x.c pinctrl: tb10x: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 09:23:25 +02:00
pinctrl-tz1090-pdc.c pinctrl: tz1090-pdc: Use devm_pinctrl_register() for pinctrl registration 2016-04-21 09:23:26 +02:00
pinctrl-tz1090.c pinctrl: tz1090 Use devm_pinctrl_register() for pinctrl registration 2016-04-21 09:23:26 +02:00
pinctrl-u300.c pinctrl: u300: make u300_pmx_registers static 2016-06-13 09:27:43 +02:00
pinctrl-utils.c pinctrl: Rename pinctrl_utils_dt_free_map to pinctrl_utils_free_map 2016-04-01 15:06:36 +02:00
pinctrl-utils.h pinctrl: Rename pinctrl_utils_dt_free_map to pinctrl_utils_free_map 2016-04-01 15:06:36 +02:00
pinctrl-xway.c This is the bulk of pin control changes for the v4.8 kernel cycle. 2016-07-28 17:06:51 -07:00
pinctrl-zynq.c pinctrl: zynq: fix typo in sdio1_3_grp pin list 2016-09-06 00:49:00 +02:00
pinmux.c pinctrl: return -ENOMEM instead of -EINVAL for kasprintf() failure 2016-05-31 10:33:00 +02:00
pinmux.h