diff mbox series

[06/17] hw/misc/max111x: provide QOM properties for setting initial values

Message ID 20200628142429.17111-7-peter.maydell@linaro.org
State Superseded
Headers show
Series spitz: fix hacks, fix CID 1421913, various cleanups | expand

Commit Message

Peter Maydell June 28, 2020, 2:24 p.m. UTC
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>

---
 hw/misc/max111x.c | 57 ++++++++++++++++++++++++++++++++++++++---------
 1 file changed, 47 insertions(+), 10 deletions(-)

-- 
2.20.1

Comments

Philippe Mathieu-Daudé June 29, 2020, 9:01 a.m. UTC | #1
On 6/28/20 4:24 PM, Peter Maydell 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>

> ---

>  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;

>  


An eventual improvement is to make 'inputs' a class property:

  MAX111xClass {
      SSISlaveClass parent_obj;

      unsigned input_count;
  }

"eventual" because from a QOM point it is cleaner, but we'd have
to add more boiler-plate casts, so code less clear.

Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
Alistair Francis June 30, 2020, 8:51 p.m. UTC | #2
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

>

>
diff mbox series

Patch

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 = {