| 1 | --- a/drivers/cbus/retu.c |
| 2 | +++ b/drivers/cbus/retu.c |
| 3 | @@ -53,9 +53,6 @@ struct retu { |
| 4 | |
| 5 | int irq; |
| 6 | |
| 7 | - int ack; |
| 8 | - bool ack_pending; |
| 9 | - |
| 10 | int mask; |
| 11 | bool mask_pending; |
| 12 | |
| 13 | @@ -191,9 +188,10 @@ static irqreturn_t retu_irq_handler(int |
| 14 | mutex_lock(&retu->mutex); |
| 15 | idr = __retu_read_reg(retu, RETU_REG_IDR); |
| 16 | imr = __retu_read_reg(retu, RETU_REG_IMR); |
| 17 | + idr &= ~imr; |
| 18 | + __retu_write_reg(retu, RETU_REG_IDR, idr); |
| 19 | mutex_unlock(&retu->mutex); |
| 20 | |
| 21 | - idr &= ~imr; |
| 22 | if (!idr) { |
| 23 | dev_vdbg(retu->dev, "No IRQ, spurious?\n"); |
| 24 | return IRQ_NONE; |
| 25 | @@ -232,15 +230,6 @@ static void retu_irq_unmask(struct irq_d |
| 26 | |
| 27 | } |
| 28 | |
| 29 | -static void retu_irq_ack(struct irq_data *data) |
| 30 | -{ |
| 31 | - struct retu *retu = irq_data_get_irq_chip_data(data); |
| 32 | - int irq = data->irq; |
| 33 | - |
| 34 | - retu->ack |= (1 << (irq - retu->irq_base)); |
| 35 | - retu->ack_pending = true; |
| 36 | -} |
| 37 | - |
| 38 | static void retu_bus_lock(struct irq_data *data) |
| 39 | { |
| 40 | struct retu *retu = irq_data_get_irq_chip_data(data); |
| 41 | @@ -257,11 +246,6 @@ static void retu_bus_sync_unlock(struct |
| 42 | retu->mask_pending = false; |
| 43 | } |
| 44 | |
| 45 | - if (retu->ack_pending) { |
| 46 | - __retu_write_reg(retu, RETU_REG_IDR, retu->ack); |
| 47 | - retu->ack_pending = false; |
| 48 | - } |
| 49 | - |
| 50 | mutex_unlock(&retu->mutex); |
| 51 | } |
| 52 | |
| 53 | @@ -271,7 +255,6 @@ static struct irq_chip retu_irq_chip = { |
| 54 | .irq_bus_sync_unlock = retu_bus_sync_unlock, |
| 55 | .irq_mask = retu_irq_mask, |
| 56 | .irq_unmask = retu_irq_unmask, |
| 57 | - .irq_ack = retu_irq_ack, |
| 58 | }; |
| 59 | |
| 60 | static inline void retu_irq_setup(int irq) |
| 61 | @@ -291,8 +274,7 @@ static void retu_irq_init(struct retu *r |
| 62 | |
| 63 | for (irq = base; irq < end; irq++) { |
| 64 | irq_set_chip_data(irq, retu); |
| 65 | - irq_set_chip_and_handler(irq, &retu_irq_chip, |
| 66 | - handle_simple_irq); |
| 67 | + irq_set_chip(irq, &retu_irq_chip); |
| 68 | irq_set_nested_thread(irq, 1); |
| 69 | retu_irq_setup(irq); |
| 70 | } |
| 71 | --- a/drivers/cbus/tahvo.c |
| 72 | +++ b/drivers/cbus/tahvo.c |
| 73 | @@ -48,11 +48,9 @@ struct tahvo { |
| 74 | int irq_end; |
| 75 | int irq; |
| 76 | |
| 77 | - int ack; |
| 78 | int mask; |
| 79 | |
| 80 | unsigned int mask_pending:1; |
| 81 | - unsigned int ack_pending:1; |
| 82 | unsigned int is_betty:1; |
| 83 | }; |
| 84 | |
| 85 | @@ -138,9 +136,12 @@ static irqreturn_t tahvo_irq_handler(int |
| 86 | u16 id; |
| 87 | u16 im; |
| 88 | |
| 89 | + mutex_lock(&tahvo->mutex); |
| 90 | id = __tahvo_read_reg(tahvo, TAHVO_REG_IDR); |
| 91 | im = __tahvo_read_reg(tahvo, TAHVO_REG_IMR); |
| 92 | id &= ~im; |
| 93 | + __tahvo_write_reg(tahvo, TAHVO_REG_IDR, id); |
| 94 | + mutex_unlock(&tahvo->mutex); |
| 95 | |
| 96 | if (!id) { |
| 97 | dev_vdbg(tahvo->dev, "No IRQ, spurious ?\n"); |
| 98 | @@ -177,11 +178,6 @@ static void tahvo_irq_bus_sync_unlock(st |
| 99 | tahvo->mask_pending = false; |
| 100 | } |
| 101 | |
| 102 | - if (tahvo->ack_pending) { |
| 103 | - __tahvo_write_reg(tahvo, TAHVO_REG_IDR, tahvo->ack); |
| 104 | - tahvo->ack_pending = false; |
| 105 | - } |
| 106 | - |
| 107 | mutex_unlock(&tahvo->mutex); |
| 108 | } |
| 109 | |
| 110 | @@ -203,22 +199,12 @@ static void tahvo_irq_unmask(struct irq_ |
| 111 | tahvo->mask_pending = true; |
| 112 | } |
| 113 | |
| 114 | -static void tahvo_irq_ack(struct irq_data *data) |
| 115 | -{ |
| 116 | - struct tahvo *tahvo = irq_data_get_irq_chip_data(data); |
| 117 | - int irq = data->irq; |
| 118 | - |
| 119 | - tahvo->ack |= (1 << (irq - tahvo->irq_base)); |
| 120 | - tahvo->ack_pending = true; |
| 121 | -} |
| 122 | - |
| 123 | static struct irq_chip tahvo_irq_chip = { |
| 124 | .name = "tahvo", |
| 125 | .irq_bus_lock = tahvo_irq_bus_lock, |
| 126 | .irq_bus_sync_unlock = tahvo_irq_bus_sync_unlock, |
| 127 | .irq_mask = tahvo_irq_mask, |
| 128 | .irq_unmask = tahvo_irq_unmask, |
| 129 | - .irq_ack = tahvo_irq_ack, |
| 130 | }; |
| 131 | |
| 132 | static inline void tahvo_irq_setup(int irq) |
| 133 | @@ -238,8 +224,7 @@ static void tahvo_irq_init(struct tahvo |
| 134 | |
| 135 | for (irq = base; irq < end; irq++) { |
| 136 | irq_set_chip_data(irq, tahvo); |
| 137 | - irq_set_chip_and_handler(irq, &tahvo_irq_chip, |
| 138 | - handle_simple_irq); |
| 139 | + irq_set_chip(irq, &tahvo_irq_chip); |
| 140 | irq_set_nested_thread(irq, 1); |
| 141 | tahvo_irq_setup(irq); |
| 142 | } |
| 143 | |