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