Lines Matching +full:lock +full:- +full:pull

16  *  + QOM property "pullups": an integer defining whether non-floating lines
19 * This should be an 8-bit value, where bit 0 is 1 if GPIO line 0 should
22 * + QOM property "pulldowns": an integer defining whether non-floating lines
25 * This should be an 8-bit value, where bit 0 is 1 if GPIO line 0 should
35 #include "hw/qdev-properties.h"
81 /* Properties, for non-Luminary PL061 */
124 if (s->id == pl061_id_luminary) { in pl061_floating()
129 floating = ~(s->pur | s->pdr); in pl061_floating()
131 floating = ~(s->pullups | s->pulldowns); in pl061_floating()
133 return floating & ~s->dir; in pl061_floating()
144 if (s->id == pl061_id_luminary) { in pl061_pullups()
150 pullups = s->pur; in pl061_pullups()
152 pullups = s->pullups; in pl061_pullups()
154 return pullups & ~s->dir; in pl061_pullups()
166 trace_pl061_update(DEVICE(s)->canonical_path, s->dir, s->data, in pl061_update()
175 out = (s->data & s->dir) | pullups | (s->old_out_data & floating); in pl061_update()
176 changed = s->old_out_data ^ out; in pl061_update()
178 s->old_out_data = out; in pl061_update()
183 trace_pl061_set_output(DEVICE(s)->canonical_path, i, level); in pl061_update()
184 qemu_set_irq(s->out[i], level); in pl061_update()
190 changed = (s->old_in_data ^ s->data) & ~s->dir; in pl061_update()
192 s->old_in_data = s->data; in pl061_update()
196 trace_pl061_input_change(DEVICE(s)->canonical_path, i, in pl061_update()
197 (s->data & mask) != 0); in pl061_update()
199 if (!(s->isense & mask)) { in pl061_update()
201 if (s->ibe & mask) { in pl061_update()
203 s->istate |= mask; in pl061_update()
206 s->istate |= ~(s->data ^ s->iev) & mask; in pl061_update()
214 s->istate |= ~(s->data ^ s->iev) & s->isense; in pl061_update()
216 trace_pl061_update_istate(DEVICE(s)->canonical_path, in pl061_update()
217 s->istate, s->im, (s->istate & s->im) != 0); in pl061_update()
219 qemu_set_irq(s->irq, (s->istate & s->im) != 0); in pl061_update()
230 r = s->data & (offset >> 2); in pl061_read()
233 r = s->dir; in pl061_read()
236 r = s->isense; in pl061_read()
239 r = s->ibe; in pl061_read()
242 r = s->iev; in pl061_read()
245 r = s->im; in pl061_read()
248 r = s->istate; in pl061_read()
251 r = s->istate & s->im; in pl061_read()
254 r = s->afsel; in pl061_read()
257 if (s->id != pl061_id_luminary) { in pl061_read()
260 r = s->dr2r; in pl061_read()
263 if (s->id != pl061_id_luminary) { in pl061_read()
266 r = s->dr4r; in pl061_read()
269 if (s->id != pl061_id_luminary) { in pl061_read()
272 r = s->dr8r; in pl061_read()
275 if (s->id != pl061_id_luminary) { in pl061_read()
278 r = s->odr; in pl061_read()
280 case 0x510: /* Pull-up */ in pl061_read()
281 if (s->id != pl061_id_luminary) { in pl061_read()
284 r = s->pur; in pl061_read()
286 case 0x514: /* Pull-down */ in pl061_read()
287 if (s->id != pl061_id_luminary) { in pl061_read()
290 r = s->pdr; in pl061_read()
293 if (s->id != pl061_id_luminary) { in pl061_read()
296 r = s->slr; in pl061_read()
299 if (s->id != pl061_id_luminary) { in pl061_read()
302 r = s->den; in pl061_read()
304 case 0x520: /* Lock */ in pl061_read()
305 if (s->id != pl061_id_luminary) { in pl061_read()
308 r = s->locked; in pl061_read()
311 if (s->id != pl061_id_luminary) { in pl061_read()
314 r = s->cr; in pl061_read()
317 if (s->id != pl061_id_luminary) { in pl061_read()
320 r = s->amsel; in pl061_read()
323 r = s->id[(offset - 0xfd0) >> 2]; in pl061_read()
332 trace_pl061_read(DEVICE(s)->canonical_path, offset, r); in pl061_read()
342 trace_pl061_write(DEVICE(s)->canonical_path, offset, value); in pl061_write()
346 mask = (offset >> 2) & s->dir; in pl061_write()
347 s->data = (s->data & ~mask) | (value & mask); in pl061_write()
351 s->dir = value & 0xff; in pl061_write()
354 s->isense = value & 0xff; in pl061_write()
357 s->ibe = value & 0xff; in pl061_write()
360 s->iev = value & 0xff; in pl061_write()
363 s->im = value & 0xff; in pl061_write()
366 s->istate &= ~value; in pl061_write()
369 mask = s->cr; in pl061_write()
370 s->afsel = (s->afsel & ~mask) | (value & mask); in pl061_write()
373 if (s->id != pl061_id_luminary) { in pl061_write()
376 s->dr2r = value & 0xff; in pl061_write()
379 if (s->id != pl061_id_luminary) { in pl061_write()
382 s->dr4r = value & 0xff; in pl061_write()
385 if (s->id != pl061_id_luminary) { in pl061_write()
388 s->dr8r = value & 0xff; in pl061_write()
391 if (s->id != pl061_id_luminary) { in pl061_write()
394 s->odr = value & 0xff; in pl061_write()
396 case 0x510: /* Pull-up */ in pl061_write()
397 if (s->id != pl061_id_luminary) { in pl061_write()
400 s->pur = value & 0xff; in pl061_write()
402 case 0x514: /* Pull-down */ in pl061_write()
403 if (s->id != pl061_id_luminary) { in pl061_write()
406 s->pdr = value & 0xff; in pl061_write()
409 if (s->id != pl061_id_luminary) { in pl061_write()
412 s->slr = value & 0xff; in pl061_write()
415 if (s->id != pl061_id_luminary) { in pl061_write()
418 s->den = value & 0xff; in pl061_write()
420 case 0x520: /* Lock */ in pl061_write()
421 if (s->id != pl061_id_luminary) { in pl061_write()
424 s->locked = (value != 0xacce551); in pl061_write()
427 if (s->id != pl061_id_luminary) { in pl061_write()
430 if (!s->locked) in pl061_write()
431 s->cr = value & 0xff; in pl061_write()
434 if (s->id != pl061_id_luminary) { in pl061_write()
437 s->amsel = value & 0xff; in pl061_write()
452 trace_pl061_reset(DEVICE(s)->canonical_path); in pl061_enter_reset()
461 * (PB7, PC0, PC1, PC2, PC3 -- they're used for JTAG), so we can in pl061_enter_reset()
464 s->data = 0; in pl061_enter_reset()
465 s->old_in_data = 0; in pl061_enter_reset()
466 s->dir = 0; in pl061_enter_reset()
467 s->isense = 0; in pl061_enter_reset()
468 s->ibe = 0; in pl061_enter_reset()
469 s->iev = 0; in pl061_enter_reset()
470 s->im = 0; in pl061_enter_reset()
471 s->istate = 0; in pl061_enter_reset()
472 s->afsel = 0; in pl061_enter_reset()
473 s->dr2r = 0xff; in pl061_enter_reset()
474 s->dr4r = 0; in pl061_enter_reset()
475 s->dr8r = 0; in pl061_enter_reset()
476 s->odr = 0; in pl061_enter_reset()
477 s->pur = 0; in pl061_enter_reset()
478 s->pdr = 0; in pl061_enter_reset()
479 s->slr = 0; in pl061_enter_reset()
480 s->den = 0; in pl061_enter_reset()
481 s->locked = 1; in pl061_enter_reset()
482 s->cr = 0xff; in pl061_enter_reset()
483 s->amsel = 0; in pl061_enter_reset()
498 trace_pl061_set_output(DEVICE(s)->canonical_path, i, level); in pl061_hold_reset()
499 qemu_set_irq(s->out[i], level); in pl061_hold_reset()
501 s->old_out_data = pullups; in pl061_hold_reset()
510 if ((s->dir & mask) == 0) { in pl061_set_irq()
511 s->data &= ~mask; in pl061_set_irq()
513 s->data |= mask; in pl061_set_irq()
528 s->id = pl061_id_luminary; in pl061_luminary_init()
537 s->id = pl061_id; in pl061_init()
539 memory_region_init_io(&s->iomem, obj, &pl061_ops, s, "pl061", 0x1000); in pl061_init()
540 sysbus_init_mmio(sbd, &s->iomem); in pl061_init()
541 sysbus_init_irq(sbd, &s->irq); in pl061_init()
543 qdev_init_gpio_out(dev, s->out, N_GPIOS); in pl061_init()
550 if (s->pullups > 0xff) { in pl061_realize()
554 if (s->pulldowns > 0xff) { in pl061_realize()
558 if (s->pullups & s->pulldowns) { in pl061_realize()
574 dc->vmsd = &vmstate_pl061; in pl061_class_init()
575 dc->realize = pl061_realize; in pl061_class_init()
577 rc->phases.enter = pl061_enter_reset; in pl061_class_init()
578 rc->phases.hold = pl061_hold_reset; in pl061_class_init()