mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-07-19 18:02:06 +00:00
DM: virtio-gpio: fix falling or rising irq can't work
When UOS set failling irq type, gpio BE will only request GPIOEVENT_REQUEST_FAILLING_EDGE event from native gpio driver which will cause the last_level value is always 0. So last_level can't be used to check whether interrupt should be injected or not. It is the same for rising irq type. v2: refine commit message. Tracked-On: #3010 Reviewed-by: Yuan Liu <yuan1.liu@intel.com> Signed-off-by: fuyongjie <fuyongjie@neusoft.com> Acked-by: Yu Wang <yu1.wang@intel.com>
This commit is contained in:
parent
7ef9498fe0
commit
2387010fdd
@ -965,12 +965,11 @@ gpio_irq_set_pin_state(int fd __attribute__((unused)),
|
|||||||
struct gpioevent_data data;
|
struct gpioevent_data data;
|
||||||
struct virtio_gpio *gpio;
|
struct virtio_gpio *gpio;
|
||||||
struct gpio_irq_desc *desc;
|
struct gpio_irq_desc *desc;
|
||||||
int last_level, err;
|
int err;
|
||||||
|
|
||||||
assert(arg != NULL);
|
assert(arg != NULL);
|
||||||
desc = (struct gpio_irq_desc *) arg;
|
desc = (struct gpio_irq_desc *) arg;
|
||||||
gpio = (struct virtio_gpio *) desc->data;
|
gpio = (struct virtio_gpio *) desc->data;
|
||||||
last_level = desc->level;
|
|
||||||
|
|
||||||
/* get pin state */
|
/* get pin state */
|
||||||
memset(&data, 0, sizeof(data));
|
memset(&data, 0, sizeof(data));
|
||||||
@ -987,7 +986,7 @@ gpio_irq_set_pin_state(int fd __attribute__((unused)),
|
|||||||
desc->level = 1;
|
desc->level = 1;
|
||||||
|
|
||||||
/* jitter protection */
|
/* jitter protection */
|
||||||
if (((desc->mode & IRQ_TYPE_EDGE_RISING) && (last_level == 0))
|
if ((desc->mode & IRQ_TYPE_EDGE_RISING)
|
||||||
|| (desc->mode & IRQ_TYPE_LEVEL_HIGH)) {
|
|| (desc->mode & IRQ_TYPE_LEVEL_HIGH)) {
|
||||||
gpio_irq_generate_intr(gpio, desc->pin);
|
gpio_irq_generate_intr(gpio, desc->pin);
|
||||||
}
|
}
|
||||||
@ -997,7 +996,7 @@ gpio_irq_set_pin_state(int fd __attribute__((unused)),
|
|||||||
desc->level = 0;
|
desc->level = 0;
|
||||||
|
|
||||||
/* jitter protection */
|
/* jitter protection */
|
||||||
if (((desc->mode & IRQ_TYPE_EDGE_FALLING) && (last_level == 1))
|
if ((desc->mode & IRQ_TYPE_EDGE_FALLING)
|
||||||
|| (desc->mode & IRQ_TYPE_LEVEL_LOW)) {
|
|| (desc->mode & IRQ_TYPE_LEVEL_LOW)) {
|
||||||
gpio_irq_generate_intr(gpio, desc->pin);
|
gpio_irq_generate_intr(gpio, desc->pin);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user