50
mst_fpga_update_gpio(mst_irq_state *s)
54
level = s->prev_level ^ s->intsetclr;
56
for (diff = s->prev_level ^ level; diff; diff ^= 1 << bit) {
58
qemu_set_irq(s->pins[bit], (level >> bit) & 1 );
60
s->prev_level = level;
64
56
mst_fpga_set_irq(void *opaque, int irq, int level)
66
58
mst_irq_state *s = (mst_irq_state *)opaque;
59
uint32_t oldint = s->intsetclr & s->intmskena;
69
62
s->prev_level |= 1u << irq;
71
64
s->prev_level &= ~(1u << irq);
73
if(s->intmskena & (1u << irq)) {
74
s->intsetclr = 1u << irq;
75
qemu_set_irq(s->parent[0], level);
67
case MST_PCMCIA_CD0_IRQ:
69
s->pcmcia0 &= ~MST_PCMCIAx_nCD;
71
s->pcmcia0 |= MST_PCMCIAx_nCD;
73
case MST_PCMCIA_CD1_IRQ:
75
s->pcmcia1 &= ~MST_PCMCIAx_nCD;
77
s->pcmcia1 |= MST_PCMCIAx_nCD;
81
if ((s->intmskena & (1u << irq)) && level)
82
s->intsetclr |= 1u << irq;
84
if (oldint != (s->intsetclr & s->intmskena))
85
qemu_set_irq(s->parent, s->intsetclr & s->intmskena);
179
mst_fpga_save(QEMUFile *f, void *opaque)
181
struct mst_irq_state *s = (mst_irq_state *) opaque;
183
qemu_put_be32s(f, &s->prev_level);
184
qemu_put_be32s(f, &s->leddat1);
185
qemu_put_be32s(f, &s->leddat2);
186
qemu_put_be32s(f, &s->ledctrl);
187
qemu_put_be32s(f, &s->gpswr);
188
qemu_put_be32s(f, &s->mscwr1);
189
qemu_put_be32s(f, &s->mscwr2);
190
qemu_put_be32s(f, &s->mscwr3);
191
qemu_put_be32s(f, &s->mscrd);
192
qemu_put_be32s(f, &s->intmskena);
193
qemu_put_be32s(f, &s->intsetclr);
194
qemu_put_be32s(f, &s->pcmcia0);
195
qemu_put_be32s(f, &s->pcmcia1);
199
mst_fpga_load(QEMUFile *f, void *opaque, int version_id)
190
static int mst_fpga_post_load(void *opaque, int version_id)
201
192
mst_irq_state *s = (mst_irq_state *) opaque;
203
qemu_get_be32s(f, &s->prev_level);
204
qemu_get_be32s(f, &s->leddat1);
205
qemu_get_be32s(f, &s->leddat2);
206
qemu_get_be32s(f, &s->ledctrl);
207
qemu_get_be32s(f, &s->gpswr);
208
qemu_get_be32s(f, &s->mscwr1);
209
qemu_get_be32s(f, &s->mscwr2);
210
qemu_get_be32s(f, &s->mscwr3);
211
qemu_get_be32s(f, &s->mscrd);
212
qemu_get_be32s(f, &s->intmskena);
213
qemu_get_be32s(f, &s->intsetclr);
214
qemu_get_be32s(f, &s->pcmcia0);
215
qemu_get_be32s(f, &s->pcmcia1);
194
qemu_set_irq(s->parent, s->intsetclr & s->intmskena);
219
qemu_irq *mst_irq_init(PXA2xxState *cpu, uint32_t base, int irq)
198
static int mst_fpga_init(SysBusDevice *dev)
221
200
mst_irq_state *s;
225
s = (mst_irq_state *)
226
qemu_mallocz(sizeof(mst_irq_state));
228
s->parent = &cpu->pic[irq];
203
s = FROM_SYSBUS(mst_irq_state, dev);
205
s->pcmcia0 = MST_PCMCIAx_READY | MST_PCMCIAx_nCD;
206
s->pcmcia1 = MST_PCMCIAx_READY | MST_PCMCIAx_nCD;
208
sysbus_init_irq(dev, &s->parent);
230
210
/* alloc the external 16 irqs */
231
qi = qemu_allocate_irqs(mst_fpga_set_irq, s, MST_NUM_IRQS);
211
qdev_init_gpio_in(&dev->qdev, mst_fpga_set_irq, MST_NUM_IRQS);
234
213
iomemtype = cpu_register_io_memory(mst_fpga_readfn,
235
214
mst_fpga_writefn, s, DEVICE_NATIVE_ENDIAN);
236
cpu_register_physical_memory(base, 0x00100000, iomemtype);
237
register_savevm(NULL, "mainstone_fpga", 0, 0, mst_fpga_save,
215
sysbus_init_mmio(dev, 0x00100000, iomemtype);
219
static VMStateDescription vmstate_mst_fpga_regs = {
220
.name = "mainstone_fpga",
222
.minimum_version_id = 0,
223
.minimum_version_id_old = 0,
224
.post_load = mst_fpga_post_load,
225
.fields = (VMStateField []) {
226
VMSTATE_UINT32(prev_level, mst_irq_state),
227
VMSTATE_UINT32(leddat1, mst_irq_state),
228
VMSTATE_UINT32(leddat2, mst_irq_state),
229
VMSTATE_UINT32(ledctrl, mst_irq_state),
230
VMSTATE_UINT32(gpswr, mst_irq_state),
231
VMSTATE_UINT32(mscwr1, mst_irq_state),
232
VMSTATE_UINT32(mscwr2, mst_irq_state),
233
VMSTATE_UINT32(mscwr3, mst_irq_state),
234
VMSTATE_UINT32(mscrd, mst_irq_state),
235
VMSTATE_UINT32(intmskena, mst_irq_state),
236
VMSTATE_UINT32(intsetclr, mst_irq_state),
237
VMSTATE_UINT32(pcmcia0, mst_irq_state),
238
VMSTATE_UINT32(pcmcia1, mst_irq_state),
239
VMSTATE_END_OF_LIST(),
243
static SysBusDeviceInfo mst_fpga_info = {
244
.init = mst_fpga_init,
245
.qdev.name = "mainstone-fpga",
246
.qdev.desc = "Mainstone II FPGA",
247
.qdev.size = sizeof(mst_irq_state),
248
.qdev.vmsd = &vmstate_mst_fpga_regs,
251
static void mst_fpga_register(void)
253
sysbus_register_withprop(&mst_fpga_info);
255
device_init(mst_fpga_register);