gpio: aspeed: Add interfaces for co-processor to grab GPIOs
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Fri, 29 Jun 2018 04:11:19 +0000 (14:11 +1000)
committerLinus Walleij <linus.walleij@linaro.org>
Mon, 2 Jul 2018 14:10:15 +0000 (16:10 +0200)
commita7ca13826e478f9b201eb2f9f20de0b978a82ad9
treef362209f8c9660343ecf2ccea6545a9c9b1fa53a
parent0f1e03c2b5a395e3eb38899a41c7e74afbc16ba0
gpio: aspeed: Add interfaces for co-processor to grab GPIOs

On the Aspeed chip, the GPIOs can be under control of the ARM
chip or of the ColdFire coprocessor. (There's a third command
source, the LPC bus, which we don't use or support yet).

The control of which master is allowed to modify a given
GPIO is per-bank (8 GPIOs).

Unfortunately, systems already exist for which we want to
use GPIOs of both sources in the same bank.

This provides an API exported by the gpio-aspeed driver
that an aspeed coprocessor driver can use to "grab" some
GPIOs for use by the coprocessor, and allow the coprocessor
driver to provide callbacks for arbitrating access.

Once at least one GPIO of a given bank has been "grabbed"
by the coprocessor, the entire bank is marked as being
under coprocessor control. It's command source is switched
to the coprocessor.

If the ARM then tries to write to a GPIO in such a marked bank,
the provided callbacks are used to request access from the
coprocessor driver, which is responsible to doing whatever
is necessary to "pause" the coprocessor or prevent it from
trying to use the GPIOs while the ARM is doing its accesses.

During that time, the command source for the bank is temporarily
switched back to the ARM.

Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Reviewed-by: Joel Stanley <joel@jms.id.au>
Reviewed-by: Andrew Jeffery <andrew@aj.id.au>
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
drivers/gpio/gpio-aspeed.c
include/linux/gpio/aspeed.h [new file with mode: 0644]