提交 3b5bcd2a 编写于 作者: C Chong Qiao 提交者: Hongchen Zhang

irqchip/loongson-pch-pic: 7a1000 int_clear reg must use 64bit write.

LoongArch inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7BUJN

--------------------------------
Signed-off-by: NChong Qiao <qiaochong@loongson.cn>
Signed-off-by: NHongchen Zhang <zhanghongchen@loongson.cn>
上级 55c10867
...@@ -33,6 +33,10 @@ ...@@ -33,6 +33,10 @@
#define PIC_COUNT (PIC_COUNT_PER_REG * PIC_REG_COUNT) #define PIC_COUNT (PIC_COUNT_PER_REG * PIC_REG_COUNT)
#define PIC_REG_IDX(irq_id) ((irq_id) / PIC_COUNT_PER_REG) #define PIC_REG_IDX(irq_id) ((irq_id) / PIC_COUNT_PER_REG)
#define PIC_REG_BIT(irq_id) ((irq_id) % PIC_COUNT_PER_REG) #define PIC_REG_BIT(irq_id) ((irq_id) % PIC_COUNT_PER_REG)
#define PIC_COUNT_PER_REG64 64
#define PIC_REG64_COUNT 1
#define PIC_REG64_IDX(irq_id) ((irq_id) / PIC_COUNT_PER_REG64)
#define PIC_REG64_BIT(irq_id) ((irq_id) % PIC_COUNT_PER_REG64)
static int nr_pics; static int nr_pics;
...@@ -88,8 +92,8 @@ static void pch_pic_unmask_irq(struct irq_data *d) ...@@ -88,8 +92,8 @@ static void pch_pic_unmask_irq(struct irq_data *d)
{ {
struct pch_pic *priv = irq_data_get_irq_chip_data(d); struct pch_pic *priv = irq_data_get_irq_chip_data(d);
writel(BIT(PIC_REG_BIT(d->hwirq)), writeq(BIT(PIC_REG64_BIT(d->hwirq)),
priv->base + PCH_PIC_CLR + PIC_REG_IDX(d->hwirq) * 4); priv->base + PCH_PIC_CLR + PIC_REG64_IDX(d->hwirq) * 8);
irq_chip_unmask_parent(d); irq_chip_unmask_parent(d);
pch_pic_bitclr(priv, PCH_PIC_MASK, d->hwirq); pch_pic_bitclr(priv, PCH_PIC_MASK, d->hwirq);
...@@ -136,8 +140,8 @@ static void pch_pic_ack_irq(struct irq_data *d) ...@@ -136,8 +140,8 @@ static void pch_pic_ack_irq(struct irq_data *d)
reg = readl(priv->base + PCH_PIC_EDGE + PIC_REG_IDX(d->hwirq) * 4); reg = readl(priv->base + PCH_PIC_EDGE + PIC_REG_IDX(d->hwirq) * 4);
if (reg & BIT(PIC_REG_BIT(d->hwirq))) { if (reg & BIT(PIC_REG_BIT(d->hwirq))) {
writel(BIT(PIC_REG_BIT(d->hwirq)), writeq(BIT(PIC_REG64_BIT(d->hwirq)),
priv->base + PCH_PIC_CLR + PIC_REG_IDX(d->hwirq) * 4); priv->base + PCH_PIC_CLR + PIC_REG64_IDX(d->hwirq) * 8);
} }
irq_chip_ack_parent(d); irq_chip_ack_parent(d);
} }
...@@ -224,13 +228,15 @@ static void pch_pic_reset(struct pch_pic *priv) ...@@ -224,13 +228,15 @@ static void pch_pic_reset(struct pch_pic *priv)
for (i = 0; i < PIC_REG_COUNT; i++) { for (i = 0; i < PIC_REG_COUNT; i++) {
/* Clear IRQ cause registers, mask all interrupts */ /* Clear IRQ cause registers, mask all interrupts */
writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_MASK + 4 * i); writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_MASK + 4 * i);
writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_CLR + 4 * i);
/* Clear auto bounce, we don't need that */ /* Clear auto bounce, we don't need that */
writel_relaxed(0, priv->base + PCH_PIC_AUTO0 + 4 * i); writel_relaxed(0, priv->base + PCH_PIC_AUTO0 + 4 * i);
writel_relaxed(0, priv->base + PCH_PIC_AUTO1 + 4 * i); writel_relaxed(0, priv->base + PCH_PIC_AUTO1 + 4 * i);
/* Enable HTMSI transformer */ /* Enable HTMSI transformer */
writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_HTMSI_EN + 4 * i); writel_relaxed(0xFFFFFFFF, priv->base + PCH_PIC_HTMSI_EN + 4 * i);
} }
for (i = 0; i < PIC_REG64_COUNT; i++)
writeq_relaxed((u64)-1, priv->base + PCH_PIC_CLR + 8 * i);
} }
static int pch_pic_suspend(void) static int pch_pic_suspend(void)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册