sh: intc: Add IRQ trigger bit field check
authorMagnus Damm <damm@opensource.se>
Mon, 17 Oct 2011 08:59:54 +0000 (17:59 +0900)
committerPaul Mundt <lethal@linux-sh.org>
Fri, 28 Oct 2011 05:39:24 +0000 (14:39 +0900)
R-Mobile SoCs such as sh73a0 include PINT blocks in INTC
that come with 2-bit IRQ trigger support. Add code to make
sure the bit width is checked so 4-bit only modes like for
instance EDGE_BOTH will fail for PINT.

Signed-off-by: Magnus Damm <damm@opensource.se>
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
drivers/sh/intc/chip.c

index 33b2ed4..e0ada37 100644 (file)
@@ -202,11 +202,16 @@ static int intc_set_type(struct irq_data *data, unsigned int type)
        if (!value)
                return -EINVAL;
 
+       value &= ~SENSE_VALID_FLAG;
+
        ihp = intc_find_irq(d->sense, d->nr_sense, irq);
        if (ihp) {
+               /* PINT has 2-bit sense registers, should fail on EDGE_BOTH */
+               if (value >= (1 << _INTC_WIDTH(ihp->handle)))
+                       return -EINVAL;
+
                addr = INTC_REG(d, _INTC_ADDR_E(ihp->handle), 0);
-               intc_reg_fns[_INTC_FN(ihp->handle)](addr, ihp->handle,
-                                                   value & ~SENSE_VALID_FLAG);
+               intc_reg_fns[_INTC_FN(ihp->handle)](addr, ihp->handle, value);
        }
 
        return 0;