18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* 28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * QEMU IRQ/GPIO common code. 38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Copyright (c) 2007 CodeSourcery. 58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a copy 78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * of this software and associated documentation files (the "Software"), to deal 88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * in the Software without restriction, including without limitation the rights 98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * copies of the Software, and to permit persons to whom the Software is 118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * furnished to do so, subject to the following conditions: 128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * The above copyright notice and this permission notice shall be included in 148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * all copies or substantial portions of the Software. 158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * 168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * THE SOFTWARE. 238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */ 248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "qemu-common.h" 258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "irq.h" 268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstruct IRQState { 288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_irq_handler handler; 298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project void *opaque; 308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int n; 318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}; 328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid qemu_set_irq(qemu_irq irq, int level) 348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project if (!irq) 368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return; 378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project irq->handler(irq->opaque, irq->n, level); 398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemu_irq *qemu_allocate_irqs(qemu_irq_handler handler, void *opaque, int n) 428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_irq *s; 448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct IRQState *p; 458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project int i; 468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s = (qemu_irq *)qemu_mallocz(sizeof(qemu_irq) * n); 488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p = (struct IRQState *)qemu_mallocz(sizeof(struct IRQState) * n); 498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project for (i = 0; i < n; i++) { 508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p->handler = handler; 518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p->opaque = opaque; 528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p->n = i; 538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project s[i] = p; 548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project p++; 558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project } 568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return s; 578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 595d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turnervoid qemu_free_irqs(qemu_irq *s) 605d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner{ 615d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_free(s[0]); 625d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner qemu_free(s); 635d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner} 645d8f37ad78fc66901af50c762029a501561f3b23David 'Digit' Turner 658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void qemu_notirq(void *opaque, int line, int level) 668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project struct IRQState *irq = opaque; 688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project irq->handler(irq->opaque, irq->n, !level); 708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project 728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectqemu_irq qemu_irq_invert(qemu_irq irq) 738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{ 748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project /* The default state for IRQs is low, so raise the output now. */ 758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project qemu_irq_raise(irq); 768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project return qemu_allocate_irqs(qemu_notirq, irq, 1)[0]; 778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} 78