nrf51_gpio: reflect pull-up/pull-down to IRQs
commit4261b2f915cbc1538c528d982a521c76dd46e66c
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 25 Mar 2019 14:16:46 +0000 (25 14:16 +0000)
committerPeter Maydell <peter.maydell@linaro.org>
Mon, 25 Mar 2019 14:16:46 +0000 (25 14:16 +0000)
tree0964cc10588f792c735feca648806835b14c625a
parenta036f5302c13634f3d375615b2949fd1fa1657b6
nrf51_gpio: reflect pull-up/pull-down to IRQs

Some drivers do I2C bitbanging by keeping the output to 0 and flipping
the GPIO direction between input and output (see for example in Linux
gpio_set_open_drain_value_commit, in drivers/gpio/gpiolib.c).
When the GPIO is set to input, the pull-up resistor brings the output
to 1, while when the GPIO is set to output, the output driver brings
the output to 0.

Implement this for the nRF51 GPIO device model.  First, if both input and
output are floating, and there is a pull-up or pull-down resistor
configured, do not just set s->in, but also make any devices listening
on the output qemu_irq receive that value.  Second, if the pin is
driven both internally (output pin) and externally you don't get a
short circuit if both sides drive the pin to the same value.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 20190317141001.3346-1-pbonzini@redhat.com
[PMM: wrapped long line]
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
hw/gpio/nrf51_gpio.c