1c59a5c48SFrançois Tigeot /* 2c59a5c48SFrançois Tigeot * Copyright 2015 Advanced Micro Devices, Inc. 3c59a5c48SFrançois Tigeot * 4c59a5c48SFrançois Tigeot * Permission is hereby granted, free of charge, to any person obtaining a 5c59a5c48SFrançois Tigeot * copy of this software and associated documentation files (the "Software"), 6c59a5c48SFrançois Tigeot * to deal in the Software without restriction, including without limitation 7c59a5c48SFrançois Tigeot * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c59a5c48SFrançois Tigeot * and/or sell copies of the Software, and to permit persons to whom the 9c59a5c48SFrançois Tigeot * Software is furnished to do so, subject to the following conditions: 10c59a5c48SFrançois Tigeot * 11c59a5c48SFrançois Tigeot * The above copyright notice and this permission notice shall be included in 12c59a5c48SFrançois Tigeot * all copies or substantial portions of the Software. 13c59a5c48SFrançois Tigeot * 14c59a5c48SFrançois Tigeot * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15c59a5c48SFrançois Tigeot * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16c59a5c48SFrançois Tigeot * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17c59a5c48SFrançois Tigeot * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18c59a5c48SFrançois Tigeot * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19c59a5c48SFrançois Tigeot * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20c59a5c48SFrançois Tigeot * OTHER DEALINGS IN THE SOFTWARE. 21c59a5c48SFrançois Tigeot * 22c59a5c48SFrançois Tigeot * 23c59a5c48SFrançois Tigeot */ 24c59a5c48SFrançois Tigeot #ifndef _CGS_LINUX_H 25c59a5c48SFrançois Tigeot #define _CGS_LINUX_H 26c59a5c48SFrançois Tigeot 27c59a5c48SFrançois Tigeot #include "cgs_common.h" 28c59a5c48SFrançois Tigeot 29c59a5c48SFrançois Tigeot /** 30c59a5c48SFrançois Tigeot * cgs_irq_source_set_func() - Callback for enabling/disabling interrupt sources 31c59a5c48SFrançois Tigeot * @private_data: private data provided to cgs_add_irq_source 32c59a5c48SFrançois Tigeot * @src_id: interrupt source ID 33c59a5c48SFrançois Tigeot * @type: interrupt type 34c59a5c48SFrançois Tigeot * @enabled: 0 = disable source, non-0 = enable source 35c59a5c48SFrançois Tigeot * 36c59a5c48SFrançois Tigeot * Return: 0 on success, -errno otherwise 37c59a5c48SFrançois Tigeot */ 38c59a5c48SFrançois Tigeot typedef int (*cgs_irq_source_set_func_t)(void *private_data, 39c59a5c48SFrançois Tigeot unsigned src_id, unsigned type, 40c59a5c48SFrançois Tigeot int enabled); 41c59a5c48SFrançois Tigeot 42c59a5c48SFrançois Tigeot /** 43c59a5c48SFrançois Tigeot * cgs_irq_handler_func() - Interrupt handler callback 44c59a5c48SFrançois Tigeot * @private_data: private data provided to cgs_add_irq_source 45c59a5c48SFrançois Tigeot * @src_id: interrupt source ID 46c59a5c48SFrançois Tigeot * @iv_entry: pointer to raw ih ring entry 47c59a5c48SFrançois Tigeot * 48c59a5c48SFrançois Tigeot * This callback runs in interrupt context. 49c59a5c48SFrançois Tigeot * 50c59a5c48SFrançois Tigeot * Return: 0 on success, -errno otherwise 51c59a5c48SFrançois Tigeot */ 52c59a5c48SFrançois Tigeot typedef int (*cgs_irq_handler_func_t)(void *private_data, 53c59a5c48SFrançois Tigeot unsigned src_id, const uint32_t *iv_entry); 54c59a5c48SFrançois Tigeot 55c59a5c48SFrançois Tigeot /** 56c59a5c48SFrançois Tigeot * cgs_add_irq_source() - Add an IRQ source 57c59a5c48SFrançois Tigeot * @cgs_device: opaque device handle 58c59a5c48SFrançois Tigeot * @src_id: interrupt source ID 59c59a5c48SFrançois Tigeot * @num_types: number of interrupt types that can be independently enabled 60c59a5c48SFrançois Tigeot * @set: callback function to enable/disable an interrupt type 61c59a5c48SFrançois Tigeot * @handler: interrupt handler callback 62c59a5c48SFrançois Tigeot * @private_data: private data to pass to callback functions 63c59a5c48SFrançois Tigeot * 64c59a5c48SFrançois Tigeot * The same IRQ source can be added only once. Adding an IRQ source 65c59a5c48SFrançois Tigeot * indicates ownership of that IRQ source and all its IRQ types. 66c59a5c48SFrançois Tigeot * 67c59a5c48SFrançois Tigeot * Return: 0 on success, -errno otherwise 68c59a5c48SFrançois Tigeot */ 69*d78d3a22SFrançois Tigeot typedef int (*cgs_add_irq_source_t)(struct cgs_device *cgs_device, unsigned src_id, 70c59a5c48SFrançois Tigeot unsigned num_types, 71c59a5c48SFrançois Tigeot cgs_irq_source_set_func_t set, 72c59a5c48SFrançois Tigeot cgs_irq_handler_func_t handler, 73c59a5c48SFrançois Tigeot void *private_data); 74c59a5c48SFrançois Tigeot 75c59a5c48SFrançois Tigeot /** 76c59a5c48SFrançois Tigeot * cgs_irq_get() - Request enabling an IRQ source and type 77c59a5c48SFrançois Tigeot * @cgs_device: opaque device handle 78c59a5c48SFrançois Tigeot * @src_id: interrupt source ID 79c59a5c48SFrançois Tigeot * @type: interrupt type 80c59a5c48SFrançois Tigeot * 81c59a5c48SFrançois Tigeot * cgs_irq_get and cgs_irq_put calls must be balanced. They count 82c59a5c48SFrançois Tigeot * "references" to IRQ sources. 83c59a5c48SFrançois Tigeot * 84c59a5c48SFrançois Tigeot * Return: 0 on success, -errno otherwise 85c59a5c48SFrançois Tigeot */ 86*d78d3a22SFrançois Tigeot typedef int (*cgs_irq_get_t)(struct cgs_device *cgs_device, unsigned src_id, unsigned type); 87c59a5c48SFrançois Tigeot 88c59a5c48SFrançois Tigeot /** 89c59a5c48SFrançois Tigeot * cgs_irq_put() - Indicate IRQ source is no longer needed 90c59a5c48SFrançois Tigeot * @cgs_device: opaque device handle 91c59a5c48SFrançois Tigeot * @src_id: interrupt source ID 92c59a5c48SFrançois Tigeot * @type: interrupt type 93c59a5c48SFrançois Tigeot * 94c59a5c48SFrançois Tigeot * cgs_irq_get and cgs_irq_put calls must be balanced. They count 95c59a5c48SFrançois Tigeot * "references" to IRQ sources. Even after cgs_irq_put is called, the 96c59a5c48SFrançois Tigeot * IRQ handler may still be called if there are more refecences to 97c59a5c48SFrançois Tigeot * the IRQ source. 98c59a5c48SFrançois Tigeot * 99c59a5c48SFrançois Tigeot * Return: 0 on success, -errno otherwise 100c59a5c48SFrançois Tigeot */ 101*d78d3a22SFrançois Tigeot typedef int (*cgs_irq_put_t)(struct cgs_device *cgs_device, unsigned src_id, unsigned type); 102c59a5c48SFrançois Tigeot 103c59a5c48SFrançois Tigeot struct cgs_os_ops { 104c59a5c48SFrançois Tigeot /* IRQ handling */ 105c59a5c48SFrançois Tigeot cgs_add_irq_source_t add_irq_source; 106c59a5c48SFrançois Tigeot cgs_irq_get_t irq_get; 107c59a5c48SFrançois Tigeot cgs_irq_put_t irq_put; 108c59a5c48SFrançois Tigeot }; 109c59a5c48SFrançois Tigeot 110c59a5c48SFrançois Tigeot #define cgs_add_irq_source(dev,src_id,num_types,set,handler,private_data) \ 111c59a5c48SFrançois Tigeot CGS_OS_CALL(add_irq_source,dev,src_id,num_types,set,handler, \ 112c59a5c48SFrançois Tigeot private_data) 113c59a5c48SFrançois Tigeot #define cgs_irq_get(dev,src_id,type) \ 114c59a5c48SFrançois Tigeot CGS_OS_CALL(irq_get,dev,src_id,type) 115c59a5c48SFrançois Tigeot #define cgs_irq_put(dev,src_id,type) \ 116c59a5c48SFrançois Tigeot CGS_OS_CALL(irq_put,dev,src_id,type) 117c59a5c48SFrançois Tigeot 118c59a5c48SFrançois Tigeot #endif /* _CGS_LINUX_H */ 119