1 // SPDX-License-Identifier: GPL-2.0
3 // spi-mt7621.c -- MediaTek MT7621 SPI controller driver
5 // Copyright (C) 2011 Sergiy <piratfm@gmail.com>
6 // Copyright (C) 2011-2013 Gabor Juhos <juhosg@openwrt.org>
7 // Copyright (C) 2014-2015 Felix Fietkau <nbd@nbd.name>
9 // Some parts are based on spi-orion.c:
10 // Author: Shadi Ammouri <shadi@marvell.com>
11 // Copyright (C) 2007-2008 Marvell Ltd.
13 #include <linux/clk.h>
14 #include <linux/delay.h>
16 #include <linux/module.h>
17 #include <linux/of_device.h>
18 #include <linux/reset.h>
19 #include <linux/spi/spi.h>
21 #define DRIVER_NAME "spi-mt7621"
24 #define RALINK_SPI_WAIT_MAX_LOOP 2000
26 /* SPISTAT register bit field */
27 #define SPISTAT_BUSY BIT(0)
29 #define MT7621_SPI_TRANS 0x00
30 #define SPITRANS_BUSY BIT(16)
32 #define MT7621_SPI_OPCODE 0x04
33 #define MT7621_SPI_DATA0 0x08
34 #define MT7621_SPI_DATA4 0x18
35 #define SPI_CTL_TX_RX_CNT_MASK 0xff
36 #define SPI_CTL_START BIT(8)
38 #define MT7621_SPI_MASTER 0x28
39 #define MASTER_MORE_BUFMODE BIT(2)
40 #define MASTER_FULL_DUPLEX BIT(10)
41 #define MASTER_RS_CLK_SEL GENMASK(27, 16)
42 #define MASTER_RS_CLK_SEL_SHIFT 16
43 #define MASTER_RS_SLAVE_SEL GENMASK(31, 29)
45 #define MT7621_SPI_MOREBUF 0x2c
46 #define MT7621_SPI_POLAR 0x38
47 #define MT7621_SPI_SPACE 0x3c
49 #define MT7621_CPHA BIT(5)
50 #define MT7621_CPOL BIT(4)
51 #define MT7621_LSB_FIRST BIT(3)
54 struct spi_controller
*master
;
56 unsigned int sys_freq
;
62 static inline struct mt7621_spi
*spidev_to_mt7621_spi(struct spi_device
*spi
)
64 return spi_controller_get_devdata(spi
->master
);
67 static inline u32
mt7621_spi_read(struct mt7621_spi
*rs
, u32 reg
)
69 return ioread32(rs
->base
+ reg
);
72 static inline void mt7621_spi_write(struct mt7621_spi
*rs
, u32 reg
, u32 val
)
74 iowrite32(val
, rs
->base
+ reg
);
77 static void mt7621_spi_set_cs(struct spi_device
*spi
, int enable
)
79 struct mt7621_spi
*rs
= spidev_to_mt7621_spi(spi
);
80 int cs
= spi
->chip_select
;
85 * Select SPI device 7, enable "more buffer mode" and disable
86 * full-duplex (only half-duplex really works on this chip
89 master
= mt7621_spi_read(rs
, MT7621_SPI_MASTER
);
90 master
|= MASTER_RS_SLAVE_SEL
| MASTER_MORE_BUFMODE
;
91 master
&= ~MASTER_FULL_DUPLEX
;
92 mt7621_spi_write(rs
, MT7621_SPI_MASTER
, master
);
94 rs
->pending_write
= 0;
98 mt7621_spi_write(rs
, MT7621_SPI_POLAR
, polar
);
101 static int mt7621_spi_prepare(struct spi_device
*spi
, unsigned int speed
)
103 struct mt7621_spi
*rs
= spidev_to_mt7621_spi(spi
);
107 dev_dbg(&spi
->dev
, "speed:%u\n", speed
);
109 rate
= DIV_ROUND_UP(rs
->sys_freq
, speed
);
110 dev_dbg(&spi
->dev
, "rate-1:%u\n", rate
);
118 reg
= mt7621_spi_read(rs
, MT7621_SPI_MASTER
);
119 reg
&= ~MASTER_RS_CLK_SEL
;
120 reg
|= (rate
- 2) << MASTER_RS_CLK_SEL_SHIFT
;
123 reg
&= ~MT7621_LSB_FIRST
;
124 if (spi
->mode
& SPI_LSB_FIRST
)
125 reg
|= MT7621_LSB_FIRST
;
128 * This SPI controller seems to be tested on SPI flash only and some
129 * bits are swizzled under other SPI modes probably due to incorrect
130 * wiring inside the silicon. Only mode 0 works correctly.
132 reg
&= ~(MT7621_CPHA
| MT7621_CPOL
);
134 mt7621_spi_write(rs
, MT7621_SPI_MASTER
, reg
);
139 static inline int mt7621_spi_wait_till_ready(struct mt7621_spi
*rs
)
143 for (i
= 0; i
< RALINK_SPI_WAIT_MAX_LOOP
; i
++) {
146 status
= mt7621_spi_read(rs
, MT7621_SPI_TRANS
);
147 if ((status
& SPITRANS_BUSY
) == 0)
156 static void mt7621_spi_read_half_duplex(struct mt7621_spi
*rs
,
162 * Combine with any pending write, and perform one or more half-duplex
163 * transactions reading 'len' bytes. Data to be written is already in
166 tx_len
= rs
->pending_write
;
167 rs
->pending_write
= 0;
169 while (rx_len
|| tx_len
) {
171 u32 val
= (min(tx_len
, 4) * 8) << 24;
172 int rx
= min(rx_len
, 32);
175 val
|= (tx_len
- 4) * 8;
176 val
|= (rx
* 8) << 12;
177 mt7621_spi_write(rs
, MT7621_SPI_MOREBUF
, val
);
181 val
= mt7621_spi_read(rs
, MT7621_SPI_TRANS
);
182 val
|= SPI_CTL_START
;
183 mt7621_spi_write(rs
, MT7621_SPI_TRANS
, val
);
185 mt7621_spi_wait_till_ready(rs
);
187 for (i
= 0; i
< rx
; i
++) {
189 val
= mt7621_spi_read(rs
, MT7621_SPI_DATA0
+ i
);
198 static inline void mt7621_spi_flush(struct mt7621_spi
*rs
)
200 mt7621_spi_read_half_duplex(rs
, 0, NULL
);
203 static void mt7621_spi_write_half_duplex(struct mt7621_spi
*rs
,
204 int tx_len
, const u8
*buf
)
206 int len
= rs
->pending_write
;
210 val
= mt7621_spi_read(rs
, MT7621_SPI_OPCODE
+ (len
& ~3));
212 val
<<= (4 - len
) * 8;
219 rs
->pending_write
= len
;
220 mt7621_spi_flush(rs
);
224 val
|= *buf
++ << (8 * (len
& 3));
226 if ((len
& 3) == 0) {
228 /* The byte-order of the opcode is weird! */
230 mt7621_spi_write(rs
, MT7621_SPI_OPCODE
+ len
- 4, val
);
239 val
>>= (4 - len
) * 8;
241 mt7621_spi_write(rs
, MT7621_SPI_OPCODE
+ (len
& ~3), val
);
244 rs
->pending_write
= len
;
247 static int mt7621_spi_transfer_one_message(struct spi_controller
*master
,
248 struct spi_message
*m
)
250 struct mt7621_spi
*rs
= spi_controller_get_devdata(master
);
251 struct spi_device
*spi
= m
->spi
;
252 unsigned int speed
= spi
->max_speed_hz
;
253 struct spi_transfer
*t
= NULL
;
256 mt7621_spi_wait_till_ready(rs
);
258 list_for_each_entry(t
, &m
->transfers
, transfer_list
)
259 if (t
->speed_hz
< speed
)
262 if (mt7621_spi_prepare(spi
, speed
)) {
268 mt7621_spi_set_cs(spi
, 1);
270 m
->actual_length
= 0;
271 list_for_each_entry(t
, &m
->transfers
, transfer_list
) {
272 if ((t
->rx_buf
) && (t
->tx_buf
)) {
274 * This controller will shift some extra data out
275 * of spi_opcode if (mosi_bit_cnt > 0) &&
276 * (cmd_bit_cnt == 0). So the claimed full-duplex
277 * support is broken since we have no way to read
278 * the MISO value during that bit.
282 } else if (t
->rx_buf
) {
283 mt7621_spi_read_half_duplex(rs
, t
->len
, t
->rx_buf
);
284 } else if (t
->tx_buf
) {
285 mt7621_spi_write_half_duplex(rs
, t
->len
, t
->tx_buf
);
287 m
->actual_length
+= t
->len
;
290 /* Flush data and deassert CS */
291 mt7621_spi_flush(rs
);
292 mt7621_spi_set_cs(spi
, 0);
296 spi_finalize_current_message(master
);
301 static int mt7621_spi_setup(struct spi_device
*spi
)
303 struct mt7621_spi
*rs
= spidev_to_mt7621_spi(spi
);
305 if ((spi
->max_speed_hz
== 0) ||
306 (spi
->max_speed_hz
> (rs
->sys_freq
/ 2)))
307 spi
->max_speed_hz
= rs
->sys_freq
/ 2;
309 if (spi
->max_speed_hz
< (rs
->sys_freq
/ 4097)) {
310 dev_err(&spi
->dev
, "setup: requested speed is too low %d Hz\n",
318 static const struct of_device_id mt7621_spi_match
[] = {
319 { .compatible
= "ralink,mt7621-spi" },
322 MODULE_DEVICE_TABLE(of
, mt7621_spi_match
);
324 static int mt7621_spi_probe(struct platform_device
*pdev
)
326 const struct of_device_id
*match
;
327 struct spi_controller
*master
;
328 struct mt7621_spi
*rs
;
334 match
= of_match_device(mt7621_spi_match
, &pdev
->dev
);
338 base
= devm_platform_ioremap_resource(pdev
, 0);
340 return PTR_ERR(base
);
342 clk
= devm_clk_get(&pdev
->dev
, NULL
);
344 dev_err(&pdev
->dev
, "unable to get SYS clock, err=%d\n",
349 status
= clk_prepare_enable(clk
);
353 master
= spi_alloc_master(&pdev
->dev
, sizeof(*rs
));
355 dev_info(&pdev
->dev
, "master allocation failed\n");
359 master
->mode_bits
= SPI_LSB_FIRST
;
360 master
->flags
= SPI_CONTROLLER_HALF_DUPLEX
;
361 master
->setup
= mt7621_spi_setup
;
362 master
->transfer_one_message
= mt7621_spi_transfer_one_message
;
363 master
->bits_per_word_mask
= SPI_BPW_MASK(8);
364 master
->dev
.of_node
= pdev
->dev
.of_node
;
365 master
->num_chipselect
= 2;
367 dev_set_drvdata(&pdev
->dev
, master
);
369 rs
= spi_controller_get_devdata(master
);
373 rs
->sys_freq
= clk_get_rate(rs
->clk
);
374 rs
->pending_write
= 0;
375 dev_info(&pdev
->dev
, "sys_freq: %u\n", rs
->sys_freq
);
377 ret
= device_reset(&pdev
->dev
);
379 dev_err(&pdev
->dev
, "SPI reset failed!\n");
383 return devm_spi_register_controller(&pdev
->dev
, master
);
386 static int mt7621_spi_remove(struct platform_device
*pdev
)
388 struct spi_controller
*master
;
389 struct mt7621_spi
*rs
;
391 master
= dev_get_drvdata(&pdev
->dev
);
392 rs
= spi_controller_get_devdata(master
);
394 clk_disable_unprepare(rs
->clk
);
399 MODULE_ALIAS("platform:" DRIVER_NAME
);
401 static struct platform_driver mt7621_spi_driver
= {
404 .of_match_table
= mt7621_spi_match
,
406 .probe
= mt7621_spi_probe
,
407 .remove
= mt7621_spi_remove
,
410 module_platform_driver(mt7621_spi_driver
);
412 MODULE_DESCRIPTION("MT7621 SPI driver");
413 MODULE_AUTHOR("Felix Fietkau <nbd@nbd.name>");
414 MODULE_LICENSE("GPL");