Message ID | 20200628142429.17111-7-peter.maydell@linaro.org |
---|---|
State | Superseded |
Headers | show |
Series | spitz: fix hacks, fix CID 1421913, various cleanups | expand |
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>
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 --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 = {
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