Blame view

drivers/spi/spi-au1550.c 25.2 KB
c942fddf8   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
63bd23591   Jan Nikitenko   au1550 SPI contro...
2
  /*
ca632f556   Grant Likely   spi: reorganize d...
3
   * au1550 psc spi controller driver
63bd23591   Jan Nikitenko   au1550 SPI contro...
4
5
6
7
8
   * may work also with au1200, au1210, au1250
   * will not work on au1000, au1100 and au1500 (no full spi controller there)
   *
   * Copyright (c) 2006 ATRON electronic GmbH
   * Author: Jan Nikitenko <jan.nikitenko@gmail.com>
63bd23591   Jan Nikitenko   au1550 SPI contro...
9
10
11
12
   */
  
  #include <linux/init.h>
  #include <linux/interrupt.h>
5a0e3ad6a   Tejun Heo   include cleanup: ...
13
  #include <linux/slab.h>
63bd23591   Jan Nikitenko   au1550 SPI contro...
14
  #include <linux/errno.h>
d7614de42   Paul Gortmaker   spi: Add module.h...
15
  #include <linux/module.h>
63bd23591   Jan Nikitenko   au1550 SPI contro...
16
17
  #include <linux/device.h>
  #include <linux/platform_device.h>
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
18
  #include <linux/resource.h>
63bd23591   Jan Nikitenko   au1550 SPI contro...
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  #include <linux/spi/spi.h>
  #include <linux/spi/spi_bitbang.h>
  #include <linux/dma-mapping.h>
  #include <linux/completion.h>
  #include <asm/mach-au1x00/au1000.h>
  #include <asm/mach-au1x00/au1xxx_psc.h>
  #include <asm/mach-au1x00/au1xxx_dbdma.h>
  
  #include <asm/mach-au1x00/au1550_spi.h>
  
  static unsigned usedma = 1;
  module_param(usedma, uint, 0644);
  
  /*
  #define AU1550_SPI_DEBUG_LOOPBACK
  */
  
  
  #define AU1550_SPI_DBDMA_DESCRIPTORS 1
  #define AU1550_SPI_DMA_RXTMP_MINSIZE 2048U
  
  struct au1550_spi {
  	struct spi_bitbang bitbang;
  
  	volatile psc_spi_t __iomem *regs;
  	int irq;
63bd23591   Jan Nikitenko   au1550 SPI contro...
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  
  	unsigned len;
  	unsigned tx_count;
  	unsigned rx_count;
  	const u8 *tx;
  	u8 *rx;
  
  	void (*rx_word)(struct au1550_spi *hw);
  	void (*tx_word)(struct au1550_spi *hw);
  	int (*txrx_bufs)(struct spi_device *spi, struct spi_transfer *t);
  	irqreturn_t (*irq_callback)(struct au1550_spi *hw);
  
  	struct completion master_done;
  
  	unsigned usedma;
  	u32 dma_tx_id;
  	u32 dma_rx_id;
  	u32 dma_tx_ch;
  	u32 dma_rx_ch;
  
  	u8 *dma_rx_tmpbuf;
  	unsigned dma_rx_tmpbuf_size;
  	u32 dma_rx_tmpbuf_addr;
  
  	struct spi_master *master;
  	struct device *dev;
  	struct au1550_spi_info *pdata;
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
72
  	struct resource *ioarea;
63bd23591   Jan Nikitenko   au1550 SPI contro...
73
74
75
76
77
78
79
80
81
82
83
84
85
86
  };
  
  
  /* we use an 8-bit memory device for dma transfers to/from spi fifo */
  static dbdev_tab_t au1550_spi_mem_dbdev =
  {
  	.dev_id			= DBDMA_MEM_CHAN,
  	.dev_flags		= DEV_FLAGS_ANYUSE|DEV_FLAGS_SYNC,
  	.dev_tsize		= 0,
  	.dev_devwidth		= 8,
  	.dev_physaddr		= 0x00000000,
  	.dev_intlevel		= 0,
  	.dev_intpolarity	= 0
  };
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
87
  static int ddma_memid;	/* id to above mem dma device */
63bd23591   Jan Nikitenko   au1550 SPI contro...
88
  static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw);
40369e1cd   Jan Nikitenko   au1550_spi: fix p...
89
  /*
63bd23591   Jan Nikitenko   au1550 SPI contro...
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
   *  compute BRG and DIV bits to setup spi clock based on main input clock rate
   *  that was specified in platform data structure
   *  according to au1550 datasheet:
   *    psc_tempclk = psc_mainclk / (2 << DIV)
   *    spiclk = psc_tempclk / (2 * (BRG + 1))
   *    BRG valid range is 4..63
   *    DIV valid range is 0..3
   */
  static u32 au1550_spi_baudcfg(struct au1550_spi *hw, unsigned speed_hz)
  {
  	u32 mainclk_hz = hw->pdata->mainclk_hz;
  	u32 div, brg;
  
  	for (div = 0; div < 4; div++) {
  		brg = mainclk_hz / speed_hz / (4 << div);
  		/* now we have BRG+1 in brg, so count with that */
  		if (brg < (4 + 1)) {
  			brg = (4 + 1);	/* speed_hz too big */
  			break;		/* set lowest brg (div is == 0) */
  		}
  		if (brg <= (63 + 1))
  			break;		/* we have valid brg and div */
  	}
  	if (div == 4) {
  		div = 3;		/* speed_hz too small */
  		brg = (63 + 1);		/* set highest brg and div */
  	}
  	brg--;
  	return PSC_SPICFG_SET_BAUD(brg) | PSC_SPICFG_SET_DIV(div);
  }
  
  static inline void au1550_spi_mask_ack_all(struct au1550_spi *hw)
  {
  	hw->regs->psc_spimsk =
  		  PSC_SPIMSK_MM | PSC_SPIMSK_RR | PSC_SPIMSK_RO
  		| PSC_SPIMSK_RU | PSC_SPIMSK_TR | PSC_SPIMSK_TO
  		| PSC_SPIMSK_TU | PSC_SPIMSK_SD | PSC_SPIMSK_MD;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
127
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
128
129
130
131
132
  
  	hw->regs->psc_spievent =
  		  PSC_SPIEVNT_MM | PSC_SPIEVNT_RR | PSC_SPIEVNT_RO
  		| PSC_SPIEVNT_RU | PSC_SPIEVNT_TR | PSC_SPIEVNT_TO
  		| PSC_SPIEVNT_TU | PSC_SPIEVNT_SD | PSC_SPIEVNT_MD;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
133
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
134
135
136
137
138
139
140
  }
  
  static void au1550_spi_reset_fifos(struct au1550_spi *hw)
  {
  	u32 pcr;
  
  	hw->regs->psc_spipcr = PSC_SPIPCR_RC | PSC_SPIPCR_TC;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
141
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
142
143
  	do {
  		pcr = hw->regs->psc_spipcr;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
144
  		wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
  	} while (pcr != 0);
  }
  
  /*
   * dma transfers are used for the most common spi word size of 8-bits
   * we cannot easily change already set up dma channels' width, so if we wanted
   * dma support for more than 8-bit words (up to 24 bits), we would need to
   * setup dma channels from scratch on each spi transfer, based on bits_per_word
   * instead we have pre set up 8 bit dma channels supporting spi 4 to 8 bits
   * transfers, and 9 to 24 bits spi transfers will be done in pio irq based mode
   * callbacks to handle dma or pio are set up in au1550_spi_bits_handlers_set()
   */
  static void au1550_spi_chipsel(struct spi_device *spi, int value)
  {
  	struct au1550_spi *hw = spi_master_get_devdata(spi->master);
  	unsigned cspol = spi->mode & SPI_CS_HIGH ? 1 : 0;
  	u32 cfg, stat;
  
  	switch (value) {
  	case BITBANG_CS_INACTIVE:
  		if (hw->pdata->deactivate_cs)
  			hw->pdata->deactivate_cs(hw->pdata, spi->chip_select,
  					cspol);
  		break;
  
  	case BITBANG_CS_ACTIVE:
  		au1550_spi_bits_handlers_set(hw, spi->bits_per_word);
  
  		cfg = hw->regs->psc_spicfg;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
174
  		wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
175
  		hw->regs->psc_spicfg = cfg & ~PSC_SPICFG_DE_ENABLE;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
176
  		wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
  
  		if (spi->mode & SPI_CPOL)
  			cfg |= PSC_SPICFG_BI;
  		else
  			cfg &= ~PSC_SPICFG_BI;
  		if (spi->mode & SPI_CPHA)
  			cfg &= ~PSC_SPICFG_CDE;
  		else
  			cfg |= PSC_SPICFG_CDE;
  
  		if (spi->mode & SPI_LSB_FIRST)
  			cfg |= PSC_SPICFG_MLF;
  		else
  			cfg &= ~PSC_SPICFG_MLF;
  
  		if (hw->usedma && spi->bits_per_word <= 8)
  			cfg &= ~PSC_SPICFG_DD_DISABLE;
  		else
  			cfg |= PSC_SPICFG_DD_DISABLE;
  		cfg = PSC_SPICFG_CLR_LEN(cfg);
  		cfg |= PSC_SPICFG_SET_LEN(spi->bits_per_word);
  
  		cfg = PSC_SPICFG_CLR_BAUD(cfg);
  		cfg &= ~PSC_SPICFG_SET_DIV(3);
  		cfg |= au1550_spi_baudcfg(hw, spi->max_speed_hz);
  
  		hw->regs->psc_spicfg = cfg | PSC_SPICFG_DE_ENABLE;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
204
  		wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
205
206
  		do {
  			stat = hw->regs->psc_spistat;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
207
  			wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
208
209
210
211
212
213
214
215
216
217
218
219
220
221
  		} while ((stat & PSC_SPISTAT_DR) == 0);
  
  		if (hw->pdata->activate_cs)
  			hw->pdata->activate_cs(hw->pdata, spi->chip_select,
  					cspol);
  		break;
  	}
  }
  
  static int au1550_spi_setupxfer(struct spi_device *spi, struct spi_transfer *t)
  {
  	struct au1550_spi *hw = spi_master_get_devdata(spi->master);
  	unsigned bpw, hz;
  	u32 cfg, stat;
04ba24b34   Jan Nikitenko   spi/au1550_spi: f...
222
  	if (t) {
0beb0a6da   Jarkko Nikula   spi: au1550: Simp...
223
224
225
226
227
  		bpw = t->bits_per_word;
  		hz = t->speed_hz;
  	} else {
  		bpw = spi->bits_per_word;
  		hz = spi->max_speed_hz;
04ba24b34   Jan Nikitenko   spi/au1550_spi: f...
228
  	}
63bd23591   Jan Nikitenko   au1550 SPI contro...
229

0dd26e53b   Axel Lin   spi: au1550: Conv...
230
  	if (!hz)
63bd23591   Jan Nikitenko   au1550 SPI contro...
231
  		return -EINVAL;
63bd23591   Jan Nikitenko   au1550 SPI contro...
232
233
234
235
  
  	au1550_spi_bits_handlers_set(hw, spi->bits_per_word);
  
  	cfg = hw->regs->psc_spicfg;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
236
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
237
  	hw->regs->psc_spicfg = cfg & ~PSC_SPICFG_DE_ENABLE;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
238
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
239
240
241
242
243
244
245
246
247
248
249
250
251
  
  	if (hw->usedma && bpw <= 8)
  		cfg &= ~PSC_SPICFG_DD_DISABLE;
  	else
  		cfg |= PSC_SPICFG_DD_DISABLE;
  	cfg = PSC_SPICFG_CLR_LEN(cfg);
  	cfg |= PSC_SPICFG_SET_LEN(bpw);
  
  	cfg = PSC_SPICFG_CLR_BAUD(cfg);
  	cfg &= ~PSC_SPICFG_SET_DIV(3);
  	cfg |= au1550_spi_baudcfg(hw, hz);
  
  	hw->regs->psc_spicfg = cfg;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
252
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
253
254
255
256
  
  	if (cfg & PSC_SPICFG_DE_ENABLE) {
  		do {
  			stat = hw->regs->psc_spistat;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
257
  			wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
258
259
260
261
262
263
264
  		} while ((stat & PSC_SPISTAT_DR) == 0);
  	}
  
  	au1550_spi_reset_fifos(hw);
  	au1550_spi_mask_ack_all(hw);
  	return 0;
  }
63bd23591   Jan Nikitenko   au1550 SPI contro...
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
  /*
   * for dma spi transfers, we have to setup rx channel, otherwise there is
   * no reliable way how to recognize that spi transfer is done
   * dma complete callbacks are called before real spi transfer is finished
   * and if only tx dma channel is set up (and rx fifo overflow event masked)
   * spi master done event irq is not generated unless rx fifo is empty (emptied)
   * so we need rx tmp buffer to use for rx dma if user does not provide one
   */
  static int au1550_spi_dma_rxtmp_alloc(struct au1550_spi *hw, unsigned size)
  {
  	hw->dma_rx_tmpbuf = kmalloc(size, GFP_KERNEL);
  	if (!hw->dma_rx_tmpbuf)
  		return -ENOMEM;
  	hw->dma_rx_tmpbuf_size = size;
  	hw->dma_rx_tmpbuf_addr = dma_map_single(hw->dev, hw->dma_rx_tmpbuf,
  			size, DMA_FROM_DEVICE);
8d8bb39b9   FUJITA Tomonori   dma-mapping: add ...
281
  	if (dma_mapping_error(hw->dev, hw->dma_rx_tmpbuf_addr)) {
63bd23591   Jan Nikitenko   au1550 SPI contro...
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
  		kfree(hw->dma_rx_tmpbuf);
  		hw->dma_rx_tmpbuf = 0;
  		hw->dma_rx_tmpbuf_size = 0;
  		return -EFAULT;
  	}
  	return 0;
  }
  
  static void au1550_spi_dma_rxtmp_free(struct au1550_spi *hw)
  {
  	dma_unmap_single(hw->dev, hw->dma_rx_tmpbuf_addr,
  			hw->dma_rx_tmpbuf_size, DMA_FROM_DEVICE);
  	kfree(hw->dma_rx_tmpbuf);
  	hw->dma_rx_tmpbuf = 0;
  	hw->dma_rx_tmpbuf_size = 0;
  }
  
  static int au1550_spi_dma_txrxb(struct spi_device *spi, struct spi_transfer *t)
  {
  	struct au1550_spi *hw = spi_master_get_devdata(spi->master);
  	dma_addr_t dma_tx_addr;
  	dma_addr_t dma_rx_addr;
  	u32 res;
  
  	hw->len = t->len;
  	hw->tx_count = 0;
  	hw->rx_count = 0;
  
  	hw->tx = t->tx_buf;
  	hw->rx = t->rx_buf;
  	dma_tx_addr = t->tx_dma;
  	dma_rx_addr = t->rx_dma;
  
  	/*
4e253d230   Jan Nikitenko   spi: au1550_spi f...
316
317
318
319
  	 * check if buffers are already dma mapped, map them otherwise:
  	 * - first map the TX buffer, so cache data gets written to memory
  	 * - then map the RX buffer, so that cache entries (with
  	 *   soon-to-be-stale data) get removed
63bd23591   Jan Nikitenko   au1550 SPI contro...
320
321
322
  	 * use rx buffer in place of tx if tx buffer was not provided
  	 * use temp rx buffer (preallocated or realloc to fit) for rx dma
  	 */
4e253d230   Jan Nikitenko   spi: au1550_spi f...
323
324
325
326
327
328
329
330
331
332
  	if (t->tx_buf) {
  		if (t->tx_dma == 0) {	/* if DMA_ADDR_INVALID, map it */
  			dma_tx_addr = dma_map_single(hw->dev,
  					(void *)t->tx_buf,
  					t->len, DMA_TO_DEVICE);
  			if (dma_mapping_error(hw->dev, dma_tx_addr))
  				dev_err(hw->dev, "tx dma map error
  ");
  		}
  	}
63bd23591   Jan Nikitenko   au1550 SPI contro...
333
334
335
336
337
  	if (t->rx_buf) {
  		if (t->rx_dma == 0) {	/* if DMA_ADDR_INVALID, map it */
  			dma_rx_addr = dma_map_single(hw->dev,
  					(void *)t->rx_buf,
  					t->len, DMA_FROM_DEVICE);
8d8bb39b9   FUJITA Tomonori   dma-mapping: add ...
338
  			if (dma_mapping_error(hw->dev, dma_rx_addr))
63bd23591   Jan Nikitenko   au1550 SPI contro...
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
  				dev_err(hw->dev, "rx dma map error
  ");
  		}
  	} else {
  		if (t->len > hw->dma_rx_tmpbuf_size) {
  			int ret;
  
  			au1550_spi_dma_rxtmp_free(hw);
  			ret = au1550_spi_dma_rxtmp_alloc(hw, max(t->len,
  					AU1550_SPI_DMA_RXTMP_MINSIZE));
  			if (ret < 0)
  				return ret;
  		}
  		hw->rx = hw->dma_rx_tmpbuf;
  		dma_rx_addr = hw->dma_rx_tmpbuf_addr;
  		dma_sync_single_for_device(hw->dev, dma_rx_addr,
  			t->len, DMA_FROM_DEVICE);
  	}
4e253d230   Jan Nikitenko   spi: au1550_spi f...
357
358
  
  	if (!t->tx_buf) {
63bd23591   Jan Nikitenko   au1550 SPI contro...
359
360
361
362
363
364
  		dma_sync_single_for_device(hw->dev, dma_rx_addr,
  				t->len, DMA_BIDIRECTIONAL);
  		hw->tx = hw->rx;
  	}
  
  	/* put buffers on the ring */
963accbc8   Manuel Lauss   MIPS: Alchemy: ch...
365
  	res = au1xxx_dbdma_put_dest(hw->dma_rx_ch, virt_to_phys(hw->rx),
ea071cc70   Manuel Lauss   MIPS: Alchemy: re...
366
  				    t->len, DDMA_FLAGS_IE);
63bd23591   Jan Nikitenko   au1550 SPI contro...
367
368
369
  	if (!res)
  		dev_err(hw->dev, "rx dma put dest error
  ");
963accbc8   Manuel Lauss   MIPS: Alchemy: ch...
370
  	res = au1xxx_dbdma_put_source(hw->dma_tx_ch, virt_to_phys(hw->tx),
ea071cc70   Manuel Lauss   MIPS: Alchemy: re...
371
  				      t->len, DDMA_FLAGS_IE);
63bd23591   Jan Nikitenko   au1550 SPI contro...
372
373
374
375
376
377
378
379
380
  	if (!res)
  		dev_err(hw->dev, "tx dma put source error
  ");
  
  	au1xxx_dbdma_start(hw->dma_rx_ch);
  	au1xxx_dbdma_start(hw->dma_tx_ch);
  
  	/* by default enable nearly all events interrupt */
  	hw->regs->psc_spimsk = PSC_SPIMSK_SD;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
381
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
382
383
384
  
  	/* start the transfer */
  	hw->regs->psc_spipcr = PSC_SPIPCR_MS;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
385
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
  
  	wait_for_completion(&hw->master_done);
  
  	au1xxx_dbdma_stop(hw->dma_tx_ch);
  	au1xxx_dbdma_stop(hw->dma_rx_ch);
  
  	if (!t->rx_buf) {
  		/* using the temporal preallocated and premapped buffer */
  		dma_sync_single_for_cpu(hw->dev, dma_rx_addr, t->len,
  			DMA_FROM_DEVICE);
  	}
  	/* unmap buffers if mapped above */
  	if (t->rx_buf && t->rx_dma == 0 )
  		dma_unmap_single(hw->dev, dma_rx_addr, t->len,
  			DMA_FROM_DEVICE);
  	if (t->tx_buf && t->tx_dma == 0 )
  		dma_unmap_single(hw->dev, dma_tx_addr, t->len,
  			DMA_TO_DEVICE);
  
  	return hw->rx_count < hw->tx_count ? hw->rx_count : hw->tx_count;
  }
  
  static irqreturn_t au1550_spi_dma_irq_callback(struct au1550_spi *hw)
  {
  	u32 stat, evnt;
  
  	stat = hw->regs->psc_spistat;
  	evnt = hw->regs->psc_spievent;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
414
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
415
416
417
418
419
420
421
422
423
424
425
426
427
  	if ((stat & PSC_SPISTAT_DI) == 0) {
  		dev_err(hw->dev, "Unexpected IRQ!
  ");
  		return IRQ_NONE;
  	}
  
  	if ((evnt & (PSC_SPIEVNT_MM | PSC_SPIEVNT_RO
  				| PSC_SPIEVNT_RU | PSC_SPIEVNT_TO
  				| PSC_SPIEVNT_TU | PSC_SPIEVNT_SD))
  			!= 0) {
  		/*
  		 * due to an spi error we consider transfer as done,
  		 * so mask all events until before next transfer start
886db6acf   Masanari Iida   spi: fix comment/...
428
  		 * and stop the possibly running dma immediately
63bd23591   Jan Nikitenko   au1550 SPI contro...
429
430
431
432
  		 */
  		au1550_spi_mask_ack_all(hw);
  		au1xxx_dbdma_stop(hw->dma_rx_ch);
  		au1xxx_dbdma_stop(hw->dma_tx_ch);
25985edce   Lucas De Marchi   Fix common misspe...
433
  		/* get number of transferred bytes */
63bd23591   Jan Nikitenko   au1550 SPI contro...
434
435
436
437
438
439
  		hw->rx_count = hw->len - au1xxx_get_dma_residue(hw->dma_rx_ch);
  		hw->tx_count = hw->len - au1xxx_get_dma_residue(hw->dma_tx_ch);
  
  		au1xxx_dbdma_reset(hw->dma_rx_ch);
  		au1xxx_dbdma_reset(hw->dma_tx_ch);
  		au1550_spi_reset_fifos(hw);
bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
440
441
442
443
444
445
446
447
448
  		if (evnt == PSC_SPIEVNT_RO)
  			dev_err(hw->dev,
  				"dma transfer: receive FIFO overflow!
  ");
  		else
  			dev_err(hw->dev,
  				"dma transfer: unexpected SPI error "
  				"(event=0x%x stat=0x%x)!
  ", evnt, stat);
63bd23591   Jan Nikitenko   au1550 SPI contro...
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
  
  		complete(&hw->master_done);
  		return IRQ_HANDLED;
  	}
  
  	if ((evnt & PSC_SPIEVNT_MD) != 0) {
  		/* transfer completed successfully */
  		au1550_spi_mask_ack_all(hw);
  		hw->rx_count = hw->len;
  		hw->tx_count = hw->len;
  		complete(&hw->master_done);
  	}
  	return IRQ_HANDLED;
  }
  
  
  /* routines to handle different word sizes in pio mode */
  #define AU1550_SPI_RX_WORD(size, mask)					\
  static void au1550_spi_rx_word_##size(struct au1550_spi *hw)		\
  {									\
  	u32 fifoword = hw->regs->psc_spitxrx & (u32)(mask);		\
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
470
  	wmb(); /* drain writebuffer */					\
63bd23591   Jan Nikitenko   au1550 SPI contro...
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
  	if (hw->rx) {							\
  		*(u##size *)hw->rx = (u##size)fifoword;			\
  		hw->rx += (size) / 8;					\
  	}								\
  	hw->rx_count += (size) / 8;					\
  }
  
  #define AU1550_SPI_TX_WORD(size, mask)					\
  static void au1550_spi_tx_word_##size(struct au1550_spi *hw)		\
  {									\
  	u32 fifoword = 0;						\
  	if (hw->tx) {							\
  		fifoword = *(u##size *)hw->tx & (u32)(mask);		\
  		hw->tx += (size) / 8;					\
  	}								\
  	hw->tx_count += (size) / 8;					\
  	if (hw->tx_count >= hw->len)					\
  		fifoword |= PSC_SPITXRX_LC;				\
  	hw->regs->psc_spitxrx = fifoword;				\
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
490
  	wmb(); /* drain writebuffer */					\
63bd23591   Jan Nikitenko   au1550 SPI contro...
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
  }
  
  AU1550_SPI_RX_WORD(8,0xff)
  AU1550_SPI_RX_WORD(16,0xffff)
  AU1550_SPI_RX_WORD(32,0xffffff)
  AU1550_SPI_TX_WORD(8,0xff)
  AU1550_SPI_TX_WORD(16,0xffff)
  AU1550_SPI_TX_WORD(32,0xffffff)
  
  static int au1550_spi_pio_txrxb(struct spi_device *spi, struct spi_transfer *t)
  {
  	u32 stat, mask;
  	struct au1550_spi *hw = spi_master_get_devdata(spi->master);
  
  	hw->tx = t->tx_buf;
  	hw->rx = t->rx_buf;
  	hw->len = t->len;
  	hw->tx_count = 0;
  	hw->rx_count = 0;
  
  	/* by default enable nearly all events after filling tx fifo */
  	mask = PSC_SPIMSK_SD;
  
  	/* fill the transmit FIFO */
  	while (hw->tx_count < hw->len) {
  
  		hw->tx_word(hw);
  
  		if (hw->tx_count >= hw->len) {
  			/* mask tx fifo request interrupt as we are done */
  			mask |= PSC_SPIMSK_TR;
  		}
  
  		stat = hw->regs->psc_spistat;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
525
  		wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
526
527
528
529
530
531
  		if (stat & PSC_SPISTAT_TF)
  			break;
  	}
  
  	/* enable event interrupts */
  	hw->regs->psc_spimsk = mask;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
532
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
533
534
535
  
  	/* start the transfer */
  	hw->regs->psc_spipcr = PSC_SPIPCR_MS;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
536
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
537
538
539
540
541
542
543
544
545
546
547
548
549
  
  	wait_for_completion(&hw->master_done);
  
  	return hw->rx_count < hw->tx_count ? hw->rx_count : hw->tx_count;
  }
  
  static irqreturn_t au1550_spi_pio_irq_callback(struct au1550_spi *hw)
  {
  	int busy;
  	u32 stat, evnt;
  
  	stat = hw->regs->psc_spistat;
  	evnt = hw->regs->psc_spievent;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
550
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
551
552
553
554
555
556
557
558
  	if ((stat & PSC_SPISTAT_DI) == 0) {
  		dev_err(hw->dev, "Unexpected IRQ!
  ");
  		return IRQ_NONE;
  	}
  
  	if ((evnt & (PSC_SPIEVNT_MM | PSC_SPIEVNT_RO
  				| PSC_SPIEVNT_RU | PSC_SPIEVNT_TO
bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
559
  				| PSC_SPIEVNT_SD))
63bd23591   Jan Nikitenko   au1550 SPI contro...
560
  			!= 0) {
63bd23591   Jan Nikitenko   au1550 SPI contro...
561
562
563
564
565
566
  		/*
  		 * due to an error we consider transfer as done,
  		 * so mask all events until before next transfer start
  		 */
  		au1550_spi_mask_ack_all(hw);
  		au1550_spi_reset_fifos(hw);
bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
567
568
569
570
  		dev_err(hw->dev,
  			"pio transfer: unexpected SPI error "
  			"(event=0x%x stat=0x%x)!
  ", evnt, stat);
63bd23591   Jan Nikitenko   au1550 SPI contro...
571
572
573
574
575
576
577
578
579
580
581
  		complete(&hw->master_done);
  		return IRQ_HANDLED;
  	}
  
  	/*
  	 * while there is something to read from rx fifo
  	 * or there is a space to write to tx fifo:
  	 */
  	do {
  		busy = 0;
  		stat = hw->regs->psc_spistat;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
582
  		wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
583

bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
584
585
586
587
588
589
590
591
592
593
  		/*
  		 * Take care to not let the Rx FIFO overflow.
  		 *
  		 * We only write a byte if we have read one at least. Initially,
  		 * the write fifo is full, so we should read from the read fifo
  		 * first.
  		 * In case we miss a word from the read fifo, we should get a
  		 * RO event and should back out.
  		 */
  		if (!(stat & PSC_SPISTAT_RE) && hw->rx_count < hw->len) {
63bd23591   Jan Nikitenko   au1550 SPI contro...
594
  			hw->rx_word(hw);
63bd23591   Jan Nikitenko   au1550 SPI contro...
595
  			busy = 1;
63bd23591   Jan Nikitenko   au1550 SPI contro...
596

bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
597
598
  			if (!(stat & PSC_SPISTAT_TF) && hw->tx_count < hw->len)
  				hw->tx_word(hw);
63bd23591   Jan Nikitenko   au1550 SPI contro...
599
600
  		}
  	} while (busy);
bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
601
  	hw->regs->psc_spievent = PSC_SPIEVNT_RR | PSC_SPIEVNT_TR;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
602
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
603

bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
  	/*
  	 * Restart the SPI transmission in case of a transmit underflow.
  	 * This seems to work despite the notes in the Au1550 data book
  	 * of Figure 8-4 with flowchart for SPI master operation:
  	 *
  	 * """Note 1: An XFR Error Interrupt occurs, unless masked,
  	 * for any of the following events: Tx FIFO Underflow,
  	 * Rx FIFO Overflow, or Multiple-master Error
  	 *    Note 2: In case of a Tx Underflow Error, all zeroes are
  	 * transmitted."""
  	 *
  	 * By simply restarting the spi transfer on Tx Underflow Error,
  	 * we assume that spi transfer was paused instead of zeroes
  	 * transmittion mentioned in the Note 2 of Au1550 data book.
  	 */
  	if (evnt & PSC_SPIEVNT_TU) {
  		hw->regs->psc_spievent = PSC_SPIEVNT_TU | PSC_SPIEVNT_MD;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
621
  		wmb(); /* drain writebuffer */
bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
622
  		hw->regs->psc_spipcr = PSC_SPIPCR_MS;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
623
  		wmb(); /* drain writebuffer */
bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
624
625
626
  	}
  
  	if (hw->rx_count >= hw->len) {
63bd23591   Jan Nikitenko   au1550 SPI contro...
627
628
629
630
631
632
633
634
635
636
637
638
  		/* transfer completed successfully */
  		au1550_spi_mask_ack_all(hw);
  		complete(&hw->master_done);
  	}
  	return IRQ_HANDLED;
  }
  
  static int au1550_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
  {
  	struct au1550_spi *hw = spi_master_get_devdata(spi->master);
  	return hw->txrx_bufs(spi, t);
  }
40369e1cd   Jan Nikitenko   au1550_spi: fix p...
639
  static irqreturn_t au1550_spi_irq(int irq, void *dev)
63bd23591   Jan Nikitenko   au1550 SPI contro...
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
  {
  	struct au1550_spi *hw = dev;
  	return hw->irq_callback(hw);
  }
  
  static void au1550_spi_bits_handlers_set(struct au1550_spi *hw, int bpw)
  {
  	if (bpw <= 8) {
  		if (hw->usedma) {
  			hw->txrx_bufs = &au1550_spi_dma_txrxb;
  			hw->irq_callback = &au1550_spi_dma_irq_callback;
  		} else {
  			hw->rx_word = &au1550_spi_rx_word_8;
  			hw->tx_word = &au1550_spi_tx_word_8;
  			hw->txrx_bufs = &au1550_spi_pio_txrxb;
  			hw->irq_callback = &au1550_spi_pio_irq_callback;
  		}
  	} else if (bpw <= 16) {
  		hw->rx_word = &au1550_spi_rx_word_16;
  		hw->tx_word = &au1550_spi_tx_word_16;
  		hw->txrx_bufs = &au1550_spi_pio_txrxb;
  		hw->irq_callback = &au1550_spi_pio_irq_callback;
  	} else {
  		hw->rx_word = &au1550_spi_rx_word_32;
  		hw->tx_word = &au1550_spi_tx_word_32;
  		hw->txrx_bufs = &au1550_spi_pio_txrxb;
  		hw->irq_callback = &au1550_spi_pio_irq_callback;
  	}
  }
2deff8d60   Grant Likely   spi: Remove erron...
669
  static void au1550_spi_setup_psc_as_spi(struct au1550_spi *hw)
63bd23591   Jan Nikitenko   au1550 SPI contro...
670
671
672
673
674
  {
  	u32 stat, cfg;
  
  	/* set up the PSC for SPI mode */
  	hw->regs->psc_ctrl = PSC_CTRL_DISABLE;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
675
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
676
  	hw->regs->psc_sel = PSC_SEL_PS_SPIMODE;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
677
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
678
679
  
  	hw->regs->psc_spicfg = 0;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
680
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
681
682
  
  	hw->regs->psc_ctrl = PSC_CTRL_ENABLE;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
683
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
684
685
686
  
  	do {
  		stat = hw->regs->psc_spistat;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
687
  		wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
688
689
690
691
692
693
694
695
696
697
698
699
700
701
  	} while ((stat & PSC_SPISTAT_SR) == 0);
  
  
  	cfg = hw->usedma ? 0 : PSC_SPICFG_DD_DISABLE;
  	cfg |= PSC_SPICFG_SET_LEN(8);
  	cfg |= PSC_SPICFG_RT_FIFO8 | PSC_SPICFG_TT_FIFO8;
  	/* use minimal allowed brg and div values as initial setting: */
  	cfg |= PSC_SPICFG_SET_BAUD(4) | PSC_SPICFG_SET_DIV(0);
  
  #ifdef AU1550_SPI_DEBUG_LOOPBACK
  	cfg |= PSC_SPICFG_LB;
  #endif
  
  	hw->regs->psc_spicfg = cfg;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
702
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
703
704
705
706
  
  	au1550_spi_mask_ack_all(hw);
  
  	hw->regs->psc_spicfg |= PSC_SPICFG_DE_ENABLE;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
707
  	wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
708
709
710
  
  	do {
  		stat = hw->regs->psc_spistat;
2f73bfbe0   Manuel Lauss   MIPS: Alchemy: re...
711
  		wmb(); /* drain writebuffer */
63bd23591   Jan Nikitenko   au1550 SPI contro...
712
  	} while ((stat & PSC_SPISTAT_DR) == 0);
bbe48ecc7   Jan Nikitenko   spi: au1550_spi: ...
713
714
  
  	au1550_spi_reset_fifos(hw);
63bd23591   Jan Nikitenko   au1550 SPI contro...
715
  }
2deff8d60   Grant Likely   spi: Remove erron...
716
  static int au1550_spi_probe(struct platform_device *pdev)
63bd23591   Jan Nikitenko   au1550 SPI contro...
717
718
719
  {
  	struct au1550_spi *hw;
  	struct spi_master *master;
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
720
  	struct resource *r;
63bd23591   Jan Nikitenko   au1550 SPI contro...
721
722
723
724
725
726
727
728
729
  	int err = 0;
  
  	master = spi_alloc_master(&pdev->dev, sizeof(struct au1550_spi));
  	if (master == NULL) {
  		dev_err(&pdev->dev, "No memory for spi_master
  ");
  		err = -ENOMEM;
  		goto err_nomem;
  	}
e7db06b5d   David Brownell   spi: move more sp...
730
731
  	/* the spi->mode bits understood by this driver: */
  	master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_CS_HIGH | SPI_LSB_FIRST;
24778be20   Stephen Warren   spi: convert driv...
732
  	master->bits_per_word_mask = SPI_BPW_RANGE_MASK(4, 24);
e7db06b5d   David Brownell   spi: move more sp...
733

63bd23591   Jan Nikitenko   au1550 SPI contro...
734
  	hw = spi_master_get_devdata(master);
94c69f765   Axel Lin   spi: bitbang: Let...
735
  	hw->master = master;
8074cf063   Jingoo Han   spi: use dev_get_...
736
  	hw->pdata = dev_get_platdata(&pdev->dev);
63bd23591   Jan Nikitenko   au1550 SPI contro...
737
738
739
740
741
742
743
744
  	hw->dev = &pdev->dev;
  
  	if (hw->pdata == NULL) {
  		dev_err(&pdev->dev, "No platform data supplied
  ");
  		err = -ENOENT;
  		goto err_no_pdata;
  	}
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
  	r = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
  	if (!r) {
  		dev_err(&pdev->dev, "no IRQ
  ");
  		err = -ENODEV;
  		goto err_no_iores;
  	}
  	hw->irq = r->start;
  
  	hw->usedma = 0;
  	r = platform_get_resource(pdev, IORESOURCE_DMA, 0);
  	if (r) {
  		hw->dma_tx_id = r->start;
  		r = platform_get_resource(pdev, IORESOURCE_DMA, 1);
  		if (r) {
  			hw->dma_rx_id = r->start;
  			if (usedma && ddma_memid) {
  				if (pdev->dev.dma_mask == NULL)
  					dev_warn(&pdev->dev, "no dma mask
  ");
  				else
  					hw->usedma = 1;
  			}
  		}
  	}
63bd23591   Jan Nikitenko   au1550 SPI contro...
770

3a93a159c   Manuel Lauss   spi: au1550_spi: ...
771
772
773
774
775
776
  	r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
  	if (!r) {
  		dev_err(&pdev->dev, "no mmio resource
  ");
  		err = -ENODEV;
  		goto err_no_iores;
63bd23591   Jan Nikitenko   au1550 SPI contro...
777
  	}
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
778
779
780
  	hw->ioarea = request_mem_region(r->start, sizeof(psc_spi_t),
  					pdev->name);
  	if (!hw->ioarea) {
63bd23591   Jan Nikitenko   au1550 SPI contro...
781
782
783
784
785
  		dev_err(&pdev->dev, "Cannot reserve iomem region
  ");
  		err = -ENXIO;
  		goto err_no_iores;
  	}
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
786
787
788
789
790
791
  	hw->regs = (psc_spi_t __iomem *)ioremap(r->start, sizeof(psc_spi_t));
  	if (!hw->regs) {
  		dev_err(&pdev->dev, "cannot ioremap
  ");
  		err = -ENXIO;
  		goto err_ioremap;
63bd23591   Jan Nikitenko   au1550 SPI contro...
792
  	}
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
793
  	platform_set_drvdata(pdev, hw);
63bd23591   Jan Nikitenko   au1550 SPI contro...
794

3a93a159c   Manuel Lauss   spi: au1550_spi: ...
795
796
797
798
799
  	init_completion(&hw->master_done);
  
  	hw->bitbang.master = hw->master;
  	hw->bitbang.setup_transfer = au1550_spi_setupxfer;
  	hw->bitbang.chipselect = au1550_spi_chipsel;
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
800
801
802
803
  	hw->bitbang.txrx_bufs = au1550_spi_txrx_bufs;
  
  	if (hw->usedma) {
  		hw->dma_tx_ch = au1xxx_dbdma_chan_alloc(ddma_memid,
63bd23591   Jan Nikitenko   au1550 SPI contro...
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
  			hw->dma_tx_id, NULL, (void *)hw);
  		if (hw->dma_tx_ch == 0) {
  			dev_err(&pdev->dev,
  				"Cannot allocate tx dma channel
  ");
  			err = -ENXIO;
  			goto err_no_txdma;
  		}
  		au1xxx_dbdma_set_devwidth(hw->dma_tx_ch, 8);
  		if (au1xxx_dbdma_ring_alloc(hw->dma_tx_ch,
  			AU1550_SPI_DBDMA_DESCRIPTORS) == 0) {
  			dev_err(&pdev->dev,
  				"Cannot allocate tx dma descriptors
  ");
  			err = -ENXIO;
  			goto err_no_txdma_descr;
  		}
  
  
  		hw->dma_rx_ch = au1xxx_dbdma_chan_alloc(hw->dma_rx_id,
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
824
  			ddma_memid, NULL, (void *)hw);
63bd23591   Jan Nikitenko   au1550 SPI contro...
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
  		if (hw->dma_rx_ch == 0) {
  			dev_err(&pdev->dev,
  				"Cannot allocate rx dma channel
  ");
  			err = -ENXIO;
  			goto err_no_rxdma;
  		}
  		au1xxx_dbdma_set_devwidth(hw->dma_rx_ch, 8);
  		if (au1xxx_dbdma_ring_alloc(hw->dma_rx_ch,
  			AU1550_SPI_DBDMA_DESCRIPTORS) == 0) {
  			dev_err(&pdev->dev,
  				"Cannot allocate rx dma descriptors
  ");
  			err = -ENXIO;
  			goto err_no_rxdma_descr;
  		}
  
  		err = au1550_spi_dma_rxtmp_alloc(hw,
  			AU1550_SPI_DMA_RXTMP_MINSIZE);
  		if (err < 0) {
  			dev_err(&pdev->dev,
  				"Cannot allocate initial rx dma tmp buffer
  ");
  			goto err_dma_rxtmp_alloc;
  		}
  	}
  
  	au1550_spi_bits_handlers_set(hw, 8);
  
  	err = request_irq(hw->irq, au1550_spi_irq, 0, pdev->name, hw);
  	if (err) {
  		dev_err(&pdev->dev, "Cannot claim IRQ
  ");
  		goto err_no_irq;
  	}
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
860
  	master->bus_num = pdev->id;
63bd23591   Jan Nikitenko   au1550 SPI contro...
861
862
863
864
865
866
867
868
869
870
871
872
873
874
  	master->num_chipselect = hw->pdata->num_chipselect;
  
  	/*
  	 *  precompute valid range for spi freq - from au1550 datasheet:
  	 *    psc_tempclk = psc_mainclk / (2 << DIV)
  	 *    spiclk = psc_tempclk / (2 * (BRG + 1))
  	 *    BRG valid range is 4..63
  	 *    DIV valid range is 0..3
  	 *  round the min and max frequencies to values that would still
  	 *  produce valid brg and div
  	 */
  	{
  		int min_div = (2 << 0) * (2 * (4 + 1));
  		int max_div = (2 << 3) * (2 * (63 + 1));
0dd26e53b   Axel Lin   spi: au1550: Conv...
875
876
877
  		master->max_speed_hz = hw->pdata->mainclk_hz / min_div;
  		master->min_speed_hz =
  				hw->pdata->mainclk_hz / (max_div + 1) + 1;
63bd23591   Jan Nikitenko   au1550 SPI contro...
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
  	}
  
  	au1550_spi_setup_psc_as_spi(hw);
  
  	err = spi_bitbang_start(&hw->bitbang);
  	if (err) {
  		dev_err(&pdev->dev, "Failed to register SPI master
  ");
  		goto err_register;
  	}
  
  	dev_info(&pdev->dev,
  		"spi master registered: bus_num=%d num_chipselect=%d
  ",
  		master->bus_num, master->num_chipselect);
  
  	return 0;
  
  err_register:
  	free_irq(hw->irq, hw);
  
  err_no_irq:
  	au1550_spi_dma_rxtmp_free(hw);
  
  err_dma_rxtmp_alloc:
  err_no_rxdma_descr:
  	if (hw->usedma)
  		au1xxx_dbdma_chan_free(hw->dma_rx_ch);
  
  err_no_rxdma:
  err_no_txdma_descr:
  	if (hw->usedma)
  		au1xxx_dbdma_chan_free(hw->dma_tx_ch);
  
  err_no_txdma:
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
913
914
915
  	iounmap((void __iomem *)hw->regs);
  
  err_ioremap:
30670539b   Himangi Saraogi   spi: au1550: Fix ...
916
  	release_mem_region(r->start, sizeof(psc_spi_t));
63bd23591   Jan Nikitenko   au1550 SPI contro...
917
918
919
920
921
922
923
924
  
  err_no_iores:
  err_no_pdata:
  	spi_master_put(hw->master);
  
  err_nomem:
  	return err;
  }
2deff8d60   Grant Likely   spi: Remove erron...
925
  static int au1550_spi_remove(struct platform_device *pdev)
63bd23591   Jan Nikitenko   au1550 SPI contro...
926
927
928
929
930
931
932
933
934
  {
  	struct au1550_spi *hw = platform_get_drvdata(pdev);
  
  	dev_info(&pdev->dev, "spi master remove: bus_num=%d
  ",
  		hw->master->bus_num);
  
  	spi_bitbang_stop(&hw->bitbang);
  	free_irq(hw->irq, hw);
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
935
  	iounmap((void __iomem *)hw->regs);
61a2381c7   Manuel Lauss   spi: spi-au1550: ...
936
  	release_mem_region(hw->ioarea->start, sizeof(psc_spi_t));
63bd23591   Jan Nikitenko   au1550 SPI contro...
937
938
939
940
941
942
  
  	if (hw->usedma) {
  		au1550_spi_dma_rxtmp_free(hw);
  		au1xxx_dbdma_chan_free(hw->dma_rx_ch);
  		au1xxx_dbdma_chan_free(hw->dma_tx_ch);
  	}
63bd23591   Jan Nikitenko   au1550 SPI contro...
943
944
945
  	spi_master_put(hw->master);
  	return 0;
  }
7e38c3c44   Kay Sievers   spi: fix platform...
946
947
  /* work with hotplug and coldplug */
  MODULE_ALIAS("platform:au1550-spi");
63bd23591   Jan Nikitenko   au1550 SPI contro...
948
  static struct platform_driver au1550_spi_drv = {
75dab1bfb   Wolfram Sang   spi: spi-au1550: ...
949
  	.probe = au1550_spi_probe,
2deff8d60   Grant Likely   spi: Remove erron...
950
  	.remove = au1550_spi_remove,
63bd23591   Jan Nikitenko   au1550 SPI contro...
951
952
  	.driver = {
  		.name = "au1550-spi",
63bd23591   Jan Nikitenko   au1550 SPI contro...
953
954
955
956
957
  	},
  };
  
  static int __init au1550_spi_init(void)
  {
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
958
959
960
961
  	/*
  	 * create memory device with 8 bits dev_devwidth
  	 * needed for proper byte ordering to spi fifo
  	 */
970e268d6   Manuel Lauss   MIPS: Alchemy: Un...
962
963
964
965
966
967
968
969
  	switch (alchemy_get_cputype()) {
  	case ALCHEMY_CPU_AU1550:
  	case ALCHEMY_CPU_AU1200:
  	case ALCHEMY_CPU_AU1300:
  		break;
  	default:
  		return -ENODEV;
  	}
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
970
971
972
973
974
975
976
  	if (usedma) {
  		ddma_memid = au1xxx_ddma_add_device(&au1550_spi_mem_dbdev);
  		if (!ddma_memid)
  			printk(KERN_ERR "au1550-spi: cannot add memory"
  					"dbdma device
  ");
  	}
75dab1bfb   Wolfram Sang   spi: spi-au1550: ...
977
  	return platform_driver_register(&au1550_spi_drv);
63bd23591   Jan Nikitenko   au1550 SPI contro...
978
979
980
981
982
  }
  module_init(au1550_spi_init);
  
  static void __exit au1550_spi_exit(void)
  {
3a93a159c   Manuel Lauss   spi: au1550_spi: ...
983
984
  	if (usedma && ddma_memid)
  		au1xxx_ddma_del_device(ddma_memid);
63bd23591   Jan Nikitenko   au1550 SPI contro...
985
986
987
988
989
990
991
  	platform_driver_unregister(&au1550_spi_drv);
  }
  module_exit(au1550_spi_exit);
  
  MODULE_DESCRIPTION("Au1550 PSC SPI Driver");
  MODULE_AUTHOR("Jan Nikitenko <jan.nikitenko@gmail.com>");
  MODULE_LICENSE("GPL");