0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023 #include <linux/bitops.h>
0024 #include <linux/clk.h>
0025 #include <linux/completion.h>
0026 #include <linux/delay.h>
0027 #include <linux/err.h>
0028 #include <linux/errno.h>
0029 #include <linux/interrupt.h>
0030 #include <linux/io.h>
0031 #include <linux/iopoll.h>
0032 #include <linux/jiffies.h>
0033 #include <linux/kernel.h>
0034 #include <linux/module.h>
0035 #include <linux/mutex.h>
0036 #include <linux/of.h>
0037 #include <linux/of_device.h>
0038 #include <linux/platform_device.h>
0039 #include <linux/pm_qos.h>
0040 #include <linux/sizes.h>
0041
0042 #include <linux/spi/spi.h>
0043 #include <linux/spi/spi-mem.h>
0044
0045
0046
0047
0048
0049
0050 #define SEQID_LUT 15
0051
0052
0053 #define QUADSPI_MCR 0x00
0054 #define QUADSPI_MCR_RESERVED_MASK GENMASK(19, 16)
0055 #define QUADSPI_MCR_MDIS_MASK BIT(14)
0056 #define QUADSPI_MCR_CLR_TXF_MASK BIT(11)
0057 #define QUADSPI_MCR_CLR_RXF_MASK BIT(10)
0058 #define QUADSPI_MCR_DDR_EN_MASK BIT(7)
0059 #define QUADSPI_MCR_END_CFG_MASK GENMASK(3, 2)
0060 #define QUADSPI_MCR_SWRSTHD_MASK BIT(1)
0061 #define QUADSPI_MCR_SWRSTSD_MASK BIT(0)
0062
0063 #define QUADSPI_IPCR 0x08
0064 #define QUADSPI_IPCR_SEQID(x) ((x) << 24)
0065
0066 #define QUADSPI_FLSHCR 0x0c
0067 #define QUADSPI_FLSHCR_TCSS_MASK GENMASK(3, 0)
0068 #define QUADSPI_FLSHCR_TCSH_MASK GENMASK(11, 8)
0069 #define QUADSPI_FLSHCR_TDH_MASK GENMASK(17, 16)
0070
0071 #define QUADSPI_BUF0CR 0x10
0072 #define QUADSPI_BUF1CR 0x14
0073 #define QUADSPI_BUF2CR 0x18
0074 #define QUADSPI_BUFXCR_INVALID_MSTRID 0xe
0075
0076 #define QUADSPI_BUF3CR 0x1c
0077 #define QUADSPI_BUF3CR_ALLMST_MASK BIT(31)
0078 #define QUADSPI_BUF3CR_ADATSZ(x) ((x) << 8)
0079 #define QUADSPI_BUF3CR_ADATSZ_MASK GENMASK(15, 8)
0080
0081 #define QUADSPI_BFGENCR 0x20
0082 #define QUADSPI_BFGENCR_SEQID(x) ((x) << 12)
0083
0084 #define QUADSPI_BUF0IND 0x30
0085 #define QUADSPI_BUF1IND 0x34
0086 #define QUADSPI_BUF2IND 0x38
0087 #define QUADSPI_SFAR 0x100
0088
0089 #define QUADSPI_SMPR 0x108
0090 #define QUADSPI_SMPR_DDRSMP_MASK GENMASK(18, 16)
0091 #define QUADSPI_SMPR_FSDLY_MASK BIT(6)
0092 #define QUADSPI_SMPR_FSPHS_MASK BIT(5)
0093 #define QUADSPI_SMPR_HSENA_MASK BIT(0)
0094
0095 #define QUADSPI_RBCT 0x110
0096 #define QUADSPI_RBCT_WMRK_MASK GENMASK(4, 0)
0097 #define QUADSPI_RBCT_RXBRD_USEIPS BIT(8)
0098
0099 #define QUADSPI_TBDR 0x154
0100
0101 #define QUADSPI_SR 0x15c
0102 #define QUADSPI_SR_IP_ACC_MASK BIT(1)
0103 #define QUADSPI_SR_AHB_ACC_MASK BIT(2)
0104
0105 #define QUADSPI_FR 0x160
0106 #define QUADSPI_FR_TFF_MASK BIT(0)
0107
0108 #define QUADSPI_RSER 0x164
0109 #define QUADSPI_RSER_TFIE BIT(0)
0110
0111 #define QUADSPI_SPTRCLR 0x16c
0112 #define QUADSPI_SPTRCLR_IPPTRC BIT(8)
0113 #define QUADSPI_SPTRCLR_BFPTRC BIT(0)
0114
0115 #define QUADSPI_SFA1AD 0x180
0116 #define QUADSPI_SFA2AD 0x184
0117 #define QUADSPI_SFB1AD 0x188
0118 #define QUADSPI_SFB2AD 0x18c
0119 #define QUADSPI_RBDR(x) (0x200 + ((x) * 4))
0120
0121 #define QUADSPI_LUTKEY 0x300
0122 #define QUADSPI_LUTKEY_VALUE 0x5AF05AF0
0123
0124 #define QUADSPI_LCKCR 0x304
0125 #define QUADSPI_LCKER_LOCK BIT(0)
0126 #define QUADSPI_LCKER_UNLOCK BIT(1)
0127
0128 #define QUADSPI_LUT_BASE 0x310
0129 #define QUADSPI_LUT_OFFSET (SEQID_LUT * 4 * 4)
0130 #define QUADSPI_LUT_REG(idx) \
0131 (QUADSPI_LUT_BASE + QUADSPI_LUT_OFFSET + (idx) * 4)
0132
0133
0134 #define LUT_STOP 0
0135 #define LUT_CMD 1
0136 #define LUT_ADDR 2
0137 #define LUT_DUMMY 3
0138 #define LUT_MODE 4
0139 #define LUT_MODE2 5
0140 #define LUT_MODE4 6
0141 #define LUT_FSL_READ 7
0142 #define LUT_FSL_WRITE 8
0143 #define LUT_JMP_ON_CS 9
0144 #define LUT_ADDR_DDR 10
0145 #define LUT_MODE_DDR 11
0146 #define LUT_MODE2_DDR 12
0147 #define LUT_MODE4_DDR 13
0148 #define LUT_FSL_READ_DDR 14
0149 #define LUT_FSL_WRITE_DDR 15
0150 #define LUT_DATA_LEARN 16
0151
0152
0153
0154
0155
0156
0157
0158
0159 #define LUT_PAD(x) (fls(x) - 1)
0160
0161
0162
0163
0164
0165
0166
0167
0168
0169 #define LUT_DEF(idx, ins, pad, opr) \
0170 ((((ins) << 10) | ((pad) << 8) | (opr)) << (((idx) % 2) * 16))
0171
0172
0173 #define QUADSPI_QUIRK_SWAP_ENDIAN BIT(0)
0174
0175
0176 #define QUADSPI_QUIRK_4X_INT_CLK BIT(1)
0177
0178
0179
0180
0181
0182
0183 #define QUADSPI_QUIRK_TKT253890 BIT(2)
0184
0185
0186 #define QUADSPI_QUIRK_TKT245618 BIT(3)
0187
0188
0189
0190
0191
0192 #define QUADSPI_QUIRK_BASE_INTERNAL BIT(4)
0193
0194
0195
0196
0197
0198 #define QUADSPI_QUIRK_USE_TDH_SETTING BIT(5)
0199
0200 struct fsl_qspi_devtype_data {
0201 unsigned int rxfifo;
0202 unsigned int txfifo;
0203 int invalid_mstrid;
0204 unsigned int ahb_buf_size;
0205 unsigned int quirks;
0206 bool little_endian;
0207 };
0208
0209 static const struct fsl_qspi_devtype_data vybrid_data = {
0210 .rxfifo = SZ_128,
0211 .txfifo = SZ_64,
0212 .invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID,
0213 .ahb_buf_size = SZ_1K,
0214 .quirks = QUADSPI_QUIRK_SWAP_ENDIAN,
0215 .little_endian = true,
0216 };
0217
0218 static const struct fsl_qspi_devtype_data imx6sx_data = {
0219 .rxfifo = SZ_128,
0220 .txfifo = SZ_512,
0221 .invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID,
0222 .ahb_buf_size = SZ_1K,
0223 .quirks = QUADSPI_QUIRK_4X_INT_CLK | QUADSPI_QUIRK_TKT245618,
0224 .little_endian = true,
0225 };
0226
0227 static const struct fsl_qspi_devtype_data imx7d_data = {
0228 .rxfifo = SZ_128,
0229 .txfifo = SZ_512,
0230 .invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID,
0231 .ahb_buf_size = SZ_1K,
0232 .quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK |
0233 QUADSPI_QUIRK_USE_TDH_SETTING,
0234 .little_endian = true,
0235 };
0236
0237 static const struct fsl_qspi_devtype_data imx6ul_data = {
0238 .rxfifo = SZ_128,
0239 .txfifo = SZ_512,
0240 .invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID,
0241 .ahb_buf_size = SZ_1K,
0242 .quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_4X_INT_CLK |
0243 QUADSPI_QUIRK_USE_TDH_SETTING,
0244 .little_endian = true,
0245 };
0246
0247 static const struct fsl_qspi_devtype_data ls1021a_data = {
0248 .rxfifo = SZ_128,
0249 .txfifo = SZ_64,
0250 .invalid_mstrid = QUADSPI_BUFXCR_INVALID_MSTRID,
0251 .ahb_buf_size = SZ_1K,
0252 .quirks = 0,
0253 .little_endian = false,
0254 };
0255
0256 static const struct fsl_qspi_devtype_data ls2080a_data = {
0257 .rxfifo = SZ_128,
0258 .txfifo = SZ_64,
0259 .ahb_buf_size = SZ_1K,
0260 .invalid_mstrid = 0x0,
0261 .quirks = QUADSPI_QUIRK_TKT253890 | QUADSPI_QUIRK_BASE_INTERNAL,
0262 .little_endian = true,
0263 };
0264
0265 struct fsl_qspi {
0266 void __iomem *iobase;
0267 void __iomem *ahb_addr;
0268 u32 memmap_phy;
0269 struct clk *clk, *clk_en;
0270 struct device *dev;
0271 struct completion c;
0272 const struct fsl_qspi_devtype_data *devtype_data;
0273 struct mutex lock;
0274 struct pm_qos_request pm_qos_req;
0275 int selected;
0276 };
0277
0278 static inline int needs_swap_endian(struct fsl_qspi *q)
0279 {
0280 return q->devtype_data->quirks & QUADSPI_QUIRK_SWAP_ENDIAN;
0281 }
0282
0283 static inline int needs_4x_clock(struct fsl_qspi *q)
0284 {
0285 return q->devtype_data->quirks & QUADSPI_QUIRK_4X_INT_CLK;
0286 }
0287
0288 static inline int needs_fill_txfifo(struct fsl_qspi *q)
0289 {
0290 return q->devtype_data->quirks & QUADSPI_QUIRK_TKT253890;
0291 }
0292
0293 static inline int needs_wakeup_wait_mode(struct fsl_qspi *q)
0294 {
0295 return q->devtype_data->quirks & QUADSPI_QUIRK_TKT245618;
0296 }
0297
0298 static inline int needs_amba_base_offset(struct fsl_qspi *q)
0299 {
0300 return !(q->devtype_data->quirks & QUADSPI_QUIRK_BASE_INTERNAL);
0301 }
0302
0303 static inline int needs_tdh_setting(struct fsl_qspi *q)
0304 {
0305 return q->devtype_data->quirks & QUADSPI_QUIRK_USE_TDH_SETTING;
0306 }
0307
0308
0309
0310
0311
0312 static inline u32 fsl_qspi_endian_xchg(struct fsl_qspi *q, u32 a)
0313 {
0314 return needs_swap_endian(q) ? __swab32(a) : a;
0315 }
0316
0317
0318
0319
0320
0321
0322
0323
0324 static void qspi_writel(struct fsl_qspi *q, u32 val, void __iomem *addr)
0325 {
0326 if (q->devtype_data->little_endian)
0327 iowrite32(val, addr);
0328 else
0329 iowrite32be(val, addr);
0330 }
0331
0332 static u32 qspi_readl(struct fsl_qspi *q, void __iomem *addr)
0333 {
0334 if (q->devtype_data->little_endian)
0335 return ioread32(addr);
0336
0337 return ioread32be(addr);
0338 }
0339
0340 static irqreturn_t fsl_qspi_irq_handler(int irq, void *dev_id)
0341 {
0342 struct fsl_qspi *q = dev_id;
0343 u32 reg;
0344
0345
0346 reg = qspi_readl(q, q->iobase + QUADSPI_FR);
0347 qspi_writel(q, reg, q->iobase + QUADSPI_FR);
0348
0349 if (reg & QUADSPI_FR_TFF_MASK)
0350 complete(&q->c);
0351
0352 dev_dbg(q->dev, "QUADSPI_FR : 0x%.8x:0x%.8x\n", 0, reg);
0353 return IRQ_HANDLED;
0354 }
0355
0356 static int fsl_qspi_check_buswidth(struct fsl_qspi *q, u8 width)
0357 {
0358 switch (width) {
0359 case 1:
0360 case 2:
0361 case 4:
0362 return 0;
0363 }
0364
0365 return -ENOTSUPP;
0366 }
0367
0368 static bool fsl_qspi_supports_op(struct spi_mem *mem,
0369 const struct spi_mem_op *op)
0370 {
0371 struct fsl_qspi *q = spi_controller_get_devdata(mem->spi->master);
0372 int ret;
0373
0374 ret = fsl_qspi_check_buswidth(q, op->cmd.buswidth);
0375
0376 if (op->addr.nbytes)
0377 ret |= fsl_qspi_check_buswidth(q, op->addr.buswidth);
0378
0379 if (op->dummy.nbytes)
0380 ret |= fsl_qspi_check_buswidth(q, op->dummy.buswidth);
0381
0382 if (op->data.nbytes)
0383 ret |= fsl_qspi_check_buswidth(q, op->data.buswidth);
0384
0385 if (ret)
0386 return false;
0387
0388
0389
0390
0391
0392 if (op->addr.nbytes +
0393 (op->dummy.nbytes ? 1:0) +
0394 (op->data.nbytes ? 1:0) > 6)
0395 return false;
0396
0397
0398 if (op->dummy.nbytes &&
0399 (op->dummy.nbytes * 8 / op->dummy.buswidth > 64))
0400 return false;
0401
0402
0403 if (op->data.dir == SPI_MEM_DATA_IN &&
0404 (op->data.nbytes > q->devtype_data->ahb_buf_size ||
0405 (op->data.nbytes > q->devtype_data->rxfifo - 4 &&
0406 !IS_ALIGNED(op->data.nbytes, 8))))
0407 return false;
0408
0409 if (op->data.dir == SPI_MEM_DATA_OUT &&
0410 op->data.nbytes > q->devtype_data->txfifo)
0411 return false;
0412
0413 return spi_mem_default_supports_op(mem, op);
0414 }
0415
0416 static void fsl_qspi_prepare_lut(struct fsl_qspi *q,
0417 const struct spi_mem_op *op)
0418 {
0419 void __iomem *base = q->iobase;
0420 u32 lutval[4] = {};
0421 int lutidx = 1, i;
0422
0423 lutval[0] |= LUT_DEF(0, LUT_CMD, LUT_PAD(op->cmd.buswidth),
0424 op->cmd.opcode);
0425
0426
0427
0428
0429
0430
0431 for (i = 0; i < op->addr.nbytes; i++) {
0432 u8 addrbyte = op->addr.val >> (8 * (op->addr.nbytes - i - 1));
0433
0434 lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_MODE,
0435 LUT_PAD(op->addr.buswidth),
0436 addrbyte);
0437 lutidx++;
0438 }
0439
0440 if (op->dummy.nbytes) {
0441 lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_DUMMY,
0442 LUT_PAD(op->dummy.buswidth),
0443 op->dummy.nbytes * 8 /
0444 op->dummy.buswidth);
0445 lutidx++;
0446 }
0447
0448 if (op->data.nbytes) {
0449 lutval[lutidx / 2] |= LUT_DEF(lutidx,
0450 op->data.dir == SPI_MEM_DATA_IN ?
0451 LUT_FSL_READ : LUT_FSL_WRITE,
0452 LUT_PAD(op->data.buswidth),
0453 0);
0454 lutidx++;
0455 }
0456
0457 lutval[lutidx / 2] |= LUT_DEF(lutidx, LUT_STOP, 0, 0);
0458
0459
0460 qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY);
0461 qspi_writel(q, QUADSPI_LCKER_UNLOCK, q->iobase + QUADSPI_LCKCR);
0462
0463
0464 for (i = 0; i < ARRAY_SIZE(lutval); i++)
0465 qspi_writel(q, lutval[i], base + QUADSPI_LUT_REG(i));
0466
0467
0468 qspi_writel(q, QUADSPI_LUTKEY_VALUE, q->iobase + QUADSPI_LUTKEY);
0469 qspi_writel(q, QUADSPI_LCKER_LOCK, q->iobase + QUADSPI_LCKCR);
0470 }
0471
0472 static int fsl_qspi_clk_prep_enable(struct fsl_qspi *q)
0473 {
0474 int ret;
0475
0476 ret = clk_prepare_enable(q->clk_en);
0477 if (ret)
0478 return ret;
0479
0480 ret = clk_prepare_enable(q->clk);
0481 if (ret) {
0482 clk_disable_unprepare(q->clk_en);
0483 return ret;
0484 }
0485
0486 if (needs_wakeup_wait_mode(q))
0487 cpu_latency_qos_add_request(&q->pm_qos_req, 0);
0488
0489 return 0;
0490 }
0491
0492 static void fsl_qspi_clk_disable_unprep(struct fsl_qspi *q)
0493 {
0494 if (needs_wakeup_wait_mode(q))
0495 cpu_latency_qos_remove_request(&q->pm_qos_req);
0496
0497 clk_disable_unprepare(q->clk);
0498 clk_disable_unprepare(q->clk_en);
0499 }
0500
0501
0502
0503
0504
0505
0506
0507
0508 static void fsl_qspi_invalidate(struct fsl_qspi *q)
0509 {
0510 u32 reg;
0511
0512 reg = qspi_readl(q, q->iobase + QUADSPI_MCR);
0513 reg |= QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK;
0514 qspi_writel(q, reg, q->iobase + QUADSPI_MCR);
0515
0516
0517
0518
0519
0520 udelay(1);
0521
0522 reg &= ~(QUADSPI_MCR_SWRSTHD_MASK | QUADSPI_MCR_SWRSTSD_MASK);
0523 qspi_writel(q, reg, q->iobase + QUADSPI_MCR);
0524 }
0525
0526 static void fsl_qspi_select_mem(struct fsl_qspi *q, struct spi_device *spi)
0527 {
0528 unsigned long rate = spi->max_speed_hz;
0529 int ret;
0530
0531 if (q->selected == spi->chip_select)
0532 return;
0533
0534 if (needs_4x_clock(q))
0535 rate *= 4;
0536
0537 fsl_qspi_clk_disable_unprep(q);
0538
0539 ret = clk_set_rate(q->clk, rate);
0540 if (ret)
0541 return;
0542
0543 ret = fsl_qspi_clk_prep_enable(q);
0544 if (ret)
0545 return;
0546
0547 q->selected = spi->chip_select;
0548
0549 fsl_qspi_invalidate(q);
0550 }
0551
0552 static void fsl_qspi_read_ahb(struct fsl_qspi *q, const struct spi_mem_op *op)
0553 {
0554 memcpy_fromio(op->data.buf.in,
0555 q->ahb_addr + q->selected * q->devtype_data->ahb_buf_size,
0556 op->data.nbytes);
0557 }
0558
0559 static void fsl_qspi_fill_txfifo(struct fsl_qspi *q,
0560 const struct spi_mem_op *op)
0561 {
0562 void __iomem *base = q->iobase;
0563 int i;
0564 u32 val;
0565
0566 for (i = 0; i < ALIGN_DOWN(op->data.nbytes, 4); i += 4) {
0567 memcpy(&val, op->data.buf.out + i, 4);
0568 val = fsl_qspi_endian_xchg(q, val);
0569 qspi_writel(q, val, base + QUADSPI_TBDR);
0570 }
0571
0572 if (i < op->data.nbytes) {
0573 memcpy(&val, op->data.buf.out + i, op->data.nbytes - i);
0574 val = fsl_qspi_endian_xchg(q, val);
0575 qspi_writel(q, val, base + QUADSPI_TBDR);
0576 }
0577
0578 if (needs_fill_txfifo(q)) {
0579 for (i = op->data.nbytes; i < 16; i += 4)
0580 qspi_writel(q, 0, base + QUADSPI_TBDR);
0581 }
0582 }
0583
0584 static void fsl_qspi_read_rxfifo(struct fsl_qspi *q,
0585 const struct spi_mem_op *op)
0586 {
0587 void __iomem *base = q->iobase;
0588 int i;
0589 u8 *buf = op->data.buf.in;
0590 u32 val;
0591
0592 for (i = 0; i < ALIGN_DOWN(op->data.nbytes, 4); i += 4) {
0593 val = qspi_readl(q, base + QUADSPI_RBDR(i / 4));
0594 val = fsl_qspi_endian_xchg(q, val);
0595 memcpy(buf + i, &val, 4);
0596 }
0597
0598 if (i < op->data.nbytes) {
0599 val = qspi_readl(q, base + QUADSPI_RBDR(i / 4));
0600 val = fsl_qspi_endian_xchg(q, val);
0601 memcpy(buf + i, &val, op->data.nbytes - i);
0602 }
0603 }
0604
0605 static int fsl_qspi_do_op(struct fsl_qspi *q, const struct spi_mem_op *op)
0606 {
0607 void __iomem *base = q->iobase;
0608 int err = 0;
0609
0610 init_completion(&q->c);
0611
0612
0613
0614
0615
0616
0617 qspi_writel(q, op->data.nbytes | QUADSPI_IPCR_SEQID(SEQID_LUT),
0618 base + QUADSPI_IPCR);
0619
0620
0621 if (!wait_for_completion_timeout(&q->c, msecs_to_jiffies(1000)))
0622 err = -ETIMEDOUT;
0623
0624 if (!err && op->data.nbytes && op->data.dir == SPI_MEM_DATA_IN)
0625 fsl_qspi_read_rxfifo(q, op);
0626
0627 return err;
0628 }
0629
0630 static int fsl_qspi_readl_poll_tout(struct fsl_qspi *q, void __iomem *base,
0631 u32 mask, u32 delay_us, u32 timeout_us)
0632 {
0633 u32 reg;
0634
0635 if (!q->devtype_data->little_endian)
0636 mask = (u32)cpu_to_be32(mask);
0637
0638 return readl_poll_timeout(base, reg, !(reg & mask), delay_us,
0639 timeout_us);
0640 }
0641
0642 static int fsl_qspi_exec_op(struct spi_mem *mem, const struct spi_mem_op *op)
0643 {
0644 struct fsl_qspi *q = spi_controller_get_devdata(mem->spi->master);
0645 void __iomem *base = q->iobase;
0646 u32 addr_offset = 0;
0647 int err = 0;
0648 int invalid_mstrid = q->devtype_data->invalid_mstrid;
0649
0650 mutex_lock(&q->lock);
0651
0652
0653 fsl_qspi_readl_poll_tout(q, base + QUADSPI_SR, (QUADSPI_SR_IP_ACC_MASK |
0654 QUADSPI_SR_AHB_ACC_MASK), 10, 1000);
0655
0656 fsl_qspi_select_mem(q, mem->spi);
0657
0658 if (needs_amba_base_offset(q))
0659 addr_offset = q->memmap_phy;
0660
0661 qspi_writel(q,
0662 q->selected * q->devtype_data->ahb_buf_size + addr_offset,
0663 base + QUADSPI_SFAR);
0664
0665 qspi_writel(q, qspi_readl(q, base + QUADSPI_MCR) |
0666 QUADSPI_MCR_CLR_RXF_MASK | QUADSPI_MCR_CLR_TXF_MASK,
0667 base + QUADSPI_MCR);
0668
0669 qspi_writel(q, QUADSPI_SPTRCLR_BFPTRC | QUADSPI_SPTRCLR_IPPTRC,
0670 base + QUADSPI_SPTRCLR);
0671
0672 qspi_writel(q, invalid_mstrid, base + QUADSPI_BUF0CR);
0673 qspi_writel(q, invalid_mstrid, base + QUADSPI_BUF1CR);
0674 qspi_writel(q, invalid_mstrid, base + QUADSPI_BUF2CR);
0675
0676 fsl_qspi_prepare_lut(q, op);
0677
0678
0679
0680
0681
0682
0683 if (op->data.nbytes > (q->devtype_data->rxfifo - 4) &&
0684 op->data.dir == SPI_MEM_DATA_IN) {
0685 fsl_qspi_read_ahb(q, op);
0686 } else {
0687 qspi_writel(q, QUADSPI_RBCT_WMRK_MASK |
0688 QUADSPI_RBCT_RXBRD_USEIPS, base + QUADSPI_RBCT);
0689
0690 if (op->data.nbytes && op->data.dir == SPI_MEM_DATA_OUT)
0691 fsl_qspi_fill_txfifo(q, op);
0692
0693 err = fsl_qspi_do_op(q, op);
0694 }
0695
0696
0697 fsl_qspi_invalidate(q);
0698
0699 mutex_unlock(&q->lock);
0700
0701 return err;
0702 }
0703
0704 static int fsl_qspi_adjust_op_size(struct spi_mem *mem, struct spi_mem_op *op)
0705 {
0706 struct fsl_qspi *q = spi_controller_get_devdata(mem->spi->master);
0707
0708 if (op->data.dir == SPI_MEM_DATA_OUT) {
0709 if (op->data.nbytes > q->devtype_data->txfifo)
0710 op->data.nbytes = q->devtype_data->txfifo;
0711 } else {
0712 if (op->data.nbytes > q->devtype_data->ahb_buf_size)
0713 op->data.nbytes = q->devtype_data->ahb_buf_size;
0714 else if (op->data.nbytes > (q->devtype_data->rxfifo - 4))
0715 op->data.nbytes = ALIGN_DOWN(op->data.nbytes, 8);
0716 }
0717
0718 return 0;
0719 }
0720
0721 static int fsl_qspi_default_setup(struct fsl_qspi *q)
0722 {
0723 void __iomem *base = q->iobase;
0724 u32 reg, addr_offset = 0;
0725 int ret;
0726
0727
0728 fsl_qspi_clk_disable_unprep(q);
0729
0730
0731 ret = clk_set_rate(q->clk, 66000000);
0732 if (ret)
0733 return ret;
0734
0735 ret = fsl_qspi_clk_prep_enable(q);
0736 if (ret)
0737 return ret;
0738
0739
0740 qspi_writel(q, QUADSPI_MCR_SWRSTSD_MASK | QUADSPI_MCR_SWRSTHD_MASK,
0741 base + QUADSPI_MCR);
0742 udelay(1);
0743
0744
0745 qspi_writel(q, QUADSPI_MCR_MDIS_MASK | QUADSPI_MCR_RESERVED_MASK,
0746 base + QUADSPI_MCR);
0747
0748
0749
0750
0751
0752
0753 if (needs_tdh_setting(q))
0754 qspi_writel(q, qspi_readl(q, base + QUADSPI_FLSHCR) &
0755 ~QUADSPI_FLSHCR_TDH_MASK,
0756 base + QUADSPI_FLSHCR);
0757
0758 reg = qspi_readl(q, base + QUADSPI_SMPR);
0759 qspi_writel(q, reg & ~(QUADSPI_SMPR_FSDLY_MASK
0760 | QUADSPI_SMPR_FSPHS_MASK
0761 | QUADSPI_SMPR_HSENA_MASK
0762 | QUADSPI_SMPR_DDRSMP_MASK), base + QUADSPI_SMPR);
0763
0764
0765 qspi_writel(q, 0, base + QUADSPI_BUF0IND);
0766 qspi_writel(q, 0, base + QUADSPI_BUF1IND);
0767 qspi_writel(q, 0, base + QUADSPI_BUF2IND);
0768
0769 qspi_writel(q, QUADSPI_BFGENCR_SEQID(SEQID_LUT),
0770 q->iobase + QUADSPI_BFGENCR);
0771 qspi_writel(q, QUADSPI_RBCT_WMRK_MASK, base + QUADSPI_RBCT);
0772 qspi_writel(q, QUADSPI_BUF3CR_ALLMST_MASK |
0773 QUADSPI_BUF3CR_ADATSZ(q->devtype_data->ahb_buf_size / 8),
0774 base + QUADSPI_BUF3CR);
0775
0776 if (needs_amba_base_offset(q))
0777 addr_offset = q->memmap_phy;
0778
0779
0780
0781
0782
0783
0784
0785
0786 qspi_writel(q, q->devtype_data->ahb_buf_size + addr_offset,
0787 base + QUADSPI_SFA1AD);
0788 qspi_writel(q, q->devtype_data->ahb_buf_size * 2 + addr_offset,
0789 base + QUADSPI_SFA2AD);
0790 qspi_writel(q, q->devtype_data->ahb_buf_size * 3 + addr_offset,
0791 base + QUADSPI_SFB1AD);
0792 qspi_writel(q, q->devtype_data->ahb_buf_size * 4 + addr_offset,
0793 base + QUADSPI_SFB2AD);
0794
0795 q->selected = -1;
0796
0797
0798 qspi_writel(q, QUADSPI_MCR_RESERVED_MASK | QUADSPI_MCR_END_CFG_MASK,
0799 base + QUADSPI_MCR);
0800
0801
0802 qspi_writel(q, 0xffffffff, q->iobase + QUADSPI_FR);
0803
0804
0805 qspi_writel(q, QUADSPI_RSER_TFIE, q->iobase + QUADSPI_RSER);
0806
0807 return 0;
0808 }
0809
0810 static const char *fsl_qspi_get_name(struct spi_mem *mem)
0811 {
0812 struct fsl_qspi *q = spi_controller_get_devdata(mem->spi->master);
0813 struct device *dev = &mem->spi->dev;
0814 const char *name;
0815
0816
0817
0818
0819
0820
0821 if (of_get_available_child_count(q->dev->of_node) == 1)
0822 return dev_name(q->dev);
0823
0824 name = devm_kasprintf(dev, GFP_KERNEL,
0825 "%s-%d", dev_name(q->dev),
0826 mem->spi->chip_select);
0827
0828 if (!name) {
0829 dev_err(dev, "failed to get memory for custom flash name\n");
0830 return ERR_PTR(-ENOMEM);
0831 }
0832
0833 return name;
0834 }
0835
0836 static const struct spi_controller_mem_ops fsl_qspi_mem_ops = {
0837 .adjust_op_size = fsl_qspi_adjust_op_size,
0838 .supports_op = fsl_qspi_supports_op,
0839 .exec_op = fsl_qspi_exec_op,
0840 .get_name = fsl_qspi_get_name,
0841 };
0842
0843 static int fsl_qspi_probe(struct platform_device *pdev)
0844 {
0845 struct spi_controller *ctlr;
0846 struct device *dev = &pdev->dev;
0847 struct device_node *np = dev->of_node;
0848 struct resource *res;
0849 struct fsl_qspi *q;
0850 int ret;
0851
0852 ctlr = spi_alloc_master(&pdev->dev, sizeof(*q));
0853 if (!ctlr)
0854 return -ENOMEM;
0855
0856 ctlr->mode_bits = SPI_RX_DUAL | SPI_RX_QUAD |
0857 SPI_TX_DUAL | SPI_TX_QUAD;
0858
0859 q = spi_controller_get_devdata(ctlr);
0860 q->dev = dev;
0861 q->devtype_data = of_device_get_match_data(dev);
0862 if (!q->devtype_data) {
0863 ret = -ENODEV;
0864 goto err_put_ctrl;
0865 }
0866
0867 platform_set_drvdata(pdev, q);
0868
0869
0870 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "QuadSPI");
0871 q->iobase = devm_ioremap_resource(dev, res);
0872 if (IS_ERR(q->iobase)) {
0873 ret = PTR_ERR(q->iobase);
0874 goto err_put_ctrl;
0875 }
0876
0877 res = platform_get_resource_byname(pdev, IORESOURCE_MEM,
0878 "QuadSPI-memory");
0879 if (!res) {
0880 ret = -EINVAL;
0881 goto err_put_ctrl;
0882 }
0883 q->memmap_phy = res->start;
0884
0885 q->ahb_addr = devm_ioremap(dev, q->memmap_phy,
0886 (q->devtype_data->ahb_buf_size * 4));
0887 if (!q->ahb_addr) {
0888 ret = -ENOMEM;
0889 goto err_put_ctrl;
0890 }
0891
0892
0893 q->clk_en = devm_clk_get(dev, "qspi_en");
0894 if (IS_ERR(q->clk_en)) {
0895 ret = PTR_ERR(q->clk_en);
0896 goto err_put_ctrl;
0897 }
0898
0899 q->clk = devm_clk_get(dev, "qspi");
0900 if (IS_ERR(q->clk)) {
0901 ret = PTR_ERR(q->clk);
0902 goto err_put_ctrl;
0903 }
0904
0905 ret = fsl_qspi_clk_prep_enable(q);
0906 if (ret) {
0907 dev_err(dev, "can not enable the clock\n");
0908 goto err_put_ctrl;
0909 }
0910
0911
0912 ret = platform_get_irq(pdev, 0);
0913 if (ret < 0)
0914 goto err_disable_clk;
0915
0916 ret = devm_request_irq(dev, ret,
0917 fsl_qspi_irq_handler, 0, pdev->name, q);
0918 if (ret) {
0919 dev_err(dev, "failed to request irq: %d\n", ret);
0920 goto err_disable_clk;
0921 }
0922
0923 mutex_init(&q->lock);
0924
0925 ctlr->bus_num = -1;
0926 ctlr->num_chipselect = 4;
0927 ctlr->mem_ops = &fsl_qspi_mem_ops;
0928
0929 fsl_qspi_default_setup(q);
0930
0931 ctlr->dev.of_node = np;
0932
0933 ret = devm_spi_register_controller(dev, ctlr);
0934 if (ret)
0935 goto err_destroy_mutex;
0936
0937 return 0;
0938
0939 err_destroy_mutex:
0940 mutex_destroy(&q->lock);
0941
0942 err_disable_clk:
0943 fsl_qspi_clk_disable_unprep(q);
0944
0945 err_put_ctrl:
0946 spi_controller_put(ctlr);
0947
0948 dev_err(dev, "Freescale QuadSPI probe failed\n");
0949 return ret;
0950 }
0951
0952 static int fsl_qspi_remove(struct platform_device *pdev)
0953 {
0954 struct fsl_qspi *q = platform_get_drvdata(pdev);
0955
0956
0957 qspi_writel(q, QUADSPI_MCR_MDIS_MASK, q->iobase + QUADSPI_MCR);
0958 qspi_writel(q, 0x0, q->iobase + QUADSPI_RSER);
0959
0960 fsl_qspi_clk_disable_unprep(q);
0961
0962 mutex_destroy(&q->lock);
0963
0964 return 0;
0965 }
0966
0967 static int fsl_qspi_suspend(struct device *dev)
0968 {
0969 return 0;
0970 }
0971
0972 static int fsl_qspi_resume(struct device *dev)
0973 {
0974 struct fsl_qspi *q = dev_get_drvdata(dev);
0975
0976 fsl_qspi_default_setup(q);
0977
0978 return 0;
0979 }
0980
0981 static const struct of_device_id fsl_qspi_dt_ids[] = {
0982 { .compatible = "fsl,vf610-qspi", .data = &vybrid_data, },
0983 { .compatible = "fsl,imx6sx-qspi", .data = &imx6sx_data, },
0984 { .compatible = "fsl,imx7d-qspi", .data = &imx7d_data, },
0985 { .compatible = "fsl,imx6ul-qspi", .data = &imx6ul_data, },
0986 { .compatible = "fsl,ls1021a-qspi", .data = &ls1021a_data, },
0987 { .compatible = "fsl,ls2080a-qspi", .data = &ls2080a_data, },
0988 { }
0989 };
0990 MODULE_DEVICE_TABLE(of, fsl_qspi_dt_ids);
0991
0992 static const struct dev_pm_ops fsl_qspi_pm_ops = {
0993 .suspend = fsl_qspi_suspend,
0994 .resume = fsl_qspi_resume,
0995 };
0996
0997 static struct platform_driver fsl_qspi_driver = {
0998 .driver = {
0999 .name = "fsl-quadspi",
1000 .of_match_table = fsl_qspi_dt_ids,
1001 .pm = &fsl_qspi_pm_ops,
1002 },
1003 .probe = fsl_qspi_probe,
1004 .remove = fsl_qspi_remove,
1005 };
1006 module_platform_driver(fsl_qspi_driver);
1007
1008 MODULE_DESCRIPTION("Freescale QuadSPI Controller Driver");
1009 MODULE_AUTHOR("Freescale Semiconductor Inc.");
1010 MODULE_AUTHOR("Boris Brezillon <bbrezillon@kernel.org>");
1011 MODULE_AUTHOR("Frieder Schrempf <frieder.schrempf@kontron.de>");
1012 MODULE_AUTHOR("Yogesh Gaur <yogeshnarayan.gaur@nxp.com>");
1013 MODULE_AUTHOR("Suresh Gupta <suresh.gupta@nxp.com>");
1014 MODULE_LICENSE("GPL v2");