1 /* 2 * Copyright (c) 2013-2019, Huawei Technologies Co., Ltd. All rights reserved. 3 * Copyright (c) 2020, Huawei Device Co., Ltd. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without modification, 6 * are permitted provided that the following conditions are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright notice, this list of 9 * conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright notice, this list 12 * of conditions and the following disclaimer in the documentation and/or other materials 13 * provided with the distribution. 14 * 15 * 3. Neither the name of the copyright holder nor the names of its contributors may be used 16 * to endorse or promote products derived from this software without specific prior written 17 * permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 21 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 23 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 24 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 25 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 26 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 27 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 28 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 29 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 32 #include "linux/interrupt.h" 33 #include "los_hwi.h" 34 35 36 int linux_request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, 37 const char *name, void *dev) 38 { 39 UINT32 ret; 40 HwiIrqParam irqParam; 41 42 if (OS_INT_ACTIVE) { 43 return OS_ERRNO_HWI_INTERR; 44 } 45 46 irqParam.swIrq = (INT32)irq; 47 irqParam.pDevId = dev; 48 irqParam.pName = name; 49 50 ret = LOS_HwiCreate(irq, IRQ_DEFAULT_PRIORITY, (HWI_MODE_T)flags, (HWI_PROC_FUNC)handler, &irqParam); 51 if (ret == LOS_OK) { 52 HalIrqUnmask(irq); 53 } 54 return (INT32)ret; 55 } 56 57 void linux_free_irq(unsigned int irq, void *devID) 58 { 59 HwiIrqParam irqParam; 60 61 if (OS_INT_ACTIVE) { 62 return; 63 } 64 65 irqParam.swIrq = (INT32)irq; 66 irqParam.pDevId = devID; 67 68 (VOID)LOS_HwiDelete(irq, &irqParam); 69 return; 70 } 71 72 void linux_enable_irq(unsigned int irq) 73 { 74 HalIrqUnmask(irq); 75 } 76 77 void linux_disable_irq(unsigned int irq) 78 { 79 HalIrqMask(irq); 80 } 81 82 #ifdef WORKQUEUE_SUPPORT_PRIORITY 83 bool irq_bottom_half(struct workqueue_struct *workQueue, irq_bottom_half_handler_t handler, void *data, 84 unsigned int pri) 85 #else 86 bool irq_bottom_half(struct workqueue_struct *workQueue, irq_bottom_half_handler_t handler, void *data) 87 #endif 88 { 89 struct work_struct *work = NULL; 90 91 if ((workQueue == NULL) || (handler == NULL)) { 92 return FALSE; 93 } 94 95 #ifdef WORKQUEUE_SUPPORT_PRIORITY 96 if ((pri >= OS_WORK_PRIORITY_DEFAULT) || (pri >= OS_WORK_PRIORITY_LOWEST)) { 97 return FALSE; 98 } 99 #endif 100 101 work = (struct work_struct *)LOS_MemAlloc(m_aucSysMem0, sizeof(struct work_struct)); 102 if (work == NULL) { 103 return FALSE; 104 } 105 106 INIT_WORK(work, handler); 107 108 work->data = (atomic_long_t)data; 109 #ifdef WORKQUEUE_SUPPORT_PRIORITY 110 work->work_pri = pri; 111 #endif 112 if (!(queue_work(workQueue, work))) { 113 (VOID)LOS_MemFree(m_aucSysMem0, work); 114 return FALSE; 115 } 116 return TRUE; 117 } 118 119