kernel_samsung_a53x/sound/soc/samsung/abox/abox_gic.h
2024-06-15 16:02:09 -03:00

129 lines
3.1 KiB
C
Executable file

/* 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 <linux/interrupt.h>
#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 */