ar71xx: fix MII clock settings for various chips, improves ethernet stability on...
[openwrt/svn-archive/archive.git] / target / linux / omap24xx / patches-3.3 / 252-cbus-retu-tahvo-ack-fix.patch
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 }