mirror of
https://github.com/apache/nuttx.git
synced 2026-05-28 20:08:15 +08:00
arch/arm64: use up_prioritize_irq and up_set_type_irq instead
arm64_gic_irq_set_priority use use up_prioritize_irq and up_set_type_irq as std api Signed-off-by: lipengfei28 <lipengfei28@xiaomi.com>
This commit is contained in:
@@ -648,7 +648,8 @@ static int a64_uart_attach(struct uart_dev_s *dev)
|
||||
|
||||
/* Set Interrupt Priority in Generic Interrupt Controller v2 */
|
||||
|
||||
arm64_gic_irq_set_priority(port->irq_num, 0, IRQ_TYPE_LEVEL);
|
||||
up_prioritize_irq(port->irq_num, 0);
|
||||
up_set_irq_type(port->irq_num, IRQ_HIGH_LEVEL);
|
||||
|
||||
/* Enable UART Interrupt */
|
||||
|
||||
|
||||
@@ -1845,7 +1845,8 @@ static void twi_hw_initialize(struct a64_twi_priv_s *priv)
|
||||
|
||||
/* Set Interrupt Priority in Generic Interrupt Controller v2 */
|
||||
|
||||
arm64_gic_irq_set_priority(priv->config->irq, IRQ_TYPE_LEVEL, 0);
|
||||
up_prioritize_irq(priv->config->irq, 0);
|
||||
up_set_irq_type(priv->config->irq, IRQ_HIGH_LEVEL);
|
||||
|
||||
/* Enable TWI Interrupt */
|
||||
|
||||
|
||||
@@ -272,7 +272,8 @@ static int bcm2711_gpio_irqs_init(void)
|
||||
for (int i = 0; i < NUM_GPIO_IRQS; i++)
|
||||
{
|
||||
up_enable_irq(g_gpio_irqs[i]);
|
||||
arm64_gic_irq_set_priority(g_gpio_irqs[i], 0, IRQ_TYPE_LEVEL);
|
||||
up_prioritize_irq(g_gpio_irqs[i], 0);
|
||||
up_set_irq_type(g_gpio_irqs[i], IRQ_HIGH_LEVEL);
|
||||
}
|
||||
|
||||
/* Mark as initialized. */
|
||||
|
||||
@@ -1106,7 +1106,8 @@ struct i2c_master_s *bcm2711_i2cbus_initialize(int port)
|
||||
|
||||
/* Enable interrupt handler */
|
||||
|
||||
arm64_gic_irq_set_priority(BCM_IRQ_VC_I2C, 0, IRQ_TYPE_EDGE);
|
||||
up_prioritize_irq(BCM_IRQ_VC_I2C, 0);
|
||||
up_set_irq_type(BCM_IRQ_VC_I2C, IRQ_RISING_EDGE);
|
||||
up_enable_irq(BCM_IRQ_VC_I2C);
|
||||
g_i2c_irqinit = true; /* Mark IRQ handler as initialized */
|
||||
i2cinfo("I2C IRQ enabled\n");
|
||||
|
||||
@@ -1068,7 +1068,8 @@ static int bcm2711_attach(FAR struct sdio_dev_s *dev)
|
||||
|
||||
/* Enable the interrupt handler */
|
||||
|
||||
arm64_gic_irq_set_priority(BCM_IRQ_VC_EMMC, 0, IRQ_TYPE_LEVEL);
|
||||
up_prioritize_irq(BCM_IRQ_VC_EMMC, 0);
|
||||
up_set_irq_type(BCM_IRQ_VC_EMMC, IRQ_HIGH_LEVEL);
|
||||
up_enable_irq(BCM_IRQ_VC_EMMC);
|
||||
g_emmc_irqinit = true;
|
||||
mcinfo("EMMC IRQ enabled.");
|
||||
|
||||
@@ -568,7 +568,8 @@ static int bcm2711_miniuart_attach(struct uart_dev_s *dev)
|
||||
|
||||
/* Set interrupt priority in GICv2 */
|
||||
|
||||
arm64_gic_irq_set_priority(BCM_IRQ_VC_AUX, 0, IRQ_TYPE_LEVEL);
|
||||
up_prioritize_irq(BCM_IRQ_VC_AUX, 0);
|
||||
up_set_irq_type(BCM_IRQ_VC_AUX, IRQ_HIGH_LEVEL);
|
||||
|
||||
/* Enable UART interrupt */
|
||||
|
||||
|
||||
@@ -1020,7 +1020,8 @@ struct spi_dev_s *bcm2711_spibus_initialize(int port)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
arm64_gic_irq_set_priority(BCM_IRQ_VC_SPI, 0, IRQ_TYPE_LEVEL);
|
||||
up_prioritize_irq(BCM_IRQ_VC_SPI, 0);
|
||||
up_set_irq_type(BCM_IRQ_VC_SPI, IRQ_HIGH_LEVEL);
|
||||
up_enable_irq(BCM_IRQ_VC_SPI);
|
||||
g_interrupts = true;
|
||||
|
||||
|
||||
@@ -248,10 +248,6 @@
|
||||
#define GICD_ICFGR_MASK BIT_MASK(2)
|
||||
#define GICD_ICFGR_TYPE BIT(1)
|
||||
|
||||
/* BIT(0) reserved for IRQ_ZERO_LATENCY */
|
||||
#define IRQ_TYPE_LEVEL BIT(1)
|
||||
#define IRQ_TYPE_EDGE BIT(2)
|
||||
|
||||
#define GIC_SPI_INT_BASE 32
|
||||
#define GIC_SPI_MAX_INTID 1019
|
||||
#define GIC_IS_SPI(intid) (((intid) >= GIC_SPI_INT_BASE) && \
|
||||
@@ -261,10 +257,6 @@
|
||||
#define GIC_DIST_IROUTER 0x6000
|
||||
#define IROUTER(base, n) (base + GIC_DIST_IROUTER + (n) * 8)
|
||||
|
||||
/* BIT(0) reserved for IRQ_ZERO_LATENCY */
|
||||
#define IRQ_TYPE_LEVEL BIT(1)
|
||||
#define IRQ_TYPE_EDGE BIT(2)
|
||||
|
||||
#define IRQ_DEFAULT_PRIORITY 0xa0
|
||||
|
||||
#define GIC_IRQ_SGI0 0
|
||||
@@ -300,8 +292,6 @@
|
||||
|
||||
bool arm64_gic_irq_is_enabled(unsigned int intid);
|
||||
int arm64_gic_initialize(void);
|
||||
void arm64_gic_irq_set_priority(unsigned int intid, unsigned int prio,
|
||||
uint32_t flags);
|
||||
|
||||
/****************************************************************************
|
||||
* Name: arm64_decodeirq
|
||||
|
||||
@@ -1373,56 +1373,6 @@ int up_set_irq_type(int irq, int mode)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: arm64_gic_irq_set_priority
|
||||
*
|
||||
* Description:
|
||||
* Set the interrupt priority and type.
|
||||
*
|
||||
* If CONFIG_SMP is not selected, the cpuset is ignored and SGI is sent
|
||||
* only to the current CPU.
|
||||
*
|
||||
* Input Parameters
|
||||
* intid - The SGI interrupt ID (0-15)
|
||||
* prio - The interrupt priority
|
||||
* flags - Bit IRQ_TYPE_EDGE is 1 if interrupt should be edge-triggered
|
||||
*
|
||||
* Returned Value:
|
||||
* None
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void arm64_gic_irq_set_priority(unsigned int intid, unsigned int prio,
|
||||
uint32_t flags)
|
||||
{
|
||||
int ret;
|
||||
|
||||
/* Disable the interrupt */
|
||||
|
||||
up_disable_irq(intid);
|
||||
|
||||
/* Set the interrupt priority */
|
||||
|
||||
ret = up_prioritize_irq(intid, prio);
|
||||
DEBUGASSERT(ret == OK);
|
||||
|
||||
/* Configure interrupt type */
|
||||
|
||||
if (!GIC_IS_SGI(intid))
|
||||
{
|
||||
if (flags & IRQ_TYPE_EDGE)
|
||||
{
|
||||
ret = up_set_irq_type(intid, IRQ_RISING_EDGE);
|
||||
DEBUGASSERT(ret == OK);
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = up_set_irq_type(intid, IRQ_HIGH_LEVEL);
|
||||
DEBUGASSERT(ret == OK);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Name: arm64_gic_initialize
|
||||
*
|
||||
|
||||
@@ -156,51 +156,6 @@ static inline void arm64_gic_write_irouter(uint64_t val, unsigned int intid)
|
||||
putreg64(val, addr);
|
||||
}
|
||||
|
||||
void arm64_gic_irq_set_priority(unsigned int intid, unsigned int prio,
|
||||
uint32_t flags)
|
||||
{
|
||||
uint32_t mask = BIT(intid & (GIC_NUM_INTR_PER_REG - 1));
|
||||
uint32_t idx = intid / GIC_NUM_INTR_PER_REG;
|
||||
uint32_t shift;
|
||||
uint32_t val;
|
||||
unsigned long base = GET_DIST_BASE(intid);
|
||||
irqstate_t irq_flags;
|
||||
|
||||
/* Disable the interrupt */
|
||||
|
||||
putreg32(mask, ICENABLER(base, idx));
|
||||
gic_wait_rwp(intid);
|
||||
|
||||
/* PRIORITYR registers provide byte access */
|
||||
|
||||
putreg8(prio & GIC_PRI_MASK, IPRIORITYR(base, intid));
|
||||
|
||||
/* Interrupt type config */
|
||||
|
||||
if (!GIC_IS_SGI(intid))
|
||||
{
|
||||
idx = intid / GIC_NUM_CFG_PER_REG;
|
||||
shift = (intid & (GIC_NUM_CFG_PER_REG - 1)) * 2;
|
||||
|
||||
/* GICD_ICFGR requires full 32-bit RMW operations.
|
||||
* Each interrupt uses 2 bits; thus updates must be synchronized
|
||||
* to avoid losing configuration in concurrent environments.
|
||||
*/
|
||||
|
||||
irq_flags = spin_lock_irqsave(&g_gic_lock);
|
||||
|
||||
val = getreg32(ICFGR(base, idx));
|
||||
val &= ~(GICD_ICFGR_MASK << shift);
|
||||
if (flags & IRQ_TYPE_EDGE)
|
||||
{
|
||||
val |= (GICD_ICFGR_TYPE << shift);
|
||||
}
|
||||
|
||||
putreg32(val, ICFGR(base, idx));
|
||||
spin_unlock_irqrestore(&g_gic_lock, irq_flags);
|
||||
}
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
* Name: up_set_irq_type
|
||||
*
|
||||
|
||||
@@ -641,7 +641,8 @@ static int a64_uart_attach(struct uart_dev_s *dev)
|
||||
|
||||
/* Set Interrupt Priority in Generic Interrupt Controller v2 */
|
||||
|
||||
arm64_gic_irq_set_priority(port->irq_num, 0, IRQ_TYPE_LEVEL);
|
||||
up_prioritize_irq(port->irq_num, 0);
|
||||
up_set_irq_type(port->irq_num, IRQ_RISING_EDGE);
|
||||
|
||||
/* Enable UART Interrupt */
|
||||
|
||||
|
||||
@@ -775,7 +775,8 @@ static int zynq_uart_attach(struct uart_dev_s *dev)
|
||||
|
||||
/* Set Interrupt Priority in Generic Interrupt Controller v2 */
|
||||
|
||||
arm64_gic_irq_set_priority(port->irq_num, 0, IRQ_TYPE_LEVEL);
|
||||
up_prioritize_irq(port->irq_num, 0);
|
||||
up_set_irq_type(port->irq_num, IRQ_HIGH_LEVEL);
|
||||
|
||||
/* Enable UART Interrupt */
|
||||
|
||||
|
||||
@@ -117,7 +117,8 @@ static int pinephone_gt9xx_irq_attach(const struct gt9xx_board_s *state,
|
||||
|
||||
/* Set Interrupt Priority in Generic Interrupt Controller v2 */
|
||||
|
||||
arm64_gic_irq_set_priority(A64_IRQ_PH_EINT, 0, IRQ_TYPE_EDGE);
|
||||
up_prioritize_irq(A64_IRQ_PH_EINT, 0);
|
||||
up_set_irq_type(A64_IRQ_PH_EINT, IRQ_RISING_EDGE);
|
||||
|
||||
/* Enable Interrupts for Port PH */
|
||||
|
||||
|
||||
Reference in New Issue
Block a user