Root/target/linux/lantiq/patches-3.0/0014-MIPS-lantiq-adds-xway-spi.patch

1From e29263339db41d49d79482c93463c4c0cbe764d7 Mon Sep 17 00:00:00 2001
2From: John Crispin <blogic@openwrt.org>
3Date: Fri, 30 Sep 2011 14:23:42 +0200
4Subject: [PATCH 14/24] MIPS: lantiq: adds xway spi
5
6---
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
15
16Index: 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
20@@ -50,4 +50,13 @@
21     int mii_mode;
22 };
23 
24+
25+struct ltq_spi_platform_data {
26+ u16 num_chipselect;
27+};
28+
29+struct ltq_spi_controller_data {
30+ unsigned gpio;
31+};
32+
33 #endif
34Index: 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
38@@ -27,6 +27,8 @@
39 
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)
45 
46 #define LTQ_MEI_DYING_GASP_INT (INT_NUM_IM1_IRL0 + 21)
47Index: 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
51@@ -81,6 +81,7 @@
52 
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
59Index: 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
63@@ -433,6 +433,14 @@
64     help
65       SPI driver for Nuvoton NUC900 series ARM SoCs
66 
67+config SPI_XWAY
68+ tristate "Lantiq XWAY SPI controller"
69+ depends on LANTIQ && SOC_TYPE_XWAY
70+ select SPI_BITBANG
71+ help
72+ This driver supports the Lantiq SoC SPI controller in master
73+ mode.
74+
75 #
76 # Add new SPI master controllers in alphabetical order above this line
77 #
78Index: 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
82@@ -57,6 +57,7 @@
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
87 
88 # special build for s3c24xx spi driver with fiq support
89 spi_s3c24xx_hw-y := spi_s3c24xx.o
90Index: 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
94@@ -0,0 +1,1062 @@
95+/*
96+ * Lantiq SoC SPI controller
97+ *
98+ * Copyright (C) 2011 Daniel Schwierzeck <daniel.schwierzeck@googlemail.com>
99+ *
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.
103+ */
104+
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>
120+
121+#include <lantiq_soc.h>
122+#include <lantiq_platform.h>
123+
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 */
148+
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 */
155+
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 */
162+
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 */
179+
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 */
190+
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
208+
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 */
213+
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 */
218+
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
223+
224+#define LTQ_SPI_GPOCON_ISCSBN_SHIFT 8
225+#define LTQ_SPI_GPOCON_INVOUTN_SHIFT 0
226+
227+#define LTQ_SPI_FGPO_SETOUTN_SHIFT 8
228+#define LTQ_SPI_FGPO_CLROUTN_SHIFT 0
229+
230+#define LTQ_SPI_RXREQ_RXCNT_MASK 0xFFFF /* Receive count value */
231+#define LTQ_SPI_RXCNT_TODO_MASK 0xFFFF /* Recevie to-do value */
232+
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
238+
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
243+
244+struct ltq_spi {
245+ struct spi_bitbang bitbang;
246+ struct completion done;
247+ spinlock_t lock;
248+
249+ struct device *dev;
250+ void __iomem *base;
251+ struct clk *clk;
252+
253+ int status;
254+ int irq[3];
255+
256+ const u8 *tx;
257+ u8 *rx;
258+ u32 tx_cnt;
259+ u32 rx_cnt;
260+ u32 len;
261+ struct spi_transfer *curr_transfer;
262+
263+ u32 (*get_tx) (struct ltq_spi *);
264+
265+ u16 txfs;
266+ u16 rxfs;
267+ unsigned dma_support:1;
268+ unsigned cfg_mode:1;
269+
270+};
271+
272+struct ltq_spi_controller_state {
273+ void (*cs_activate) (struct spi_device *);
274+ void (*cs_deactivate) (struct spi_device *);
275+};
276+
277+struct ltq_spi_irq_map {
278+ char *name;
279+ irq_handler_t handler;
280+};
281+
282+struct ltq_spi_cs_gpio_map {
283+ unsigned gpio;
284+ unsigned altsel0;
285+ unsigned altsel1;
286+};
287+
288+static inline struct ltq_spi *ltq_spi_to_hw(struct spi_device *spi)
289+{
290+ return spi_master_get_devdata(spi->master);
291+}
292+
293+static inline u32 ltq_spi_reg_read(struct ltq_spi *hw, u32 reg)
294+{
295+ return ioread32be(hw->base + reg);
296+}
297+
298+static inline void ltq_spi_reg_write(struct ltq_spi *hw, u32 val, u32 reg)
299+{
300+ iowrite32be(val, hw->base + reg);
301+}
302+
303+static inline void ltq_spi_reg_setbit(struct ltq_spi *hw, u32 bits, u32 reg)
304+{
305+ u32 val;
306+
307+ val = ltq_spi_reg_read(hw, reg);
308+ val |= bits;
309+ ltq_spi_reg_write(hw, val, reg);
310+}
311+
312+static inline void ltq_spi_reg_clearbit(struct ltq_spi *hw, u32 bits, u32 reg)
313+{
314+ u32 val;
315+
316+ val = ltq_spi_reg_read(hw, reg);
317+ val &= ~bits;
318+ ltq_spi_reg_write(hw, val, reg);
319+}
320+
321+static void ltq_spi_hw_enable(struct ltq_spi *hw)
322+{
323+ u32 clc;
324+
325+ /* Power-up mdule */
326+ ltq_pmu_enable(PMU_SPI);
327+
328+ /*
329+ * Set clock divider for run mode to 1 to
330+ * run at same frequency as FPI bus
331+ */
332+ clc = (1 << LTQ_SPI_CLC_RMC_SHIFT);
333+ ltq_spi_reg_write(hw, clc, LTQ_SPI_CLC);
334+}
335+
336+static void ltq_spi_hw_disable(struct ltq_spi *hw)
337+{
338+ /* Set clock divider to 0 and set module disable bit */
339+ ltq_spi_reg_write(hw, LTQ_SPI_CLC_DISS, LTQ_SPI_CLC);
340+
341+ /* Power-down mdule */
342+ ltq_pmu_disable(PMU_SPI);
343+}
344+
345+static void ltq_spi_reset_fifos(struct ltq_spi *hw)
346+{
347+ u32 val;
348+
349+ /*
350+ * Enable and flush FIFOs. Set interrupt trigger level to
351+ * half of FIFO count implemented in hardware.
352+ */
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);
357+ }
358+
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);
363+ }
364+}
365+
366+static inline int ltq_spi_wait_ready(struct ltq_spi *hw)
367+{
368+ u32 stat;
369+ unsigned long timeout;
370+
371+ timeout = jiffies + msecs_to_jiffies(200);
372+
373+ do {
374+ stat = ltq_spi_reg_read(hw, LTQ_SPI_STAT);
375+ if (!(stat & LTQ_SPI_STAT_BSY))
376+ return 0;
377+
378+ cond_resched();
379+ } while (!time_after_eq(jiffies, timeout));
380+
381+ dev_err(hw->dev, "SPI wait ready timed out\n");
382+
383+ return -ETIMEDOUT;
384+}
385+
386+static void ltq_spi_config_mode_set(struct ltq_spi *hw)
387+{
388+ if (hw->cfg_mode)
389+ return;
390+
391+ /*
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.
394+ */
395+ if (ltq_spi_wait_ready(hw)) {
396+ ltq_spi_reset_fifos(hw);
397+ hw->status = -ETIMEDOUT;
398+ }
399+ ltq_spi_reg_write(hw, LTQ_SPI_WHBSTATE_CLREN, LTQ_SPI_WHBSTATE);
400+
401+ hw->cfg_mode = 1;
402+}
403+
404+static void ltq_spi_run_mode_set(struct ltq_spi *hw)
405+{
406+ if (!hw->cfg_mode)
407+ return;
408+
409+ ltq_spi_reg_write(hw, LTQ_SPI_WHBSTATE_SETEN, LTQ_SPI_WHBSTATE);
410+
411+ hw->cfg_mode = 0;
412+}
413+
414+static u32 ltq_spi_tx_word_u8(struct ltq_spi *hw)
415+{
416+ const u8 *tx = hw->tx;
417+ u32 data = *tx++;
418+
419+ hw->tx_cnt++;
420+ hw->tx++;
421+
422+ return data;
423+}
424+
425+static u32 ltq_spi_tx_word_u16(struct ltq_spi *hw)
426+{
427+ const u16 *tx = (u16 *) hw->tx;
428+ u32 data = *tx++;
429+
430+ hw->tx_cnt += 2;
431+ hw->tx += 2;
432+
433+ return data;
434+}
435+
436+static u32 ltq_spi_tx_word_u32(struct ltq_spi *hw)
437+{
438+ const u32 *tx = (u32 *) hw->tx;
439+ u32 data = *tx++;
440+
441+ hw->tx_cnt += 4;
442+ hw->tx += 4;
443+
444+ return data;
445+}
446+
447+static void ltq_spi_bits_per_word_set(struct spi_device *spi)
448+{
449+ struct ltq_spi *hw = ltq_spi_to_hw(spi);
450+ u32 bm;
451+ u8 bits_per_word = spi->bits_per_word;
452+
453+ /*
454+ * Use either default value of SPI device or value
455+ * from current transfer.
456+ */
457+ if (hw->curr_transfer && hw->curr_transfer->bits_per_word)
458+ bits_per_word = hw->curr_transfer->bits_per_word;
459+
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;
466+
467+ /* CON.BM value = bits_per_word - 1 */
468+ bm = (bits_per_word - 1) << LTQ_SPI_CON_BM_SHIFT;
469+
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);
473+}
474+
475+static void ltq_spi_speed_set(struct spi_device *spi)
476+{
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;
480+
481+ /*
482+ * Use either default value of SPI device or value
483+ * from current transfer.
484+ */
485+ if (hw->curr_transfer && hw->curr_transfer->speed_hz)
486+ speed_hz = hw->curr_transfer->speed_hz;
487+
488+ /*
489+ * SPI module clock is derived from FPI bus clock dependent on
490+ * divider value in CLC.RMS which is always set to 1.
491+ */
492+ spi_clk = clk_get_rate(hw->clk);
493+
494+ /*
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.
498+ */
499+ max_speed_hz = spi_clk / 2;
500+ if (speed_hz >= max_speed_hz)
501+ br = 0;
502+ else
503+ br = (max_speed_hz / speed_hz) - 1;
504+
505+ if (br > 0xFFFF)
506+ br = 0xFFFF;
507+
508+ ltq_spi_reg_write(hw, br, LTQ_SPI_BRT);
509+}
510+
511+static void ltq_spi_clockmode_set(struct spi_device *spi)
512+{
513+ struct ltq_spi *hw = ltq_spi_to_hw(spi);
514+ u32 con;
515+
516+ con = ltq_spi_reg_read(hw, LTQ_SPI_CON);
517+
518+ /*
519+ * SPI mode mapping in CON register:
520+ * Mode CPOL CPHA CON.PO CON.PH
521+ * 0 0 0 0 1
522+ * 1 0 1 0 0
523+ * 2 1 0 1 1
524+ * 3 1 1 1 0
525+ */
526+ if (spi->mode & SPI_CPHA)
527+ con &= ~LTQ_SPI_CON_PH;
528+ else
529+ con |= LTQ_SPI_CON_PH;
530+
531+ if (spi->mode & SPI_CPOL)
532+ con |= LTQ_SPI_CON_PO;
533+ else
534+ con &= ~LTQ_SPI_CON_PO;
535+
536+ /* Set heading control */
537+ if (spi->mode & SPI_LSB_FIRST)
538+ con &= ~LTQ_SPI_CON_HB;
539+ else
540+ con |= LTQ_SPI_CON_HB;
541+
542+ ltq_spi_reg_write(hw, con, LTQ_SPI_CON);
543+}
544+
545+static void ltq_spi_xmit_set(struct ltq_spi *hw, struct spi_transfer *t)
546+{
547+ u32 con;
548+
549+ con = ltq_spi_reg_read(hw, LTQ_SPI_CON);
550+
551+ if (t) {
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;
560+ }
561+ } else
562+ con |= (LTQ_SPI_CON_TXOFF | LTQ_SPI_CON_RXOFF);
563+
564+ ltq_spi_reg_write(hw, con, LTQ_SPI_CON);
565+}
566+
567+static void ltq_spi_gpio_cs_activate(struct spi_device *spi)
568+{
569+ struct ltq_spi_controller_data *cdata = spi->controller_data;
570+ int val = spi->mode & SPI_CS_HIGH ? 1 : 0;
571+
572+ gpio_set_value(cdata->gpio, val);
573+}
574+
575+static void ltq_spi_gpio_cs_deactivate(struct spi_device *spi)
576+{
577+ struct ltq_spi_controller_data *cdata = spi->controller_data;
578+ int val = spi->mode & SPI_CS_HIGH ? 0 : 1;
579+
580+ gpio_set_value(cdata->gpio, val);
581+}
582+
583+static void ltq_spi_internal_cs_activate(struct spi_device *spi)
584+{
585+ struct ltq_spi *hw = ltq_spi_to_hw(spi);
586+ u32 fgpo;
587+
588+ fgpo = (1 << (spi->chip_select + LTQ_SPI_FGPO_CLROUTN_SHIFT));
589+ ltq_spi_reg_setbit(hw, fgpo, LTQ_SPI_FGPO);
590+}
591+
592+static void ltq_spi_internal_cs_deactivate(struct spi_device *spi)
593+{
594+ struct ltq_spi *hw = ltq_spi_to_hw(spi);
595+ u32 fgpo;
596+
597+ fgpo = (1 << (spi->chip_select + LTQ_SPI_FGPO_SETOUTN_SHIFT));
598+ ltq_spi_reg_setbit(hw, fgpo, LTQ_SPI_FGPO);
599+}
600+
601+static void ltq_spi_chipselect(struct spi_device *spi, int cs)
602+{
603+ struct ltq_spi *hw = ltq_spi_to_hw(spi);
604+ struct ltq_spi_controller_state *cstate = spi->controller_state;
605+
606+ switch (cs) {
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);
612+
613+ cstate->cs_activate(spi);
614+ break;
615+
616+ case BITBANG_CS_INACTIVE:
617+ cstate->cs_deactivate(spi);
618+
619+ ltq_spi_config_mode_set(hw);
620+
621+ break;
622+ }
623+}
624+
625+static int ltq_spi_setup_transfer(struct spi_device *spi,
626+ struct spi_transfer *t)
627+{
628+ struct ltq_spi *hw = ltq_spi_to_hw(spi);
629+ u8 bits_per_word = spi->bits_per_word;
630+
631+ hw->curr_transfer = t;
632+
633+ if (t && t->bits_per_word)
634+ bits_per_word = t->bits_per_word;
635+
636+ if (bits_per_word > 32)
637+ return -EINVAL;
638+
639+ ltq_spi_config_mode_set(hw);
640+
641+ return 0;
642+}
643+
644+static const struct ltq_spi_cs_gpio_map ltq_spi_cs[] = {
645+ { 15, 1, 0 },
646+ { 22, 1, 0 },
647+ { 13, 0, 1 },
648+ { 10, 0, 1 },
649+ { 9, 0, 1 },
650+ { 11, 1, 1 },
651+};
652+
653+static int ltq_spi_setup(struct spi_device *spi)
654+{
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;
658+ u32 gpocon, fgpo;
659+ int ret;
660+
661+ /* Set default word length to 8 if not set */
662+ if (!spi->bits_per_word)
663+ spi->bits_per_word = 8;
664+
665+ if (spi->bits_per_word > 32)
666+ return -EINVAL;
667+
668+ if (!spi->controller_state) {
669+ cstate = kzalloc(sizeof(struct ltq_spi_controller_state),
670+ GFP_KERNEL);
671+ if (!cstate)
672+ return -ENOMEM;
673+
674+ spi->controller_state = cstate;
675+ } else
676+ return 0;
677+
678+ /*
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
684+ * attached.
685+ */
686+ if (cdata && cdata->gpio) {
687+ ret = gpio_request(cdata->gpio, "spi-cs");
688+ if (ret)
689+ return -EBUSY;
690+
691+ ret = spi->mode & SPI_CS_HIGH ? 0 : 1;
692+ gpio_direction_output(cdata->gpio, ret);
693+
694+ cstate->cs_activate = ltq_spi_gpio_cs_activate;
695+ cstate->cs_deactivate = ltq_spi_gpio_cs_deactivate;
696+ } else {
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,
700+ 1, "spi-cs");
701+ if (ret)
702+ return -EBUSY;
703+
704+ gpocon = (1 << (spi->chip_select +
705+ LTQ_SPI_GPOCON_ISCSBN_SHIFT));
706+
707+ if (spi->mode & SPI_CS_HIGH)
708+ gpocon |= (1 << spi->chip_select);
709+
710+ fgpo = (1 << (spi->chip_select + LTQ_SPI_FGPO_SETOUTN_SHIFT));
711+
712+ ltq_spi_reg_setbit(hw, gpocon, LTQ_SPI_GPOCON);
713+ ltq_spi_reg_setbit(hw, fgpo, LTQ_SPI_FGPO);
714+
715+ cstate->cs_activate = ltq_spi_internal_cs_activate;
716+ cstate->cs_deactivate = ltq_spi_internal_cs_deactivate;
717+ }
718+
719+ return 0;
720+}
721+
722+static void ltq_spi_cleanup(struct spi_device *spi)
723+{
724+ struct ltq_spi_controller_data *cdata = spi->controller_data;
725+ struct ltq_spi_controller_state *cstate = spi->controller_state;
726+ unsigned gpio;
727+
728+ if (cdata && cdata->gpio)
729+ gpio = cdata->gpio;
730+ else
731+ gpio = ltq_spi_cs[spi->chip_select].gpio;
732+
733+ gpio_free(gpio);
734+ kfree(cstate);
735+}
736+
737+static void ltq_spi_txfifo_write(struct ltq_spi *hw)
738+{
739+ u32 fstat, data;
740+ u16 fifo_space;
741+
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);
746+
747+ if (!fifo_space)
748+ return;
749+
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);
753+ fifo_space--;
754+ }
755+}
756+
757+static void ltq_spi_rxfifo_read(struct ltq_spi *hw)
758+{
759+ u32 fstat, data, *rx32;
760+ u16 fifo_fill;
761+ u8 rxbv, shift, *rx8;
762+
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);
767+
768+ if (!fifo_fill)
769+ return;
770+
771+ /*
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
774+ * per FIFO.
775+ */
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);
779+ hw->rx_cnt += 4;
780+ hw->rx += 4;
781+ fifo_fill--;
782+ }
783+
784+ /*
785+ * If there are remaining bytes, read byte count from STAT.RXBV
786+ * register and read the data byte-wise.
787+ */
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);
792+
793+ shift = (rxbv - 1) * 8;
794+ rx8 = hw->rx;
795+
796+ while (rxbv) {
797+ *rx8++ = (data >> shift) & 0xFF;
798+ rxbv--;
799+ shift -= 8;
800+ hw->rx_cnt++;
801+ hw->rx++;
802+ }
803+
804+ fifo_fill--;
805+ }
806+}
807+
808+static void ltq_spi_rxreq_set(struct ltq_spi *hw)
809+{
810+ u32 rxreq, rxreq_max, rxtodo;
811+
812+ rxtodo = ltq_spi_reg_read(hw, LTQ_SPI_RXCNT) & LTQ_SPI_RXCNT_TODO_MASK;
813+
814+ /*
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.
820+ */
821+ rxreq = hw->len - hw->rx_cnt;
822+ rxreq_max = hw->rxfs << 2;
823+ rxreq = min(rxreq_max, rxreq);
824+
825+ if (!rxtodo && rxreq)
826+ ltq_spi_reg_write(hw, rxreq, LTQ_SPI_RXREQ);
827+}
828+
829+static inline void ltq_spi_complete(struct ltq_spi *hw)
830+{
831+ complete(&hw->done);
832+}
833+
834+irqreturn_t ltq_spi_tx_irq(int irq, void *data)
835+{
836+ struct ltq_spi *hw = data;
837+ unsigned long flags;
838+ int completed = 0;
839+
840+ spin_lock_irqsave(&hw->lock, flags);
841+
842+ if (hw->tx_cnt < hw->len)
843+ ltq_spi_txfifo_write(hw);
844+
845+ if (hw->tx_cnt == hw->len)
846+ completed = 1;
847+
848+ spin_unlock_irqrestore(&hw->lock, flags);
849+
850+ if (completed)
851+ ltq_spi_complete(hw);
852+
853+ return IRQ_HANDLED;
854+}
855+
856+irqreturn_t ltq_spi_rx_irq(int irq, void *data)
857+{
858+ struct ltq_spi *hw = data;
859+ unsigned long flags;
860+ int completed = 0;
861+
862+ spin_lock_irqsave(&hw->lock, flags);
863+
864+ if (hw->rx_cnt < hw->len) {
865+ ltq_spi_rxfifo_read(hw);
866+
867+ if (hw->tx && hw->tx_cnt < hw->len)
868+ ltq_spi_txfifo_write(hw);
869+ }
870+
871+ if (hw->rx_cnt == hw->len)
872+ completed = 1;
873+ else if (!hw->tx)
874+ ltq_spi_rxreq_set(hw);
875+
876+ spin_unlock_irqrestore(&hw->lock, flags);
877+
878+ if (completed)
879+ ltq_spi_complete(hw);
880+
881+ return IRQ_HANDLED;
882+}
883+
884+irqreturn_t ltq_spi_err_irq(int irq, void *data)
885+{
886+ struct ltq_spi *hw = data;
887+ unsigned long flags;
888+
889+ spin_lock_irqsave(&hw->lock, flags);
890+
891+ /* Disable all interrupts */
892+ ltq_spi_reg_clearbit(hw, LTQ_SPI_IRNEN_ALL, LTQ_SPI_IRNEN);
893+
894+ /* Clear all error flags */
895+ ltq_spi_reg_write(hw, LTQ_SPI_WHBSTATE_CLR_ERRORS, LTQ_SPI_WHBSTATE);
896+
897+ /* Flush FIFOs */
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);
900+
901+ hw->status = -EIO;
902+ spin_unlock_irqrestore(&hw->lock, flags);
903+
904+ ltq_spi_complete(hw);
905+
906+ return IRQ_HANDLED;
907+}
908+
909+static int ltq_spi_txrx_bufs(struct spi_device *spi, struct spi_transfer *t)
910+{
911+ struct ltq_spi *hw = ltq_spi_to_hw(spi);
912+ u32 irq_flags = 0;
913+
914+ hw->tx = t->tx_buf;
915+ hw->rx = t->rx_buf;
916+ hw->len = t->len;
917+ hw->tx_cnt = 0;
918+ hw->rx_cnt = 0;
919+ hw->status = 0;
920+ INIT_COMPLETION(hw->done);
921+
922+ ltq_spi_xmit_set(hw, t);
923+
924+ /* Enable error interrupts */
925+ ltq_spi_reg_setbit(hw, LTQ_SPI_IRNEN_E, LTQ_SPI_IRNEN);
926+
927+ if (hw->tx) {
928+ /* Initially fill TX FIFO with as much data as possible */
929+ ltq_spi_txfifo_write(hw);
930+ irq_flags |= LTQ_SPI_IRNEN_T;
931+
932+ /* Always enable RX interrupt in Full Duplex mode */
933+ if (hw->rx)
934+ irq_flags |= LTQ_SPI_IRNEN_R;
935+ } else if (hw->rx) {
936+ /* Start RX clock */
937+ ltq_spi_rxreq_set(hw);
938+
939+ /* Enable RX interrupt to receive data from RX FIFOs */
940+ irq_flags |= LTQ_SPI_IRNEN_R;
941+ }
942+
943+ /* Enable TX or RX interrupts */
944+ ltq_spi_reg_setbit(hw, irq_flags, LTQ_SPI_IRNEN);
945+ wait_for_completion_interruptible(&hw->done);
946+
947+ /* Disable all interrupts */
948+ ltq_spi_reg_clearbit(hw, LTQ_SPI_IRNEN_ALL, LTQ_SPI_IRNEN);
949+
950+ /*
951+ * Return length of current transfer for bitbang utility code if
952+ * no errors occured during transmission.
953+ */
954+ if (!hw->status)
955+ hw->status = hw->len;
956+
957+ return hw->status;
958+}
959+
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 },
964+};
965+
966+static int __init ltq_spi_probe(struct platform_device *pdev)
967+{
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;
972+ int ret, i;
973+ u32 data, id;
974+
975+ master = spi_alloc_master(&pdev->dev, sizeof(struct ltq_spi));
976+ if (!master) {
977+ dev_err(&pdev->dev, "spi_alloc_master\n");
978+ ret = -ENOMEM;
979+ goto err;
980+ }
981+
982+ hw = spi_master_get_devdata(master);
983+
984+ r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
985+ if (r == NULL) {
986+ dev_err(&pdev->dev, "platform_get_resource\n");
987+ ret = -ENOENT;
988+ goto err_master;
989+ }
990+
991+ r = devm_request_mem_region(&pdev->dev, r->start, resource_size(r),
992+ pdev->name);
993+ if (!r) {
994+ dev_err(&pdev->dev, "devm_request_mem_region\n");
995+ ret = -ENXIO;
996+ goto err_master;
997+ }
998+
999+ hw->base = devm_ioremap_nocache(&pdev->dev, r->start, resource_size(r));
1000+ if (!hw->base) {
1001+ dev_err(&pdev->dev, "devm_ioremap_nocache\n");
1002+ ret = -ENXIO;
1003+ goto err_master;
1004+ }
1005+
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);
1010+ goto err_master;
1011+ }
1012+
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);
1016+ if (0 > ret) {
1017+ dev_err(&pdev->dev, "platform_get_irq_byname\n");
1018+ goto err_irq;
1019+ }
1020+
1021+ hw->irq[i] = ret;
1022+ ret = request_irq(hw->irq[i], ltq_spi_irqs[i].handler,
1023+ 0, ltq_spi_irqs[i].name, hw);
1024+ if (ret) {
1025+ dev_err(&pdev->dev, "request_irq\n");
1026+ goto err_irq;
1027+ }
1028+ }
1029+
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;
1034+
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;
1039+
1040+ hw->dev = &pdev->dev;
1041+ init_completion(&hw->done);
1042+ spin_lock_init(&hw->lock);
1043+
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");
1048+
1049+ ltq_spi_hw_enable(hw);
1050+
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;
1056+
1057+ ltq_spi_config_mode_set(hw);
1058+
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);
1064+
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);
1068+
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);
1072+
1073+ /* Enable and flush FIFOs */
1074+ ltq_spi_reset_fifos(hw);
1075+
1076+ ret = spi_bitbang_start(&hw->bitbang);
1077+ if (ret) {
1078+ dev_err(&pdev->dev, "spi_bitbang_start\n");
1079+ goto err_bitbang;
1080+ }
1081+
1082+ platform_set_drvdata(pdev, hw);
1083+
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);
1086+
1087+ return 0;
1088+
1089+err_bitbang:
1090+ ltq_spi_hw_disable(hw);
1091+
1092+err_irq:
1093+ clk_put(hw->clk);
1094+
1095+ for (; i > 0; i--)
1096+ free_irq(hw->irq[i], hw);
1097+
1098+err_master:
1099+ spi_master_put(master);
1100+
1101+err:
1102+ return ret;
1103+}
1104+
1105+static int __exit ltq_spi_remove(struct platform_device *pdev)
1106+{
1107+ struct ltq_spi *hw = platform_get_drvdata(pdev);
1108+ int ret, i;
1109+
1110+ ret = spi_bitbang_stop(&hw->bitbang);
1111+ if (ret)
1112+ return ret;
1113+
1114+ platform_set_drvdata(pdev, NULL);
1115+
1116+ ltq_spi_config_mode_set(hw);
1117+ ltq_spi_hw_disable(hw);
1118+
1119+ for (i = 0; i < ARRAY_SIZE(hw->irq); i++)
1120+ if (0 < hw->irq[i])
1121+ free_irq(hw->irq[i], hw);
1122+
1123+ gpio_free(LTQ_SPI_GPIO_DI);
1124+ gpio_free(LTQ_SPI_GPIO_DO);
1125+ gpio_free(LTQ_SPI_GPIO_CLK);
1126+
1127+ clk_put(hw->clk);
1128+ spi_master_put(hw->bitbang.master);
1129+
1130+ return 0;
1131+}
1132+
1133+static struct platform_driver ltq_spi_driver = {
1134+ .driver = {
1135+ .name = "ltq-spi",
1136+ .owner = THIS_MODULE,
1137+ },
1138+ .remove = __exit_p(ltq_spi_remove),
1139+};
1140+
1141+static int __init ltq_spi_init(void)
1142+{
1143+ return platform_driver_probe(&ltq_spi_driver, ltq_spi_probe);
1144+}
1145+module_init(ltq_spi_init);
1146+
1147+static void __exit ltq_spi_exit(void)
1148+{
1149+ platform_driver_unregister(&ltq_spi_driver);
1150+}
1151+module_exit(ltq_spi_exit);
1152+
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");
1157

Archive Download this file



interactive