|
@@ -88,6 +88,19 @@ void cx18_writel_retry(struct cx18 *cx, u32 val, void __iomem *addr)
|
|
|
cx18_log_write_retries(cx, i, addr);
|
|
cx18_log_write_retries(cx, i, addr);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+void _cx18_writel_expect(struct cx18 *cx, u32 val, void __iomem *addr,
|
|
|
|
|
+ u32 eval, u32 mask)
|
|
|
|
|
+{
|
|
|
|
|
+ int i;
|
|
|
|
|
+ eval &= mask;
|
|
|
|
|
+ for (i = 0; i < CX18_MAX_MMIO_RETRIES; i++) {
|
|
|
|
|
+ cx18_writel_noretry(cx, val, addr);
|
|
|
|
|
+ if (eval == (cx18_readl_noretry(cx, addr) & mask))
|
|
|
|
|
+ break;
|
|
|
|
|
+ }
|
|
|
|
|
+ cx18_log_write_retries(cx, i, addr);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
void cx18_writew_retry(struct cx18 *cx, u16 val, void __iomem *addr)
|
|
void cx18_writew_retry(struct cx18 *cx, u16 val, void __iomem *addr)
|
|
|
{
|
|
{
|
|
|
int i;
|
|
int i;
|
|
@@ -218,7 +231,7 @@ void cx18_memset_io(struct cx18 *cx, void __iomem *addr, int val, size_t count)
|
|
|
void cx18_sw1_irq_enable(struct cx18 *cx, u32 val)
|
|
void cx18_sw1_irq_enable(struct cx18 *cx, u32 val)
|
|
|
{
|
|
{
|
|
|
u32 r;
|
|
u32 r;
|
|
|
- cx18_write_reg_noretry(cx, val, SW1_INT_STATUS);
|
|
|
|
|
|
|
+ cx18_write_reg_expect(cx, val, SW1_INT_STATUS, ~val, val);
|
|
|
r = cx18_read_reg(cx, SW1_INT_ENABLE_PCI);
|
|
r = cx18_read_reg(cx, SW1_INT_ENABLE_PCI);
|
|
|
cx18_write_reg(cx, r | val, SW1_INT_ENABLE_PCI);
|
|
cx18_write_reg(cx, r | val, SW1_INT_ENABLE_PCI);
|
|
|
}
|
|
}
|
|
@@ -233,7 +246,7 @@ void cx18_sw1_irq_disable(struct cx18 *cx, u32 val)
|
|
|
void cx18_sw2_irq_enable(struct cx18 *cx, u32 val)
|
|
void cx18_sw2_irq_enable(struct cx18 *cx, u32 val)
|
|
|
{
|
|
{
|
|
|
u32 r;
|
|
u32 r;
|
|
|
- cx18_write_reg_noretry(cx, val, SW2_INT_STATUS);
|
|
|
|
|
|
|
+ cx18_write_reg_expect(cx, val, SW2_INT_STATUS, ~val, val);
|
|
|
r = cx18_read_reg(cx, SW2_INT_ENABLE_PCI);
|
|
r = cx18_read_reg(cx, SW2_INT_ENABLE_PCI);
|
|
|
cx18_write_reg(cx, r | val, SW2_INT_ENABLE_PCI);
|
|
cx18_write_reg(cx, r | val, SW2_INT_ENABLE_PCI);
|
|
|
}
|
|
}
|