[omap]: switch the am335x-evmsk to the new wlcore bindings
[openwrt/svn-archive/archive.git] / target / linux / ramips / patches-3.10 / 0500-spi-mt7621.patch
1 --- a/drivers/spi/spi-rt2880.c
2 +++ b/drivers/spi/spi-rt2880.c
3 @@ -21,8 +21,11 @@
4 #include <linux/io.h>
5 #include <linux/reset.h>
6 #include <linux/spi/spi.h>
7 +#include <linux/of_device.h>
8 #include <linux/platform_device.h>
9
10 +#include <ralink_regs.h>
11 +
12 #define DRIVER_NAME "spi-rt2880"
13 /* only one slave is supported*/
14 #define RALINK_NUM_CHIPSELECTS 1
15 @@ -63,6 +66,25 @@
16 /* SPIFIFOSTAT register bit field */
17 #define SPIFIFOSTAT_TXFULL BIT(17)
18
19 +#define MT7621_SPI_TRANS 0x00
20 +#define SPITRANS_BUSY BIT(16)
21 +#define MT7621_SPI_OPCODE 0x04
22 +#define MT7621_SPI_DATA0 0x08
23 +#define SPI_CTL_TX_RX_CNT_MASK 0xff
24 +#define SPI_CTL_START BIT(8)
25 +#define MT7621_SPI_POLAR 0x38
26 +#define MT7621_SPI_MASTER 0x28
27 +#define MT7621_SPI_SPACE 0x3c
28 +
29 +struct rt2880_spi;
30 +
31 +struct rt2880_spi_ops {
32 + void (*init_hw)(struct rt2880_spi *rs);
33 + void (*set_cs)(struct rt2880_spi *rs, int enable);
34 + int (*baudrate_set)(struct spi_device *spi, unsigned int speed);
35 + unsigned int (*write_read)(struct spi_device *spi, struct list_head *list, struct spi_transfer *xfer);
36 +};
37 +
38 struct rt2880_spi {
39 struct spi_master *master;
40 void __iomem *base;
41 @@ -70,6 +92,8 @@ struct rt2880_spi {
42 unsigned int speed;
43 struct clk *clk;
44 spinlock_t lock;
45 +
46 + struct rt2880_spi_ops *ops;
47 };
48
49 static inline struct rt2880_spi *spidev_to_rt2880_spi(struct spi_device *spi)
50 @@ -149,6 +173,17 @@ static int rt2880_spi_baudrate_set(struc
51 return 0;
52 }
53
54 +static int mt7621_spi_baudrate_set(struct spi_device *spi, unsigned int speed)
55 +{
56 +/* u32 master = rt2880_spi_read(rs, MT7621_SPI_MASTER);
57 +
58 + // set default clock to hclk/5
59 + master &= ~(0xfff << 16);
60 + master |= 0x3 << 16;
61 +*/
62 + return 0;
63 +}
64 +
65 /*
66 * called only when no transfer is active on the bus
67 */
68 @@ -164,7 +199,7 @@ rt2880_spi_setup_transfer(struct spi_dev
69
70 if (rs->speed != speed) {
71 dev_dbg(&spi->dev, "speed_hz:%u\n", speed);
72 - rc = rt2880_spi_baudrate_set(spi, speed);
73 + rc = rs->ops->baudrate_set(spi, speed);
74 if (rc)
75 return rc;
76 }
77 @@ -180,6 +215,17 @@ static void rt2880_spi_set_cs(struct rt2
78 rt2880_spi_setbits(rs, RAMIPS_SPI_CTL, SPICTL_SPIENA);
79 }
80
81 +static void mt7621_spi_set_cs(struct rt2880_spi *rs, int enable)
82 +{
83 + u32 polar = rt2880_spi_read(rs, MT7621_SPI_POLAR);
84 +
85 + if (enable)
86 + polar |= 1;
87 + else
88 + polar &= ~1;
89 + rt2880_spi_write(rs, MT7621_SPI_POLAR, polar);
90 +}
91 +
92 static inline int rt2880_spi_wait_till_ready(struct rt2880_spi *rs)
93 {
94 int i;
95 @@ -198,8 +244,26 @@ static inline int rt2880_spi_wait_till_r
96 return -ETIMEDOUT;
97 }
98
99 +static inline int mt7621_spi_wait_till_ready(struct rt2880_spi *rs)
100 +{
101 + int i;
102 +
103 + for (i = 0; i < RALINK_SPI_WAIT_MAX_LOOP; i++) {
104 + u32 status;
105 +
106 + status = rt2880_spi_read(rs, MT7621_SPI_TRANS);
107 + if ((status & SPITRANS_BUSY) == 0) {
108 + return 0;
109 + }
110 + cpu_relax();
111 + udelay(1);
112 + }
113 +
114 + return -ETIMEDOUT;
115 +}
116 +
117 static unsigned int
118 -rt2880_spi_write_read(struct spi_device *spi, struct spi_transfer *xfer)
119 +rt2880_spi_write_read(struct spi_device *spi, struct list_head *list, struct spi_transfer *xfer)
120 {
121 struct rt2880_spi *rs = spidev_to_rt2880_spi(spi);
122 unsigned count = 0;
123 @@ -239,6 +303,100 @@ out:
124 return count;
125 }
126
127 +static unsigned int
128 +mt7621_spi_write_read(struct spi_device *spi, struct list_head *list, struct spi_transfer *xfer)
129 +{
130 + struct rt2880_spi *rs = spidev_to_rt2880_spi(spi);
131 + struct spi_transfer *next = NULL;
132 + const u8 *tx = xfer->tx_buf;
133 + u8 *rx = NULL;
134 + u32 trans;
135 + int len = xfer->len;
136 +
137 + if (!tx)
138 + return 0;
139 +
140 + if (!list_is_last(&xfer->transfer_list, list)) {
141 + next = list_entry(xfer->transfer_list.next, struct spi_transfer, transfer_list);
142 + rx = next->rx_buf;
143 + }
144 +
145 + trans = rt2880_spi_read(rs, MT7621_SPI_TRANS);
146 + trans &= ~SPI_CTL_TX_RX_CNT_MASK;
147 +
148 + if (tx) {
149 + u32 data0 = 0, opcode = 0;
150 +
151 + switch (xfer->len) {
152 + case 8:
153 + data0 |= tx[7] << 24;
154 + case 7:
155 + data0 |= tx[6] << 16;
156 + case 6:
157 + data0 |= tx[5] << 8;
158 + case 5:
159 + data0 |= tx[4];
160 + case 4:
161 + opcode |= tx[3] << 8;
162 + case 3:
163 + opcode |= tx[2] << 16;
164 + case 2:
165 + opcode |= tx[1] << 24;
166 + case 1:
167 + opcode |= tx[0];
168 + break;
169 +
170 + default:
171 + dev_err(&spi->dev, "trying to write too many bytes: %d\n", next->len);
172 + return -EINVAL;
173 + }
174 +
175 + rt2880_spi_write(rs, MT7621_SPI_DATA0, data0);
176 + rt2880_spi_write(rs, MT7621_SPI_OPCODE, opcode);
177 + trans |= xfer->len;
178 + }
179 +
180 + if (rx)
181 + trans |= (next->len << 4);
182 + rt2880_spi_write(rs, MT7621_SPI_TRANS, trans);
183 + trans |= SPI_CTL_START;
184 + rt2880_spi_write(rs, MT7621_SPI_TRANS, trans);
185 +
186 + mt7621_spi_wait_till_ready(rs);
187 +
188 + if (rx) {
189 + u32 data0 = rt2880_spi_read(rs, MT7621_SPI_DATA0);
190 + u32 opcode = rt2880_spi_read(rs, MT7621_SPI_OPCODE);
191 +
192 + switch (next->len) {
193 + case 8:
194 + rx[7] = (opcode >> 24) & 0xff;
195 + case 7:
196 + rx[6] = (opcode >> 16) & 0xff;
197 + case 6:
198 + rx[5] = (opcode >> 8) & 0xff;
199 + case 5:
200 + rx[4] = opcode & 0xff;
201 + case 4:
202 + rx[3] = (data0 >> 24) & 0xff;
203 + case 3:
204 + rx[2] = (data0 >> 16) & 0xff;
205 + case 2:
206 + rx[1] = (data0 >> 8) & 0xff;
207 + case 1:
208 + rx[0] = data0 & 0xff;
209 + break;
210 +
211 + default:
212 + dev_err(&spi->dev, "trying to read too many bytes: %d\n", next->len);
213 + return -EINVAL;
214 + }
215 + len += next->len;
216 + }
217 +
218 + return len;
219 +}
220 +
221 static int rt2880_spi_transfer_one_message(struct spi_master *master,
222 struct spi_message *m)
223 {
224 @@ -280,25 +438,25 @@ static int rt2880_spi_transfer_one_messa
225 }
226
227 if (!cs_active) {
228 - rt2880_spi_set_cs(rs, 1);
229 + rs->ops->set_cs(rs, 1);
230 cs_active = 1;
231 }
232
233 if (t->len)
234 - m->actual_length += rt2880_spi_write_read(spi, t);
235 + m->actual_length += rs->ops->write_read(spi, &m->transfers, t);
236
237 if (t->delay_usecs)
238 udelay(t->delay_usecs);
239
240 if (t->cs_change) {
241 - rt2880_spi_set_cs(rs, 0);
242 + rs->ops->set_cs(rs, 0);
243 cs_active = 0;
244 }
245 }
246
247 msg_done:
248 if (cs_active)
249 - rt2880_spi_set_cs(rs, 0);
250 + rs->ops->set_cs(rs, 0);
251
252 m->status = status;
253 spi_finalize_current_message(master);
254 @@ -334,8 +492,41 @@ static void rt2880_spi_reset(struct rt28
255 rt2880_spi_write(rs, RAMIPS_SPI_CTL, SPICTL_HIZSDO | SPICTL_SPIENA);
256 }
257
258 +static void mt7621_spi_reset(struct rt2880_spi *rs)
259 +{
260 + u32 master = rt2880_spi_read(rs, MT7621_SPI_MASTER);
261 +
262 + master &= ~(0xfff << 16);
263 + master |= 3 << 16;
264 +
265 + master |= 7 << 29;
266 + rt2880_spi_write(rs, MT7621_SPI_MASTER, master);
267 +}
268 +
269 +static struct rt2880_spi_ops spi_ops[] = {
270 + {
271 + .init_hw = rt2880_spi_reset,
272 + .set_cs = rt2880_spi_set_cs,
273 + .baudrate_set = rt2880_spi_baudrate_set,
274 + .write_read = rt2880_spi_write_read,
275 + }, {
276 + .init_hw = mt7621_spi_reset,
277 + .set_cs = mt7621_spi_set_cs,
278 + .baudrate_set = mt7621_spi_baudrate_set,
279 + .write_read = mt7621_spi_write_read,
280 + },
281 +};
282 +
283 +static const struct of_device_id rt2880_spi_match[] = {
284 + { .compatible = "ralink,rt2880-spi", .data = &spi_ops[0]},
285 + { .compatible = "ralink,mt7621-spi", .data = &spi_ops[1] },
286 + {},
287 +};
288 +MODULE_DEVICE_TABLE(of, rt2880_spi_match);
289 +
290 static int rt2880_spi_probe(struct platform_device *pdev)
291 {
292 + const struct of_device_id *match;
293 struct spi_master *master;
294 struct rt2880_spi *rs;
295 unsigned long flags;
296 @@ -344,6 +535,10 @@ static int rt2880_spi_probe(struct platf
297 int status = 0;
298 struct clk *clk;
299
300 + match = of_match_device(rt2880_spi_match, &pdev->dev);
301 + if (!match)
302 + return -EINVAL;
303 +
304 r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
305 base = devm_ioremap_resource(&pdev->dev, r);
306 if (IS_ERR(base))
307 @@ -382,12 +577,13 @@ static int rt2880_spi_probe(struct platf
308 rs->clk = clk;
309 rs->master = master;
310 rs->sys_freq = clk_get_rate(rs->clk);
311 + rs->ops = (struct rt2880_spi_ops *) match->data;
312 dev_dbg(&pdev->dev, "sys_freq: %u\n", rs->sys_freq);
313 spin_lock_irqsave(&rs->lock, flags);
314
315 device_reset(&pdev->dev);
316
317 - rt2880_spi_reset(rs);
318 + rs->ops->init_hw(rs);
319
320 return spi_register_master(master);
321 }
322 @@ -408,12 +604,6 @@ static int rt2880_spi_remove(struct plat
323
324 MODULE_ALIAS("platform:" DRIVER_NAME);
325
326 -static const struct of_device_id rt2880_spi_match[] = {
327 - { .compatible = "ralink,rt2880-spi" },
328 - {},
329 -};
330 -MODULE_DEVICE_TABLE(of, rt2880_spi_match);
331 -
332 static struct platform_driver rt2880_spi_driver = {
333 .driver = {
334 .name = DRIVER_NAME,