Lines Matching refs:rpc

19 #include <memory/renesas-rpc-if.h>
220 struct rpcif_priv *rpc = context;
225 switch (rpc->xfer_size) {
227 *val = readb(rpc->base + reg);
231 *val = readw(rpc->base + reg);
236 *val = readl(rpc->base + reg);
245 if (rpc->xfer_size != 8)
250 *val = readl(rpc->base + reg);
256 struct rpcif_priv *rpc = context;
260 switch (rpc->xfer_size) {
262 writeb(val, rpc->base + reg);
266 writew(val, rpc->base + reg);
271 writel(val, rpc->base + reg);
279 if (rpc->xfer_size != 8)
288 writel(val, rpc->base + reg);
305 struct rpcif_priv *rpc = dev_get_drvdata(dev);
308 rpcif->dirmap = rpc->dirmap;
309 rpcif->size = rpc->size;
314 static void rpcif_rzg2l_timing_adjust_sdr(struct rpcif_priv *rpc)
316 regmap_write(rpc->regmap, RPCIF_PHYWR, 0xa5390000);
317 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000000);
318 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00008080);
319 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000022);
320 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00008080);
321 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000024);
322 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_CKSEL(3),
324 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00000030);
325 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000032);
330 struct rpcif_priv *rpc = dev_get_drvdata(dev);
338 if (rpc->info->type == RPCIF_RZ_G2L) {
339 ret = reset_control_reset(rpc->rstc);
343 rpcif_rzg2l_timing_adjust_sdr(rpc);
346 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_PHYMEM_MASK,
350 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_HS, 0);
352 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
354 RPCIF_PHYCNT_STRTIM(BIT(fls(rpc->info->strtim)) - 1),
355 RPCIF_PHYCNT_STRTIM(rpc->info->strtim));
357 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET1, RPCIF_PHYOFFSET1_DDRTMG(3),
359 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET2, RPCIF_PHYOFFSET2_OCTTMG(7),
363 regmap_update_bits(rpc->regmap, RPCIF_PHYINT,
366 if (rpc->info->type == RPCIF_RZ_G2L)
367 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
373 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
379 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF);
381 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy);
382 regmap_write(rpc->regmap, RPCIF_SSLDR, RPCIF_SSLDR_SPNDL(7) |
387 rpc->bus_size = hyperflash ? 2 : 1;
393 static int wait_msg_xfer_end(struct rpcif_priv *rpc)
397 return regmap_read_poll_timeout(rpc->regmap, RPCIF_CMNSR, sts,
402 static u8 rpcif_bits_set(struct rpcif_priv *rpc, u32 nbytes)
404 if (rpc->bus_size == 2)
418 struct rpcif_priv *rpc = dev_get_drvdata(dev);
420 rpc->smcr = 0;
421 rpc->smadr = 0;
422 rpc->enable = 0;
423 rpc->command = 0;
424 rpc->option = 0;
425 rpc->dummy = 0;
426 rpc->ddr = 0;
427 rpc->xferlen = 0;
430 rpc->enable = RPCIF_SMENR_CDE |
432 rpc->command = RPCIF_SMCMR_CMD(op->cmd.opcode);
434 rpc->ddr = RPCIF_SMDRENR_HYPE(0x5);
437 rpc->enable |= RPCIF_SMENR_OCDE |
439 rpc->command |= RPCIF_SMCMR_OCMD(op->ocmd.opcode);
443 rpc->enable |=
446 rpc->enable |= RPCIF_SMENR_ADE(0xF);
448 rpc->enable |= RPCIF_SMENR_ADE(GENMASK(
451 rpc->ddr |= RPCIF_SMDRENR_ADDRE;
454 rpc->smadr = *offs;
456 rpc->smadr = op->addr.val;
460 rpc->enable |= RPCIF_SMENR_DME;
461 rpc->dummy = RPCIF_SMDMCR_DMCYC(op->dummy.ncycles);
465 rpc->enable |= RPCIF_SMENR_OPDE(
466 rpcif_bits_set(rpc, op->option.nbytes)) |
469 rpc->ddr |= RPCIF_SMDRENR_OPDRE;
470 rpc->option = op->option.val;
473 rpc->dir = op->data.dir;
477 rpc->buffer = op->data.buf.in;
480 rpc->smcr = RPCIF_SMCR_SPIRE;
483 rpc->smcr = RPCIF_SMCR_SPIWE;
489 rpc->ddr |= RPCIF_SMDRENR_SPIDRE;
495 rpc->xferlen = nbytes;
497 rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth));
504 struct rpcif_priv *rpc = dev_get_drvdata(dev);
505 u32 smenr, smcr, pos = 0, max = rpc->bus_size == 2 ? 8 : 4;
512 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
514 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
516 regmap_write(rpc->regmap, RPCIF_SMCMR, rpc->command);
517 regmap_write(rpc->regmap, RPCIF_SMOPR, rpc->option);
518 regmap_write(rpc->regmap, RPCIF_SMDMCR, rpc->dummy);
519 regmap_write(rpc->regmap, RPCIF_SMDRENR, rpc->ddr);
520 regmap_write(rpc->regmap, RPCIF_SMADR, rpc->smadr);
521 smenr = rpc->enable;
523 switch (rpc->dir) {
525 while (pos < rpc->xferlen) {
526 u32 bytes_left = rpc->xferlen - pos;
529 smcr = rpc->smcr | RPCIF_SMCR_SPIE;
536 smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes));
537 regmap_write(rpc->regmap, RPCIF_SMENR, smenr);
538 rpc->xfer_size = nbytes;
540 memcpy(data, rpc->buffer + pos, nbytes);
542 regmap_write(rpc->regmap, RPCIF_SMWDR1, *p++);
543 regmap_write(rpc->regmap, RPCIF_SMWDR0, *p);
545 regmap_write(rpc->regmap, RPCIF_SMCR, smcr);
546 ret = wait_msg_xfer_end(rpc);
551 smenr = rpc->enable &
562 if (!(smenr & RPCIF_SMENR_ADE(0xF)) && rpc->dirmap) {
565 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
567 regmap_write(rpc->regmap, RPCIF_DRCR,
569 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command);
570 regmap_write(rpc->regmap, RPCIF_DREAR,
572 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option);
573 regmap_write(rpc->regmap, RPCIF_DRENR,
575 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy);
576 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr);
577 memcpy_fromio(rpc->buffer, rpc->dirmap, rpc->xferlen);
578 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF);
580 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy);
583 while (pos < rpc->xferlen) {
584 u32 bytes_left = rpc->xferlen - pos;
590 regmap_write(rpc->regmap, RPCIF_SMADR,
591 rpc->smadr + pos);
593 smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes));
594 regmap_write(rpc->regmap, RPCIF_SMENR, smenr);
595 regmap_write(rpc->regmap, RPCIF_SMCR,
596 rpc->smcr | RPCIF_SMCR_SPIE);
597 rpc->xfer_size = nbytes;
598 ret = wait_msg_xfer_end(rpc);
603 regmap_read(rpc->regmap, RPCIF_SMRDR1, p++);
604 regmap_read(rpc->regmap, RPCIF_SMRDR0, p);
605 memcpy(rpc->buffer + pos, data, nbytes);
611 regmap_write(rpc->regmap, RPCIF_SMENR, rpc->enable);
612 regmap_write(rpc->regmap, RPCIF_SMCR,
613 rpc->smcr | RPCIF_SMCR_SPIE);
614 ret = wait_msg_xfer_end(rpc);
624 if (reset_control_reset(rpc->rstc))
626 rpcif_hw_init(dev, rpc->bus_size == 2);
675 struct rpcif_priv *rpc = dev_get_drvdata(dev);
676 loff_t from = offs & (rpc->size - 1);
677 size_t size = rpc->size - from;
687 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_MD, 0);
688 regmap_write(rpc->regmap, RPCIF_DRCR, 0);
689 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command);
690 regmap_write(rpc->regmap, RPCIF_DREAR,
692 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option);
693 regmap_write(rpc->regmap, RPCIF_DRENR,
694 rpc->enable & ~RPCIF_SMENR_SPIDE(0xF));
695 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy);
696 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr);
698 if (rpc->bus_size == 2)
699 memcpy_fromio_readw(buf, rpc->dirmap + from, len);
701 memcpy_fromio(buf, rpc->dirmap + from, len);
714 struct rpcif_priv *rpc;
726 name = "rpc-if-spi";
728 name = "rpc-if-hyperflash";
736 rpc = devm_kzalloc(dev, sizeof(*rpc), GFP_KERNEL);
737 if (!rpc)
740 rpc->base = devm_platform_ioremap_resource_byname(pdev, "regs");
741 if (IS_ERR(rpc->base))
742 return PTR_ERR(rpc->base);
744 rpc->regmap = devm_regmap_init(dev, NULL, rpc, &rpcif_regmap_config);
745 if (IS_ERR(rpc->regmap)) {
747 PTR_ERR(rpc->regmap));
748 return PTR_ERR(rpc->regmap);
752 rpc->dirmap = devm_ioremap_resource(dev, res);
753 if (IS_ERR(rpc->dirmap))
754 return PTR_ERR(rpc->dirmap);
756 rpc->size = resource_size(res);
757 rpc->info = of_device_get_match_data(dev);
758 rpc->rstc = devm_reset_control_get_exclusive(dev, NULL);
759 if (IS_ERR(rpc->rstc))
760 return PTR_ERR(rpc->rstc);
767 rpc->dev = dev;
768 rpc->vdev = vdev;
769 platform_set_drvdata(pdev, rpc);
782 struct rpcif_priv *rpc = platform_get_drvdata(pdev);
784 platform_device_unregister(rpc->vdev);
788 { .compatible = "renesas,r8a7796-rpc-if", .data = &rpcif_info_r8a7796 },
789 { .compatible = "renesas,rcar-gen3-rpc-if", .data = &rpcif_info_gen3 },
790 { .compatible = "renesas,rcar-gen4-rpc-if", .data = &rpcif_info_gen4 },
791 { .compatible = "renesas,rzg2l-rpc-if", .data = &rpcif_info_rz_g2l },
800 .name = "rpc-if",