diff options
Diffstat (limited to 'target/linux/omap24xx/patches-3.3/252-cbus-retu-tahvo-ack-fix.patch')
-rw-r--r-- | target/linux/omap24xx/patches-3.3/252-cbus-retu-tahvo-ack-fix.patch | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/target/linux/omap24xx/patches-3.3/252-cbus-retu-tahvo-ack-fix.patch b/target/linux/omap24xx/patches-3.3/252-cbus-retu-tahvo-ack-fix.patch new file mode 100644 index 0000000..86f2f77 --- /dev/null +++ b/target/linux/omap24xx/patches-3.3/252-cbus-retu-tahvo-ack-fix.patch @@ -0,0 +1,142 @@ +--- a/drivers/cbus/retu.c ++++ b/drivers/cbus/retu.c +@@ -53,9 +53,6 @@ struct retu { + + int irq; + +- int ack; +- bool ack_pending; +- + int mask; + bool mask_pending; + +@@ -191,9 +188,10 @@ static irqreturn_t retu_irq_handler(int + mutex_lock(&retu->mutex); + idr = __retu_read_reg(retu, RETU_REG_IDR); + imr = __retu_read_reg(retu, RETU_REG_IMR); ++ idr &= ~imr; ++ __retu_write_reg(retu, RETU_REG_IDR, idr); + mutex_unlock(&retu->mutex); + +- idr &= ~imr; + if (!idr) { + dev_vdbg(retu->dev, "No IRQ, spurious?\n"); + return IRQ_NONE; +@@ -232,15 +230,6 @@ static void retu_irq_unmask(struct irq_d + + } + +-static void retu_irq_ack(struct irq_data *data) +-{ +- struct retu *retu = irq_data_get_irq_chip_data(data); +- int irq = data->irq; +- +- retu->ack |= (1 << (irq - retu->irq_base)); +- retu->ack_pending = true; +-} +- + static void retu_bus_lock(struct irq_data *data) + { + struct retu *retu = irq_data_get_irq_chip_data(data); +@@ -257,11 +246,6 @@ static void retu_bus_sync_unlock(struct + retu->mask_pending = false; + } + +- if (retu->ack_pending) { +- __retu_write_reg(retu, RETU_REG_IDR, retu->ack); +- retu->ack_pending = false; +- } +- + mutex_unlock(&retu->mutex); + } + +@@ -271,7 +255,6 @@ static struct irq_chip retu_irq_chip = { + .irq_bus_sync_unlock = retu_bus_sync_unlock, + .irq_mask = retu_irq_mask, + .irq_unmask = retu_irq_unmask, +- .irq_ack = retu_irq_ack, + }; + + static inline void retu_irq_setup(int irq) +@@ -291,8 +274,7 @@ static void retu_irq_init(struct retu *r + + for (irq = base; irq < end; irq++) { + irq_set_chip_data(irq, retu); +- irq_set_chip_and_handler(irq, &retu_irq_chip, +- handle_simple_irq); ++ irq_set_chip(irq, &retu_irq_chip); + irq_set_nested_thread(irq, 1); + retu_irq_setup(irq); + } +--- a/drivers/cbus/tahvo.c ++++ b/drivers/cbus/tahvo.c +@@ -48,11 +48,9 @@ struct tahvo { + int irq_end; + int irq; + +- int ack; + int mask; + + unsigned int mask_pending:1; +- unsigned int ack_pending:1; + unsigned int is_betty:1; + }; + +@@ -138,9 +136,12 @@ static irqreturn_t tahvo_irq_handler(int + u16 id; + u16 im; + ++ mutex_lock(&tahvo->mutex); + id = __tahvo_read_reg(tahvo, TAHVO_REG_IDR); + im = __tahvo_read_reg(tahvo, TAHVO_REG_IMR); + id &= ~im; ++ __tahvo_write_reg(tahvo, TAHVO_REG_IDR, id); ++ mutex_unlock(&tahvo->mutex); + + if (!id) { + dev_vdbg(tahvo->dev, "No IRQ, spurious ?\n"); +@@ -177,11 +178,6 @@ static void tahvo_irq_bus_sync_unlock(st + tahvo->mask_pending = false; + } + +- if (tahvo->ack_pending) { +- __tahvo_write_reg(tahvo, TAHVO_REG_IDR, tahvo->ack); +- tahvo->ack_pending = false; +- } +- + mutex_unlock(&tahvo->mutex); + } + +@@ -203,22 +199,12 @@ static void tahvo_irq_unmask(struct irq_ + tahvo->mask_pending = true; + } + +-static void tahvo_irq_ack(struct irq_data *data) +-{ +- struct tahvo *tahvo = irq_data_get_irq_chip_data(data); +- int irq = data->irq; +- +- tahvo->ack |= (1 << (irq - tahvo->irq_base)); +- tahvo->ack_pending = true; +-} +- + static struct irq_chip tahvo_irq_chip = { + .name = "tahvo", + .irq_bus_lock = tahvo_irq_bus_lock, + .irq_bus_sync_unlock = tahvo_irq_bus_sync_unlock, + .irq_mask = tahvo_irq_mask, + .irq_unmask = tahvo_irq_unmask, +- .irq_ack = tahvo_irq_ack, + }; + + static inline void tahvo_irq_setup(int irq) +@@ -238,8 +224,7 @@ static void tahvo_irq_init(struct tahvo + + for (irq = base; irq < end; irq++) { + irq_set_chip_data(irq, tahvo); +- irq_set_chip_and_handler(irq, &tahvo_irq_chip, +- handle_simple_irq); ++ irq_set_chip(irq, &tahvo_irq_chip); + irq_set_nested_thread(irq, 1); + tahvo_irq_setup(irq); + } |