1
0
mirror of https://xff.cz/git/u-boot/ synced 2025-09-01 16:52:14 +02:00
Files
u-boot-megous/include/irq.h
Simon Glass ba87607971 dm: irq: Add support for interrupt controller types
There can be different types of interrupt controllers in a system and some
drivers may need to distinguish between these. In general this can be
handled using the device tree by adding the interrupt information to
device nodes.

However on x86 devices we have interrupt controllers which are not tied
to any particular device and not really used in U-Boot. These still need
to be inited, so a convenient method is to give each controller a type
and allow a particular controller type to be probed.

Add support for this in sandbox along with a test.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
[bmeng: remove the new bland line at EOF of test/dm/irq.c]
Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
2020-02-07 22:44:59 +08:00

112 lines
2.6 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* IRQ is a type of interrupt controller used on recent Intel SoC.
*
* Copyright 2019 Google LLC
*/
#ifndef __irq_H
#define __irq_H
/*
* Interrupt controller types available. You can find a particular one with
* irq_first_device_type()
*/
enum irq_dev_t {
X86_IRQT_BASE, /* Base controller */
X86_IRQT_ITSS, /* ITSS controller, e.g. on APL */
X86_IRQT_ACPI_GPE, /* ACPI General-Purpose Events controller */
SANDBOX_IRQT_BASE, /* Sandbox testing */
};
/**
* struct irq_ops - Operations for the IRQ
*/
struct irq_ops {
/**
* route_pmc_gpio_gpe() - Get the GPIO for an event
*
* @dev: IRQ device
* @pmc_gpe_num: Event number to check
* @returns GPIO for the event, or -ENOENT if none
*/
int (*route_pmc_gpio_gpe)(struct udevice *dev, uint pmc_gpe_num);
/**
* set_polarity() - Set the IRQ polarity
*
* @dev: IRQ device
* @irq: Interrupt number to set
* @active_low: true if active low, false for active high
* @return 0 if OK, -EINVAL if @irq is invalid
*/
int (*set_polarity)(struct udevice *dev, uint irq, bool active_low);
/**
* snapshot_polarities() - record IRQ polarities for later restore
*
* @dev: IRQ device
* @return 0
*/
int (*snapshot_polarities)(struct udevice *dev);
/**
* restore_polarities() - restore IRQ polarities
*
* @dev: IRQ device
* @return 0
*/
int (*restore_polarities)(struct udevice *dev);
};
#define irq_get_ops(dev) ((struct irq_ops *)(dev)->driver->ops)
/**
* irq_route_pmc_gpio_gpe() - Get the GPIO for an event
*
* @dev: IRQ device
* @pmc_gpe_num: Event number to check
* @returns GPIO for the event, or -ENOENT if none
*/
int irq_route_pmc_gpio_gpe(struct udevice *dev, uint pmc_gpe_num);
/**
* irq_set_polarity() - Set the IRQ polarity
*
* @dev: IRQ device
* @irq: Interrupt number to set
* @active_low: true if active low, false for active high
* @return 0 if OK, -EINVAL if @irq is invalid
*/
int irq_set_polarity(struct udevice *dev, uint irq, bool active_low);
/**
* irq_snapshot_polarities() - record IRQ polarities for later restore
*
* @dev: IRQ device
* @return 0
*/
int irq_snapshot_polarities(struct udevice *dev);
/**
* irq_restore_polarities() - restore IRQ polarities
*
* @dev: IRQ device
* @return 0
*/
int irq_restore_polarities(struct udevice *dev);
/**
* irq_first_device_type() - Get a particular interrupt controller
*
* On success this returns an activated interrupt device.
*
* @type: Type to find
* @devp: Returns the device, if found
* @return 0 if OK, -ENODEV if not found, other -ve error if uclass failed to
* probe
*/
int irq_first_device_type(enum irq_dev_t type, struct udevice **devp);
#endif