/* SPDX-License-Identifier: GPL-2.0-or-later */ /* * ALSA SoC - Samsung Abox GIC driver * * Copyright (c) 2016 Samsung Electronics Co. Ltd. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef __SND_SOC_ABOX_GIC_H #define __SND_SOC_ABOX_GIC_H #include #include "abox_soc.h" struct abox_gic_irq_handler_t { irq_handler_t handler; void *dev_id; }; struct abox_gic_data { struct device *dev; void __iomem *gicd_base; void __iomem *gicc_base; phys_addr_t gicd_base_phys; phys_addr_t gicc_base_phys; size_t gicd_size; size_t gicc_size; int irq; struct abox_gic_irq_handler_t handler[IRQ_COUNT]; bool disabled; }; /** * Dump ABOX GIC Distributor SFR * @param[in] dev pointer to abox_gic device * @param[in] dump gpr dump * @param[in] off dump start offset * @param[in] size size of dump * @return error code or 0 */ extern int abox_gicd_dump(struct device *dev, char *dump, size_t off, size_t size); /** * Enable or disable an IRQ * @param[in] dev pointer to abox_gic device * @param[in] irq irq id * @param[in] en enable */ extern void abox_gic_enable(struct device *dev, unsigned int irq, bool en); /** * Change target of an IRQ * @param[in] dev pointer to abox_gic device * @param[in] irq irq id * @param[in] target target */ extern void abox_gic_target(struct device *dev, unsigned int irq, enum abox_gic_target target); /** * Change target of an IRQ to ap * @param[in] dev pointer to abox_gic device * @param[in] irq irq id */ static inline void abox_gic_target_ap(struct device *dev, unsigned int irq) { abox_gic_target(dev, irq, ABOX_GIC_AP); } /** * Change target of an IRQ to core0 * @param[in] dev pointer to abox_gic device * @param[in] irq irq id */ static inline void abox_gic_target_core0(struct device *dev, unsigned int irq) { abox_gic_target(dev, irq, ABOX_GIC_CORE0); } /** * Generate interrupt * @param[in] dev pointer to abox_gic device * @param[in] irq irq number */ extern void abox_gic_generate_interrupt(struct device *dev, unsigned int irq); /** * Register interrupt handler * @param[in] dev pointer to abox_gic device * @param[in] irq irq number * @param[in] handler function to be called on interrupt * @param[in] dev_id cookie for interrupt. * @return error code or 0 */ extern int abox_gic_register_irq_handler(struct device *dev, unsigned int irq, irq_handler_t handler, void *dev_id); /** * Unregister interrupt handler * @param[in] dev pointer to abox_gic device * @param[in] irq irq number * @return error code or 0 */ extern int abox_gic_unregister_irq_handler(struct device *dev, unsigned int irq); /** * Enable abox gic irq * @param[in] dev pointer to abox_gic device */ extern int abox_gic_enable_irq(struct device *dev); /** * Disable abox gic irq * @param[in] dev pointer to abox_gic device */ extern int abox_gic_disable_irq(struct device *dev); /** * Initialize abox gic * @param[in] dev pointer to abox_gic device */ extern void abox_gic_init_gic(struct device *dev); #endif /* __SND_SOC_ABOX_GIC_H */