1 From e29263339db41d49d79482c93463c4c0cbe764d7 Mon Sep 17 00:00:00 2001
2 From: John Crispin <blogic@openwrt.org>
3 Date: Fri, 30 Sep 2011 14:23:42 +0200
4 Subject: [PATCH 14/24] MIPS: lantiq: adds xway spi
7 .../mips/include/asm/mach-lantiq/lantiq_platform.h | 9 +
8 .../mips/include/asm/mach-lantiq/xway/lantiq_irq.h | 2 +
9 .../mips/include/asm/mach-lantiq/xway/lantiq_soc.h | 1 +
10 drivers/spi/Kconfig | 8 +
11 drivers/spi/Makefile | 2 +-
12 drivers/spi/spi-xway.c | 1062 ++++++++++++++++++++
13 6 files changed, 1083 insertions(+), 1 deletions(-)
14 create mode 100644 drivers/spi/spi-xway.c
16 Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/lantiq_platform.h
17 ===================================================================
18 --- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/lantiq_platform.h 2011-08-17 19:57:16.000000000 +0200
19 +++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/lantiq_platform.h 2011-10-04 20:05:23.962311503 +0200
25 +struct ltq_spi_platform_data {
29 +struct ltq_spi_controller_data {
34 Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h
35 ===================================================================
36 --- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h 2011-08-17 19:57:16.000000000 +0200
37 +++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_irq.h 2011-10-04 20:05:23.962311503 +0200
40 #define LTQ_SSC_TIR (INT_NUM_IM0_IRL0 + 15)
41 #define LTQ_SSC_RIR (INT_NUM_IM0_IRL0 + 14)
42 +#define LTQ_SSC_TIR_AR9 (INT_NUM_IM0_IRL0 + 14)
43 +#define LTQ_SSC_RIR_AR9 (INT_NUM_IM0_IRL0 + 15)
44 #define LTQ_SSC_EIR (INT_NUM_IM0_IRL0 + 16)
46 #define LTQ_MEI_DYING_GASP_INT (INT_NUM_IM1_IRL0 + 21)
47 Index: linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h
48 ===================================================================
49 --- linux-3.0.3.orig/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2011-10-04 20:03:54.934307699 +0200
50 +++ linux-3.0.3/arch/mips/include/asm/mach-lantiq/xway/lantiq_soc.h 2011-10-04 20:05:23.966311504 +0200
53 #define PMU_DMA 0x0020
54 #define PMU_USB 0x8041
55 +#define PMU_SPI 0x0100
56 #define PMU_LED 0x0800
57 #define PMU_GPT 0x1000
58 #define PMU_PPE 0x2000
59 Index: linux-3.0.3/drivers/spi/Kconfig
60 ===================================================================
61 --- linux-3.0.3.orig/drivers/spi/Kconfig 2011-10-04 20:05:07.030310779 +0200
62 +++ linux-3.0.3/drivers/spi/Kconfig 2011-10-04 20:05:23.966311504 +0200
65 SPI driver for Nuvoton NUC900 series ARM SoCs
68 + tristate "Lantiq XWAY SPI controller"
69 + depends on LANTIQ && SOC_TYPE_XWAY
72 + This driver supports the Lantiq SoC SPI controller in master
76 # Add new SPI master controllers in alphabetical order above this line
78 Index: linux-3.0.3/drivers/spi/Makefile
79 ===================================================================
80 --- linux-3.0.3.orig/drivers/spi/Makefile 2011-10-04 20:05:20.000000000 +0200
81 +++ linux-3.0.3/drivers/spi/Makefile 2011-10-04 20:05:35.802312011 +0200
83 obj-$(CONFIG_SPI_STMP3XXX) += spi_stmp.o
84 obj-$(CONFIG_SPI_NUC900) += spi_nuc900.o
85 obj-$(CONFIG_SPI_FALCON) += spi-falcon.o
86 +obj-$(CONFIG_SPI_XWAY) += spi-xway.o
88 # special build for s3c24xx spi driver with fiq support
89 spi_s3c24xx_hw-y := spi_s3c24xx.o
90 Index: linux-3.0.3/drivers/spi/spi-xway.c
91 ===================================================================
92 --- /dev/null 1970-01-01 00:00:00.000000000 +0000
93 +++ linux-3.0.3/drivers/spi/spi-xway.c 2011-10-04 20:05:23.966311504 +0200
96 + * Lantiq SoC SPI controller
98 + * Copyright (C) 2011 Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
100 + * This program is free software; you can distribute it and/or modify it
101 + * under the terms of the GNU General Public License (Version 2) as
102 + * published by the Free Software Foundation.
105 +#include <linux/init.h>
106 +#include <linux/module.h>
107 +#include <linux/workqueue.h>
108 +#include <linux/platform_device.h>
109 +#include <linux/io.h>
110 +#include <linux/sched.h>
111 +#include <linux/delay.h>
112 +#include <linux/interrupt.h>
113 +#include <linux/completion.h>
114 +#include <linux/spinlock.h>
115 +#include <linux/err.h>
116 +#include <linux/clk.h>
117 +#include <linux/gpio.h>
118 +#include <linux/spi/spi.h>
119 +#include <linux/spi/spi_bitbang.h>
121 +#include <lantiq_soc.h>
122 +#include <lantiq_platform.h>
124 +#define LTQ_SPI_CLC 0x00 /* Clock control */
125 +#define LTQ_SPI_PISEL 0x04 /* Port input select */
126 +#define LTQ_SPI_ID 0x08 /* Identification */
127 +#define LTQ_SPI_CON 0x10 /* Control */
128 +#define LTQ_SPI_STAT 0x14 /* Status */
129 +#define LTQ_SPI_WHBSTATE 0x18 /* Write HW modified state */
130 +#define LTQ_SPI_TB 0x20 /* Transmit buffer */
131 +#define LTQ_SPI_RB 0x24 /* Receive buffer */
132 +#define LTQ_SPI_RXFCON 0x30 /* Receive FIFO control */
133 +#define LTQ_SPI_TXFCON 0x34 /* Transmit FIFO control */
134 +#define LTQ_SPI_FSTAT 0x38 /* FIFO status */
135 +#define LTQ_SPI_BRT 0x40 /* Baudrate timer */
136 +#define LTQ_SPI_BRSTAT 0x44 /* Baudrate timer status */
137 +#define LTQ_SPI_SFCON 0x60 /* Serial frame control */
138 +#define LTQ_SPI_SFSTAT 0x64 /* Serial frame status */
139 +#define LTQ_SPI_GPOCON 0x70 /* General purpose output control */
140 +#define LTQ_SPI_GPOSTAT 0x74 /* General purpose output status */
141 +#define LTQ_SPI_FGPO 0x78 /* Forced general purpose output */
142 +#define LTQ_SPI_RXREQ 0x80 /* Receive request */
143 +#define LTQ_SPI_RXCNT 0x84 /* Receive count */
144 +#define LTQ_SPI_DMACON 0xEC /* DMA control */
145 +#define LTQ_SPI_IRNEN 0xF4 /* Interrupt node enable */
146 +#define LTQ_SPI_IRNICR 0xF8 /* Interrupt node interrupt capture */
147 +#define LTQ_SPI_IRNCR 0xFC /* Interrupt node control */
149 +#define LTQ_SPI_CLC_SMC_SHIFT 16 /* Clock divider for sleep mode */
150 +#define LTQ_SPI_CLC_SMC_MASK 0xFF
151 +#define LTQ_SPI_CLC_RMC_SHIFT 8 /* Clock divider for normal run mode */
152 +#define LTQ_SPI_CLC_RMC_MASK 0xFF
153 +#define LTQ_SPI_CLC_DISS BIT(1) /* Disable status bit */
154 +#define LTQ_SPI_CLC_DISR BIT(0) /* Disable request bit */
156 +#define LTQ_SPI_ID_TXFS_SHIFT 24 /* Implemented TX FIFO size */
157 +#define LTQ_SPI_ID_TXFS_MASK 0x3F
158 +#define LTQ_SPI_ID_RXFS_SHIFT 16 /* Implemented RX FIFO size */
159 +#define LTQ_SPI_ID_RXFS_MASK 0x3F
160 +#define LTQ_SPI_ID_REV_MASK 0x1F /* Hardware revision number */
161 +#define LTQ_SPI_ID_CFG BIT(5) /* DMA interface support */
163 +#define LTQ_SPI_CON_BM_SHIFT 16 /* Data width selection */
164 +#define LTQ_SPI_CON_BM_MASK 0x1F
165 +#define LTQ_SPI_CON_EM BIT(24) /* Echo mode */
166 +#define LTQ_SPI_CON_IDLE BIT(23) /* Idle bit value */
167 +#define LTQ_SPI_CON_ENBV BIT(22) /* Enable byte valid control */
168 +#define LTQ_SPI_CON_RUEN BIT(12) /* Receive underflow error enable */
169 +#define LTQ_SPI_CON_TUEN BIT(11) /* Transmit underflow error enable */
170 +#define LTQ_SPI_CON_AEN BIT(10) /* Abort error enable */
171 +#define LTQ_SPI_CON_REN BIT(9) /* Receive overflow error enable */
172 +#define LTQ_SPI_CON_TEN BIT(8) /* Transmit overflow error enable */
173 +#define LTQ_SPI_CON_LB BIT(7) /* Loopback control */
174 +#define LTQ_SPI_CON_PO BIT(6) /* Clock polarity control */
175 +#define LTQ_SPI_CON_PH BIT(5) /* Clock phase control */
176 +#define LTQ_SPI_CON_HB BIT(4) /* Heading control */
177 +#define LTQ_SPI_CON_RXOFF BIT(1) /* Switch receiver off */
178 +#define LTQ_SPI_CON_TXOFF BIT(0) /* Switch transmitter off */
180 +#define LTQ_SPI_STAT_RXBV_MASK 0x7
181 +#define LTQ_SPI_STAT_RXBV_SHIFT 28
182 +#define LTQ_SPI_STAT_BSY BIT(13) /* Busy flag */
183 +#define LTQ_SPI_STAT_RUE BIT(12) /* Receive underflow error flag */
184 +#define LTQ_SPI_STAT_TUE BIT(11) /* Transmit underflow error flag */
185 +#define LTQ_SPI_STAT_AE BIT(10) /* Abort error flag */
186 +#define LTQ_SPI_STAT_RE BIT(9) /* Receive error flag */
187 +#define LTQ_SPI_STAT_TE BIT(8) /* Transmit error flag */
188 +#define LTQ_SPI_STAT_MS BIT(1) /* Master/slave select bit */
189 +#define LTQ_SPI_STAT_EN BIT(0) /* Enable bit */
191 +#define LTQ_SPI_WHBSTATE_SETTUE BIT(15) /* Set transmit underflow error flag */
192 +#define LTQ_SPI_WHBSTATE_SETAE BIT(14) /* Set abort error flag */
193 +#define LTQ_SPI_WHBSTATE_SETRE BIT(13) /* Set receive error flag */
194 +#define LTQ_SPI_WHBSTATE_SETTE BIT(12) /* Set transmit error flag */
195 +#define LTQ_SPI_WHBSTATE_CLRTUE BIT(11) /* Clear transmit underflow error flag */
196 +#define LTQ_SPI_WHBSTATE_CLRAE BIT(10) /* Clear abort error flag */
197 +#define LTQ_SPI_WHBSTATE_CLRRE BIT(9) /* Clear receive error flag */
198 +#define LTQ_SPI_WHBSTATE_CLRTE BIT(8) /* Clear transmit error flag */
199 +#define LTQ_SPI_WHBSTATE_SETME BIT(7) /* Set mode error flag */
200 +#define LTQ_SPI_WHBSTATE_CLRME BIT(6) /* Clear mode error flag */
201 +#define LTQ_SPI_WHBSTATE_SETRUE BIT(5) /* Set receive underflow error flag */
202 +#define LTQ_SPI_WHBSTATE_CLRRUE BIT(4) /* Clear receive underflow error flag */
203 +#define LTQ_SPI_WHBSTATE_SETMS BIT(3) /* Set master select bit */
204 +#define LTQ_SPI_WHBSTATE_CLRMS BIT(2) /* Clear master select bit */
205 +#define LTQ_SPI_WHBSTATE_SETEN BIT(1) /* Set enable bit (operational mode) */
206 +#define LTQ_SPI_WHBSTATE_CLREN BIT(0) /* Clear enable bit (config mode */
207 +#define LTQ_SPI_WHBSTATE_CLR_ERRORS 0x0F50
209 +#define LTQ_SPI_RXFCON_RXFITL_SHIFT 8 /* FIFO interrupt trigger level */
210 +#define LTQ_SPI_RXFCON_RXFITL_MASK 0x3F
211 +#define LTQ_SPI_RXFCON_RXFLU BIT(1) /* FIFO flush */
212 +#define LTQ_SPI_RXFCON_RXFEN BIT(0) /* FIFO enable */
214 +#define LTQ_SPI_TXFCON_TXFITL_SHIFT 8 /* FIFO interrupt trigger level */
215 +#define LTQ_SPI_TXFCON_TXFITL_MASK 0x3F
216 +#define LTQ_SPI_TXFCON_TXFLU BIT(1) /* FIFO flush */
217 +#define LTQ_SPI_TXFCON_TXFEN BIT(0) /* FIFO enable */
219 +#define LTQ_SPI_FSTAT_RXFFL_MASK 0x3f
220 +#define LTQ_SPI_FSTAT_RXFFL_SHIFT 0
221 +#define LTQ_SPI_FSTAT_TXFFL_MASK 0x3f
222 +#define LTQ_SPI_FSTAT_TXFFL_SHIFT 8
224 +#define LTQ_SPI_GPOCON_ISCSBN_SHIFT 8
225 +#define LTQ_SPI_GPOCON_INVOUTN_SHIFT 0
227 +#define LTQ_SPI_FGPO_SETOUTN_SHIFT 8
228 +#define LTQ_SPI_FGPO_CLROUTN_SHIFT 0
230 +#define LTQ_SPI_RXREQ_RXCNT_MASK 0xFFFF /* Receive count value */
231 +#define LTQ_SPI_RXCNT_TODO_MASK 0xFFFF /* Recevie to-do value */
233 +#define LTQ_SPI_IRNEN_F BIT(3) /* Frame end interrupt request */
234 +#define LTQ_SPI_IRNEN_E BIT(2) /* Error end interrupt request */
235 +#define LTQ_SPI_IRNEN_T BIT(1) /* Transmit end interrupt request */
236 +#define LTQ_SPI_IRNEN_R BIT(0) /* Receive end interrupt request */
237 +#define LTQ_SPI_IRNEN_ALL 0xF
239 +/* Hard-wired GPIOs used by SPI controller */
240 +#define LTQ_SPI_GPIO_DI 16
241 +#define LTQ_SPI_GPIO_DO 17
242 +#define LTQ_SPI_GPIO_CLK 18
245 + struct spi_bitbang bitbang;
246 + struct completion done;
249 + struct device *dev;
250 + void __iomem *base;
261 + struct spi_transfer *curr_transfer;
263 + u32 (*get_tx) (struct ltq_spi *);
267 + unsigned dma_support:1;
268 + unsigned cfg_mode:1;
272 +struct ltq_spi_controller_state {
273 + void (*cs_activate) (struct spi_device *);
274 + void (*cs_deactivate) (struct spi_device *);
277 +struct ltq_spi_irq_map {
279 + irq_handler_t handler;
282 +struct ltq_spi_cs_gpio_map {
288 +static inline struct ltq_spi *ltq_spi_to_hw(struct spi_device *spi)
290 + return spi_master_get_devdata(spi->master);
293 +static inline u32 ltq_spi_reg_read(struct ltq_spi *hw, u32 reg)
295 + return ioread32be(hw->base + reg);
298 +static inline void ltq_spi_reg_write(struct ltq_spi *hw, u32 val, u32 reg)
300 + iowrite32be(val, hw->base + reg);
303 +static inline void ltq_spi_reg_setbit(struct ltq_spi *hw, u32 bits, u32 reg)
307 + val = ltq_spi_reg_read(hw, reg);
309 + ltq_spi_reg_write(hw, val, reg);
312 +static inline void ltq_spi_reg_clearbit(struct ltq_spi *hw, u32 bits, u32 reg)
316 + val = ltq_spi_reg_read(hw, reg);
318 + ltq_spi_reg_write(hw, val, reg);
321 +static void ltq_spi_hw_enable(struct ltq_spi *hw)
325 + /* Power-up mdule */
326 + ltq_pmu_enable(PMU_SPI);
329 + * Set clock divider for run mode to 1 to
330 + * run at same frequency as FPI bus
332 + clc = (1 << LTQ_SPI_CLC_RMC_SHIFT);
333 + ltq_spi_reg_write(hw, clc, LTQ_SPI_CLC);
336 +static void ltq_spi_hw_disable(struct ltq_spi *hw)
338 + /* Set clock divider to 0 and set module disable bit */
339 + ltq_spi_reg_write(hw, LTQ_SPI_CLC_DISS, LTQ_SPI_CLC);
341 + /* Power-down mdule */
342 + ltq_pmu_disable(PMU_SPI);
345 +static void ltq_spi_reset_fifos(struct ltq_spi *hw)
350 + * Enable and flush FIFOs. Set interrupt trigger level to
351 + * half of FIFO count implemented in hardware.
353 + if (hw->txfs > 1) {
354 + val = hw->txfs << (LTQ_SPI_TXFCON_TXFITL_SHIFT - 1);
355 + val |= LTQ_SPI_TXFCON_TXFEN | LTQ_SPI_TXFCON_TXFLU;
356 + ltq_spi_reg_write(hw, val, LTQ_SPI_TXFCON);
359 + if (hw->rxfs > 1) {
360 + val = hw->rxfs << (LTQ_SPI_RXFCON_RXFITL_SHIFT - 1);
361 + val |= LTQ_SPI_RXFCON_RXFEN | LTQ_SPI_RXFCON_RXFLU;
362 + ltq_spi_reg_write(hw, val, LTQ_SPI_RXFCON);
366 +static inline int ltq_spi_wait_ready(struct ltq_spi *hw)
369 + unsigned long timeout;
371 + timeout = jiffies + msecs_to_jiffies(200);
374 + stat = ltq_spi_reg_read(hw, LTQ_SPI_STAT);
375 + if (!(stat & LTQ_SPI_STAT_BSY))
379 + } while (!time_after_eq(jiffies, timeout));
381 + dev_err(hw->dev, "SPI wait ready timed out\n");
386 +static void ltq_spi_config_mode_set(struct ltq_spi *hw)
392 + * Putting the SPI module in config mode is only safe if no
393 + * transfer is in progress as indicated by busy flag STATE.BSY.
395 + if (ltq_spi_wait_ready(hw)) {
396 + ltq_spi_reset_fifos(hw);
397 + hw->status = -ETIMEDOUT;
399 + ltq_spi_reg_write(hw, LTQ_SPI_WHBSTATE_CLREN, LTQ_SPI_WHBSTATE);
404 +static void ltq_spi_run_mode_set(struct ltq_spi *hw)
409 + ltq_spi_reg_write(hw, LTQ_SPI_WHBSTATE_SETEN, LTQ_SPI_WHBSTATE);
414 +static u32 ltq_spi_tx_word_u8(struct ltq_spi *hw)
416 + const u8 *tx = hw->tx;
425 +static u32 ltq_spi_tx_word_u16(struct ltq_spi *hw)
427 + const u16 *tx = (u16 *) hw->tx;
436 +static u32 ltq_spi_tx_word_u32(struct ltq_spi *hw)
438 + const u32 *tx = (u32 *) hw->tx;
447 +static void ltq_spi_bits_per_word_set(struct spi_device *spi)
449 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
451 + u8 bits_per_word = spi->bits_per_word;
454 + * Use either default value of SPI device or value
455 + * from current transfer.
457 + if (hw->curr_transfer && hw->curr_transfer->bits_per_word)
458 + bits_per_word = hw->curr_transfer->bits_per_word;
460 + if (bits_per_word <= 8)
461 + hw->get_tx = ltq_spi_tx_word_u8;
462 + else if (bits_per_word <= 16)
463 + hw->get_tx = ltq_spi_tx_word_u16;
464 + else if (bits_per_word <= 32)
465 + hw->get_tx = ltq_spi_tx_word_u32;
467 + /* CON.BM value = bits_per_word - 1 */
468 + bm = (bits_per_word - 1) << LTQ_SPI_CON_BM_SHIFT;
470 + ltq_spi_reg_clearbit(hw, LTQ_SPI_CON_BM_MASK <<
471 + LTQ_SPI_CON_BM_SHIFT, LTQ_SPI_CON);
472 + ltq_spi_reg_setbit(hw, bm, LTQ_SPI_CON);
475 +static void ltq_spi_speed_set(struct spi_device *spi)
477 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
478 + u32 br, max_speed_hz, spi_clk;
479 + u32 speed_hz = spi->max_speed_hz;
482 + * Use either default value of SPI device or value
483 + * from current transfer.
485 + if (hw->curr_transfer && hw->curr_transfer->speed_hz)
486 + speed_hz = hw->curr_transfer->speed_hz;
489 + * SPI module clock is derived from FPI bus clock dependent on
490 + * divider value in CLC.RMS which is always set to 1.
492 + spi_clk = clk_get_rate(hw->clk);
495 + * Maximum SPI clock frequency in master mode is half of
496 + * SPI module clock frequency. Maximum reload value of
497 + * baudrate generator BR is 2^16.
499 + max_speed_hz = spi_clk / 2;
500 + if (speed_hz >= max_speed_hz)
503 + br = (max_speed_hz / speed_hz) - 1;
508 + ltq_spi_reg_write(hw, br, LTQ_SPI_BRT);
511 +static void ltq_spi_clockmode_set(struct spi_device *spi)
513 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
516 + con = ltq_spi_reg_read(hw, LTQ_SPI_CON);
519 + * SPI mode mapping in CON register:
520 + * Mode CPOL CPHA CON.PO CON.PH
526 + if (spi->mode & SPI_CPHA)
527 + con &= ~LTQ_SPI_CON_PH;
529 + con |= LTQ_SPI_CON_PH;
531 + if (spi->mode & SPI_CPOL)
532 + con |= LTQ_SPI_CON_PO;
534 + con &= ~LTQ_SPI_CON_PO;
536 + /* Set heading control */
537 + if (spi->mode & SPI_LSB_FIRST)
538 + con &= ~LTQ_SPI_CON_HB;
540 + con |= LTQ_SPI_CON_HB;
542 + ltq_spi_reg_write(hw, con, LTQ_SPI_CON);
545 +static void ltq_spi_xmit_set(struct ltq_spi *hw, struct spi_transfer *t)
549 + con = ltq_spi_reg_read(hw, LTQ_SPI_CON);
552 + if (t->tx_buf && t->rx_buf) {
553 + con &= ~(LTQ_SPI_CON_TXOFF | LTQ_SPI_CON_RXOFF);
554 + } else if (t->rx_buf) {
555 + con &= ~LTQ_SPI_CON_RXOFF;
556 + con |= LTQ_SPI_CON_TXOFF;
557 + } else if (t->tx_buf) {
558 + con &= ~LTQ_SPI_CON_TXOFF;
559 + con |= LTQ_SPI_CON_RXOFF;
562 + con |= (LTQ_SPI_CON_TXOFF | LTQ_SPI_CON_RXOFF);
564 + ltq_spi_reg_write(hw, con, LTQ_SPI_CON);
567 +static void ltq_spi_gpio_cs_activate(struct spi_device *spi)
569 + struct ltq_spi_controller_data *cdata = spi->controller_data;
570 + int val = spi->mode & SPI_CS_HIGH ? 1 : 0;
572 + gpio_set_value(cdata->gpio, val);
575 +static void ltq_spi_gpio_cs_deactivate(struct spi_device *spi)
577 + struct ltq_spi_controller_data *cdata = spi->controller_data;
578 + int val = spi->mode & SPI_CS_HIGH ? 0 : 1;
580 + gpio_set_value(cdata->gpio, val);
583 +static void ltq_spi_internal_cs_activate(struct spi_device *spi)
585 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
588 + fgpo = (1 << (spi->chip_select + LTQ_SPI_FGPO_CLROUTN_SHIFT));
589 + ltq_spi_reg_setbit(hw, fgpo, LTQ_SPI_FGPO);
592 +static void ltq_spi_internal_cs_deactivate(struct spi_device *spi)
594 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
597 + fgpo = (1 << (spi->chip_select + LTQ_SPI_FGPO_SETOUTN_SHIFT));
598 + ltq_spi_reg_setbit(hw, fgpo, LTQ_SPI_FGPO);
601 +static void ltq_spi_chipselect(struct spi_device *spi, int cs)
603 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
604 + struct ltq_spi_controller_state *cstate = spi->controller_state;
607 + case BITBANG_CS_ACTIVE:
608 + ltq_spi_bits_per_word_set(spi);
609 + ltq_spi_speed_set(spi);
610 + ltq_spi_clockmode_set(spi);
611 + ltq_spi_run_mode_set(hw);
613 + cstate->cs_activate(spi);
616 + case BITBANG_CS_INACTIVE:
617 + cstate->cs_deactivate(spi);
619 + ltq_spi_config_mode_set(hw);
625 +static int ltq_spi_setup_transfer(struct spi_device *spi,
626 + struct spi_transfer *t)
628 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
629 + u8 bits_per_word = spi->bits_per_word;
631 + hw->curr_transfer = t;
633 + if (t && t->bits_per_word)
634 + bits_per_word = t->bits_per_word;
636 + if (bits_per_word > 32)
639 + ltq_spi_config_mode_set(hw);
644 +static const struct ltq_spi_cs_gpio_map ltq_spi_cs[] = {
653 +static int ltq_spi_setup(struct spi_device *spi)
655 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
656 + struct ltq_spi_controller_data *cdata = spi->controller_data;
657 + struct ltq_spi_controller_state *cstate;
661 + /* Set default word length to 8 if not set */
662 + if (!spi->bits_per_word)
663 + spi->bits_per_word = 8;
665 + if (spi->bits_per_word > 32)
668 + if (!spi->controller_state) {
669 + cstate = kzalloc(sizeof(struct ltq_spi_controller_state),
674 + spi->controller_state = cstate;
679 + * Up to six GPIOs can be connected to the SPI module
680 + * via GPIO alternate function to control the chip select lines.
681 + * For more flexibility in board layout this driver can also control
682 + * the CS lines via GPIO API. If GPIOs should be used, board setup code
683 + * have to register the SPI device with struct ltq_spi_controller_data
686 + if (cdata && cdata->gpio) {
687 + ret = gpio_request(cdata->gpio, "spi-cs");
691 + ret = spi->mode & SPI_CS_HIGH ? 0 : 1;
692 + gpio_direction_output(cdata->gpio, ret);
694 + cstate->cs_activate = ltq_spi_gpio_cs_activate;
695 + cstate->cs_deactivate = ltq_spi_gpio_cs_deactivate;
697 + ret = ltq_gpio_request(ltq_spi_cs[spi->chip_select].gpio,
698 + ltq_spi_cs[spi->chip_select].altsel0,
699 + ltq_spi_cs[spi->chip_select].altsel1,
704 + gpocon = (1 << (spi->chip_select +
705 + LTQ_SPI_GPOCON_ISCSBN_SHIFT));
707 + if (spi->mode & SPI_CS_HIGH)
708 + gpocon |= (1 << spi->chip_select);
710 + fgpo = (1 << (spi->chip_select + LTQ_SPI_FGPO_SETOUTN_SHIFT));
712 + ltq_spi_reg_setbit(hw, gpocon, LTQ_SPI_GPOCON);
713 + ltq_spi_reg_setbit(hw, fgpo, LTQ_SPI_FGPO);
715 + cstate->cs_activate = ltq_spi_internal_cs_activate;
716 + cstate->cs_deactivate = ltq_spi_internal_cs_deactivate;
722 +static void ltq_spi_cleanup(struct spi_device *spi)
724 + struct ltq_spi_controller_data *cdata = spi->controller_data;
725 + struct ltq_spi_controller_state *cstate = spi->controller_state;
728 + if (cdata && cdata->gpio)
729 + gpio = cdata->gpio;
731 + gpio = ltq_spi_cs[spi->chip_select].gpio;
737 +static void ltq_spi_txfifo_write(struct ltq_spi *hw)
742 + /* Determine how much FIFOs are free for TX data */
743 + fstat = ltq_spi_reg_read(hw, LTQ_SPI_FSTAT);
744 + fifo_space = hw->txfs - ((fstat >> LTQ_SPI_FSTAT_TXFFL_SHIFT) &
745 + LTQ_SPI_FSTAT_TXFFL_MASK);
750 + while (hw->tx_cnt < hw->len && fifo_space) {
751 + data = hw->get_tx(hw);
752 + ltq_spi_reg_write(hw, data, LTQ_SPI_TB);
757 +static void ltq_spi_rxfifo_read(struct ltq_spi *hw)
759 + u32 fstat, data, *rx32;
761 + u8 rxbv, shift, *rx8;
763 + /* Determine how much FIFOs are filled with RX data */
764 + fstat = ltq_spi_reg_read(hw, LTQ_SPI_FSTAT);
765 + fifo_fill = ((fstat >> LTQ_SPI_FSTAT_RXFFL_SHIFT)
766 + & LTQ_SPI_FSTAT_RXFFL_MASK);
772 + * The 32 bit FIFO is always used completely independent from the
773 + * bits_per_word value. Thus four bytes have to be read at once
776 + rx32 = (u32 *) hw->rx;
777 + while (hw->len - hw->rx_cnt >= 4 && fifo_fill) {
778 + *rx32++ = ltq_spi_reg_read(hw, LTQ_SPI_RB);
785 + * If there are remaining bytes, read byte count from STAT.RXBV
786 + * register and read the data byte-wise.
788 + while (fifo_fill && hw->rx_cnt < hw->len) {
789 + rxbv = (ltq_spi_reg_read(hw, LTQ_SPI_STAT) >>
790 + LTQ_SPI_STAT_RXBV_SHIFT) & LTQ_SPI_STAT_RXBV_MASK;
791 + data = ltq_spi_reg_read(hw, LTQ_SPI_RB);
793 + shift = (rxbv - 1) * 8;
797 + *rx8++ = (data >> shift) & 0xFF;
808 +static void ltq_spi_rxreq_set(struct ltq_spi *hw)
810 + u32 rxreq, rxreq_max, rxtodo;
812 + rxtodo = ltq_spi_reg_read(hw, LTQ_SPI_RXCNT) & LTQ_SPI_RXCNT_TODO_MASK;
815 + * In RX-only mode the serial clock is activated only after writing
816 + * the expected amount of RX bytes into RXREQ register.
817 + * To avoid receive overflows at high clocks it is better to request
818 + * only the amount of bytes that fits into all FIFOs. This value
819 + * depends on the FIFO size implemented in hardware.
821 + rxreq = hw->len - hw->rx_cnt;
822 + rxreq_max = hw->rxfs << 2;
823 + rxreq = min(rxreq_max, rxreq);
825 + if (!rxtodo && rxreq)
826 + ltq_spi_reg_write(hw, rxreq, LTQ_SPI_RXREQ);
829 +static inline void ltq_spi_complete(struct ltq_spi *hw)
831 + complete(&hw->done);
834 +irqreturn_t ltq_spi_tx_irq(int irq, void *data)
836 + struct ltq_spi *hw = data;
837 + unsigned long flags;
840 + spin_lock_irqsave(&hw->lock, flags);
842 + if (hw->tx_cnt < hw->len)
843 + ltq_spi_txfifo_write(hw);
845 + if (hw->tx_cnt == hw->len)
848 + spin_unlock_irqrestore(&hw->lock, flags);
851 + ltq_spi_complete(hw);
853 + return IRQ_HANDLED;
856 +irqreturn_t ltq_spi_rx_irq(int irq, void *data)
858 + struct ltq_spi *hw = data;
859 + unsigned long flags;
862 + spin_lock_irqsave(&hw->lock, flags);
864 + if (hw->rx_cnt < hw->len) {
865 + ltq_spi_rxfifo_read(hw);
867 + if (hw->tx && hw->tx_cnt < hw->len)
868 + ltq_spi_txfifo_write(hw);
871 + if (hw->rx_cnt == hw->len)
874 + ltq_spi_rxreq_set(hw);
876 + spin_unlock_irqrestore(&hw->lock, flags);
879 + ltq_spi_complete(hw);
881 + return IRQ_HANDLED;
884 +irqreturn_t ltq_spi_err_irq(int irq, void *data)
886 + struct ltq_spi *hw = data;
887 + unsigned long flags;
889 + spin_lock_irqsave(&hw->lock, flags);
891 + /* Disable all interrupts */
892 + ltq_spi_reg_clearbit(hw, LTQ_SPI_IRNEN_ALL, LTQ_SPI_IRNEN);
894 + /* Clear all error flags */
895 + ltq_spi_reg_write(hw, LTQ_SPI_WHBSTATE_CLR_ERRORS, LTQ_SPI_WHBSTATE);
898 + ltq_spi_reg_setbit(hw, LTQ_SPI_RXFCON_RXFLU, LTQ_SPI_RXFCON);
899 + ltq_spi_reg_setbit(hw, LTQ_SPI_TXFCON_TXFLU, LTQ_SPI_TXFCON);
902 + spin_unlock_irqrestore(&hw->lock, flags);
904 + ltq_spi_complete(hw);
906 + return IRQ_HANDLED;
909 +static int ltq_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
911 + struct ltq_spi *hw = ltq_spi_to_hw(spi);
914 + hw->tx = t->tx_buf;
915 + hw->rx = t->rx_buf;
920 + INIT_COMPLETION(hw->done);
922 + ltq_spi_xmit_set(hw, t);
924 + /* Enable error interrupts */
925 + ltq_spi_reg_setbit(hw, LTQ_SPI_IRNEN_E, LTQ_SPI_IRNEN);
928 + /* Initially fill TX FIFO with as much data as possible */
929 + ltq_spi_txfifo_write(hw);
930 + irq_flags |= LTQ_SPI_IRNEN_T;
932 + /* Always enable RX interrupt in Full Duplex mode */
934 + irq_flags |= LTQ_SPI_IRNEN_R;
935 + } else if (hw->rx) {
936 + /* Start RX clock */
937 + ltq_spi_rxreq_set(hw);
939 + /* Enable RX interrupt to receive data from RX FIFOs */
940 + irq_flags |= LTQ_SPI_IRNEN_R;
943 + /* Enable TX or RX interrupts */
944 + ltq_spi_reg_setbit(hw, irq_flags, LTQ_SPI_IRNEN);
945 + wait_for_completion_interruptible(&hw->done);
947 + /* Disable all interrupts */
948 + ltq_spi_reg_clearbit(hw, LTQ_SPI_IRNEN_ALL, LTQ_SPI_IRNEN);
951 + * Return length of current transfer for bitbang utility code if
952 + * no errors occured during transmission.
955 + hw->status = hw->len;
960 +static const struct ltq_spi_irq_map ltq_spi_irqs[] = {
961 + { "spi_tx", ltq_spi_tx_irq },
962 + { "spi_rx", ltq_spi_rx_irq },
963 + { "spi_err", ltq_spi_err_irq },
966 +static int __init ltq_spi_probe(struct platform_device *pdev)
968 + struct spi_master *master;
969 + struct resource *r;
970 + struct ltq_spi *hw;
971 + struct ltq_spi_platform_data *pdata = pdev->dev.platform_data;
975 + master = spi_alloc_master(&pdev->dev, sizeof(struct ltq_spi));
977 + dev_err(&pdev->dev, "spi_alloc_master\n");
982 + hw = spi_master_get_devdata(master);
984 + r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
986 + dev_err(&pdev->dev, "platform_get_resource\n");
991 + r = devm_request_mem_region(&pdev->dev, r->start, resource_size(r),
994 + dev_err(&pdev->dev, "devm_request_mem_region\n");
999 + hw->base = devm_ioremap_nocache(&pdev->dev, r->start, resource_size(r));
1001 + dev_err(&pdev->dev, "devm_ioremap_nocache\n");
1006 + hw->clk = clk_get(&pdev->dev, "fpi");
1007 + if (IS_ERR(hw->clk)) {
1008 + dev_err(&pdev->dev, "clk_get\n");
1009 + ret = PTR_ERR(hw->clk);
1013 + memset(hw->irq, 0, sizeof(hw->irq));
1014 + for (i = 0; i < ARRAY_SIZE(ltq_spi_irqs); i++) {
1015 + ret = platform_get_irq_byname(pdev, ltq_spi_irqs[i].name);
1017 + dev_err(&pdev->dev, "platform_get_irq_byname\n");
1022 + ret = request_irq(hw->irq[i], ltq_spi_irqs[i].handler,
1023 + 0, ltq_spi_irqs[i].name, hw);
1025 + dev_err(&pdev->dev, "request_irq\n");
1030 + hw->bitbang.master = spi_master_get(master);
1031 + hw->bitbang.chipselect = ltq_spi_chipselect;
1032 + hw->bitbang.setup_transfer = ltq_spi_setup_transfer;
1033 + hw->bitbang.txrx_bufs = ltq_spi_txrx_bufs;
1035 + master->bus_num = pdev->id;
1036 + master->num_chipselect = pdata->num_chipselect;
1037 + master->setup = ltq_spi_setup;
1038 + master->cleanup = ltq_spi_cleanup;
1040 + hw->dev = &pdev->dev;
1041 + init_completion(&hw->done);
1042 + spin_lock_init(&hw->lock);
1044 + /* Set GPIO alternate functions to SPI */
1045 + ltq_gpio_request(LTQ_SPI_GPIO_DI, 1, 0, 0, "spi-di");
1046 + ltq_gpio_request(LTQ_SPI_GPIO_DO, 1, 0, 1, "spi-do");
1047 + ltq_gpio_request(LTQ_SPI_GPIO_CLK, 1, 0, 1, "spi-clk");
1049 + ltq_spi_hw_enable(hw);
1051 + /* Read module capabilities */
1052 + id = ltq_spi_reg_read(hw, LTQ_SPI_ID);
1053 + hw->txfs = (id >> LTQ_SPI_ID_TXFS_SHIFT) & LTQ_SPI_ID_TXFS_MASK;
1054 + hw->rxfs = (id >> LTQ_SPI_ID_TXFS_SHIFT) & LTQ_SPI_ID_TXFS_MASK;
1055 + hw->dma_support = (id & LTQ_SPI_ID_CFG) ? 1 : 0;
1057 + ltq_spi_config_mode_set(hw);
1059 + /* Enable error checking, disable TX/RX, set idle value high */
1060 + data = LTQ_SPI_CON_RUEN | LTQ_SPI_CON_AEN |
1061 + LTQ_SPI_CON_TEN | LTQ_SPI_CON_REN |
1062 + LTQ_SPI_CON_TXOFF | LTQ_SPI_CON_RXOFF | LTQ_SPI_CON_IDLE;
1063 + ltq_spi_reg_write(hw, data, LTQ_SPI_CON);
1065 + /* Enable master mode and clear error flags */
1066 + ltq_spi_reg_write(hw, LTQ_SPI_WHBSTATE_SETMS |
1067 + LTQ_SPI_WHBSTATE_CLR_ERRORS, LTQ_SPI_WHBSTATE);
1069 + /* Reset GPIO/CS registers */
1070 + ltq_spi_reg_write(hw, 0x0, LTQ_SPI_GPOCON);
1071 + ltq_spi_reg_write(hw, 0xFF00, LTQ_SPI_FGPO);
1073 + /* Enable and flush FIFOs */
1074 + ltq_spi_reset_fifos(hw);
1076 + ret = spi_bitbang_start(&hw->bitbang);
1078 + dev_err(&pdev->dev, "spi_bitbang_start\n");
1082 + platform_set_drvdata(pdev, hw);
1084 + pr_info("Lantiq SoC SPI controller rev %u (TXFS %u, RXFS %u, DMA %u)\n",
1085 + id & LTQ_SPI_ID_REV_MASK, hw->txfs, hw->rxfs, hw->dma_support);
1090 + ltq_spi_hw_disable(hw);
1095 + for (; i > 0; i--)
1096 + free_irq(hw->irq[i], hw);
1099 + spi_master_put(master);
1105 +static int __exit ltq_spi_remove(struct platform_device *pdev)
1107 + struct ltq_spi *hw = platform_get_drvdata(pdev);
1110 + ret = spi_bitbang_stop(&hw->bitbang);
1114 + platform_set_drvdata(pdev, NULL);
1116 + ltq_spi_config_mode_set(hw);
1117 + ltq_spi_hw_disable(hw);
1119 + for (i = 0; i < ARRAY_SIZE(hw->irq); i++)
1120 + if (0 < hw->irq[i])
1121 + free_irq(hw->irq[i], hw);
1123 + gpio_free(LTQ_SPI_GPIO_DI);
1124 + gpio_free(LTQ_SPI_GPIO_DO);
1125 + gpio_free(LTQ_SPI_GPIO_CLK);
1128 + spi_master_put(hw->bitbang.master);
1133 +static struct platform_driver ltq_spi_driver = {
1135 + .name = "ltq-spi",
1136 + .owner = THIS_MODULE,
1138 + .remove = __exit_p(ltq_spi_remove),
1141 +static int __init ltq_spi_init(void)
1143 + return platform_driver_probe(<q_spi_driver, ltq_spi_probe);
1145 +module_init(ltq_spi_init);
1147 +static void __exit ltq_spi_exit(void)
1149 + platform_driver_unregister(<q_spi_driver);
1151 +module_exit(ltq_spi_exit);
1153 +MODULE_DESCRIPTION("Lantiq SoC SPI controller driver");
1154 +MODULE_AUTHOR("Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>");
1155 +MODULE_LICENSE("GPL");
1156 +MODULE_ALIAS("platform:ltq-spi");