hw/misc/max111x: Use GPIO lines rather than max111x_set_input()
The max111x ADC device model allows other code to set the level on the 8 ADC inputs using the max111x_set_input() function. Replace this with generic qdev GPIO inputs, which also allow inputs to be set to arbitrary values. Using GPIO lines will make it easier for board code to wire things up, so that if device A wants to set the ADC input it doesn't need to have a direct pointer to the max111x but can just set that value on its output GPIO, which is then wired up by the board to the appropriate max111x input. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Alistair Francis <alistair.francis@wdc.com> Message-id: 20200628142429.17111-11-peter.maydell@linaro.org
This commit is contained in:
parent
4aed7b51c2
commit
871f82722c
@ -696,13 +696,14 @@ static void corgi_ssp_gpio_cs(void *opaque, int line, int level)
|
|||||||
|
|
||||||
static void spitz_adc_temp_on(void *opaque, int line, int level)
|
static void spitz_adc_temp_on(void *opaque, int line, int level)
|
||||||
{
|
{
|
||||||
|
int batt_temp;
|
||||||
|
|
||||||
if (!max1111)
|
if (!max1111)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (level)
|
batt_temp = level ? SPITZ_BATTERY_TEMP : 0;
|
||||||
max111x_set_input(max1111, MAX1111_BATT_TEMP, SPITZ_BATTERY_TEMP);
|
|
||||||
else
|
qemu_set_irq(qdev_get_gpio_in(max1111, MAX1111_BATT_TEMP), batt_temp);
|
||||||
max111x_set_input(max1111, MAX1111_BATT_TEMP, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void corgi_ssp_realize(SSISlave *d, Error **errp)
|
static void corgi_ssp_realize(SSISlave *d, Error **errp)
|
||||||
|
@ -131,12 +131,21 @@ static const VMStateDescription vmstate_max111x = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void max111x_input_set(void *opaque, int line, int value)
|
||||||
|
{
|
||||||
|
MAX111xState *s = MAX_111X(opaque);
|
||||||
|
|
||||||
|
assert(line >= 0 && line < s->inputs);
|
||||||
|
s->input[line] = value;
|
||||||
|
}
|
||||||
|
|
||||||
static int max111x_init(SSISlave *d, int inputs)
|
static int max111x_init(SSISlave *d, int inputs)
|
||||||
{
|
{
|
||||||
DeviceState *dev = DEVICE(d);
|
DeviceState *dev = DEVICE(d);
|
||||||
MAX111xState *s = MAX_111X(dev);
|
MAX111xState *s = MAX_111X(dev);
|
||||||
|
|
||||||
qdev_init_gpio_out(dev, &s->interrupt, 1);
|
qdev_init_gpio_out(dev, &s->interrupt, 1);
|
||||||
|
qdev_init_gpio_in(dev, max111x_input_set, inputs);
|
||||||
|
|
||||||
s->inputs = inputs;
|
s->inputs = inputs;
|
||||||
|
|
||||||
@ -153,13 +162,6 @@ static void max1111_realize(SSISlave *dev, Error **errp)
|
|||||||
max111x_init(dev, 4);
|
max111x_init(dev, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void max111x_set_input(DeviceState *dev, int line, uint8_t value)
|
|
||||||
{
|
|
||||||
MAX111xState *s = MAX_111X(dev);
|
|
||||||
assert(line >= 0 && line < s->inputs);
|
|
||||||
s->input[line] = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void max111x_reset(DeviceState *dev)
|
static void max111x_reset(DeviceState *dev)
|
||||||
{
|
{
|
||||||
MAX111xState *s = MAX_111X(dev);
|
MAX111xState *s = MAX_111X(dev);
|
||||||
|
@ -111,7 +111,4 @@ SSIBus *ssi_create_bus(DeviceState *parent, const char *name);
|
|||||||
|
|
||||||
uint32_t ssi_transfer(SSIBus *bus, uint32_t val);
|
uint32_t ssi_transfer(SSIBus *bus, uint32_t val);
|
||||||
|
|
||||||
/* max111x.c */
|
|
||||||
void max111x_set_input(DeviceState *dev, int line, uint8_t value);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user