summaryrefslogtreecommitdiff
path: root/drivers/irqchip/irq-imx-irqsteer.c
diff options
context:
space:
mode:
authorFancy Fang <chen.fang@nxp.com>2017-08-04 18:33:44 +0800
committerJason Liu <jason.hui.liu@nxp.com>2019-02-12 10:27:56 +0800
commited776159eae3ff592527bdfff9cb5cfd8a501643 (patch)
tree53a6442a181ce8afba9959f66fdc40f8c71261b6 /drivers/irqchip/irq-imx-irqsteer.c
parent2caf24c8652d35d632652e160cd53d0dcd65086d (diff)
MLK-16136-9 irqchip: imx-irqsteer: adjust irq config via 'endian'.
Change the irq configurations with adding endianness determination for different platforms which may choose different kinds of endianess. Signed-off-by: Fancy Fang <chen.fang@nxp.com>
Diffstat (limited to 'drivers/irqchip/irq-imx-irqsteer.c')
-rw-r--r--drivers/irqchip/irq-imx-irqsteer.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/drivers/irqchip/irq-imx-irqsteer.c b/drivers/irqchip/irq-imx-irqsteer.c
index 9727445196d0..27afb237347b 100644
--- a/drivers/irqchip/irq-imx-irqsteer.c
+++ b/drivers/irqchip/irq-imx-irqsteer.c
@@ -31,6 +31,7 @@ struct irqsteer_irqchip_data {
struct clk *ipg_clk;
int irq;
int channum;
+ int endian; /* 0: littel endian; 1: big endian */
struct irq_domain *domain;
unsigned int irqstat[];
};
@@ -42,7 +43,8 @@ static void imx_irqsteer_irq_unmask(struct irq_data *d)
u32 val, idx;
spin_lock(&irqsteer_data->lock);
- idx = d->hwirq / 32;
+ idx = irqsteer_data->endian ? (irqsteer_data->channum - d->hwirq / 32 - 1) :
+ d->hwirq / 32;
reg = irqsteer_data->regs + CHANMASK(idx);
val = readl_relaxed(reg);
val |= 1 << (d->hwirq % 32);
@@ -111,7 +113,9 @@ static void imx_irqsteer_update_irqstat(struct irqsteer_irqchip_data *irqsteer_d
*/
for (i = 0; i < irqsteer_data->channum; i++)
irqsteer_data->irqstat[i] = readl_relaxed(irqsteer_data->regs +
- CHANSTATUS(i));
+ CHANSTATUS(irqsteer_data->endian ?
+ (irqsteer_data->channum - i - 1) :
+ i));
}
static void imx_irqsteer_irq_handler(struct irq_desc *desc)
@@ -145,13 +149,18 @@ static int imx_irqsteer_probe(struct platform_device *pdev)
struct device_node *np = pdev->dev.of_node;
struct irqsteer_irqchip_data *irqsteer_data;
struct resource *res;
- int channum;
+ int channum, endian;
int ret;
ret = of_property_read_u32(np, "nxp,irqsteer_chans", &channum);
if (ret)
channum = 1;
+ ret = of_property_read_u32(np, "nxp,endian", &endian);
+ if (ret)
+ /* default is LSB */
+ endian = 0;
+
irqsteer_data = devm_kzalloc(&pdev->dev, sizeof(*irqsteer_data) +
channum *
sizeof(irqsteer_data->irqstat[0]),
@@ -181,6 +190,7 @@ static int imx_irqsteer_probe(struct platform_device *pdev)
}
irqsteer_data->channum = channum;
+ irqsteer_data->endian = endian;
irqsteer_data->pdev = pdev;
spin_lock_init(&irqsteer_data->lock);