xref: /OK3568_Linux_fs/kernel/drivers/spi/spi-mt7621.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun //
3*4882a593Smuzhiyun // spi-mt7621.c -- MediaTek MT7621 SPI controller driver
4*4882a593Smuzhiyun //
5*4882a593Smuzhiyun // Copyright (C) 2011 Sergiy <piratfm@gmail.com>
6*4882a593Smuzhiyun // Copyright (C) 2011-2013 Gabor Juhos <juhosg@openwrt.org>
7*4882a593Smuzhiyun // Copyright (C) 2014-2015 Felix Fietkau <nbd@nbd.name>
8*4882a593Smuzhiyun //
9*4882a593Smuzhiyun // Some parts are based on spi-orion.c:
10*4882a593Smuzhiyun //   Author: Shadi Ammouri <shadi@marvell.com>
11*4882a593Smuzhiyun //   Copyright (C) 2007-2008 Marvell Ltd.
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <linux/clk.h>
14*4882a593Smuzhiyun #include <linux/delay.h>
15*4882a593Smuzhiyun #include <linux/io.h>
16*4882a593Smuzhiyun #include <linux/module.h>
17*4882a593Smuzhiyun #include <linux/of_device.h>
18*4882a593Smuzhiyun #include <linux/reset.h>
19*4882a593Smuzhiyun #include <linux/spi/spi.h>
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun #define DRIVER_NAME		"spi-mt7621"
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun /* in usec */
24*4882a593Smuzhiyun #define RALINK_SPI_WAIT_MAX_LOOP 2000
25*4882a593Smuzhiyun 
26*4882a593Smuzhiyun /* SPISTAT register bit field */
27*4882a593Smuzhiyun #define SPISTAT_BUSY		BIT(0)
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun #define MT7621_SPI_TRANS	0x00
30*4882a593Smuzhiyun #define SPITRANS_BUSY		BIT(16)
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun #define MT7621_SPI_OPCODE	0x04
33*4882a593Smuzhiyun #define MT7621_SPI_DATA0	0x08
34*4882a593Smuzhiyun #define MT7621_SPI_DATA4	0x18
35*4882a593Smuzhiyun #define SPI_CTL_TX_RX_CNT_MASK	0xff
36*4882a593Smuzhiyun #define SPI_CTL_START		BIT(8)
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun #define MT7621_SPI_MASTER	0x28
39*4882a593Smuzhiyun #define MASTER_MORE_BUFMODE	BIT(2)
40*4882a593Smuzhiyun #define MASTER_FULL_DUPLEX	BIT(10)
41*4882a593Smuzhiyun #define MASTER_RS_CLK_SEL	GENMASK(27, 16)
42*4882a593Smuzhiyun #define MASTER_RS_CLK_SEL_SHIFT	16
43*4882a593Smuzhiyun #define MASTER_RS_SLAVE_SEL	GENMASK(31, 29)
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun #define MT7621_SPI_MOREBUF	0x2c
46*4882a593Smuzhiyun #define MT7621_SPI_POLAR	0x38
47*4882a593Smuzhiyun #define MT7621_SPI_SPACE	0x3c
48*4882a593Smuzhiyun 
49*4882a593Smuzhiyun #define MT7621_CPHA		BIT(5)
50*4882a593Smuzhiyun #define MT7621_CPOL		BIT(4)
51*4882a593Smuzhiyun #define MT7621_LSB_FIRST	BIT(3)
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun struct mt7621_spi {
54*4882a593Smuzhiyun 	struct spi_controller	*master;
55*4882a593Smuzhiyun 	void __iomem		*base;
56*4882a593Smuzhiyun 	unsigned int		sys_freq;
57*4882a593Smuzhiyun 	unsigned int		speed;
58*4882a593Smuzhiyun 	struct clk		*clk;
59*4882a593Smuzhiyun 	int			pending_write;
60*4882a593Smuzhiyun };
61*4882a593Smuzhiyun 
spidev_to_mt7621_spi(struct spi_device * spi)62*4882a593Smuzhiyun static inline struct mt7621_spi *spidev_to_mt7621_spi(struct spi_device *spi)
63*4882a593Smuzhiyun {
64*4882a593Smuzhiyun 	return spi_controller_get_devdata(spi->master);
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun 
mt7621_spi_read(struct mt7621_spi * rs,u32 reg)67*4882a593Smuzhiyun static inline u32 mt7621_spi_read(struct mt7621_spi *rs, u32 reg)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun 	return ioread32(rs->base + reg);
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun 
mt7621_spi_write(struct mt7621_spi * rs,u32 reg,u32 val)72*4882a593Smuzhiyun static inline void mt7621_spi_write(struct mt7621_spi *rs, u32 reg, u32 val)
73*4882a593Smuzhiyun {
74*4882a593Smuzhiyun 	iowrite32(val, rs->base + reg);
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
mt7621_spi_set_cs(struct spi_device * spi,int enable)77*4882a593Smuzhiyun static void mt7621_spi_set_cs(struct spi_device *spi, int enable)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	struct mt7621_spi *rs = spidev_to_mt7621_spi(spi);
80*4882a593Smuzhiyun 	int cs = spi->chip_select;
81*4882a593Smuzhiyun 	u32 polar = 0;
82*4882a593Smuzhiyun 	u32 master;
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun 	/*
85*4882a593Smuzhiyun 	 * Select SPI device 7, enable "more buffer mode" and disable
86*4882a593Smuzhiyun 	 * full-duplex (only half-duplex really works on this chip
87*4882a593Smuzhiyun 	 * reliably)
88*4882a593Smuzhiyun 	 */
89*4882a593Smuzhiyun 	master = mt7621_spi_read(rs, MT7621_SPI_MASTER);
90*4882a593Smuzhiyun 	master |= MASTER_RS_SLAVE_SEL | MASTER_MORE_BUFMODE;
91*4882a593Smuzhiyun 	master &= ~MASTER_FULL_DUPLEX;
92*4882a593Smuzhiyun 	mt7621_spi_write(rs, MT7621_SPI_MASTER, master);
93*4882a593Smuzhiyun 
94*4882a593Smuzhiyun 	rs->pending_write = 0;
95*4882a593Smuzhiyun 
96*4882a593Smuzhiyun 	if (enable)
97*4882a593Smuzhiyun 		polar = BIT(cs);
98*4882a593Smuzhiyun 	mt7621_spi_write(rs, MT7621_SPI_POLAR, polar);
99*4882a593Smuzhiyun }
100*4882a593Smuzhiyun 
mt7621_spi_prepare(struct spi_device * spi,unsigned int speed)101*4882a593Smuzhiyun static int mt7621_spi_prepare(struct spi_device *spi, unsigned int speed)
102*4882a593Smuzhiyun {
103*4882a593Smuzhiyun 	struct mt7621_spi *rs = spidev_to_mt7621_spi(spi);
104*4882a593Smuzhiyun 	u32 rate;
105*4882a593Smuzhiyun 	u32 reg;
106*4882a593Smuzhiyun 
107*4882a593Smuzhiyun 	dev_dbg(&spi->dev, "speed:%u\n", speed);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	rate = DIV_ROUND_UP(rs->sys_freq, speed);
110*4882a593Smuzhiyun 	dev_dbg(&spi->dev, "rate-1:%u\n", rate);
111*4882a593Smuzhiyun 
112*4882a593Smuzhiyun 	if (rate > 4097)
113*4882a593Smuzhiyun 		return -EINVAL;
114*4882a593Smuzhiyun 
115*4882a593Smuzhiyun 	if (rate < 2)
116*4882a593Smuzhiyun 		rate = 2;
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	reg = mt7621_spi_read(rs, MT7621_SPI_MASTER);
119*4882a593Smuzhiyun 	reg &= ~MASTER_RS_CLK_SEL;
120*4882a593Smuzhiyun 	reg |= (rate - 2) << MASTER_RS_CLK_SEL_SHIFT;
121*4882a593Smuzhiyun 	rs->speed = speed;
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun 	reg &= ~MT7621_LSB_FIRST;
124*4882a593Smuzhiyun 	if (spi->mode & SPI_LSB_FIRST)
125*4882a593Smuzhiyun 		reg |= MT7621_LSB_FIRST;
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun 	/*
128*4882a593Smuzhiyun 	 * This SPI controller seems to be tested on SPI flash only and some
129*4882a593Smuzhiyun 	 * bits are swizzled under other SPI modes probably due to incorrect
130*4882a593Smuzhiyun 	 * wiring inside the silicon. Only mode 0 works correctly.
131*4882a593Smuzhiyun 	 */
132*4882a593Smuzhiyun 	reg &= ~(MT7621_CPHA | MT7621_CPOL);
133*4882a593Smuzhiyun 
134*4882a593Smuzhiyun 	mt7621_spi_write(rs, MT7621_SPI_MASTER, reg);
135*4882a593Smuzhiyun 
136*4882a593Smuzhiyun 	return 0;
137*4882a593Smuzhiyun }
138*4882a593Smuzhiyun 
mt7621_spi_wait_till_ready(struct mt7621_spi * rs)139*4882a593Smuzhiyun static inline int mt7621_spi_wait_till_ready(struct mt7621_spi *rs)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun 	int i;
142*4882a593Smuzhiyun 
143*4882a593Smuzhiyun 	for (i = 0; i < RALINK_SPI_WAIT_MAX_LOOP; i++) {
144*4882a593Smuzhiyun 		u32 status;
145*4882a593Smuzhiyun 
146*4882a593Smuzhiyun 		status = mt7621_spi_read(rs, MT7621_SPI_TRANS);
147*4882a593Smuzhiyun 		if ((status & SPITRANS_BUSY) == 0)
148*4882a593Smuzhiyun 			return 0;
149*4882a593Smuzhiyun 		cpu_relax();
150*4882a593Smuzhiyun 		udelay(1);
151*4882a593Smuzhiyun 	}
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun 	return -ETIMEDOUT;
154*4882a593Smuzhiyun }
155*4882a593Smuzhiyun 
mt7621_spi_read_half_duplex(struct mt7621_spi * rs,int rx_len,u8 * buf)156*4882a593Smuzhiyun static void mt7621_spi_read_half_duplex(struct mt7621_spi *rs,
157*4882a593Smuzhiyun 					int rx_len, u8 *buf)
158*4882a593Smuzhiyun {
159*4882a593Smuzhiyun 	int tx_len;
160*4882a593Smuzhiyun 
161*4882a593Smuzhiyun 	/*
162*4882a593Smuzhiyun 	 * Combine with any pending write, and perform one or more half-duplex
163*4882a593Smuzhiyun 	 * transactions reading 'len' bytes. Data to be written is already in
164*4882a593Smuzhiyun 	 * MT7621_SPI_DATA.
165*4882a593Smuzhiyun 	 */
166*4882a593Smuzhiyun 	tx_len = rs->pending_write;
167*4882a593Smuzhiyun 	rs->pending_write = 0;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	while (rx_len || tx_len) {
170*4882a593Smuzhiyun 		int i;
171*4882a593Smuzhiyun 		u32 val = (min(tx_len, 4) * 8) << 24;
172*4882a593Smuzhiyun 		int rx = min(rx_len, 32);
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun 		if (tx_len > 4)
175*4882a593Smuzhiyun 			val |= (tx_len - 4) * 8;
176*4882a593Smuzhiyun 		val |= (rx * 8) << 12;
177*4882a593Smuzhiyun 		mt7621_spi_write(rs, MT7621_SPI_MOREBUF, val);
178*4882a593Smuzhiyun 
179*4882a593Smuzhiyun 		tx_len = 0;
180*4882a593Smuzhiyun 
181*4882a593Smuzhiyun 		val = mt7621_spi_read(rs, MT7621_SPI_TRANS);
182*4882a593Smuzhiyun 		val |= SPI_CTL_START;
183*4882a593Smuzhiyun 		mt7621_spi_write(rs, MT7621_SPI_TRANS, val);
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun 		mt7621_spi_wait_till_ready(rs);
186*4882a593Smuzhiyun 
187*4882a593Smuzhiyun 		for (i = 0; i < rx; i++) {
188*4882a593Smuzhiyun 			if ((i % 4) == 0)
189*4882a593Smuzhiyun 				val = mt7621_spi_read(rs, MT7621_SPI_DATA0 + i);
190*4882a593Smuzhiyun 			*buf++ = val & 0xff;
191*4882a593Smuzhiyun 			val >>= 8;
192*4882a593Smuzhiyun 		}
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 		rx_len -= i;
195*4882a593Smuzhiyun 	}
196*4882a593Smuzhiyun }
197*4882a593Smuzhiyun 
mt7621_spi_flush(struct mt7621_spi * rs)198*4882a593Smuzhiyun static inline void mt7621_spi_flush(struct mt7621_spi *rs)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	mt7621_spi_read_half_duplex(rs, 0, NULL);
201*4882a593Smuzhiyun }
202*4882a593Smuzhiyun 
mt7621_spi_write_half_duplex(struct mt7621_spi * rs,int tx_len,const u8 * buf)203*4882a593Smuzhiyun static void mt7621_spi_write_half_duplex(struct mt7621_spi *rs,
204*4882a593Smuzhiyun 					 int tx_len, const u8 *buf)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun 	int len = rs->pending_write;
207*4882a593Smuzhiyun 	int val = 0;
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 	if (len & 3) {
210*4882a593Smuzhiyun 		val = mt7621_spi_read(rs, MT7621_SPI_OPCODE + (len & ~3));
211*4882a593Smuzhiyun 		if (len < 4) {
212*4882a593Smuzhiyun 			val <<= (4 - len) * 8;
213*4882a593Smuzhiyun 			val = swab32(val);
214*4882a593Smuzhiyun 		}
215*4882a593Smuzhiyun 	}
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	while (tx_len > 0) {
218*4882a593Smuzhiyun 		if (len >= 36) {
219*4882a593Smuzhiyun 			rs->pending_write = len;
220*4882a593Smuzhiyun 			mt7621_spi_flush(rs);
221*4882a593Smuzhiyun 			len = 0;
222*4882a593Smuzhiyun 		}
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun 		val |= *buf++ << (8 * (len & 3));
225*4882a593Smuzhiyun 		len++;
226*4882a593Smuzhiyun 		if ((len & 3) == 0) {
227*4882a593Smuzhiyun 			if (len == 4)
228*4882a593Smuzhiyun 				/* The byte-order of the opcode is weird! */
229*4882a593Smuzhiyun 				val = swab32(val);
230*4882a593Smuzhiyun 			mt7621_spi_write(rs, MT7621_SPI_OPCODE + len - 4, val);
231*4882a593Smuzhiyun 			val = 0;
232*4882a593Smuzhiyun 		}
233*4882a593Smuzhiyun 		tx_len -= 1;
234*4882a593Smuzhiyun 	}
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun 	if (len & 3) {
237*4882a593Smuzhiyun 		if (len < 4) {
238*4882a593Smuzhiyun 			val = swab32(val);
239*4882a593Smuzhiyun 			val >>= (4 - len) * 8;
240*4882a593Smuzhiyun 		}
241*4882a593Smuzhiyun 		mt7621_spi_write(rs, MT7621_SPI_OPCODE + (len & ~3), val);
242*4882a593Smuzhiyun 	}
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun 	rs->pending_write = len;
245*4882a593Smuzhiyun }
246*4882a593Smuzhiyun 
mt7621_spi_transfer_one_message(struct spi_controller * master,struct spi_message * m)247*4882a593Smuzhiyun static int mt7621_spi_transfer_one_message(struct spi_controller *master,
248*4882a593Smuzhiyun 					   struct spi_message *m)
249*4882a593Smuzhiyun {
250*4882a593Smuzhiyun 	struct mt7621_spi *rs = spi_controller_get_devdata(master);
251*4882a593Smuzhiyun 	struct spi_device *spi = m->spi;
252*4882a593Smuzhiyun 	unsigned int speed = spi->max_speed_hz;
253*4882a593Smuzhiyun 	struct spi_transfer *t = NULL;
254*4882a593Smuzhiyun 	int status = 0;
255*4882a593Smuzhiyun 
256*4882a593Smuzhiyun 	mt7621_spi_wait_till_ready(rs);
257*4882a593Smuzhiyun 
258*4882a593Smuzhiyun 	list_for_each_entry(t, &m->transfers, transfer_list)
259*4882a593Smuzhiyun 		if (t->speed_hz < speed)
260*4882a593Smuzhiyun 			speed = t->speed_hz;
261*4882a593Smuzhiyun 
262*4882a593Smuzhiyun 	if (mt7621_spi_prepare(spi, speed)) {
263*4882a593Smuzhiyun 		status = -EIO;
264*4882a593Smuzhiyun 		goto msg_done;
265*4882a593Smuzhiyun 	}
266*4882a593Smuzhiyun 
267*4882a593Smuzhiyun 	/* Assert CS */
268*4882a593Smuzhiyun 	mt7621_spi_set_cs(spi, 1);
269*4882a593Smuzhiyun 
270*4882a593Smuzhiyun 	m->actual_length = 0;
271*4882a593Smuzhiyun 	list_for_each_entry(t, &m->transfers, transfer_list) {
272*4882a593Smuzhiyun 		if ((t->rx_buf) && (t->tx_buf)) {
273*4882a593Smuzhiyun 			/*
274*4882a593Smuzhiyun 			 * This controller will shift some extra data out
275*4882a593Smuzhiyun 			 * of spi_opcode if (mosi_bit_cnt > 0) &&
276*4882a593Smuzhiyun 			 * (cmd_bit_cnt == 0). So the claimed full-duplex
277*4882a593Smuzhiyun 			 * support is broken since we have no way to read
278*4882a593Smuzhiyun 			 * the MISO value during that bit.
279*4882a593Smuzhiyun 			 */
280*4882a593Smuzhiyun 			status = -EIO;
281*4882a593Smuzhiyun 			goto msg_done;
282*4882a593Smuzhiyun 		} else if (t->rx_buf) {
283*4882a593Smuzhiyun 			mt7621_spi_read_half_duplex(rs, t->len, t->rx_buf);
284*4882a593Smuzhiyun 		} else if (t->tx_buf) {
285*4882a593Smuzhiyun 			mt7621_spi_write_half_duplex(rs, t->len, t->tx_buf);
286*4882a593Smuzhiyun 		}
287*4882a593Smuzhiyun 		m->actual_length += t->len;
288*4882a593Smuzhiyun 	}
289*4882a593Smuzhiyun 
290*4882a593Smuzhiyun 	/* Flush data and deassert CS */
291*4882a593Smuzhiyun 	mt7621_spi_flush(rs);
292*4882a593Smuzhiyun 	mt7621_spi_set_cs(spi, 0);
293*4882a593Smuzhiyun 
294*4882a593Smuzhiyun msg_done:
295*4882a593Smuzhiyun 	m->status = status;
296*4882a593Smuzhiyun 	spi_finalize_current_message(master);
297*4882a593Smuzhiyun 
298*4882a593Smuzhiyun 	return 0;
299*4882a593Smuzhiyun }
300*4882a593Smuzhiyun 
mt7621_spi_setup(struct spi_device * spi)301*4882a593Smuzhiyun static int mt7621_spi_setup(struct spi_device *spi)
302*4882a593Smuzhiyun {
303*4882a593Smuzhiyun 	struct mt7621_spi *rs = spidev_to_mt7621_spi(spi);
304*4882a593Smuzhiyun 
305*4882a593Smuzhiyun 	if ((spi->max_speed_hz == 0) ||
306*4882a593Smuzhiyun 	    (spi->max_speed_hz > (rs->sys_freq / 2)))
307*4882a593Smuzhiyun 		spi->max_speed_hz = rs->sys_freq / 2;
308*4882a593Smuzhiyun 
309*4882a593Smuzhiyun 	if (spi->max_speed_hz < (rs->sys_freq / 4097)) {
310*4882a593Smuzhiyun 		dev_err(&spi->dev, "setup: requested speed is too low %d Hz\n",
311*4882a593Smuzhiyun 			spi->max_speed_hz);
312*4882a593Smuzhiyun 		return -EINVAL;
313*4882a593Smuzhiyun 	}
314*4882a593Smuzhiyun 
315*4882a593Smuzhiyun 	return 0;
316*4882a593Smuzhiyun }
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun static const struct of_device_id mt7621_spi_match[] = {
319*4882a593Smuzhiyun 	{ .compatible = "ralink,mt7621-spi" },
320*4882a593Smuzhiyun 	{},
321*4882a593Smuzhiyun };
322*4882a593Smuzhiyun MODULE_DEVICE_TABLE(of, mt7621_spi_match);
323*4882a593Smuzhiyun 
mt7621_spi_probe(struct platform_device * pdev)324*4882a593Smuzhiyun static int mt7621_spi_probe(struct platform_device *pdev)
325*4882a593Smuzhiyun {
326*4882a593Smuzhiyun 	const struct of_device_id *match;
327*4882a593Smuzhiyun 	struct spi_controller *master;
328*4882a593Smuzhiyun 	struct mt7621_spi *rs;
329*4882a593Smuzhiyun 	void __iomem *base;
330*4882a593Smuzhiyun 	int status = 0;
331*4882a593Smuzhiyun 	struct clk *clk;
332*4882a593Smuzhiyun 	int ret;
333*4882a593Smuzhiyun 
334*4882a593Smuzhiyun 	match = of_match_device(mt7621_spi_match, &pdev->dev);
335*4882a593Smuzhiyun 	if (!match)
336*4882a593Smuzhiyun 		return -EINVAL;
337*4882a593Smuzhiyun 
338*4882a593Smuzhiyun 	base = devm_platform_ioremap_resource(pdev, 0);
339*4882a593Smuzhiyun 	if (IS_ERR(base))
340*4882a593Smuzhiyun 		return PTR_ERR(base);
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun 	clk = devm_clk_get(&pdev->dev, NULL);
343*4882a593Smuzhiyun 	if (IS_ERR(clk))
344*4882a593Smuzhiyun 		return dev_err_probe(&pdev->dev, PTR_ERR(clk),
345*4882a593Smuzhiyun 				     "unable to get SYS clock\n");
346*4882a593Smuzhiyun 
347*4882a593Smuzhiyun 	status = clk_prepare_enable(clk);
348*4882a593Smuzhiyun 	if (status)
349*4882a593Smuzhiyun 		return status;
350*4882a593Smuzhiyun 
351*4882a593Smuzhiyun 	master = devm_spi_alloc_master(&pdev->dev, sizeof(*rs));
352*4882a593Smuzhiyun 	if (!master) {
353*4882a593Smuzhiyun 		dev_info(&pdev->dev, "master allocation failed\n");
354*4882a593Smuzhiyun 		clk_disable_unprepare(clk);
355*4882a593Smuzhiyun 		return -ENOMEM;
356*4882a593Smuzhiyun 	}
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	master->mode_bits = SPI_LSB_FIRST;
359*4882a593Smuzhiyun 	master->flags = SPI_CONTROLLER_HALF_DUPLEX;
360*4882a593Smuzhiyun 	master->setup = mt7621_spi_setup;
361*4882a593Smuzhiyun 	master->transfer_one_message = mt7621_spi_transfer_one_message;
362*4882a593Smuzhiyun 	master->bits_per_word_mask = SPI_BPW_MASK(8);
363*4882a593Smuzhiyun 	master->dev.of_node = pdev->dev.of_node;
364*4882a593Smuzhiyun 	master->num_chipselect = 2;
365*4882a593Smuzhiyun 
366*4882a593Smuzhiyun 	dev_set_drvdata(&pdev->dev, master);
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 	rs = spi_controller_get_devdata(master);
369*4882a593Smuzhiyun 	rs->base = base;
370*4882a593Smuzhiyun 	rs->clk = clk;
371*4882a593Smuzhiyun 	rs->master = master;
372*4882a593Smuzhiyun 	rs->sys_freq = clk_get_rate(rs->clk);
373*4882a593Smuzhiyun 	rs->pending_write = 0;
374*4882a593Smuzhiyun 	dev_info(&pdev->dev, "sys_freq: %u\n", rs->sys_freq);
375*4882a593Smuzhiyun 
376*4882a593Smuzhiyun 	ret = device_reset(&pdev->dev);
377*4882a593Smuzhiyun 	if (ret) {
378*4882a593Smuzhiyun 		dev_err(&pdev->dev, "SPI reset failed!\n");
379*4882a593Smuzhiyun 		clk_disable_unprepare(clk);
380*4882a593Smuzhiyun 		return ret;
381*4882a593Smuzhiyun 	}
382*4882a593Smuzhiyun 
383*4882a593Smuzhiyun 	ret = spi_register_controller(master);
384*4882a593Smuzhiyun 	if (ret)
385*4882a593Smuzhiyun 		clk_disable_unprepare(clk);
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 	return ret;
388*4882a593Smuzhiyun }
389*4882a593Smuzhiyun 
mt7621_spi_remove(struct platform_device * pdev)390*4882a593Smuzhiyun static int mt7621_spi_remove(struct platform_device *pdev)
391*4882a593Smuzhiyun {
392*4882a593Smuzhiyun 	struct spi_controller *master;
393*4882a593Smuzhiyun 	struct mt7621_spi *rs;
394*4882a593Smuzhiyun 
395*4882a593Smuzhiyun 	master = dev_get_drvdata(&pdev->dev);
396*4882a593Smuzhiyun 	rs = spi_controller_get_devdata(master);
397*4882a593Smuzhiyun 
398*4882a593Smuzhiyun 	spi_unregister_controller(master);
399*4882a593Smuzhiyun 	clk_disable_unprepare(rs->clk);
400*4882a593Smuzhiyun 
401*4882a593Smuzhiyun 	return 0;
402*4882a593Smuzhiyun }
403*4882a593Smuzhiyun 
404*4882a593Smuzhiyun MODULE_ALIAS("platform:" DRIVER_NAME);
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun static struct platform_driver mt7621_spi_driver = {
407*4882a593Smuzhiyun 	.driver = {
408*4882a593Smuzhiyun 		.name = DRIVER_NAME,
409*4882a593Smuzhiyun 		.of_match_table = mt7621_spi_match,
410*4882a593Smuzhiyun 	},
411*4882a593Smuzhiyun 	.probe = mt7621_spi_probe,
412*4882a593Smuzhiyun 	.remove = mt7621_spi_remove,
413*4882a593Smuzhiyun };
414*4882a593Smuzhiyun 
415*4882a593Smuzhiyun module_platform_driver(mt7621_spi_driver);
416*4882a593Smuzhiyun 
417*4882a593Smuzhiyun MODULE_DESCRIPTION("MT7621 SPI driver");
418*4882a593Smuzhiyun MODULE_AUTHOR("Felix Fietkau <nbd@nbd.name>");
419*4882a593Smuzhiyun MODULE_LICENSE("GPL");
420