blob: 118496dc14c72457ee45e2f6efad644400c797b8 [file] [log] [blame]
rjw1f884582022-01-06 17:20:42 +08001/*
2 * Copyright (c) 2015 MediaTek Inc.
3 * Author: Leilk Liu <leilk.liu@mediatek.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 */
14
15#include <linux/clk.h>
16#include <linux/device.h>
17#include <linux/err.h>
18#include <linux/interrupt.h>
19#include <linux/io.h>
20#include <linux/ioport.h>
21#include <linux/module.h>
22#include <linux/of.h>
23#include <linux/of_gpio.h>
24#include <linux/of_address.h>
25#include <linux/platform_device.h>
26#include <linux/platform_data/spi-mt65xx.h>
27#include <linux/pm_runtime.h>
28#include <linux/spi/spi.h>
29#include <linux/dma-mapping.h>
30
31
32#define SPI_CFG0_REG 0x0000
33#define SPI_CFG1_REG 0x0004
34#define SPI_TX_SRC_REG 0x0008
35#define SPI_RX_DST_REG 0x000c
36#define SPI_TX_DATA_REG 0x0010
37#define SPI_RX_DATA_REG 0x0014
38#define SPI_CMD_REG 0x0018
39#define SPI_STATUS0_REG 0x001c
40#define SPI_STATUS1_REG 0x0020
41#define SPI_PAD_SEL_REG 0x0024
42#define SPI_CFG2_REG 0x0028
43#define SPI_TX_SRC_REG_64 0x002c
44#define SPI_RX_DST_REG_64 0x0030
45
46#define SPI_CFG0_SCK_HIGH_OFFSET 0
47#define SPI_CFG0_SCK_LOW_OFFSET 8
48#define SPI_CFG0_CS_HOLD_OFFSET 16
49#define SPI_CFG0_CS_SETUP_OFFSET 24
50#define SPI_ADJUST_CFG0_CS_HOLD_OFFSET 0
51#define SPI_ADJUST_CFG0_CS_SETUP_OFFSET 16
52
53#define SPI_CFG1_CS_IDLE_OFFSET 0
54#define SPI_CFG1_PACKET_LOOP_OFFSET 8
55#define SPI_CFG1_PACKET_LENGTH_OFFSET 16
56#define SPI_CFG1_GET_TICK_DLY_OFFSET 29
57
58#define SPI_CFG1_CS_IDLE_MASK 0xff
59#define SPI_CFG1_PACKET_LOOP_MASK 0xff00
60#define SPI_CFG1_PACKET_LENGTH_MASK 0x3ff0000
61#define SPI_CFG2_SCK_HIGH_OFFSET 0
62#define SPI_CFG2_SCK_LOW_OFFSET 16
63
64#define SPI_CMD_ACT BIT(0)
65#define SPI_CMD_RESUME BIT(1)
66#define SPI_CMD_RST BIT(2)
67#define SPI_CMD_PAUSE_EN BIT(4)
68#define SPI_CMD_DEASSERT BIT(5)
69#define SPI_CMD_SAMPLE_SEL BIT(6)
70#define SPI_CMD_CS_POL BIT(7)
71#define SPI_CMD_CPHA BIT(8)
72#define SPI_CMD_CPOL BIT(9)
73#define SPI_CMD_RX_DMA BIT(10)
74#define SPI_CMD_TX_DMA BIT(11)
75#define SPI_CMD_TXMSBF BIT(12)
76#define SPI_CMD_RXMSBF BIT(13)
77#define SPI_CMD_RX_ENDIAN BIT(14)
78#define SPI_CMD_TX_ENDIAN BIT(15)
79#define SPI_CMD_FINISH_IE BIT(16)
80#define SPI_CMD_PAUSE_IE BIT(17)
81
82#define SPI_CMD_MULTI_CS_OFFSET 29
83
84#define MT8173_SPI_MAX_PAD_SEL 3
85
86#define MTK_SPI_PAUSE_INT_STATUS 0x2
87
88#define MTK_SPI_IDLE 0
89#define MTK_SPI_PAUSED 1
90
91#define MTK_SPI_MAX_FIFO_SIZE 32U
92#define MTK_SPI_PACKET_SIZE 1024
93#define ADDRSHIFT_R_OFFSET (6)
94#define ADDRSHIFT_R_MASK (0xFFFFF03F)
95#define ADDRSHIFT_W_MASK (0xFFFFFFC0)
96#define MTK_SPI_32BIS_MASK (0xFFFFFFFF)
97#define MTK_SPI_32BIS_SHIFT (32)
98
99#define DMA_ADDR_BITS (36)
100
101struct mtk_spi_compatible {
102 bool need_pad_sel;
103 /* Must explicitly send dummy Tx bytes to do Rx only transfer */
104 bool must_tx;
105 /* some IC design adjust register define */
106 bool enhance_timing;
107 /*some chip support 8GB DRAM access, there are two kinds solutions*/
108 bool dma8g_peri_ext;
109 bool dma8g_spi_ext;
110};
111
112struct mtk_spi {
113 void __iomem *base;
114 void __iomem *peri_regs;
115 u32 state;
116 int pad_num;
117 u32 *pad_sel;
118 struct clk *parent_clk, *sel_clk, *spi_clk;
119 struct spi_transfer *cur_transfer;
120 u32 xfer_len;
121 u32 num_xfered;
122 struct scatterlist *tx_sgl, *rx_sgl;
123 u32 tx_sgl_len, rx_sgl_len;
124 const struct mtk_spi_compatible *dev_comp;
125 u32 dram_8gb_offset;
126};
127
128static const struct mtk_spi_compatible mtk_common_compat;
129
130static const struct mtk_spi_compatible mt2712_compat = {
131 .must_tx = true,
132};
133
134static const struct mtk_spi_compatible mt2731_compat = {
135 .need_pad_sel = true,
136 .enhance_timing = true,
137 .dma8g_spi_ext = true,
138 .must_tx = true,
139};
140
141/*
142 * A piece of default chip info unless the platform
143 * supplies it.
144 */
145static const struct mtk_chip_config mtk_default_chip_info = {
146 .rx_mlsb = 1,
147 .tx_mlsb = 1,
148 .cs_pol = 0,
149 .sample_sel = 0,
150
151 .cs_setuptime = 0,
152 .cs_holdtime = 0,
153 .cs_idletime = 0,
154 .deassert_mode = 0,
155 .multi_cs_num = 0,
156};
157
158static const struct of_device_id mtk_spi_of_match[] = {
159 { .compatible = "mediatek,mt2701-spi",
160 .data = (void *)&mtk_common_compat,
161 },
162 { .compatible = "mediatek,mt2712-spi",
163 .data = (void *)&mt2712_compat,
164 },
165 { .compatible = "mediatek,mt2731-spi",
166 .data = (void *)&mt2731_compat,
167 },
168 {}
169};
170MODULE_DEVICE_TABLE(of, mtk_spi_of_match);
171
172#define LOG_CLOSE 0
173#define LOG_OPEN 1
174u8 spi_log_status = LOG_CLOSE;
175
176#define spi_debug(fmt, args...) do { \
177 if (spi_log_status == LOG_OPEN) {\
178 pr_info("[spi]%s() " fmt, __func__, ##args); \
179 } \
180} while (0)
181
182static ssize_t spi_log_show(struct device *dev, struct device_attribute *attr,
183 char *buf)
184{
185 char buf_temp[50] = { 0 };
186
187 if (buf == NULL) {
188 pr_notice("%s() *buf is NULL\n", __func__);
189 return -EINVAL;
190 }
191
192 snprintf(buf_temp, sizeof(buf_temp), "Now spi log %s.\n",
193 (spi_log_status == LOG_CLOSE)?"disabled":"enabled");
194 strncat(buf, buf_temp, strlen(buf_temp));
195
196 return strlen(buf);
197}
198
199static ssize_t spi_log_store(struct device *dev, struct device_attribute *attr,
200 const char *buf, size_t count)
201{
202 if (strlen(buf) < 1) {
203 pr_notice("%s() Invalid input!\n", __func__);
204 return -EINVAL;
205 }
206
207 pr_info("[spi]%s buflen:%zu buf:%s\n", __func__, strlen(buf), buf);
208 if (!strncmp(buf, "1", 1)) {
209 pr_info("[spi]%s Now enable spi log\n", __func__);
210 spi_log_status = LOG_OPEN;
211 } else if (!strncmp(buf, "0", 1)) {
212 pr_info("[spi]%s Now disable spi log\n", __func__);
213 spi_log_status = LOG_CLOSE;
214 } else
215 pr_info("[spi]%s invalid parameter.Plz Input 1 or 0\n",
216 __func__);
217
218 return count;
219}
220
221static DEVICE_ATTR(spi_log, 0644, spi_log_show, spi_log_store);
222
223static void spi_dump_reg(struct mtk_spi *mdata)
224{
225 spi_debug("||**************%s**************||\n", __func__);
226 spi_debug("cfg0:0x%.8x\n", readl(mdata->base + SPI_CFG0_REG));
227 spi_debug("cfg1:0x%.8x\n", readl(mdata->base + SPI_CFG1_REG));
228 spi_debug("cfg2:0x%.8x\n", readl(mdata->base + SPI_CFG2_REG));
229 spi_debug("cmd :0x%.8x\n", readl(mdata->base + SPI_CMD_REG));
230 spi_debug("tx_s:0x%.8x\n", readl(mdata->base + SPI_TX_SRC_REG));
231 spi_debug("rx_d:0x%.8x\n", readl(mdata->base + SPI_RX_DST_REG));
232 spi_debug("status1:0x%.8x\n", readl(mdata->base + SPI_STATUS1_REG));
233 spi_debug("pad_sel:0x%.8x\n", readl(mdata->base + SPI_PAD_SEL_REG));
234 spi_debug("||**************%s end**************||\n", __func__);
235}
236
237static void spi_dump_config(struct spi_master *master, struct spi_message *msg)
238{
239 struct spi_device *spi = msg->spi;
240 struct mtk_chip_config *chip_config = spi->controller_data;
241 struct mtk_spi *mdata = spi_master_get_devdata(master);
242
243 spi_debug("||**************%s**************||\n", __func__);
244 spi_debug("chip_config->spi_mode:0x%.4x\n", spi->mode);
245 spi_debug("chip_config->tx_mlsb:%d.\n", chip_config->tx_mlsb);
246 spi_debug("chip_config->rx_mlsb:%d.\n", chip_config->rx_mlsb);
247 spi_debug("chip_config->cs_pol:%d.\n", chip_config->cs_pol);
248 spi_debug("chip_config->sample_sel:%d\n", chip_config->sample_sel);
249 spi_debug("chip_config->cs_setuptime=%d\n",
250 chip_config->cs_setuptime);
251 spi_debug("chip_config->cs_holdtime=%d\n",
252 chip_config->cs_holdtime);
253 spi_debug("chip_config->cs_idletime=%d\n",
254 chip_config->cs_idletime);
255 spi_debug("chip_config->deassert_mode=%d\n",
256 chip_config->deassert_mode);
257 spi_debug("chip_config->chip_select:%d,chip_config->pad_sel:%d\n",
258 spi->chip_select, mdata->pad_sel[spi->chip_select]);
259 spi_debug("||**************%s end**************||\n", __func__);
260}
261
262static void mtk_spi_reset(struct mtk_spi *mdata)
263{
264 u32 reg_val;
265
266 /* set the software reset bit in SPI_CMD_REG. */
267 reg_val = readl(mdata->base + SPI_CMD_REG);
268 reg_val |= SPI_CMD_RST;
269 writel(reg_val, mdata->base + SPI_CMD_REG);
270
271 reg_val = readl(mdata->base + SPI_CMD_REG);
272 reg_val &= ~SPI_CMD_RST;
273 writel(reg_val, mdata->base + SPI_CMD_REG);
274}
275
276static int mtk_spi_prepare_message(struct spi_master *master,
277 struct spi_message *msg)
278{
279 u16 cpha, cpol;
280 u32 reg_val;
281 struct spi_device *spi = msg->spi;
282 struct mtk_chip_config *chip_config = spi->controller_data;
283 struct mtk_spi *mdata = spi_master_get_devdata(master);
284
285 cpha = spi->mode & SPI_CPHA ? 1 : 0;
286 cpol = spi->mode & SPI_CPOL ? 1 : 0;
287
288 spi_debug("cpha:%d cpol:%d. chip_config as below\n", cpha, cpol);
289 spi_dump_config(master, msg);
290
291 reg_val = readl(mdata->base + SPI_CMD_REG);
292 if (cpha)
293 reg_val |= SPI_CMD_CPHA;
294 else
295 reg_val &= ~SPI_CMD_CPHA;
296 if (cpol)
297 reg_val |= SPI_CMD_CPOL;
298 else
299 reg_val &= ~SPI_CMD_CPOL;
300
301 /* set the mlsbx and mlsbtx */
302 if (chip_config->tx_mlsb)
303 reg_val |= SPI_CMD_TXMSBF;
304 else
305 reg_val &= ~SPI_CMD_TXMSBF;
306 if (chip_config->rx_mlsb)
307 reg_val |= SPI_CMD_RXMSBF;
308 else
309 reg_val &= ~SPI_CMD_RXMSBF;
310
311 /* set the tx/rx endian */
312#ifdef __LITTLE_ENDIAN
313 reg_val &= ~SPI_CMD_TX_ENDIAN;
314 reg_val &= ~SPI_CMD_RX_ENDIAN;
315#else
316 reg_val |= SPI_CMD_TX_ENDIAN;
317 reg_val |= SPI_CMD_RX_ENDIAN;
318#endif
319
320 if (mdata->dev_comp->enhance_timing) {
321 if (chip_config->cs_pol)
322 reg_val |= SPI_CMD_CS_POL;
323 else
324 reg_val &= ~SPI_CMD_CS_POL;
325 if (chip_config->sample_sel)
326 reg_val |= SPI_CMD_SAMPLE_SEL;
327 else
328 reg_val &= ~SPI_CMD_SAMPLE_SEL;
329 }
330
331 /* set finish and pause interrupt always enable */
332 reg_val |= SPI_CMD_FINISH_IE | SPI_CMD_PAUSE_IE;
333
334 /* disable dma mode */
335 reg_val &= ~(SPI_CMD_TX_DMA | SPI_CMD_RX_DMA);
336
337 /* disable deassert mode */
338 if (chip_config->deassert_mode == 1)
339 reg_val |= SPI_CMD_DEASSERT;
340 else
341 reg_val &= ~SPI_CMD_DEASSERT;
342
343 /* multi_cs support */
344 reg_val &= 0x1fffffff;
345 reg_val |= (chip_config->multi_cs_num << SPI_CMD_MULTI_CS_OFFSET);
346
347 writel(reg_val, mdata->base + SPI_CMD_REG);
348
349 /* pad select */
350 if (mdata->dev_comp->need_pad_sel)
351 writel(mdata->pad_sel[spi->chip_select],
352 mdata->base + SPI_PAD_SEL_REG);
353
354 return 0;
355}
356
357static void mtk_spi_set_cs(struct spi_device *spi, bool enable)
358{
359 u32 reg_val;
360 int ret;
361 struct mtk_spi *mdata = spi_master_get_devdata(spi->master);
362
363 ret = clk_prepare_enable(mdata->spi_clk);
364 if (ret < 0) {
365 pr_info("failed to enable spi_clk (%d)\n", ret);
366 return;
367 }
368 reg_val = readl(mdata->base + SPI_CMD_REG);
369 if (!enable) {
370 reg_val |= SPI_CMD_PAUSE_EN;
371 writel(reg_val, mdata->base + SPI_CMD_REG);
372 } else {
373 reg_val &= ~SPI_CMD_PAUSE_EN;
374 writel(reg_val, mdata->base + SPI_CMD_REG);
375 mdata->state = MTK_SPI_IDLE;
376 mtk_spi_reset(mdata);
377 }
378 clk_disable_unprepare(mdata->spi_clk);
379}
380
381static void mtk_spi_prepare_transfer(struct spi_master *master,
382 struct spi_transfer *xfer, struct spi_device *spi)
383{
384 u32 spi_clk_hz, div, sck_time, cs_time, reg_val;
385 struct mtk_spi *mdata = spi_master_get_devdata(master);
386 u32 cs_setuptime, cs_holdtime, cs_idletime = 0;
387 struct mtk_chip_config *chip_config = spi->controller_data;
388
389 spi_clk_hz = clk_get_rate(mdata->spi_clk);
390 if (xfer->speed_hz < spi_clk_hz / 2)
391 div = DIV_ROUND_UP(spi_clk_hz, xfer->speed_hz);
392 else
393 div = 1;
394
395 sck_time = (div + 1) / 2;
396 cs_time = sck_time * 2;
397
398 if (chip_config->cs_setuptime)
399 cs_setuptime = chip_config->cs_setuptime;
400 else
401 cs_setuptime = cs_time;
402
403 if (chip_config->cs_holdtime)
404 cs_holdtime = chip_config->cs_holdtime;
405 else
406 cs_holdtime = cs_time;
407
408 if (chip_config->cs_idletime)
409 cs_idletime = chip_config->cs_idletime;
410 else
411 cs_idletime = cs_time;
412
413 if (mdata->dev_comp->enhance_timing) {
414 reg_val = (((sck_time - 1) & 0xffff)
415 << SPI_CFG2_SCK_HIGH_OFFSET);
416 reg_val |= (((sck_time - 1) & 0xffff)
417 << SPI_CFG2_SCK_LOW_OFFSET);
418 writel(reg_val, mdata->base + SPI_CFG2_REG);
419
420 reg_val = 0;
421 reg_val |= (((cs_holdtime - 1) & 0xffff)
422 << SPI_ADJUST_CFG0_CS_HOLD_OFFSET);
423 reg_val |= (((cs_setuptime - 1) & 0xffff)
424 << SPI_ADJUST_CFG0_CS_SETUP_OFFSET);
425 writel(reg_val, mdata->base + SPI_CFG0_REG);
426 } else {
427 reg_val = (((sck_time - 1) & 0xff)
428 << SPI_CFG0_SCK_HIGH_OFFSET);
429 reg_val |= (((sck_time - 1) & 0xff) <<
430 SPI_CFG0_SCK_LOW_OFFSET);
431 reg_val |= (((cs_holdtime - 1) & 0xff) <<
432 SPI_CFG0_CS_HOLD_OFFSET);
433 reg_val |= (((cs_setuptime - 1) & 0xff) <<
434 SPI_CFG0_CS_SETUP_OFFSET);
435 writel(reg_val, mdata->base + SPI_CFG0_REG);
436 }
437
438 reg_val = readl(mdata->base + SPI_CFG1_REG);
439 reg_val &= ~SPI_CFG1_CS_IDLE_MASK;
440 reg_val |= (((cs_idletime - 1) & 0xff) << SPI_CFG1_CS_IDLE_OFFSET);
441 writel(reg_val, mdata->base + SPI_CFG1_REG);
442}
443
444static void mtk_spi_setup_packet(struct spi_master *master)
445{
446 u32 packet_size, packet_loop, reg_val;
447 struct mtk_spi *mdata = spi_master_get_devdata(master);
448
449 packet_size = min_t(u32, mdata->xfer_len, MTK_SPI_PACKET_SIZE);
450 packet_loop = mdata->xfer_len / packet_size;
451
452 reg_val = readl(mdata->base + SPI_CFG1_REG);
453 reg_val &= ~(SPI_CFG1_PACKET_LENGTH_MASK | SPI_CFG1_PACKET_LOOP_MASK);
454 reg_val |= (packet_size - 1) << SPI_CFG1_PACKET_LENGTH_OFFSET;
455 reg_val |= (packet_loop - 1) << SPI_CFG1_PACKET_LOOP_OFFSET;
456 writel(reg_val, mdata->base + SPI_CFG1_REG);
457}
458
459static void mtk_spi_enable_transfer(struct spi_master *master)
460{
461 u32 cmd;
462 struct mtk_spi *mdata = spi_master_get_devdata(master);
463
464 cmd = readl(mdata->base + SPI_CMD_REG);
465 if (mdata->state == MTK_SPI_IDLE)
466 cmd |= SPI_CMD_ACT;
467 else
468 cmd |= SPI_CMD_RESUME;
469 writel(cmd, mdata->base + SPI_CMD_REG);
470}
471
472static int mtk_spi_get_mult_delta(u32 xfer_len)
473{
474 u32 mult_delta;
475
476 if (xfer_len > MTK_SPI_PACKET_SIZE)
477 mult_delta = xfer_len % MTK_SPI_PACKET_SIZE;
478 else
479 mult_delta = 0;
480
481 return mult_delta;
482}
483
484static void mtk_spi_update_mdata_len(struct spi_master *master)
485{
486 int mult_delta;
487 struct mtk_spi *mdata = spi_master_get_devdata(master);
488
489 if (mdata->tx_sgl_len && mdata->rx_sgl_len) {
490 if (mdata->tx_sgl_len > mdata->rx_sgl_len) {
491 mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len);
492 mdata->xfer_len = mdata->rx_sgl_len - mult_delta;
493 mdata->rx_sgl_len = mult_delta;
494 mdata->tx_sgl_len -= mdata->xfer_len;
495 } else {
496 mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len);
497 mdata->xfer_len = mdata->tx_sgl_len - mult_delta;
498 mdata->tx_sgl_len = mult_delta;
499 mdata->rx_sgl_len -= mdata->xfer_len;
500 }
501 } else if (mdata->tx_sgl_len) {
502 mult_delta = mtk_spi_get_mult_delta(mdata->tx_sgl_len);
503 mdata->xfer_len = mdata->tx_sgl_len - mult_delta;
504 mdata->tx_sgl_len = mult_delta;
505 } else if (mdata->rx_sgl_len) {
506 mult_delta = mtk_spi_get_mult_delta(mdata->rx_sgl_len);
507 mdata->xfer_len = mdata->rx_sgl_len - mult_delta;
508 mdata->rx_sgl_len = mult_delta;
509 }
510}
511
512static void mtk_spi_setup_dma_addr(struct spi_master *master,
513 struct spi_transfer *xfer)
514{
515 u32 addr_ext;
516 struct mtk_spi *mdata = spi_master_get_devdata(master);
517
518 spi_debug("xfer->tx_dma:0x%llx,xfer->rx_dma:0x%llx\n",
519 (uint64_t)xfer->tx_dma, (uint64_t)xfer->rx_dma);
520 if (mdata->dev_comp->dma8g_peri_ext) {
521 if (mdata->tx_sgl) {
522 addr_ext = readl(mdata->peri_regs +
523 mdata->dram_8gb_offset);
524 addr_ext = ((addr_ext & (ADDRSHIFT_W_MASK)) |
525 (u32)(cpu_to_le64(xfer->tx_dma) / SZ_1G));
526 writel(addr_ext,
527 mdata->dram_8gb_offset + mdata->peri_regs);
528 writel((u32)(cpu_to_le64(xfer->tx_dma) % SZ_1G),
529 mdata->base + SPI_TX_SRC_REG);
530 }
531 if (mdata->rx_sgl) {
532 addr_ext = readl(mdata->peri_regs +
533 mdata->dram_8gb_offset);
534 addr_ext = ((addr_ext & (ADDRSHIFT_R_MASK)) |
535 (u32)((cpu_to_le64(xfer->rx_dma) / SZ_1G)
536 << ADDRSHIFT_R_OFFSET));
537 writel(addr_ext,
538 mdata->dram_8gb_offset + mdata->peri_regs);
539 writel((u32)(cpu_to_le64(xfer->rx_dma) % SZ_1G),
540 mdata->base + SPI_RX_DST_REG);
541 }
542 } else if (mdata->dev_comp->dma8g_spi_ext) {
543 if (mdata->tx_sgl) {
544 writel((u32)(cpu_to_le64(xfer->tx_dma) &
545 MTK_SPI_32BIS_MASK), mdata->base + SPI_TX_SRC_REG);
546#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
547 writel((u32)(cpu_to_le64(xfer->tx_dma) >>
548 MTK_SPI_32BIS_SHIFT), mdata->base + SPI_TX_SRC_REG_64);
549#endif
550 }
551 if (mdata->rx_sgl) {
552 writel((u32)(cpu_to_le64(xfer->rx_dma) &
553 MTK_SPI_32BIS_MASK), mdata->base + SPI_RX_DST_REG);
554#ifdef CONFIG_ARCH_DMA_ADDR_T_64BIT
555 writel((u32)(cpu_to_le64(xfer->rx_dma) >>
556 MTK_SPI_32BIS_SHIFT), mdata->base + SPI_RX_DST_REG_64);
557#endif
558 }
559 } else {
560 if (mdata->tx_sgl)
561 writel(xfer->tx_dma, mdata->base + SPI_TX_SRC_REG);
562 if (mdata->rx_sgl)
563 writel(xfer->rx_dma, mdata->base + SPI_RX_DST_REG);
564 }
565}
566
567static int mtk_spi_fifo_transfer(struct spi_master *master,
568 struct spi_device *spi,
569 struct spi_transfer *xfer)
570{
571 int cnt, remainder;
572 u32 reg_val;
573 struct mtk_spi *mdata = spi_master_get_devdata(master);
574
575 mdata->cur_transfer = xfer;
576 mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, xfer->len);
577 mdata->num_xfered = 0;
578 mtk_spi_prepare_transfer(master, xfer, spi);
579 mtk_spi_setup_packet(master);
580
581 cnt = xfer->len / 4;
582 if (xfer->tx_buf)
583 iowrite32_rep(mdata->base + SPI_TX_DATA_REG, xfer->tx_buf, cnt);
584
585 remainder = xfer->len % 4;
586 if (xfer->tx_buf && remainder > 0) {
587 reg_val = 0;
588 memcpy(&reg_val, xfer->tx_buf + (cnt * 4), remainder);
589 writel(reg_val, mdata->base + SPI_TX_DATA_REG);
590 }
591
592 spi_debug("spi setting Done.Dump reg before Transfer start:\n");
593 spi_dump_reg(mdata);
594
595 mtk_spi_enable_transfer(master);
596
597 return 1;
598}
599
600static int mtk_spi_dma_transfer(struct spi_master *master,
601 struct spi_device *spi,
602 struct spi_transfer *xfer)
603{
604 int cmd;
605 struct mtk_spi *mdata = spi_master_get_devdata(master);
606
607 mdata->tx_sgl = NULL;
608 mdata->rx_sgl = NULL;
609 mdata->tx_sgl_len = 0;
610 mdata->rx_sgl_len = 0;
611 mdata->cur_transfer = xfer;
612 mdata->num_xfered = 0;
613
614 mtk_spi_prepare_transfer(master, xfer, spi);
615
616 cmd = readl(mdata->base + SPI_CMD_REG);
617 if (xfer->tx_buf)
618 cmd |= SPI_CMD_TX_DMA;
619 if (xfer->rx_buf)
620 cmd |= SPI_CMD_RX_DMA;
621 writel(cmd, mdata->base + SPI_CMD_REG);
622
623 if (xfer->tx_buf)
624 mdata->tx_sgl = xfer->tx_sg.sgl;
625 if (xfer->rx_buf)
626 mdata->rx_sgl = xfer->rx_sg.sgl;
627
628 if (mdata->tx_sgl) {
629 xfer->tx_dma = sg_dma_address(mdata->tx_sgl);
630 mdata->tx_sgl_len = sg_dma_len(mdata->tx_sgl);
631 }
632 if (mdata->rx_sgl) {
633 xfer->rx_dma = sg_dma_address(mdata->rx_sgl);
634 mdata->rx_sgl_len = sg_dma_len(mdata->rx_sgl);
635 }
636
637 mtk_spi_update_mdata_len(master);
638 mtk_spi_setup_packet(master);
639 mtk_spi_setup_dma_addr(master, xfer);
640
641 spi_debug("spi setting Done.Dump reg before Transfer start:\n");
642 spi_dump_reg(mdata);
643
644 mtk_spi_enable_transfer(master);
645
646 return 1;
647}
648
649static int mtk_spi_transfer_one(struct spi_master *master,
650 struct spi_device *spi,
651 struct spi_transfer *xfer)
652{
653 spi_debug("xfer->len:%d\n", xfer->len);
654 if (master->can_dma(master, spi, xfer))
655 return mtk_spi_dma_transfer(master, spi, xfer);
656 else
657 return mtk_spi_fifo_transfer(master, spi, xfer);
658}
659
660static bool mtk_spi_can_dma(struct spi_master *master,
661 struct spi_device *spi,
662 struct spi_transfer *xfer)
663{
664 return xfer->len > MTK_SPI_MAX_FIFO_SIZE;
665}
666
667static int mtk_spi_setup(struct spi_device *spi)
668{
669 struct mtk_spi *mdata = spi_master_get_devdata(spi->master);
670
671 if (!spi->controller_data)
672 spi->controller_data = (void *)&mtk_default_chip_info;
673
674 if (mdata->dev_comp->need_pad_sel && gpio_is_valid(spi->cs_gpio))
675 gpio_direction_output(spi->cs_gpio, !(spi->mode & SPI_CS_HIGH));
676
677 return 0;
678}
679
680static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id)
681{
682 u32 cmd, reg_val, cnt, remainder, len;
683 struct spi_master *master = dev_id;
684 struct mtk_spi *mdata = spi_master_get_devdata(master);
685 struct spi_transfer *trans = mdata->cur_transfer;
686
687 reg_val = readl(mdata->base + SPI_STATUS0_REG);
688 if (reg_val & MTK_SPI_PAUSE_INT_STATUS)
689 mdata->state = MTK_SPI_PAUSED;
690 else
691 mdata->state = MTK_SPI_IDLE;
692
693 if (!master->can_dma(master, master->cur_msg->spi, trans)) {
694 if (trans->rx_buf) {
695 cnt = mdata->xfer_len / 4;
696 ioread32_rep(mdata->base + SPI_RX_DATA_REG,
697 trans->rx_buf + mdata->num_xfered, cnt);
698 remainder = mdata->xfer_len % 4;
699 if (remainder > 0) {
700 reg_val = readl(mdata->base + SPI_RX_DATA_REG);
701 memcpy(trans->rx_buf +
702 mdata->num_xfered +
703 (cnt * 4),
704 &reg_val,
705 remainder);
706 }
707 }
708
709 mdata->num_xfered += mdata->xfer_len;
710 if (mdata->num_xfered == trans->len) {
711 spi_finalize_current_transfer(master);
712 return IRQ_HANDLED;
713 }
714
715 len = trans->len - mdata->num_xfered;
716 mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, len);
717 mtk_spi_setup_packet(master);
718
719 cnt = mdata->xfer_len / 4;
720 iowrite32_rep(mdata->base + SPI_TX_DATA_REG,
721 trans->tx_buf + mdata->num_xfered, cnt);
722
723 remainder = mdata->xfer_len % 4;
724 if (remainder > 0) {
725 reg_val = 0;
726 memcpy(&reg_val,
727 trans->tx_buf + (cnt * 4) + mdata->num_xfered,
728 remainder);
729 writel(reg_val, mdata->base + SPI_TX_DATA_REG);
730 }
731
732 mtk_spi_enable_transfer(master);
733
734 return IRQ_HANDLED;
735 }
736
737 if (mdata->tx_sgl)
738 trans->tx_dma += mdata->xfer_len;
739 if (mdata->rx_sgl)
740 trans->rx_dma += mdata->xfer_len;
741
742 if (mdata->tx_sgl && (mdata->tx_sgl_len == 0)) {
743 mdata->tx_sgl = sg_next(mdata->tx_sgl);
744 if (mdata->tx_sgl) {
745 trans->tx_dma = sg_dma_address(mdata->tx_sgl);
746 mdata->tx_sgl_len = sg_dma_len(mdata->tx_sgl);
747 }
748 }
749 if (mdata->rx_sgl && (mdata->rx_sgl_len == 0)) {
750 mdata->rx_sgl = sg_next(mdata->rx_sgl);
751 if (mdata->rx_sgl) {
752 trans->rx_dma = sg_dma_address(mdata->rx_sgl);
753 mdata->rx_sgl_len = sg_dma_len(mdata->rx_sgl);
754 }
755 }
756
757 if (!mdata->tx_sgl && !mdata->rx_sgl) {
758 /* spi disable dma */
759 cmd = readl(mdata->base + SPI_CMD_REG);
760 cmd &= ~SPI_CMD_TX_DMA;
761 cmd &= ~SPI_CMD_RX_DMA;
762 writel(cmd, mdata->base + SPI_CMD_REG);
763
764 spi_finalize_current_transfer(master);
765 spi_debug("The last DMA transfer Done.\n");
766 return IRQ_HANDLED;
767 }
768
769 spi_debug("One DMA transfer Done.Start Next\n");
770
771 mtk_spi_update_mdata_len(master);
772 mtk_spi_setup_packet(master);
773 mtk_spi_setup_dma_addr(master, trans);
774 mtk_spi_enable_transfer(master);
775
776 return IRQ_HANDLED;
777}
778
779static int mtk_spi_probe(struct platform_device *pdev)
780{
781 struct spi_master *master;
782 struct mtk_spi *mdata;
783 const struct of_device_id *of_id;
784 struct resource *res;
785 int i, irq, ret, value;
786 struct device_node *node_pericfg;
787
788 master = spi_alloc_master(&pdev->dev, sizeof(*mdata));
789 if (!master) {
790 dev_err(&pdev->dev, "failed to alloc spi master\n");
791 return -ENOMEM;
792 }
793
794 master->auto_runtime_pm = true;
795 master->dev.of_node = pdev->dev.of_node;
796 master->mode_bits = SPI_CPOL | SPI_CPHA;
797
798 master->set_cs = mtk_spi_set_cs;
799 master->prepare_message = mtk_spi_prepare_message;
800 master->transfer_one = mtk_spi_transfer_one;
801 master->can_dma = mtk_spi_can_dma;
802 master->setup = mtk_spi_setup;
803
804 of_id = of_match_node(mtk_spi_of_match, pdev->dev.of_node);
805 if (!of_id) {
806 dev_err(&pdev->dev, "failed to probe of_node\n");
807 ret = -EINVAL;
808 goto err_put_master;
809 }
810
811 mdata = spi_master_get_devdata(master);
812 mdata->dev_comp = of_id->data;
813 if (mdata->dev_comp->must_tx)
814 master->flags = SPI_MASTER_MUST_TX;
815
816 ret = of_property_read_u32(pdev->dev.of_node,
817 "mediatek,kthread-rt", &value);
818 if (ret < 0)
819 dev_notice(&pdev->dev,
820 "No 'mediatek,kthread-rt' property\n");
821 else {
822 if (value == 1)
823 master->rt = true;
824 else
825 master->rt = false;
826 }
827
828 if (mdata->dev_comp->need_pad_sel) {
829 mdata->pad_num = of_property_count_u32_elems(
830 pdev->dev.of_node,
831 "mediatek,pad-select");
832 if (mdata->pad_num < 0) {
833 dev_err(&pdev->dev,
834 "No 'mediatek,pad-select' property\n");
835 ret = -EINVAL;
836 goto err_put_master;
837 }
838
839 mdata->pad_sel = devm_kmalloc_array(&pdev->dev, mdata->pad_num,
840 sizeof(u32), GFP_KERNEL);
841 if (!mdata->pad_sel) {
842 ret = -ENOMEM;
843 goto err_put_master;
844 }
845
846 for (i = 0; i < mdata->pad_num; i++) {
847 of_property_read_u32_index(pdev->dev.of_node,
848 "mediatek,pad-select",
849 i, &mdata->pad_sel[i]);
850 if (mdata->pad_sel[i] > MT8173_SPI_MAX_PAD_SEL) {
851 dev_err(&pdev->dev, "wrong pad-sel[%d]: %u\n",
852 i, mdata->pad_sel[i]);
853 ret = -EINVAL;
854 goto err_put_master;
855 }
856 }
857 }
858
859 platform_set_drvdata(pdev, master);
860
861 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
862 if (!res) {
863 ret = -ENODEV;
864 dev_err(&pdev->dev, "failed to determine base address\n");
865 goto err_put_master;
866 }
867
868 mdata->base = devm_ioremap_resource(&pdev->dev, res);
869 if (IS_ERR(mdata->base)) {
870 ret = PTR_ERR(mdata->base);
871 goto err_put_master;
872 }
873
874 irq = platform_get_irq(pdev, 0);
875 if (irq < 0) {
876 dev_err(&pdev->dev, "failed to get irq (%d)\n", irq);
877 ret = irq;
878 goto err_put_master;
879 }
880
881 if (!pdev->dev.dma_mask)
882 pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
883
884 ret = devm_request_irq(&pdev->dev, irq, mtk_spi_interrupt,
885 IRQF_TRIGGER_NONE, dev_name(&pdev->dev), master);
886 if (ret) {
887 dev_err(&pdev->dev, "failed to register irq (%d)\n", ret);
888 goto err_put_master;
889 }
890
891 mdata->parent_clk = devm_clk_get(&pdev->dev, "parent-clk");
892 if (IS_ERR(mdata->parent_clk)) {
893 ret = PTR_ERR(mdata->parent_clk);
894 dev_err(&pdev->dev, "failed to get parent-clk: %d\n", ret);
895 goto err_put_master;
896 }
897
898 mdata->sel_clk = devm_clk_get(&pdev->dev, "sel-clk");
899 if (IS_ERR(mdata->sel_clk)) {
900 ret = PTR_ERR(mdata->sel_clk);
901 dev_err(&pdev->dev, "failed to get sel-clk: %d\n", ret);
902 goto err_put_master;
903 }
904
905 mdata->spi_clk = devm_clk_get(&pdev->dev, "spi-clk");
906 if (IS_ERR(mdata->spi_clk)) {
907 ret = PTR_ERR(mdata->spi_clk);
908 dev_err(&pdev->dev, "failed to get spi-clk: %d\n", ret);
909 goto err_put_master;
910 }
911
912 ret = clk_prepare_enable(mdata->spi_clk);
913 if (ret < 0) {
914 dev_err(&pdev->dev, "failed to enable spi_clk (%d)\n", ret);
915 goto err_put_master;
916 }
917
918 ret = clk_set_parent(mdata->sel_clk, mdata->parent_clk);
919 if (ret < 0) {
920 dev_err(&pdev->dev, "failed to clk_set_parent (%d)\n", ret);
921 clk_disable_unprepare(mdata->spi_clk);
922 goto err_put_master;
923 }
924
925 pm_runtime_enable(&pdev->dev);
926
927 ret = devm_spi_register_master(&pdev->dev, master);
928 if (ret) {
929 dev_err(&pdev->dev, "failed to register master (%d)\n", ret);
930 clk_disable_unprepare(mdata->spi_clk);
931 goto err_disable_runtime_pm;
932 }
933
934 clk_disable_unprepare(mdata->spi_clk);
935
936 if (mdata->dev_comp->need_pad_sel) {
937 if (mdata->pad_num != master->num_chipselect) {
938 dev_err(&pdev->dev,
939 "pad_num does not match num_chipselect(%d != %d)\n",
940 mdata->pad_num, master->num_chipselect);
941 ret = -EINVAL;
942 goto err_disable_runtime_pm;
943 }
944
945 if (!master->cs_gpios && master->num_chipselect > 1) {
946 dev_err(&pdev->dev,
947 "cs_gpios not specified and num_chipselect > 1\n");
948 ret = -EINVAL;
949 goto err_disable_runtime_pm;
950 }
951
952 if (master->cs_gpios) {
953 for (i = 0; i < master->num_chipselect; i++) {
954 ret = devm_gpio_request(&pdev->dev,
955 master->cs_gpios[i],
956 dev_name(&pdev->dev));
957 if (ret) {
958 dev_err(&pdev->dev,
959 "can't get CS GPIO %i\n", i);
960 goto err_disable_runtime_pm;
961 }
962 }
963 }
964 }
965
966 if (mdata->dev_comp->dma8g_peri_ext) {
967 node_pericfg = of_find_compatible_node(NULL, NULL,
968 "mediatek,pericfg");
969 if (!node_pericfg) {
970 dev_notice(&pdev->dev, "error: node_pericfg init fail\n");
971 goto err_disable_runtime_pm;
972 }
973 mdata->peri_regs = of_iomap(node_pericfg, 0);
974 if (IS_ERR(*(void **)&(mdata->peri_regs))) {
975 ret = PTR_ERR(*(void **)&mdata->peri_regs);
976 dev_notice(&pdev->dev, "error: ms->peri_regs init fail\n");
977 mdata->peri_regs = NULL;
978 goto err_disable_runtime_pm;
979 }
980 if (of_property_read_u32(pdev->dev.of_node,
981 "mediatek,dram-8gb-offset", &mdata->dram_8gb_offset)) {
982 dev_notice(&pdev->dev, "SPI get dram-8gb-offset failed\n");
983 goto err_disable_runtime_pm;
984 }
985 }
986
987 ret = device_create_file(&pdev->dev, &dev_attr_spi_log);
988 if (ret)
989 dev_notice(&pdev->dev, "SPI sysfs_create_file fail, ret:%d\n",
990 ret);
991
992 ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(DMA_ADDR_BITS));
993 if (ret)
994 dev_notice(&pdev->dev, "SPI dma_set_mask(%d) failed, ret:%d\n",
995 DMA_ADDR_BITS, ret);
996
997 return 0;
998
999err_disable_runtime_pm:
1000 pm_runtime_disable(&pdev->dev);
1001err_put_master:
1002 spi_master_put(master);
1003
1004 return ret;
1005}
1006
1007static int mtk_spi_remove(struct platform_device *pdev)
1008{
1009 struct spi_master *master = platform_get_drvdata(pdev);
1010 struct mtk_spi *mdata = spi_master_get_devdata(master);
1011
1012 pm_runtime_disable(&pdev->dev);
1013
1014 mtk_spi_reset(mdata);
1015
1016 return 0;
1017}
1018
1019#ifdef CONFIG_PM_SLEEP
1020static int mtk_spi_suspend(struct device *dev)
1021{
1022 int ret;
1023 struct spi_master *master = dev_get_drvdata(dev);
1024 struct mtk_spi *mdata = spi_master_get_devdata(master);
1025
1026 ret = spi_master_suspend(master);
1027 if (ret)
1028 return ret;
1029
1030 if (!pm_runtime_suspended(dev))
1031 clk_disable_unprepare(mdata->spi_clk);
1032
1033 ret = pinctrl_pm_select_sleep_state(dev);
1034 if (ret < 0)
1035 dev_notice(dev, "failed to set pin sleep_state (%d)\n", ret);
1036
1037 return ret;
1038}
1039
1040static int mtk_spi_resume(struct device *dev)
1041{
1042 int ret;
1043 struct spi_master *master = dev_get_drvdata(dev);
1044 struct mtk_spi *mdata = spi_master_get_devdata(master);
1045
1046 ret = pinctrl_pm_select_default_state(dev);
1047 if (ret < 0)
1048 dev_notice(dev, "failed to set pin default_state (%d)\n", ret);
1049
1050 if (!pm_runtime_suspended(dev)) {
1051 ret = clk_prepare_enable(mdata->spi_clk);
1052 if (ret < 0) {
1053 dev_err(dev, "failed to enable spi_clk (%d)\n", ret);
1054 return ret;
1055 }
1056 }
1057
1058 ret = spi_master_resume(master);
1059 if (ret < 0)
1060 clk_disable_unprepare(mdata->spi_clk);
1061
1062 return ret;
1063}
1064#endif /* CONFIG_PM_SLEEP */
1065
1066#ifdef CONFIG_PM
1067static int mtk_spi_runtime_suspend(struct device *dev)
1068{
1069 struct spi_master *master = dev_get_drvdata(dev);
1070 struct mtk_spi *mdata = spi_master_get_devdata(master);
1071
1072 clk_disable_unprepare(mdata->spi_clk);
1073
1074 return 0;
1075}
1076
1077static int mtk_spi_runtime_resume(struct device *dev)
1078{
1079 struct spi_master *master = dev_get_drvdata(dev);
1080 struct mtk_spi *mdata = spi_master_get_devdata(master);
1081 int ret;
1082
1083 ret = clk_prepare_enable(mdata->spi_clk);
1084 if (ret < 0) {
1085 dev_err(dev, "failed to enable spi_clk (%d)\n", ret);
1086 return ret;
1087 }
1088
1089 return 0;
1090}
1091#endif /* CONFIG_PM */
1092
1093static const struct dev_pm_ops mtk_spi_pm = {
1094 SET_SYSTEM_SLEEP_PM_OPS(mtk_spi_suspend, mtk_spi_resume)
1095 SET_RUNTIME_PM_OPS(mtk_spi_runtime_suspend,
1096 mtk_spi_runtime_resume, NULL)
1097};
1098
1099static struct platform_driver mtk_spi_driver = {
1100 .driver = {
1101 .name = "mtk-spi",
1102 .pm = &mtk_spi_pm,
1103 .of_match_table = mtk_spi_of_match,
1104 },
1105 .probe = mtk_spi_probe,
1106 .remove = mtk_spi_remove,
1107};
1108
1109module_platform_driver(mtk_spi_driver);
1110
1111MODULE_DESCRIPTION("MTK SPI Controller driver");
1112MODULE_AUTHOR("Leilk Liu <leilk.liu@mediatek.com>");
1113MODULE_LICENSE("GPL v2");
1114MODULE_ALIAS("platform:mtk-spi");