Lines Matching +full:r9a09g047 +full:- +full:xspi
1 // SPDX-License-Identifier: GPL-2.0
3 * Renesas RPC-IF core driver
5 * Copyright (C) 2018-2019 Renesas Solutions Corp.
7 * Copyright (C) 2019-2020 Cogent Embedded, Inc.
19 #include <memory/renesas-rpc-if.h>
21 #include "renesas-rpc-if-regs.h"
22 #include "renesas-xspi-if-regs.h"
76 u8 addr_nbytes; /* Specified for xSPI */
77 u32 proto; /* Specified for xSPI */
100 switch (rpc->xfer_size) { in rpcif_reg_read()
102 *val = readb(rpc->base + reg); in rpcif_reg_read()
106 *val = readw(rpc->base + reg); in rpcif_reg_read()
111 *val = readl(rpc->base + reg); in rpcif_reg_read()
115 return -EILSEQ; in rpcif_reg_read()
120 if (rpc->xfer_size != 8) in rpcif_reg_read()
121 return -EILSEQ; in rpcif_reg_read()
125 *val = readl(rpc->base + reg); in rpcif_reg_read()
135 switch (rpc->xfer_size) { in rpcif_reg_write()
137 writeb(val, rpc->base + reg); in rpcif_reg_write()
141 writew(val, rpc->base + reg); in rpcif_reg_write()
146 writel(val, rpc->base + reg); in rpcif_reg_write()
150 return -EILSEQ; in rpcif_reg_write()
154 if (rpc->xfer_size != 8) in rpcif_reg_write()
155 return -EILSEQ; in rpcif_reg_write()
160 return -EPERM; in rpcif_reg_write()
163 writel(val, rpc->base + reg); in rpcif_reg_write()
180 struct rpcif_priv *xspi = context; in xspi_reg_read() local
182 *val = readl(xspi->base + reg); in xspi_reg_read()
188 struct rpcif_priv *xspi = context; in xspi_reg_write() local
190 writel(val, xspi->base + reg); in xspi_reg_write()
209 rpcif->dev = dev; in rpcif_sw_init()
210 rpcif->dirmap = rpc->dirmap; in rpcif_sw_init()
211 rpcif->size = rpc->size; in rpcif_sw_init()
212 rpcif->xspi = rpc->info->type == XSPI_RZ_G3E; in rpcif_sw_init()
219 regmap_write(rpc->regmap, RPCIF_PHYWR, 0xa5390000); in rpcif_rzg2l_timing_adjust_sdr()
220 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000000); in rpcif_rzg2l_timing_adjust_sdr()
221 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00008080); in rpcif_rzg2l_timing_adjust_sdr()
222 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000022); in rpcif_rzg2l_timing_adjust_sdr()
223 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00008080); in rpcif_rzg2l_timing_adjust_sdr()
224 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000024); in rpcif_rzg2l_timing_adjust_sdr()
225 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_CKSEL(3), in rpcif_rzg2l_timing_adjust_sdr()
227 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00000030); in rpcif_rzg2l_timing_adjust_sdr()
228 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000032); in rpcif_rzg2l_timing_adjust_sdr()
236 if (rpc->info->type == RPCIF_RZ_G2L) { in rpcif_hw_init_impl()
237 ret = reset_control_reset(rpc->rstc); in rpcif_hw_init_impl()
244 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_PHYMEM_MASK, in rpcif_hw_init_impl()
248 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_HS, 0); in rpcif_hw_init_impl()
250 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, in rpcif_hw_init_impl()
252 RPCIF_PHYCNT_STRTIM(BIT(fls(rpc->info->strtim)) - 1), in rpcif_hw_init_impl()
253 RPCIF_PHYCNT_STRTIM(rpc->info->strtim)); in rpcif_hw_init_impl()
255 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET1, RPCIF_PHYOFFSET1_DDRTMG(3), in rpcif_hw_init_impl()
257 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET2, RPCIF_PHYOFFSET2_OCTTMG(7), in rpcif_hw_init_impl()
261 regmap_update_bits(rpc->regmap, RPCIF_PHYINT, in rpcif_hw_init_impl()
264 if (rpc->info->type == RPCIF_RZ_G2L) in rpcif_hw_init_impl()
265 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, in rpcif_hw_init_impl()
271 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, in rpcif_hw_init_impl()
277 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF); in rpcif_hw_init_impl()
279 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy); in rpcif_hw_init_impl()
280 regmap_write(rpc->regmap, RPCIF_SSLDR, RPCIF_SSLDR_SPNDL(7) | in rpcif_hw_init_impl()
283 rpc->bus_size = hyperflash ? 2 : 1; in rpcif_hw_init_impl()
288 static int xspi_hw_init_impl(struct rpcif_priv *xspi, bool hyperflash) in xspi_hw_init_impl() argument
292 ret = reset_control_reset(xspi->rstc); in xspi_hw_init_impl()
296 regmap_write(xspi->regmap, XSPI_WRAPCFG, 0x0); in xspi_hw_init_impl()
298 regmap_update_bits(xspi->regmap, XSPI_LIOCFGCS0, in xspi_hw_init_impl()
304 regmap_update_bits(xspi->regmap, XSPI_CCCTL0CS0, XSPI_CCCTL0_CAEN, 0); in xspi_hw_init_impl()
306 regmap_update_bits(xspi->regmap, XSPI_CDCTL0, in xspi_hw_init_impl()
309 regmap_update_bits(xspi->regmap, XSPI_INTE, XSPI_INTE_CMDCMPE, in xspi_hw_init_impl()
324 ret = rpc->info->impl->hw_init(rpc, hyperflash); in rpcif_hw_init()
336 return regmap_read_poll_timeout(rpc->regmap, rpc->info->impl->status_reg, in wait_msg_xfer_end()
337 sts, sts & rpc->info->impl->status_mask, in wait_msg_xfer_end()
343 if (rpc->bus_size == 2) in rpcif_bits_set()
346 return GENMASK(3, 4 - nbytes); in rpcif_bits_set()
357 rpc->smcr = 0; in rpcif_prepare_impl()
358 rpc->smadr = 0; in rpcif_prepare_impl()
359 rpc->enable = 0; in rpcif_prepare_impl()
360 rpc->command = 0; in rpcif_prepare_impl()
361 rpc->option = 0; in rpcif_prepare_impl()
362 rpc->dummy = 0; in rpcif_prepare_impl()
363 rpc->ddr = 0; in rpcif_prepare_impl()
364 rpc->xferlen = 0; in rpcif_prepare_impl()
366 if (op->cmd.buswidth) { in rpcif_prepare_impl()
367 rpc->enable = RPCIF_SMENR_CDE | in rpcif_prepare_impl()
368 RPCIF_SMENR_CDB(rpcif_bit_size(op->cmd.buswidth)); in rpcif_prepare_impl()
369 rpc->command = RPCIF_SMCMR_CMD(op->cmd.opcode); in rpcif_prepare_impl()
370 if (op->cmd.ddr) in rpcif_prepare_impl()
371 rpc->ddr = RPCIF_SMDRENR_HYPE(0x5); in rpcif_prepare_impl()
373 if (op->ocmd.buswidth) { in rpcif_prepare_impl()
374 rpc->enable |= RPCIF_SMENR_OCDE | in rpcif_prepare_impl()
375 RPCIF_SMENR_OCDB(rpcif_bit_size(op->ocmd.buswidth)); in rpcif_prepare_impl()
376 rpc->command |= RPCIF_SMCMR_OCMD(op->ocmd.opcode); in rpcif_prepare_impl()
379 if (op->addr.buswidth) { in rpcif_prepare_impl()
380 rpc->enable |= in rpcif_prepare_impl()
381 RPCIF_SMENR_ADB(rpcif_bit_size(op->addr.buswidth)); in rpcif_prepare_impl()
382 if (op->addr.nbytes == 4) in rpcif_prepare_impl()
383 rpc->enable |= RPCIF_SMENR_ADE(0xF); in rpcif_prepare_impl()
385 rpc->enable |= RPCIF_SMENR_ADE(GENMASK( in rpcif_prepare_impl()
386 2, 3 - op->addr.nbytes)); in rpcif_prepare_impl()
387 if (op->addr.ddr) in rpcif_prepare_impl()
388 rpc->ddr |= RPCIF_SMDRENR_ADDRE; in rpcif_prepare_impl()
391 rpc->smadr = *offs; in rpcif_prepare_impl()
393 rpc->smadr = op->addr.val; in rpcif_prepare_impl()
396 if (op->dummy.buswidth) { in rpcif_prepare_impl()
397 rpc->enable |= RPCIF_SMENR_DME; in rpcif_prepare_impl()
398 rpc->dummy = RPCIF_SMDMCR_DMCYC(op->dummy.ncycles); in rpcif_prepare_impl()
401 if (op->option.buswidth) { in rpcif_prepare_impl()
402 rpc->enable |= RPCIF_SMENR_OPDE( in rpcif_prepare_impl()
403 rpcif_bits_set(rpc, op->option.nbytes)) | in rpcif_prepare_impl()
404 RPCIF_SMENR_OPDB(rpcif_bit_size(op->option.buswidth)); in rpcif_prepare_impl()
405 if (op->option.ddr) in rpcif_prepare_impl()
406 rpc->ddr |= RPCIF_SMDRENR_OPDRE; in rpcif_prepare_impl()
407 rpc->option = op->option.val; in rpcif_prepare_impl()
410 rpc->dir = op->data.dir; in rpcif_prepare_impl()
411 if (op->data.buswidth) { in rpcif_prepare_impl()
414 rpc->buffer = op->data.buf.in; in rpcif_prepare_impl()
415 switch (op->data.dir) { in rpcif_prepare_impl()
417 rpc->smcr = RPCIF_SMCR_SPIRE; in rpcif_prepare_impl()
420 rpc->smcr = RPCIF_SMCR_SPIWE; in rpcif_prepare_impl()
425 if (op->data.ddr) in rpcif_prepare_impl()
426 rpc->ddr |= RPCIF_SMDRENR_SPIDRE; in rpcif_prepare_impl()
431 nbytes = op->data.nbytes; in rpcif_prepare_impl()
432 rpc->xferlen = nbytes; in rpcif_prepare_impl()
434 rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth)); in rpcif_prepare_impl()
438 static void xspi_prepare_impl(struct rpcif_priv *xspi, const struct rpcif_op *op, in xspi_prepare_impl() argument
441 xspi->smadr = 0; in xspi_prepare_impl()
442 xspi->addr_nbytes = 0; in xspi_prepare_impl()
443 xspi->command = 0; in xspi_prepare_impl()
444 xspi->option = 0; in xspi_prepare_impl()
445 xspi->dummy = 0; in xspi_prepare_impl()
446 xspi->xferlen = 0; in xspi_prepare_impl()
447 xspi->proto = 0; in xspi_prepare_impl()
449 if (op->cmd.buswidth) in xspi_prepare_impl()
450 xspi->command = op->cmd.opcode; in xspi_prepare_impl()
452 if (op->ocmd.buswidth) in xspi_prepare_impl()
453 xspi->command = (xspi->command << 8) | op->ocmd.opcode; in xspi_prepare_impl()
455 if (op->addr.buswidth) { in xspi_prepare_impl()
456 xspi->addr_nbytes = op->addr.nbytes; in xspi_prepare_impl()
458 xspi->smadr = *offs; in xspi_prepare_impl()
460 xspi->smadr = op->addr.val; in xspi_prepare_impl()
463 if (op->dummy.buswidth) in xspi_prepare_impl()
464 xspi->dummy = op->dummy.ncycles; in xspi_prepare_impl()
466 xspi->dir = op->data.dir; in xspi_prepare_impl()
467 if (op->data.buswidth) { in xspi_prepare_impl()
470 xspi->buffer = op->data.buf.in; in xspi_prepare_impl()
475 nbytes = op->data.nbytes; in xspi_prepare_impl()
476 xspi->xferlen = nbytes; in xspi_prepare_impl()
479 if (op->cmd.buswidth == 1) { in xspi_prepare_impl()
480 if (op->addr.buswidth == 2 || op->data.buswidth == 2) in xspi_prepare_impl()
481 xspi->proto = PROTO_1S_2S_2S; in xspi_prepare_impl()
482 else if (op->addr.buswidth == 4 || op->data.buswidth == 4) in xspi_prepare_impl()
483 xspi->proto = PROTO_1S_4S_4S; in xspi_prepare_impl()
484 } else if (op->cmd.buswidth == 2 && in xspi_prepare_impl()
485 (op->addr.buswidth == 2 || op->data.buswidth == 2)) { in xspi_prepare_impl()
486 xspi->proto = PROTO_2S_2S_2S; in xspi_prepare_impl()
487 } else if (op->cmd.buswidth == 4 && in xspi_prepare_impl()
488 (op->addr.buswidth == 4 || op->data.buswidth == 4)) { in xspi_prepare_impl()
489 xspi->proto = PROTO_4S_4S_4S; in xspi_prepare_impl()
498 rpc->info->impl->prepare(rpc, op, offs, len); in rpcif_prepare()
504 u32 smenr, smcr, pos = 0, max = rpc->bus_size == 2 ? 8 : 4; in rpcif_manual_xfer_impl()
507 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, in rpcif_manual_xfer_impl()
509 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, in rpcif_manual_xfer_impl()
511 regmap_write(rpc->regmap, RPCIF_SMCMR, rpc->command); in rpcif_manual_xfer_impl()
512 regmap_write(rpc->regmap, RPCIF_SMOPR, rpc->option); in rpcif_manual_xfer_impl()
513 regmap_write(rpc->regmap, RPCIF_SMDMCR, rpc->dummy); in rpcif_manual_xfer_impl()
514 regmap_write(rpc->regmap, RPCIF_SMDRENR, rpc->ddr); in rpcif_manual_xfer_impl()
515 regmap_write(rpc->regmap, RPCIF_SMADR, rpc->smadr); in rpcif_manual_xfer_impl()
516 smenr = rpc->enable; in rpcif_manual_xfer_impl()
518 switch (rpc->dir) { in rpcif_manual_xfer_impl()
520 while (pos < rpc->xferlen) { in rpcif_manual_xfer_impl()
521 u32 bytes_left = rpc->xferlen - pos; in rpcif_manual_xfer_impl()
524 smcr = rpc->smcr | RPCIF_SMCR_SPIE; in rpcif_manual_xfer_impl()
532 regmap_write(rpc->regmap, RPCIF_SMENR, smenr); in rpcif_manual_xfer_impl()
533 rpc->xfer_size = nbytes; in rpcif_manual_xfer_impl()
535 memcpy(data, rpc->buffer + pos, nbytes); in rpcif_manual_xfer_impl()
537 regmap_write(rpc->regmap, RPCIF_SMWDR1, *p++); in rpcif_manual_xfer_impl()
538 regmap_write(rpc->regmap, RPCIF_SMWDR0, *p); in rpcif_manual_xfer_impl()
540 regmap_write(rpc->regmap, RPCIF_SMCR, smcr); in rpcif_manual_xfer_impl()
546 smenr = rpc->enable & in rpcif_manual_xfer_impl()
552 * RPC-IF spoils the data for the commands without an address in rpcif_manual_xfer_impl()
557 if (!(smenr & RPCIF_SMENR_ADE(0xF)) && rpc->dirmap) { in rpcif_manual_xfer_impl()
560 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, in rpcif_manual_xfer_impl()
562 regmap_write(rpc->regmap, RPCIF_DRCR, in rpcif_manual_xfer_impl()
564 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command); in rpcif_manual_xfer_impl()
565 regmap_write(rpc->regmap, RPCIF_DREAR, in rpcif_manual_xfer_impl()
567 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option); in rpcif_manual_xfer_impl()
568 regmap_write(rpc->regmap, RPCIF_DRENR, in rpcif_manual_xfer_impl()
570 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy); in rpcif_manual_xfer_impl()
571 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr); in rpcif_manual_xfer_impl()
572 memcpy_fromio(rpc->buffer, rpc->dirmap, rpc->xferlen); in rpcif_manual_xfer_impl()
573 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF); in rpcif_manual_xfer_impl()
575 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy); in rpcif_manual_xfer_impl()
578 while (pos < rpc->xferlen) { in rpcif_manual_xfer_impl()
579 u32 bytes_left = rpc->xferlen - pos; in rpcif_manual_xfer_impl()
585 regmap_write(rpc->regmap, RPCIF_SMADR, in rpcif_manual_xfer_impl()
586 rpc->smadr + pos); in rpcif_manual_xfer_impl()
589 regmap_write(rpc->regmap, RPCIF_SMENR, smenr); in rpcif_manual_xfer_impl()
590 regmap_write(rpc->regmap, RPCIF_SMCR, in rpcif_manual_xfer_impl()
591 rpc->smcr | RPCIF_SMCR_SPIE); in rpcif_manual_xfer_impl()
592 rpc->xfer_size = nbytes; in rpcif_manual_xfer_impl()
598 regmap_read(rpc->regmap, RPCIF_SMRDR1, p++); in rpcif_manual_xfer_impl()
599 regmap_read(rpc->regmap, RPCIF_SMRDR0, p); in rpcif_manual_xfer_impl()
600 memcpy(rpc->buffer + pos, data, nbytes); in rpcif_manual_xfer_impl()
606 regmap_write(rpc->regmap, RPCIF_SMENR, rpc->enable); in rpcif_manual_xfer_impl()
607 regmap_write(rpc->regmap, RPCIF_SMCR, in rpcif_manual_xfer_impl()
608 rpc->smcr | RPCIF_SMCR_SPIE); in rpcif_manual_xfer_impl()
617 if (reset_control_reset(rpc->rstc)) in rpcif_manual_xfer_impl()
618 dev_err(rpc->dev, "Failed to reset HW\n"); in rpcif_manual_xfer_impl()
619 rpcif_hw_init_impl(rpc, rpc->bus_size == 2); in rpcif_manual_xfer_impl()
623 static int xspi_manual_xfer_impl(struct rpcif_priv *xspi) in xspi_manual_xfer_impl() argument
628 regmap_update_bits(xspi->regmap, XSPI_CDCTL0, XSPI_CDCTL0_TRNUM(0x3), in xspi_manual_xfer_impl()
631 regmap_update_bits(xspi->regmap, XSPI_CDCTL0, XSPI_CDCTL0_TRREQ, 0); in xspi_manual_xfer_impl()
633 regmap_write(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
634 XSPI_CDTBUF_CMDSIZE(0x1) | XSPI_CDTBUF_CMD_FIELD(xspi->command)); in xspi_manual_xfer_impl()
636 regmap_write(xspi->regmap, XSPI_CDABUF0, 0); in xspi_manual_xfer_impl()
638 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, XSPI_CDTBUF_ADDSIZE(0x7), in xspi_manual_xfer_impl()
639 XSPI_CDTBUF_ADDSIZE(xspi->addr_nbytes)); in xspi_manual_xfer_impl()
641 regmap_write(xspi->regmap, XSPI_CDABUF0, xspi->smadr); in xspi_manual_xfer_impl()
643 regmap_update_bits(xspi->regmap, XSPI_LIOCFGCS0, XSPI_LIOCFG_PRTMD(0x3ff), in xspi_manual_xfer_impl()
644 XSPI_LIOCFG_PRTMD(xspi->proto)); in xspi_manual_xfer_impl()
646 switch (xspi->dir) { in xspi_manual_xfer_impl()
648 while (pos < xspi->xferlen) { in xspi_manual_xfer_impl()
649 u32 bytes_left = xspi->xferlen - pos; in xspi_manual_xfer_impl()
652 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
657 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
661 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
663 XSPI_CDTBUF_ADDSIZE(xspi->addr_nbytes)); in xspi_manual_xfer_impl()
665 memcpy(data, xspi->buffer + pos, nbytes); in xspi_manual_xfer_impl()
668 regmap_write(xspi->regmap, XSPI_CDD0BUF0, *p++); in xspi_manual_xfer_impl()
669 regmap_write(xspi->regmap, XSPI_CDD1BUF0, *p); in xspi_manual_xfer_impl()
671 regmap_write(xspi->regmap, XSPI_CDD0BUF0, *p); in xspi_manual_xfer_impl()
674 regmap_write(xspi->regmap, XSPI_CDABUF0, xspi->smadr + pos); in xspi_manual_xfer_impl()
676 regmap_update_bits(xspi->regmap, XSPI_CDCTL0, in xspi_manual_xfer_impl()
679 ret = wait_msg_xfer_end(xspi); in xspi_manual_xfer_impl()
683 regmap_update_bits(xspi->regmap, XSPI_INTC, in xspi_manual_xfer_impl()
688 regmap_update_bits(xspi->regmap, XSPI_CDCTL0, XSPI_CDCTL0_TRREQ, 0); in xspi_manual_xfer_impl()
691 while (pos < xspi->xferlen) { in xspi_manual_xfer_impl()
692 u32 bytes_left = xspi->xferlen - pos; in xspi_manual_xfer_impl()
695 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
702 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
706 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
708 XSPI_CDTBUF_ADDSIZE(xspi->addr_nbytes)); in xspi_manual_xfer_impl()
710 if (xspi->addr_nbytes) in xspi_manual_xfer_impl()
711 regmap_write(xspi->regmap, XSPI_CDABUF0, in xspi_manual_xfer_impl()
712 xspi->smadr + pos); in xspi_manual_xfer_impl()
714 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
716 XSPI_CDTBUF_LATE(xspi->dummy)); in xspi_manual_xfer_impl()
718 regmap_update_bits(xspi->regmap, XSPI_CDCTL0, in xspi_manual_xfer_impl()
721 ret = wait_msg_xfer_end(xspi); in xspi_manual_xfer_impl()
726 regmap_read(xspi->regmap, XSPI_CDD0BUF0, p++); in xspi_manual_xfer_impl()
727 regmap_read(xspi->regmap, XSPI_CDD1BUF0, p); in xspi_manual_xfer_impl()
729 regmap_read(xspi->regmap, XSPI_CDD0BUF0, p); in xspi_manual_xfer_impl()
732 memcpy(xspi->buffer + pos, data, nbytes); in xspi_manual_xfer_impl()
734 regmap_update_bits(xspi->regmap, XSPI_INTC, in xspi_manual_xfer_impl()
739 regmap_update_bits(xspi->regmap, XSPI_CDCTL0, in xspi_manual_xfer_impl()
743 regmap_update_bits(xspi->regmap, XSPI_CDTBUF0, in xspi_manual_xfer_impl()
745 regmap_update_bits(xspi->regmap, XSPI_CDCTL0, in xspi_manual_xfer_impl()
748 ret = wait_msg_xfer_end(xspi); in xspi_manual_xfer_impl()
752 regmap_update_bits(xspi->regmap, XSPI_INTC, in xspi_manual_xfer_impl()
759 xspi_hw_init_impl(xspi, false); in xspi_manual_xfer_impl()
772 ret = rpc->info->impl->manual_xfer(rpc); in rpcif_manual_xfer()
792 count--; in memcpy_fromio_readw()
798 count -= 2; in memcpy_fromio_readw()
808 count -= maxw; in memcpy_fromio_readw()
814 count -= 2; in memcpy_fromio_readw()
825 loff_t from = offs & (rpc->size - 1); in rpcif_dirmap_read_impl()
826 size_t size = rpc->size - from; in rpcif_dirmap_read_impl()
831 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_MD, 0); in rpcif_dirmap_read_impl()
832 regmap_write(rpc->regmap, RPCIF_DRCR, 0); in rpcif_dirmap_read_impl()
833 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command); in rpcif_dirmap_read_impl()
834 regmap_write(rpc->regmap, RPCIF_DREAR, in rpcif_dirmap_read_impl()
836 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option); in rpcif_dirmap_read_impl()
837 regmap_write(rpc->regmap, RPCIF_DRENR, in rpcif_dirmap_read_impl()
838 rpc->enable & ~RPCIF_SMENR_SPIDE(0xF)); in rpcif_dirmap_read_impl()
839 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy); in rpcif_dirmap_read_impl()
840 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr); in rpcif_dirmap_read_impl()
842 if (rpc->bus_size == 2) in rpcif_dirmap_read_impl()
843 memcpy_fromio_readw(buf, rpc->dirmap + from, len); in rpcif_dirmap_read_impl()
845 memcpy_fromio(buf, rpc->dirmap + from, len); in rpcif_dirmap_read_impl()
850 static size_t xspi_dirmap_read_impl(struct rpcif_priv *xspi, u64 offs, in xspi_dirmap_read_impl() argument
853 loff_t from = offs & (xspi->size - 1); in xspi_dirmap_read_impl()
854 size_t size = xspi->size - from; in xspi_dirmap_read_impl()
855 u8 addsize = xspi->addr_nbytes - 1; in xspi_dirmap_read_impl()
860 regmap_update_bits(xspi->regmap, XSPI_CMCFG0CS0, in xspi_dirmap_read_impl()
864 regmap_update_bits(xspi->regmap, XSPI_CMCFG1CS0, in xspi_dirmap_read_impl()
866 XSPI_CMCFG1_RDCMD_UPPER_BYTE(xspi->command) | in xspi_dirmap_read_impl()
867 XSPI_CMCFG1_RDLATE(xspi->dummy)); in xspi_dirmap_read_impl()
869 regmap_update_bits(xspi->regmap, XSPI_BMCTL0, XSPI_BMCTL0_CS0ACC(0xff), in xspi_dirmap_read_impl()
872 regmap_update_bits(xspi->regmap, XSPI_BMCFG, in xspi_dirmap_read_impl()
878 regmap_update_bits(xspi->regmap, XSPI_LIOCFGCS0, XSPI_LIOCFG_PRTMD(0x3ff), in xspi_dirmap_read_impl()
879 XSPI_LIOCFG_PRTMD(xspi->proto)); in xspi_dirmap_read_impl()
881 memcpy_fromio(buf, xspi->dirmap + from, len); in xspi_dirmap_read_impl()
896 read = rpc->info->impl->dirmap_read(rpc, offs, len, buf); in rpcif_dirmap_read()
905 * xspi_dirmap_write - Write data to xspi memory.
906 * @dev: xspi device
911 * This function writes data into xspi memory.
917 struct rpcif_priv *xspi = dev_get_drvdata(dev); in xspi_dirmap_write() local
918 loff_t from = offs & (xspi->size - 1); in xspi_dirmap_write()
919 u8 addsize = xspi->addr_nbytes - 1; in xspi_dirmap_write()
920 size_t size = xspi->size - from; in xspi_dirmap_write()
936 regmap_update_bits(xspi->regmap, XSPI_CMCFG0CS0, in xspi_dirmap_write()
940 regmap_update_bits(xspi->regmap, XSPI_CMCFG2CS0, in xspi_dirmap_write()
942 XSPI_CMCFG2_WRCMD_UPPER(xspi->command) | in xspi_dirmap_write()
943 XSPI_CMCFG2_WRLATE(xspi->dummy)); in xspi_dirmap_write()
945 regmap_update_bits(xspi->regmap, XSPI_BMCTL0, in xspi_dirmap_write()
948 regmap_update_bits(xspi->regmap, XSPI_BMCFG, in xspi_dirmap_write()
954 regmap_update_bits(xspi->regmap, XSPI_LIOCFGCS0, XSPI_LIOCFG_PRTMD(0x3ff), in xspi_dirmap_write()
955 XSPI_LIOCFG_PRTMD(xspi->proto)); in xspi_dirmap_write()
957 memcpy_toio(xspi->dirmap + from, buf, writebytes); in xspi_dirmap_write()
961 regmap_update_bits(xspi->regmap, XSPI_BMCTL1, in xspi_dirmap_write()
972 struct device *dev = &pdev->dev; in rpcif_probe()
980 flash = of_get_next_child(dev->of_node, NULL); in rpcif_probe()
983 return -ENODEV; in rpcif_probe()
986 if (of_device_is_compatible(flash, "jedec,spi-nor")) { in rpcif_probe()
987 name = "rpc-if-spi"; in rpcif_probe()
988 } else if (of_device_is_compatible(flash, "cfi-flash")) { in rpcif_probe()
989 name = "rpc-if-hyperflash"; in rpcif_probe()
993 return -ENODEV; in rpcif_probe()
999 return -ENOMEM; in rpcif_probe()
1001 rpc->base = devm_platform_ioremap_resource_byname(pdev, "regs"); in rpcif_probe()
1002 if (IS_ERR(rpc->base)) in rpcif_probe()
1003 return PTR_ERR(rpc->base); in rpcif_probe()
1004 rpc->info = of_device_get_match_data(dev); in rpcif_probe()
1005 rpc->regmap = devm_regmap_init(dev, NULL, rpc, rpc->info->regmap_config); in rpcif_probe()
1006 if (IS_ERR(rpc->regmap)) { in rpcif_probe()
1008 PTR_ERR(rpc->regmap)); in rpcif_probe()
1009 return PTR_ERR(rpc->regmap); in rpcif_probe()
1013 rpc->dirmap = devm_ioremap_resource(dev, res); in rpcif_probe()
1014 if (IS_ERR(rpc->dirmap)) in rpcif_probe()
1015 return PTR_ERR(rpc->dirmap); in rpcif_probe()
1017 rpc->size = resource_size(res); in rpcif_probe()
1018 rpc->rstc = devm_reset_control_array_get_exclusive(dev); in rpcif_probe()
1019 if (IS_ERR(rpc->rstc)) in rpcif_probe()
1020 return PTR_ERR(rpc->rstc); in rpcif_probe()
1027 if (rpc->info->type == XSPI_RZ_G3E) { in rpcif_probe()
1041 vdev = platform_device_alloc(name, pdev->id); in rpcif_probe()
1043 return -ENOMEM; in rpcif_probe()
1044 vdev->dev.parent = dev; in rpcif_probe()
1046 rpc->dev = dev; in rpcif_probe()
1047 rpc->vdev = vdev; in rpcif_probe()
1063 platform_device_unregister(rpc->vdev); in rpcif_remove()
1119 { .compatible = "renesas,r8a7796-rpc-if", .data = &rpcif_info_r8a7796 },
1120 { .compatible = "renesas,r9a09g047-xspi", .data = &xspi_info_r9a09g047 },
1121 { .compatible = "renesas,rcar-gen3-rpc-if", .data = &rpcif_info_gen3 },
1122 { .compatible = "renesas,rcar-gen4-rpc-if", .data = &rpcif_info_gen4 },
1123 { .compatible = "renesas,rzg2l-rpc-if", .data = &rpcif_info_rz_g2l },
1132 .name = "rpc-if",
1138 MODULE_DESCRIPTION("Renesas RPC-IF core driver");