Skip to content

Commit

Permalink
macio: wire macio GPIOs to OpenPIC using sysbus IRQs
Browse files Browse the repository at this point in the history
This both allows the wiring to be done as Ben suggested in his original comment in
gpio.c and also enables the OpenPIC object property link to be removed.

Signed-off-by: Mark Cave-Ayland <[email protected]>
Message-Id: <[email protected]>
Signed-off-by: Mark Cave-Ayland <[email protected]>
  • Loading branch information
mcayland committed Jan 13, 2021
1 parent 7e4d62d commit b73eb72
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 26 deletions.
24 changes: 5 additions & 19 deletions hw/misc/macio/gpio.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,7 @@ void macio_set_gpio(MacIOGPIOState *s, uint32_t gpio, bool state)

s->gpio_regs[gpio] = new_reg;

/* This is will work until we fix the binding between MacIO and
* the MPIC properly so we can route all GPIOs and avoid going
* via the top level platform code.
*
/*
* Note that we probably need to get access to the MPIC config to
* decode polarity since qemu always use "raise" regardless.
*
Expand Down Expand Up @@ -152,25 +149,15 @@ static const MemoryRegionOps macio_gpio_ops = {
},
};

static void macio_gpio_realize(DeviceState *dev, Error **errp)
{
MacIOGPIOState *s = MACIO_GPIO(dev);

s->gpio_extirqs[1] = qdev_get_gpio_in(DEVICE(s->pic),
NEWWORLD_EXTING_GPIO1);
s->gpio_extirqs[9] = qdev_get_gpio_in(DEVICE(s->pic),
NEWWORLD_EXTING_GPIO9);
}

static void macio_gpio_init(Object *obj)
{
SysBusDevice *sbd = SYS_BUS_DEVICE(obj);
MacIOGPIOState *s = MACIO_GPIO(obj);
int i;

object_property_add_link(obj, "pic", TYPE_OPENPIC,
(Object **) &s->pic,
qdev_prop_allow_set_link_before_realize,
0);
for (i = 0; i < 10; i++) {
sysbus_init_irq(sbd, &s->gpio_extirqs[i]);
}

memory_region_init_io(&s->gpiomem, OBJECT(s), &macio_gpio_ops, obj,
"gpio", 0x30);
Expand Down Expand Up @@ -207,7 +194,6 @@ static void macio_gpio_class_init(ObjectClass *oc, void *data)
DeviceClass *dc = DEVICE_CLASS(oc);
NMIClass *nc = NMI_CLASS(oc);

dc->realize = macio_gpio_realize;
dc->reset = macio_gpio_reset;
dc->vmsd = &vmstate_macio_gpio;
nc->nmi_monitor_handler = macio_gpio_nmi;
Expand Down
12 changes: 7 additions & 5 deletions hw/misc/macio/macio.c
Original file line number Diff line number Diff line change
Expand Up @@ -324,14 +324,16 @@ static void macio_newworld_realize(PCIDevice *d, Error **errp)

if (ns->has_pmu) {
/* GPIOs */
sysbus_dev = SYS_BUS_DEVICE(&ns->gpio);
object_property_set_link(OBJECT(&ns->gpio), "pic", OBJECT(pic_dev),
&error_abort);
memory_region_add_subregion(&s->bar, 0x50,
sysbus_mmio_get_region(sysbus_dev, 0));
if (!qdev_realize(DEVICE(&ns->gpio), BUS(&s->macio_bus), errp)) {
return;
}
sysbus_dev = SYS_BUS_DEVICE(&ns->gpio);
sysbus_connect_irq(sysbus_dev, 1, qdev_get_gpio_in(pic_dev,
NEWWORLD_EXTING_GPIO1));
sysbus_connect_irq(sysbus_dev, 9, qdev_get_gpio_in(pic_dev,
NEWWORLD_EXTING_GPIO9));
memory_region_add_subregion(&s->bar, 0x50,
sysbus_mmio_get_region(sysbus_dev, 0));

/* PMU */
object_initialize_child(OBJECT(s), "pmu", &s->pmu, TYPE_VIA_PMU);
Expand Down
2 changes: 0 additions & 2 deletions include/hw/misc/macio/gpio.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,6 @@ struct MacIOGPIOState {
SysBusDevice parent;
/*< public >*/

OpenPICState *pic;

MemoryRegion gpiomem;
qemu_irq gpio_extirqs[10];
uint8_t gpio_levels[8];
Expand Down

0 comments on commit b73eb72

Please sign in to comment.