qemu-devel
[Top][All Lists]
Advanced

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

Re: [PATCH 06/17] hw/misc/max111x: provide QOM properties for setting in


From: Alistair Francis
Subject: Re: [PATCH 06/17] hw/misc/max111x: provide QOM properties for setting initial values
Date: Tue, 30 Jun 2020 13:51:37 -0700

On Sun, Jun 28, 2020 at 7:29 AM Peter Maydell <peter.maydell@linaro.org> wrote:
>
> Add some QOM properties to the max111x ADC device to allow the
> initial values to be configured. Currently this is done by
> board code calling max111x_set_input() after it creates the
> device, which doesn't work on system reset.
>
> This requires us to implement a reset method for this device,
> so while we're doing that make sure we reset the other parts
> of the device state.
>
> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Reviewed-by: Alistair Francis <alistair.francis@wdc.com>

Alistair

> ---
>  hw/misc/max111x.c | 57 ++++++++++++++++++++++++++++++++++++++---------
>  1 file changed, 47 insertions(+), 10 deletions(-)
>
> diff --git a/hw/misc/max111x.c b/hw/misc/max111x.c
> index 2b87bdee5b7..d0e5534e4f5 100644
> --- a/hw/misc/max111x.c
> +++ b/hw/misc/max111x.c
> @@ -15,11 +15,15 @@
>  #include "hw/ssi/ssi.h"
>  #include "migration/vmstate.h"
>  #include "qemu/module.h"
> +#include "hw/qdev-properties.h"
>
>  typedef struct {
>      SSISlave parent_obj;
>
>      qemu_irq interrupt;
> +    /* Values of inputs at system reset (settable by QOM property) */
> +    uint8_t reset_input[8];
> +
>      uint8_t tb1, rb2, rb3;
>      int cycle;
>
> @@ -135,16 +139,6 @@ static int max111x_init(SSISlave *d, int inputs)
>      qdev_init_gpio_out(dev, &s->interrupt, 1);
>
>      s->inputs = inputs;
> -    /* TODO: add a user interface for setting these */
> -    s->input[0] = 0xf0;
> -    s->input[1] = 0xe0;
> -    s->input[2] = 0xd0;
> -    s->input[3] = 0xc0;
> -    s->input[4] = 0xb0;
> -    s->input[5] = 0xa0;
> -    s->input[6] = 0x90;
> -    s->input[7] = 0x80;
> -    s->com = 0;
>
>      vmstate_register(VMSTATE_IF(dev), VMSTATE_INSTANCE_ID_ANY,
>                       &vmstate_max111x, s);
> @@ -168,11 +162,50 @@ void max111x_set_input(DeviceState *dev, int line, 
> uint8_t value)
>      s->input[line] = value;
>  }
>
> +static void max111x_reset(DeviceState *dev)
> +{
> +    MAX111xState *s = MAX_111X(dev);
> +    int i;
> +
> +    for (i = 0; i < s->inputs; i++) {
> +        s->input[i] = s->reset_input[i];
> +    }
> +    s->com = 0;
> +    s->tb1 = 0;
> +    s->rb2 = 0;
> +    s->rb3 = 0;
> +    s->cycle = 0;
> +}
> +
> +static Property max1110_properties[] = {
> +    /* Reset values for ADC inputs */
> +    DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
> +    DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
> +    DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
> +    DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
> +    DEFINE_PROP_END_OF_LIST(),
> +};
> +
> +static Property max1111_properties[] = {
> +    /* Reset values for ADC inputs */
> +    DEFINE_PROP_UINT8("input0", MAX111xState, reset_input[0], 0xf0),
> +    DEFINE_PROP_UINT8("input1", MAX111xState, reset_input[1], 0xe0),
> +    DEFINE_PROP_UINT8("input2", MAX111xState, reset_input[2], 0xd0),
> +    DEFINE_PROP_UINT8("input3", MAX111xState, reset_input[3], 0xc0),
> +    DEFINE_PROP_UINT8("input4", MAX111xState, reset_input[4], 0xb0),
> +    DEFINE_PROP_UINT8("input5", MAX111xState, reset_input[5], 0xa0),
> +    DEFINE_PROP_UINT8("input6", MAX111xState, reset_input[6], 0x90),
> +    DEFINE_PROP_UINT8("input7", MAX111xState, reset_input[7], 0x80),
> +    DEFINE_PROP_END_OF_LIST(),
> +};
> +
>  static void max111x_class_init(ObjectClass *klass, void *data)
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
> +    DeviceClass *dc = DEVICE_CLASS(klass);
>
>      k->transfer = max111x_transfer;
> +    dc->reset = max111x_reset;
>  }
>
>  static const TypeInfo max111x_info = {
> @@ -186,8 +219,10 @@ static const TypeInfo max111x_info = {
>  static void max1110_class_init(ObjectClass *klass, void *data)
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
> +    DeviceClass *dc = DEVICE_CLASS(klass);
>
>      k->realize = max1110_realize;
> +    device_class_set_props(dc, max1110_properties);
>  }
>
>  static const TypeInfo max1110_info = {
> @@ -199,8 +234,10 @@ static const TypeInfo max1110_info = {
>  static void max1111_class_init(ObjectClass *klass, void *data)
>  {
>      SSISlaveClass *k = SSI_SLAVE_CLASS(klass);
> +    DeviceClass *dc = DEVICE_CLASS(klass);
>
>      k->realize = max1111_realize;
> +    device_class_set_props(dc, max1111_properties);
>  }
>
>  static const TypeInfo max1111_info = {
> --
> 2.20.1
>
>



reply via email to

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