Lines Matching defs:rpc
19 #include <memory/renesas-rpc-if.h>
171 struct rpcif *rpc = context;
176 switch (rpc->xfer_size) {
178 *val = readb(rpc->base + reg);
182 *val = readw(rpc->base + reg);
187 *val = readl(rpc->base + reg);
196 if (rpc->xfer_size != 8)
201 *val = readl(rpc->base + reg);
208 struct rpcif *rpc = context;
212 switch (rpc->xfer_size) {
214 writeb(val, rpc->base + reg);
218 writew(val, rpc->base + reg);
223 writel(val, rpc->base + reg);
231 if (rpc->xfer_size != 8)
240 writel(val, rpc->base + reg);
255 int rpcif_sw_init(struct rpcif *rpc, struct device *dev)
260 rpc->dev = dev;
263 rpc->base = devm_ioremap_resource(&pdev->dev, res);
264 if (IS_ERR(rpc->base))
265 return PTR_ERR(rpc->base);
267 rpc->regmap = devm_regmap_init(&pdev->dev, NULL, rpc, &rpcif_regmap_config);
268 if (IS_ERR(rpc->regmap)) {
271 PTR_ERR(rpc->regmap));
272 return PTR_ERR(rpc->regmap);
276 rpc->dirmap = devm_ioremap_resource(&pdev->dev, res);
277 if (IS_ERR(rpc->dirmap))
278 return PTR_ERR(rpc->dirmap);
279 rpc->size = resource_size(res);
281 rpc->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
283 return PTR_ERR_OR_ZERO(rpc->rstc);
287 void rpcif_enable_rpm(struct rpcif *rpc)
289 pm_runtime_enable(rpc->dev);
293 void rpcif_disable_rpm(struct rpcif *rpc)
295 pm_runtime_disable(rpc->dev);
299 void rpcif_hw_init(struct rpcif *rpc, bool hyperflash)
303 pm_runtime_get_sync(rpc->dev);
313 regmap_write(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_STRTIM(7) |
322 regmap_write(rpc->regmap, RPCIF_PHYOFFSET1, 0x1511144 |
324 regmap_write(rpc->regmap, RPCIF_PHYOFFSET2, 0x31 |
328 regmap_update_bits(rpc->regmap, RPCIF_PHYINT,
331 regmap_write(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_SFDE |
335 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF);
337 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy);
338 regmap_write(rpc->regmap, RPCIF_SSLDR, RPCIF_SSLDR_SPNDL(7) |
341 pm_runtime_put(rpc->dev);
343 rpc->bus_size = hyperflash ? 2 : 1;
347 static int wait_msg_xfer_end(struct rpcif *rpc)
351 return regmap_read_poll_timeout(rpc->regmap, RPCIF_CMNSR, sts,
356 static u8 rpcif_bits_set(struct rpcif *rpc, u32 nbytes)
358 if (rpc->bus_size == 2)
369 void rpcif_prepare(struct rpcif *rpc, const struct rpcif_op *op, u64 *offs,
372 rpc->smcr = 0;
373 rpc->smadr = 0;
374 rpc->enable = 0;
375 rpc->command = 0;
376 rpc->option = 0;
377 rpc->dummy = 0;
378 rpc->ddr = 0;
379 rpc->xferlen = 0;
382 rpc->enable = RPCIF_SMENR_CDE |
384 rpc->command = RPCIF_SMCMR_CMD(op->cmd.opcode);
386 rpc->ddr = RPCIF_SMDRENR_HYPE(0x5);
389 rpc->enable |= RPCIF_SMENR_OCDE |
391 rpc->command |= RPCIF_SMCMR_OCMD(op->ocmd.opcode);
395 rpc->enable |=
398 rpc->enable |= RPCIF_SMENR_ADE(0xF);
400 rpc->enable |= RPCIF_SMENR_ADE(GENMASK(
403 rpc->ddr |= RPCIF_SMDRENR_ADDRE;
406 rpc->smadr = *offs;
408 rpc->smadr = op->addr.val;
412 rpc->enable |= RPCIF_SMENR_DME;
413 rpc->dummy = RPCIF_SMDMCR_DMCYC(op->dummy.ncycles /
418 rpc->enable |= RPCIF_SMENR_OPDE(
419 rpcif_bits_set(rpc, op->option.nbytes)) |
422 rpc->ddr |= RPCIF_SMDRENR_OPDRE;
423 rpc->option = op->option.val;
426 rpc->dir = op->data.dir;
430 rpc->buffer = op->data.buf.in;
433 rpc->smcr = RPCIF_SMCR_SPIRE;
436 rpc->smcr = RPCIF_SMCR_SPIWE;
442 rpc->ddr |= RPCIF_SMDRENR_SPIDRE;
448 rpc->xferlen = nbytes;
450 rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth));
455 int rpcif_manual_xfer(struct rpcif *rpc)
457 u32 smenr, smcr, pos = 0, max = rpc->bus_size == 2 ? 8 : 4;
460 pm_runtime_get_sync(rpc->dev);
462 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
464 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
466 regmap_write(rpc->regmap, RPCIF_SMCMR, rpc->command);
467 regmap_write(rpc->regmap, RPCIF_SMOPR, rpc->option);
468 regmap_write(rpc->regmap, RPCIF_SMDMCR, rpc->dummy);
469 regmap_write(rpc->regmap, RPCIF_SMDRENR, rpc->ddr);
470 regmap_write(rpc->regmap, RPCIF_SMADR, rpc->smadr);
471 smenr = rpc->enable;
473 switch (rpc->dir) {
475 while (pos < rpc->xferlen) {
476 u32 bytes_left = rpc->xferlen - pos;
479 smcr = rpc->smcr | RPCIF_SMCR_SPIE;
486 smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes));
487 regmap_write(rpc->regmap, RPCIF_SMENR, smenr);
488 rpc->xfer_size = nbytes;
490 memcpy(data, rpc->buffer + pos, nbytes);
492 regmap_write(rpc->regmap, RPCIF_SMWDR1,
494 regmap_write(rpc->regmap, RPCIF_SMWDR0,
497 regmap_write(rpc->regmap, RPCIF_SMWDR0,
501 regmap_write(rpc->regmap, RPCIF_SMCR, smcr);
502 ret = wait_msg_xfer_end(rpc);
507 smenr = rpc->enable &
518 if (!(smenr & RPCIF_SMENR_ADE(0xF)) && rpc->dirmap) {
521 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
523 regmap_write(rpc->regmap, RPCIF_DRCR,
525 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command);
526 regmap_write(rpc->regmap, RPCIF_DREAR,
528 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option);
529 regmap_write(rpc->regmap, RPCIF_DRENR,
531 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy);
532 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr);
533 memcpy_fromio(rpc->buffer, rpc->dirmap, rpc->xferlen);
534 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF);
536 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy);
539 while (pos < rpc->xferlen) {
540 u32 bytes_left = rpc->xferlen - pos;
546 regmap_write(rpc->regmap, RPCIF_SMADR,
547 rpc->smadr + pos);
549 smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes));
550 regmap_write(rpc->regmap, RPCIF_SMENR, smenr);
551 regmap_write(rpc->regmap, RPCIF_SMCR,
552 rpc->smcr | RPCIF_SMCR_SPIE);
553 rpc->xfer_size = nbytes;
554 ret = wait_msg_xfer_end(rpc);
559 regmap_read(rpc->regmap, RPCIF_SMRDR1,
561 regmap_read(rpc->regmap, RPCIF_SMRDR0,
564 regmap_read(rpc->regmap, RPCIF_SMRDR0,
567 memcpy(rpc->buffer + pos, data, nbytes);
573 regmap_write(rpc->regmap, RPCIF_SMENR, rpc->enable);
574 regmap_write(rpc->regmap, RPCIF_SMCR,
575 rpc->smcr | RPCIF_SMCR_SPIE);
576 ret = wait_msg_xfer_end(rpc);
582 pm_runtime_put(rpc->dev);
586 if (reset_control_reset(rpc->rstc))
587 dev_err(rpc->dev, "Failed to reset HW\n");
588 rpcif_hw_init(rpc, rpc->bus_size == 2);
593 ssize_t rpcif_dirmap_read(struct rpcif *rpc, u64 offs, size_t len, void *buf)
601 pm_runtime_get_sync(rpc->dev);
603 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_MD, 0);
604 regmap_write(rpc->regmap, RPCIF_DRCR, 0);
605 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command);
606 regmap_write(rpc->regmap, RPCIF_DREAR,
608 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option);
609 regmap_write(rpc->regmap, RPCIF_DRENR,
610 rpc->enable & ~RPCIF_SMENR_SPIDE(0xF));
611 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy);
612 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr);
614 memcpy_fromio(buf, rpc->dirmap + from, len);
616 pm_runtime_put(rpc->dev);
636 name = "rpc-if-spi";
638 name = "rpc-if-hyperflash";
671 { .compatible = "renesas,rcar-gen3-rpc-if", },
680 .name = "rpc-if",