Commit 96a207cd authored by Grzegorz Daniluk's avatar Grzegorz Daniluk Committed by Adam Wujek

kernel/wr_rtu: get IRQ number from the VIC domain

parent ccfc120a
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <linux/wait.h> #include <linux/wait.h>
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/irqdomain.h>
/* /*
* Ugly trick to be able to use headers that have been moved out * Ugly trick to be able to use headers that have been moved out
...@@ -70,6 +71,13 @@ static struct RTU_WB __iomem *regs; ...@@ -70,6 +71,13 @@ static struct RTU_WB __iomem *regs;
#define wr_rtu_readl(r) __raw_readl(&regs->r); #define wr_rtu_readl(r) __raw_readl(&regs->r);
#define wr_rtu_writel(val, r) __raw_writel(val, &regs->r); #define wr_rtu_writel(val, r) __raw_writel(val, &regs->r);
/**
* IRQ domain to be used. This is static here but in general it should be
* a module parameter or somehow configurable. For the time being we keep
* it hard-coded here.
*/
static const char *irqdomain_name = "htvic-wr-swi.0";
static void wr_rtu_enable_irq(void) static void wr_rtu_enable_irq(void)
{ {
wr_rtu_writel(RTU_EIC_IER_NEMPTY, EIC_IER); wr_rtu_writel(RTU_EIC_IER_NEMPTY, EIC_IER);
...@@ -159,6 +167,15 @@ static struct miscdevice wr_rtu_misc = { ...@@ -159,6 +167,15 @@ static struct miscdevice wr_rtu_misc = {
static int __init wr_rtu_init(void) static int __init wr_rtu_init(void)
{ {
int err; int err;
int irq;
struct irq_domain *irqdomain;
irqdomain = irq_find_host((struct device_node *)irqdomain_name);
if (!irqdomain) {
pr_err("pstat: The IRQ domain %s does not exist\n",
irqdomain_name);
return -EINVAL;
}
// register misc device // register misc device
err = misc_register(&wr_rtu_misc); err = misc_register(&wr_rtu_misc);
...@@ -182,9 +199,8 @@ static int __init wr_rtu_init(void) ...@@ -182,9 +199,8 @@ static int __init wr_rtu_init(void)
// register interrupt handler // register interrupt handler
wr_rtu_disable_irq(); wr_rtu_disable_irq();
err = request_irq( irq = irq_find_mapping(irqdomain, WR_RTU_IRQ);
WRVIC_BASE_IRQ + WR_RTU_IRQ, err = request_irq(irq, wr_rtu_interrupt,
wr_rtu_interrupt,
IRQF_SHARED, IRQF_SHARED,
"wr-rtu", "wr-rtu",
(void*)regs (void*)regs
...@@ -209,10 +225,20 @@ static int __init wr_rtu_init(void) ...@@ -209,10 +225,20 @@ static int __init wr_rtu_init(void)
static void __exit wr_rtu_exit(void) static void __exit wr_rtu_exit(void)
{ {
int irq;
struct irq_domain *irqdomain;
// disable RTU interrupts // disable RTU interrupts
wr_rtu_disable_irq(); wr_rtu_disable_irq();
// Unregister IRQ handler // Unregister IRQ handler
free_irq(WRVIC_BASE_IRQ + WR_RTU_IRQ, (void*)regs); irqdomain = irq_find_host((struct device_node *)irqdomain_name);
if (!irqdomain) {
pr_err("pstat: The IRQ domain %s does not exist\n",
irqdomain_name);
} else {
irq = irq_find_mapping(irqdomain, WR_RTU_IRQ);
free_irq(irq, (void*)regs);
}
// Unmap RTU memory // Unmap RTU memory
iounmap(regs); iounmap(regs);
// Unregister misc device driver // Unregister misc device driver
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment