Commit b064d51f authored by Peter Maydell's avatar Peter Maydell
Browse files

hw/misc/max111x: provide QOM properties for setting initial values



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: default avatarPeter Maydell <peter.maydell@linaro.org>
Reviewed-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
Reviewed-by: default avatarAlistair Francis <alistair.francis@wdc.com>
Message-id: 20200628142429.17111-7-peter.maydell@linaro.org
parent 2e354c02
Loading
Loading
Loading
Loading
+47 −10
Original line number Diff line number Diff line
@@ -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 = {