mirror of
https://github.com/AsahiLinux/m1n1
synced 2024-12-22 19:43:05 +00:00
38 lines
794 B
C
38 lines
794 B
C
|
/* SPDX-License-Identifier: MIT */
|
||
|
|
||
|
#include "aic.h"
|
||
|
#include "adt.h"
|
||
|
#include "aic_regs.h"
|
||
|
#include "utils.h"
|
||
|
|
||
|
u64 aic_base;
|
||
|
|
||
|
#define MASK_REG(x) (4 * ((x) >> 5))
|
||
|
#define MASK_BIT(x) BIT((x)&GENMASK(4, 0))
|
||
|
|
||
|
void aic_init(void)
|
||
|
{
|
||
|
int path[8];
|
||
|
int node = adt_path_offset_trace(adt, "/arm-io/aic", path);
|
||
|
|
||
|
if (node < 0) {
|
||
|
printf("AIC node not found!\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if (adt_get_reg(adt, path, "reg", 0, &aic_base, NULL)) {
|
||
|
printf("Failed to get AIC reg property!\n");
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
printf("AIC registers @ 0x%lx\n", aic_base);
|
||
|
}
|
||
|
|
||
|
void aic_set_sw(int irq, bool active)
|
||
|
{
|
||
|
if (active)
|
||
|
write32(aic_base + AIC_SW_SET + MASK_REG(irq), MASK_BIT(irq));
|
||
|
else
|
||
|
write32(aic_base + AIC_SW_CLR + MASK_REG(irq), MASK_BIT(irq));
|
||
|
}
|