qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 07/13] pckbd: handle A20 IRQ as GPIO


From: Paolo Bonzini
Subject: Re: [Qemu-devel] [PATCH 07/13] pckbd: handle A20 IRQ as GPIO
Date: Fri, 17 Jun 2016 15:23:55 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.1.0


On 17/06/2016 15:11, Efimov Vasily wrote:
> The i8042 device has outgouing IRQ line A20. Currently the IRQ is referenced
> by a pointer which normally is set during machine initialization. The pointer
> is never changed at runtime. So common GPIO model can be applied to A20 IRQ
> line. Note that checking for IRQ to be connected as in previous version
> of code is not required because qemu_set_irq will do it.
> 
> Signed-off-by: Efimov Vasily <address@hidden>
> ---
>  hw/input/pckbd.c | 21 +++++++--------------
>  1 file changed, 7 insertions(+), 14 deletions(-)
> 
> diff --git a/hw/input/pckbd.c b/hw/input/pckbd.c
> index 1d932ec..1406b6b 100644
> --- a/hw/input/pckbd.c
> +++ b/hw/input/pckbd.c
> @@ -146,7 +146,7 @@ typedef struct KBDState {
>  
>      qemu_irq irq_kbd;
>      qemu_irq irq_mouse;
> -    qemu_irq *a20_out;
> +    qemu_irq a20_out;
>      hwaddr mask;
>  } KBDState;
>  
> @@ -224,9 +224,7 @@ static void outport_write(KBDState *s, uint32_t val)
>  {
>      DPRINTF("kbd: write outport=0x%02x\n", val);
>      s->outport = val;
> -    if (s->a20_out) {
> -        qemu_set_irq(*s->a20_out, (val >> 1) & 1);
> -    }
> +    qemu_set_irq(s->a20_out, (val >> 1) & 1);
>      if (!(val & 1)) {
>          qemu_system_reset_request();
>      }
> @@ -295,15 +293,11 @@ static void kbd_write_command(void *opaque, hwaddr addr,
>          kbd_queue(s, s->outport, 0);
>          break;
>      case KBD_CCMD_ENABLE_A20:
> -        if (s->a20_out) {
> -            qemu_irq_raise(*s->a20_out);
> -        }
> +        qemu_irq_raise(s->a20_out);
>          s->outport |= KBD_OUT_A20;
>          break;
>      case KBD_CCMD_DISABLE_A20:
> -        if (s->a20_out) {
> -            qemu_irq_lower(*s->a20_out);
> -        }
> +        qemu_irq_lower(s->a20_out);
>          s->outport &= ~KBD_OUT_A20;
>          break;
>      case KBD_CCMD_RESET:
> @@ -507,10 +501,7 @@ void i8042_isa_mouse_fake_event(void *opaque)
>  
>  void i8042_setup_a20_line(ISADevice *dev, qemu_irq *a20_out)
>  {
> -    ISAKBDState *isa = I8042(dev);
> -    KBDState *s = &isa->kbd;
> -
> -    s->a20_out = a20_out;
> +    qdev_connect_gpio_out(DEVICE(dev), 0, *a20_out);
>  }
>  
>  static const VMStateDescription vmstate_kbd_isa = {
> @@ -552,6 +543,8 @@ static void i8042_initfn(Object *obj)
>                            "i8042-data", 1);
>      memory_region_init_io(isa_s->io + 1, obj, &i8042_cmd_ops, s,
>                            "i8042-cmd", 1);
> +
> +    qdev_init_gpio_out(DEVICE(obj), &s->a20_out, 1);

While at it, please use qdev_init_gpio_out_named and
qdev_connect_gpio_out_named with "a20" as the name.

Paolo

>  }
>  
>  static void i8042_realizefn(DeviceState *dev, Error **errp)
> 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]