Blame view

drivers/spi/spi-xilinx.c 15.2 KB
ae918c02d   Andrei Konovalov   SPI master driver...
1
  /*
ae918c02d   Andrei Konovalov   SPI master driver...
2
3
4
5
6
   * Xilinx SPI controller driver (master mode only)
   *
   * Author: MontaVista Software, Inc.
   *	source@mvista.com
   *
8fd8821b6   Grant Likely   spi/xilinx: fold ...
7
8
9
10
11
12
13
   * Copyright (c) 2010 Secret Lab Technologies, Ltd.
   * Copyright (c) 2009 Intel Corporation
   * 2002-2007 (c) MontaVista Software, Inc.
  
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License version 2 as
   * published by the Free Software Foundation.
ae918c02d   Andrei Konovalov   SPI master driver...
14
15
16
17
18
   */
  
  #include <linux/module.h>
  #include <linux/init.h>
  #include <linux/interrupt.h>
eae6cb31d   Grant Likely   spi/xilinx: merge...
19
  #include <linux/of.h>
8fd8821b6   Grant Likely   spi/xilinx: fold ...
20
  #include <linux/platform_device.h>
ae918c02d   Andrei Konovalov   SPI master driver...
21
22
  #include <linux/spi/spi.h>
  #include <linux/spi/spi_bitbang.h>
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
23
  #include <linux/spi/xilinx_spi.h>
eae6cb31d   Grant Likely   spi/xilinx: merge...
24
  #include <linux/io.h>
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
25

fc3ba9525   David Brownell   SPI driver hotplu...
26
  #define XILINX_SPI_NAME "xilinx_spi"
ae918c02d   Andrei Konovalov   SPI master driver...
27
28
29
30
  
  /* Register definitions as per "OPB Serial Peripheral Interface (SPI) (v1.00e)
   * Product Specification", DS464
   */
c9da2e125   Richard Röjfors   xilinx_spi: add s...
31
  #define XSPI_CR_OFFSET		0x60	/* Control Register */
ae918c02d   Andrei Konovalov   SPI master driver...
32
33
34
35
36
37
38
39
40
41
  
  #define XSPI_CR_ENABLE		0x02
  #define XSPI_CR_MASTER_MODE	0x04
  #define XSPI_CR_CPOL		0x08
  #define XSPI_CR_CPHA		0x10
  #define XSPI_CR_MODE_MASK	(XSPI_CR_CPHA | XSPI_CR_CPOL)
  #define XSPI_CR_TXFIFO_RESET	0x20
  #define XSPI_CR_RXFIFO_RESET	0x40
  #define XSPI_CR_MANUAL_SSELECT	0x80
  #define XSPI_CR_TRANS_INHIBIT	0x100
c9da2e125   Richard Röjfors   xilinx_spi: add s...
42
  #define XSPI_CR_LSB_FIRST	0x200
ae918c02d   Andrei Konovalov   SPI master driver...
43

c9da2e125   Richard Röjfors   xilinx_spi: add s...
44
  #define XSPI_SR_OFFSET		0x64	/* Status Register */
ae918c02d   Andrei Konovalov   SPI master driver...
45
46
47
48
49
50
  
  #define XSPI_SR_RX_EMPTY_MASK	0x01	/* Receive FIFO is empty */
  #define XSPI_SR_RX_FULL_MASK	0x02	/* Receive FIFO is full */
  #define XSPI_SR_TX_EMPTY_MASK	0x04	/* Transmit FIFO is empty */
  #define XSPI_SR_TX_FULL_MASK	0x08	/* Transmit FIFO is full */
  #define XSPI_SR_MODE_FAULT_MASK	0x10	/* Mode fault error */
c9da2e125   Richard Röjfors   xilinx_spi: add s...
51
52
  #define XSPI_TXD_OFFSET		0x68	/* Data Transmit Register */
  #define XSPI_RXD_OFFSET		0x6c	/* Data Receive Register */
ae918c02d   Andrei Konovalov   SPI master driver...
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
  
  #define XSPI_SSR_OFFSET		0x70	/* 32-bit Slave Select Register */
  
  /* Register definitions as per "OPB IPIF (v3.01c) Product Specification", DS414
   * IPIF registers are 32 bit
   */
  #define XIPIF_V123B_DGIER_OFFSET	0x1c	/* IPIF global int enable reg */
  #define XIPIF_V123B_GINTR_ENABLE	0x80000000
  
  #define XIPIF_V123B_IISR_OFFSET		0x20	/* IPIF interrupt status reg */
  #define XIPIF_V123B_IIER_OFFSET		0x28	/* IPIF interrupt enable reg */
  
  #define XSPI_INTR_MODE_FAULT		0x01	/* Mode fault error */
  #define XSPI_INTR_SLAVE_MODE_FAULT	0x02	/* Selected as slave while
  						 * disabled */
  #define XSPI_INTR_TX_EMPTY		0x04	/* TxFIFO is empty */
  #define XSPI_INTR_TX_UNDERRUN		0x08	/* TxFIFO was underrun */
  #define XSPI_INTR_RX_FULL		0x10	/* RxFIFO is full */
  #define XSPI_INTR_RX_OVERRUN		0x20	/* RxFIFO was overrun */
c9da2e125   Richard Röjfors   xilinx_spi: add s...
72
  #define XSPI_INTR_TX_HALF_EMPTY		0x40	/* TxFIFO is half empty */
ae918c02d   Andrei Konovalov   SPI master driver...
73
74
75
76
77
78
79
80
  
  #define XIPIF_V123B_RESETR_OFFSET	0x40	/* IPIF reset register */
  #define XIPIF_V123B_RESET_MASK		0x0a	/* the value to write */
  
  struct xilinx_spi {
  	/* bitbang has to be first */
  	struct spi_bitbang bitbang;
  	struct completion done;
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
81
  	struct resource mem; /* phys mem */
ae918c02d   Andrei Konovalov   SPI master driver...
82
83
84
  	void __iomem	*regs;	/* virt. address of the control registers */
  
  	u32		irq;
ae918c02d   Andrei Konovalov   SPI master driver...
85
86
87
  	u8 *rx_ptr;		/* pointer in the Tx buffer */
  	const u8 *tx_ptr;	/* pointer in the Rx buffer */
  	int remaining_bytes;	/* the number of bytes left to transfer */
c9da2e125   Richard Röjfors   xilinx_spi: add s...
88
  	u8 bits_per_word;
86fc59359   Richard Röjfors   xilinx_spi: Switc...
89
90
  	unsigned int (*read_fn) (void __iomem *);
  	void (*write_fn) (u32, void __iomem *);
c9da2e125   Richard Röjfors   xilinx_spi: add s...
91
92
  	void (*tx_fn) (struct xilinx_spi *);
  	void (*rx_fn) (struct xilinx_spi *);
ae918c02d   Andrei Konovalov   SPI master driver...
93
  };
977821499   Paul Mundt   spi: xilinx_spi: ...
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  static void xspi_write32(u32 val, void __iomem *addr)
  {
  	iowrite32(val, addr);
  }
  
  static unsigned int xspi_read32(void __iomem *addr)
  {
  	return ioread32(addr);
  }
  
  static void xspi_write32_be(u32 val, void __iomem *addr)
  {
  	iowrite32be(val, addr);
  }
  
  static unsigned int xspi_read32_be(void __iomem *addr)
  {
  	return ioread32be(addr);
  }
c9da2e125   Richard Röjfors   xilinx_spi: add s...
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  static void xspi_tx8(struct xilinx_spi *xspi)
  {
  	xspi->write_fn(*xspi->tx_ptr, xspi->regs + XSPI_TXD_OFFSET);
  	xspi->tx_ptr++;
  }
  
  static void xspi_tx16(struct xilinx_spi *xspi)
  {
  	xspi->write_fn(*(u16 *)(xspi->tx_ptr), xspi->regs + XSPI_TXD_OFFSET);
  	xspi->tx_ptr += 2;
  }
  
  static void xspi_tx32(struct xilinx_spi *xspi)
  {
  	xspi->write_fn(*(u32 *)(xspi->tx_ptr), xspi->regs + XSPI_TXD_OFFSET);
  	xspi->tx_ptr += 4;
  }
  
  static void xspi_rx8(struct xilinx_spi *xspi)
  {
  	u32 data = xspi->read_fn(xspi->regs + XSPI_RXD_OFFSET);
  	if (xspi->rx_ptr) {
  		*xspi->rx_ptr = data & 0xff;
  		xspi->rx_ptr++;
  	}
  }
  
  static void xspi_rx16(struct xilinx_spi *xspi)
  {
  	u32 data = xspi->read_fn(xspi->regs + XSPI_RXD_OFFSET);
  	if (xspi->rx_ptr) {
  		*(u16 *)(xspi->rx_ptr) = data & 0xffff;
  		xspi->rx_ptr += 2;
  	}
  }
  
  static void xspi_rx32(struct xilinx_spi *xspi)
  {
  	u32 data = xspi->read_fn(xspi->regs + XSPI_RXD_OFFSET);
  	if (xspi->rx_ptr) {
  		*(u32 *)(xspi->rx_ptr) = data;
  		xspi->rx_ptr += 4;
  	}
  }
86fc59359   Richard Röjfors   xilinx_spi: Switc...
157
  static void xspi_init_hw(struct xilinx_spi *xspi)
ae918c02d   Andrei Konovalov   SPI master driver...
158
  {
86fc59359   Richard Röjfors   xilinx_spi: Switc...
159
  	void __iomem *regs_base = xspi->regs;
ae918c02d   Andrei Konovalov   SPI master driver...
160
  	/* Reset the SPI device */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
161
162
  	xspi->write_fn(XIPIF_V123B_RESET_MASK,
  		regs_base + XIPIF_V123B_RESETR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
163
  	/* Disable all the interrupts just in case */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
164
  	xspi->write_fn(0, regs_base + XIPIF_V123B_IIER_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
165
  	/* Enable the global IPIF interrupt */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
166
167
  	xspi->write_fn(XIPIF_V123B_GINTR_ENABLE,
  		regs_base + XIPIF_V123B_DGIER_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
168
  	/* Deselect the slave on the SPI bus */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
169
  	xspi->write_fn(0xffff, regs_base + XSPI_SSR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
170
171
  	/* Disable the transmitter, enable Manual Slave Select Assertion,
  	 * put SPI controller into master mode, and enable it */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
172
  	xspi->write_fn(XSPI_CR_TRANS_INHIBIT | XSPI_CR_MANUAL_SSELECT |
c9da2e125   Richard Röjfors   xilinx_spi: add s...
173
174
  		XSPI_CR_MASTER_MODE | XSPI_CR_ENABLE | XSPI_CR_TXFIFO_RESET |
  		XSPI_CR_RXFIFO_RESET, regs_base + XSPI_CR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
175
176
177
178
179
180
181
182
  }
  
  static void xilinx_spi_chipselect(struct spi_device *spi, int is_on)
  {
  	struct xilinx_spi *xspi = spi_master_get_devdata(spi->master);
  
  	if (is_on == BITBANG_CS_INACTIVE) {
  		/* Deselect the slave on the SPI bus */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
183
  		xspi->write_fn(0xffff, xspi->regs + XSPI_SSR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
184
185
  	} else if (is_on == BITBANG_CS_ACTIVE) {
  		/* Set the SPI clock phase and polarity */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
186
  		u16 cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET)
ae918c02d   Andrei Konovalov   SPI master driver...
187
188
189
190
191
  			 & ~XSPI_CR_MODE_MASK;
  		if (spi->mode & SPI_CPHA)
  			cr |= XSPI_CR_CPHA;
  		if (spi->mode & SPI_CPOL)
  			cr |= XSPI_CR_CPOL;
86fc59359   Richard Röjfors   xilinx_spi: Switc...
192
  		xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
193
194
195
196
197
198
199
  
  		/* We do not check spi->max_speed_hz here as the SPI clock
  		 * frequency is not software programmable (the IP block design
  		 * parameter)
  		 */
  
  		/* Activate the chip select */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
200
201
  		xspi->write_fn(~(0x0001 << spi->chip_select),
  			xspi->regs + XSPI_SSR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
202
203
204
205
206
  	}
  }
  
  /* spi_bitbang requires custom setup_transfer() to be defined if there is a
   * custom txrx_bufs(). We have nothing to setup here as the SPI IP block
c9da2e125   Richard Röjfors   xilinx_spi: add s...
207
208
209
   * supports 8 or 16 bits per word which cannot be changed in software.
   * SPI clock can't be changed in software either.
   * Check for correct bits per word. Chip select delay calculations could be
ae918c02d   Andrei Konovalov   SPI master driver...
210
211
212
213
214
   * added here as soon as bitbang_work() can be made aware of the delay value.
   */
  static int xilinx_spi_setup_transfer(struct spi_device *spi,
  		struct spi_transfer *t)
  {
c9da2e125   Richard Röjfors   xilinx_spi: add s...
215
  	struct xilinx_spi *xspi = spi_master_get_devdata(spi->master);
ae918c02d   Andrei Konovalov   SPI master driver...
216
  	u8 bits_per_word;
ae918c02d   Andrei Konovalov   SPI master driver...
217

1a8d3b777   John Linn   Xilinx: SPI: Fix ...
218
219
  	bits_per_word = (t && t->bits_per_word)
  			 ? t->bits_per_word : spi->bits_per_word;
c9da2e125   Richard Röjfors   xilinx_spi: add s...
220
  	if (bits_per_word != xspi->bits_per_word) {
ae918c02d   Andrei Konovalov   SPI master driver...
221
222
  		dev_err(&spi->dev, "%s, unsupported bits_per_word=%d
  ",
b687d2a8f   Harvey Harrison   spi: replace rema...
223
  			__func__, bits_per_word);
ae918c02d   Andrei Konovalov   SPI master driver...
224
225
  		return -EINVAL;
  	}
ae918c02d   Andrei Konovalov   SPI master driver...
226
227
  	return 0;
  }
ae918c02d   Andrei Konovalov   SPI master driver...
228
229
  static int xilinx_spi_setup(struct spi_device *spi)
  {
c9da2e125   Richard Röjfors   xilinx_spi: add s...
230
231
232
233
234
235
236
237
238
239
  	/* always return 0, we can not check the number of bits.
  	 * There are cases when SPI setup is called before any driver is
  	 * there, in that case the SPI core defaults to 8 bits, which we
  	 * do not support in some cases. But if we return an error, the
  	 * SPI device would not be registered and no driver can get hold of it
  	 * When the driver is there, it will call SPI setup again with the
  	 * correct number of bits per transfer.
  	 * If a driver setups with the wrong bit number, it will fail when
  	 * it tries to do a transfer
  	 */
ae918c02d   Andrei Konovalov   SPI master driver...
240
241
242
243
244
245
246
247
  	return 0;
  }
  
  static void xilinx_spi_fill_tx_fifo(struct xilinx_spi *xspi)
  {
  	u8 sr;
  
  	/* Fill the Tx FIFO with as many bytes as possible */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
248
  	sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
249
  	while ((sr & XSPI_SR_TX_FULL_MASK) == 0 && xspi->remaining_bytes > 0) {
86fc59359   Richard Röjfors   xilinx_spi: Switc...
250
  		if (xspi->tx_ptr)
c9da2e125   Richard Röjfors   xilinx_spi: add s...
251
  			xspi->tx_fn(xspi);
86fc59359   Richard Röjfors   xilinx_spi: Switc...
252
253
  		else
  			xspi->write_fn(0, xspi->regs + XSPI_TXD_OFFSET);
c9da2e125   Richard Röjfors   xilinx_spi: add s...
254
  		xspi->remaining_bytes -= xspi->bits_per_word / 8;
86fc59359   Richard Röjfors   xilinx_spi: Switc...
255
  		sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
  	}
  }
  
  static int xilinx_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
  {
  	struct xilinx_spi *xspi = spi_master_get_devdata(spi->master);
  	u32 ipif_ier;
  	u16 cr;
  
  	/* We get here with transmitter inhibited */
  
  	xspi->tx_ptr = t->tx_buf;
  	xspi->rx_ptr = t->rx_buf;
  	xspi->remaining_bytes = t->len;
  	INIT_COMPLETION(xspi->done);
  
  	xilinx_spi_fill_tx_fifo(xspi);
  
  	/* Enable the transmit empty interrupt, which we use to determine
  	 * progress on the transmission.
  	 */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
277
278
279
  	ipif_ier = xspi->read_fn(xspi->regs + XIPIF_V123B_IIER_OFFSET);
  	xspi->write_fn(ipif_ier | XSPI_INTR_TX_EMPTY,
  		xspi->regs + XIPIF_V123B_IIER_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
280
281
  
  	/* Start the transfer by not inhibiting the transmitter any longer */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
282
283
284
  	cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET) &
  		~XSPI_CR_TRANS_INHIBIT;
  	xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
285
286
287
288
  
  	wait_for_completion(&xspi->done);
  
  	/* Disable the transmit empty interrupt */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
289
  	xspi->write_fn(ipif_ier, xspi->regs + XIPIF_V123B_IIER_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
  
  	return t->len - xspi->remaining_bytes;
  }
  
  
  /* This driver supports single master mode only. Hence Tx FIFO Empty
   * is the only interrupt we care about.
   * Receive FIFO Overrun, Transmit FIFO Underrun, Mode Fault, and Slave Mode
   * Fault are not to happen.
   */
  static irqreturn_t xilinx_spi_irq(int irq, void *dev_id)
  {
  	struct xilinx_spi *xspi = dev_id;
  	u32 ipif_isr;
  
  	/* Get the IPIF interrupts, and clear them immediately */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
306
307
  	ipif_isr = xspi->read_fn(xspi->regs + XIPIF_V123B_IISR_OFFSET);
  	xspi->write_fn(ipif_isr, xspi->regs + XIPIF_V123B_IISR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
308
309
310
311
312
313
314
315
316
317
  
  	if (ipif_isr & XSPI_INTR_TX_EMPTY) {	/* Transmission completed */
  		u16 cr;
  		u8 sr;
  
  		/* A transmit has just completed. Process received data and
  		 * check for more data to transmit. Always inhibit the
  		 * transmitter while the Isr refills the transmit register/FIFO,
  		 * or make sure it is stopped if we're done.
  		 */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
318
319
320
  		cr = xspi->read_fn(xspi->regs + XSPI_CR_OFFSET);
  		xspi->write_fn(cr | XSPI_CR_TRANS_INHIBIT,
  			xspi->regs + XSPI_CR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
321
322
  
  		/* Read out all the data from the Rx FIFO */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
323
  		sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
324
  		while ((sr & XSPI_SR_RX_EMPTY_MASK) == 0) {
c9da2e125   Richard Röjfors   xilinx_spi: add s...
325
  			xspi->rx_fn(xspi);
86fc59359   Richard Röjfors   xilinx_spi: Switc...
326
  			sr = xspi->read_fn(xspi->regs + XSPI_SR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
327
328
329
330
331
332
333
334
  		}
  
  		/* See if there is more data to send */
  		if (xspi->remaining_bytes > 0) {
  			xilinx_spi_fill_tx_fifo(xspi);
  			/* Start the transfer by not inhibiting the
  			 * transmitter any longer
  			 */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
335
  			xspi->write_fn(cr, xspi->regs + XSPI_CR_OFFSET);
ae918c02d   Andrei Konovalov   SPI master driver...
336
337
338
339
340
341
342
343
344
345
  		} else {
  			/* No more data to send.
  			 * Indicate the transfer is completed.
  			 */
  			complete(&xspi->done);
  		}
  	}
  
  	return IRQ_HANDLED;
  }
eae6cb31d   Grant Likely   spi/xilinx: merge...
346
347
348
349
350
351
  static const struct of_device_id xilinx_spi_of_match[] = {
  	{ .compatible = "xlnx,xps-spi-2.00.a", },
  	{ .compatible = "xlnx,xps-spi-2.00.b", },
  	{}
  };
  MODULE_DEVICE_TABLE(of, xilinx_spi_of_match);
eae6cb31d   Grant Likely   spi/xilinx: merge...
352

d5af91a1f   Richard Röjfors   xilinx_spi: Split...
353
  struct spi_master *xilinx_spi_init(struct device *dev, struct resource *mem,
91565c406   Grant Likely   spi/xilinx: Elimi...
354
  	u32 irq, s16 bus_num, int num_cs, int little_endian, int bits_per_word)
ae918c02d   Andrei Konovalov   SPI master driver...
355
  {
ae918c02d   Andrei Konovalov   SPI master driver...
356
357
  	struct spi_master *master;
  	struct xilinx_spi *xspi;
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
358
  	int ret;
ae918c02d   Andrei Konovalov   SPI master driver...
359

d5af91a1f   Richard Röjfors   xilinx_spi: Split...
360
361
362
  	master = spi_alloc_master(dev, sizeof(struct xilinx_spi));
  	if (!master)
  		return NULL;
ae918c02d   Andrei Konovalov   SPI master driver...
363

e7db06b5d   David Brownell   spi: move more sp...
364
365
  	/* the spi->mode bits understood by this driver: */
  	master->mode_bits = SPI_CPOL | SPI_CPHA;
ae918c02d   Andrei Konovalov   SPI master driver...
366
367
368
369
370
371
372
  	xspi = spi_master_get_devdata(master);
  	xspi->bitbang.master = spi_master_get(master);
  	xspi->bitbang.chipselect = xilinx_spi_chipselect;
  	xspi->bitbang.setup_transfer = xilinx_spi_setup_transfer;
  	xspi->bitbang.txrx_bufs = xilinx_spi_txrx_bufs;
  	xspi->bitbang.master->setup = xilinx_spi_setup;
  	init_completion(&xspi->done);
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
373
374
  	if (!request_mem_region(mem->start, resource_size(mem),
  		XILINX_SPI_NAME))
ae918c02d   Andrei Konovalov   SPI master driver...
375
  		goto put_master;
ae918c02d   Andrei Konovalov   SPI master driver...
376

d5af91a1f   Richard Röjfors   xilinx_spi: Split...
377
  	xspi->regs = ioremap(mem->start, resource_size(mem));
ae918c02d   Andrei Konovalov   SPI master driver...
378
  	if (xspi->regs == NULL) {
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
379
380
381
  		dev_warn(dev, "ioremap failure
  ");
  		goto map_failed;
ae918c02d   Andrei Konovalov   SPI master driver...
382
  	}
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
383
  	master->bus_num = bus_num;
91565c406   Grant Likely   spi/xilinx: Elimi...
384
  	master->num_chipselect = num_cs;
12b15e832   Anatolij Gustschin   of/spi: call of_r...
385
  	master->dev.of_node = dev->of_node;
ae918c02d   Andrei Konovalov   SPI master driver...
386

d5af91a1f   Richard Röjfors   xilinx_spi: Split...
387
388
  	xspi->mem = *mem;
  	xspi->irq = irq;
91565c406   Grant Likely   spi/xilinx: Elimi...
389
  	if (little_endian) {
977821499   Paul Mundt   spi: xilinx_spi: ...
390
391
  		xspi->read_fn = xspi_read32;
  		xspi->write_fn = xspi_write32;
86fc59359   Richard Röjfors   xilinx_spi: Switc...
392
  	} else {
977821499   Paul Mundt   spi: xilinx_spi: ...
393
394
  		xspi->read_fn = xspi_read32_be;
  		xspi->write_fn = xspi_write32_be;
86fc59359   Richard Röjfors   xilinx_spi: Switc...
395
  	}
91565c406   Grant Likely   spi/xilinx: Elimi...
396
  	xspi->bits_per_word = bits_per_word;
c9da2e125   Richard Röjfors   xilinx_spi: add s...
397
398
399
400
401
402
403
404
405
406
407
  	if (xspi->bits_per_word == 8) {
  		xspi->tx_fn = xspi_tx8;
  		xspi->rx_fn = xspi_rx8;
  	} else if (xspi->bits_per_word == 16) {
  		xspi->tx_fn = xspi_tx16;
  		xspi->rx_fn = xspi_rx16;
  	} else if (xspi->bits_per_word == 32) {
  		xspi->tx_fn = xspi_tx32;
  		xspi->rx_fn = xspi_rx32;
  	} else
  		goto unmap_io;
ae918c02d   Andrei Konovalov   SPI master driver...
408
409
  
  	/* SPI controller initializations */
86fc59359   Richard Röjfors   xilinx_spi: Switc...
410
  	xspi_init_hw(xspi);
ae918c02d   Andrei Konovalov   SPI master driver...
411
412
  
  	/* Register for SPI Interrupt */
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
413
414
  	ret = request_irq(xspi->irq, xilinx_spi_irq, 0, XILINX_SPI_NAME, xspi);
  	if (ret)
ae918c02d   Andrei Konovalov   SPI master driver...
415
  		goto unmap_io;
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
416
417
418
419
  	ret = spi_bitbang_start(&xspi->bitbang);
  	if (ret) {
  		dev_err(dev, "spi_bitbang_start FAILED
  ");
ae918c02d   Andrei Konovalov   SPI master driver...
420
421
  		goto free_irq;
  	}
920712af4   Grant Likely   spi/xilinx_spi: f...
422
423
424
  	dev_info(dev, "at 0x%08llX mapped to 0x%p, irq=%d
  ",
  		(unsigned long long)mem->start, xspi->regs, xspi->irq);
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
425
  	return master;
ae918c02d   Andrei Konovalov   SPI master driver...
426
427
428
429
430
  
  free_irq:
  	free_irq(xspi->irq, xspi);
  unmap_io:
  	iounmap(xspi->regs);
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
431
432
  map_failed:
  	release_mem_region(mem->start, resource_size(mem));
ae918c02d   Andrei Konovalov   SPI master driver...
433
434
  put_master:
  	spi_master_put(master);
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
435
  	return NULL;
ae918c02d   Andrei Konovalov   SPI master driver...
436
  }
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
437
  EXPORT_SYMBOL(xilinx_spi_init);
ae918c02d   Andrei Konovalov   SPI master driver...
438

d5af91a1f   Richard Röjfors   xilinx_spi: Split...
439
  void xilinx_spi_deinit(struct spi_master *master)
ae918c02d   Andrei Konovalov   SPI master driver...
440
441
  {
  	struct xilinx_spi *xspi;
ae918c02d   Andrei Konovalov   SPI master driver...
442

ae918c02d   Andrei Konovalov   SPI master driver...
443
444
445
446
447
  	xspi = spi_master_get_devdata(master);
  
  	spi_bitbang_stop(&xspi->bitbang);
  	free_irq(xspi->irq, xspi);
  	iounmap(xspi->regs);
ff82c587a   John Linn   Xilinx: SPI: upda...
448

d5af91a1f   Richard Röjfors   xilinx_spi: Split...
449
450
  	release_mem_region(xspi->mem.start, resource_size(&xspi->mem));
  	spi_master_put(xspi->bitbang.master);
ae918c02d   Andrei Konovalov   SPI master driver...
451
  }
d5af91a1f   Richard Röjfors   xilinx_spi: Split...
452
  EXPORT_SYMBOL(xilinx_spi_deinit);
ae918c02d   Andrei Konovalov   SPI master driver...
453

8fd8821b6   Grant Likely   spi/xilinx: fold ...
454
455
456
457
  static int __devinit xilinx_spi_probe(struct platform_device *dev)
  {
  	struct xspi_platform_data *pdata;
  	struct resource *r;
eae6cb31d   Grant Likely   spi/xilinx: merge...
458
  	int irq, num_cs = 0, little_endian = 0, bits_per_word = 8;
8fd8821b6   Grant Likely   spi/xilinx: fold ...
459
460
  	struct spi_master *master;
  	u8 i;
3271d382c   Samuel Ortiz   mfd: Use mfd cell...
461
  	pdata = dev->dev.platform_data;
eae6cb31d   Grant Likely   spi/xilinx: merge...
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
  	if (pdata) {
  		num_cs = pdata->num_chipselect;
  		little_endian = pdata->little_endian;
  		bits_per_word = pdata->bits_per_word;
  	}
  
  #ifdef CONFIG_OF
  	if (dev->dev.of_node) {
  		const __be32 *prop;
  		int len;
  
  		/* number of slave select bits is required */
  		prop = of_get_property(dev->dev.of_node, "xlnx,num-ss-bits",
  				       &len);
  		if (prop && len >= sizeof(*prop))
  			num_cs = __be32_to_cpup(prop);
  	}
  #endif
  
  	if (!num_cs) {
  		dev_err(&dev->dev, "Missing slave select configuration data
  ");
  		return -EINVAL;
  	}
8fd8821b6   Grant Likely   spi/xilinx: fold ...
486
487
488
489
490
491
492
493
  
  	r = platform_get_resource(dev, IORESOURCE_MEM, 0);
  	if (!r)
  		return -ENODEV;
  
  	irq = platform_get_irq(dev, 0);
  	if (irq < 0)
  		return -ENXIO;
eae6cb31d   Grant Likely   spi/xilinx: merge...
494
495
  	master = xilinx_spi_init(&dev->dev, r, irq, dev->id, num_cs,
  				 little_endian, bits_per_word);
8fd8821b6   Grant Likely   spi/xilinx: fold ...
496
497
  	if (!master)
  		return -ENODEV;
eae6cb31d   Grant Likely   spi/xilinx: merge...
498
499
500
501
  	if (pdata) {
  		for (i = 0; i < pdata->num_devices; i++)
  			spi_new_device(master, pdata->devices + i);
  	}
8fd8821b6   Grant Likely   spi/xilinx: fold ...
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
  
  	platform_set_drvdata(dev, master);
  	return 0;
  }
  
  static int __devexit xilinx_spi_remove(struct platform_device *dev)
  {
  	xilinx_spi_deinit(platform_get_drvdata(dev));
  	platform_set_drvdata(dev, 0);
  
  	return 0;
  }
  
  /* work with hotplug and coldplug */
  MODULE_ALIAS("platform:" XILINX_SPI_NAME);
  
  static struct platform_driver xilinx_spi_driver = {
  	.probe = xilinx_spi_probe,
  	.remove = __devexit_p(xilinx_spi_remove),
  	.driver = {
  		.name = XILINX_SPI_NAME,
  		.owner = THIS_MODULE,
eae6cb31d   Grant Likely   spi/xilinx: merge...
524
  		.of_match_table = xilinx_spi_of_match,
8fd8821b6   Grant Likely   spi/xilinx: fold ...
525
526
  	},
  };
940ab8896   Grant Likely   drivercore: Add h...
527
  module_platform_driver(xilinx_spi_driver);
8fd8821b6   Grant Likely   spi/xilinx: fold ...
528

ae918c02d   Andrei Konovalov   SPI master driver...
529
530
531
  MODULE_AUTHOR("MontaVista Software, Inc. <source@mvista.com>");
  MODULE_DESCRIPTION("Xilinx SPI driver");
  MODULE_LICENSE("GPL");