Lines Matching refs:rpc

172 	struct rpcif *rpc = context;  in rpcif_reg_read()  local
177 switch (rpc->xfer_size) { in rpcif_reg_read()
179 *val = readb(rpc->base + reg); in rpcif_reg_read()
183 *val = readw(rpc->base + reg); in rpcif_reg_read()
188 *val = readl(rpc->base + reg); in rpcif_reg_read()
197 if (rpc->xfer_size != 8) in rpcif_reg_read()
202 *val = readl(rpc->base + reg); in rpcif_reg_read()
208 struct rpcif *rpc = context; in rpcif_reg_write() local
212 switch (rpc->xfer_size) { in rpcif_reg_write()
214 writeb(val, rpc->base + reg); in rpcif_reg_write()
218 writew(val, rpc->base + reg); in rpcif_reg_write()
223 writel(val, rpc->base + reg); in rpcif_reg_write()
231 if (rpc->xfer_size != 8) in rpcif_reg_write()
240 writel(val, rpc->base + reg); in rpcif_reg_write()
255 int rpcif_sw_init(struct rpcif *rpc, struct device *dev) in rpcif_sw_init() argument
260 rpc->dev = dev; in rpcif_sw_init()
262 rpc->base = devm_platform_ioremap_resource_byname(pdev, "regs"); in rpcif_sw_init()
263 if (IS_ERR(rpc->base)) in rpcif_sw_init()
264 return PTR_ERR(rpc->base); in rpcif_sw_init()
266 rpc->regmap = devm_regmap_init(&pdev->dev, NULL, rpc, &rpcif_regmap_config); in rpcif_sw_init()
267 if (IS_ERR(rpc->regmap)) { in rpcif_sw_init()
270 PTR_ERR(rpc->regmap)); in rpcif_sw_init()
271 return PTR_ERR(rpc->regmap); in rpcif_sw_init()
275 rpc->dirmap = devm_ioremap_resource(&pdev->dev, res); in rpcif_sw_init()
276 if (IS_ERR(rpc->dirmap)) in rpcif_sw_init()
277 return PTR_ERR(rpc->dirmap); in rpcif_sw_init()
278 rpc->size = resource_size(res); in rpcif_sw_init()
280 rpc->type = (uintptr_t)of_device_get_match_data(dev); in rpcif_sw_init()
281 rpc->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); in rpcif_sw_init()
283 return PTR_ERR_OR_ZERO(rpc->rstc); in rpcif_sw_init()
287 static void rpcif_rzg2l_timing_adjust_sdr(struct rpcif *rpc) in rpcif_rzg2l_timing_adjust_sdr() argument
289 regmap_write(rpc->regmap, RPCIF_PHYWR, 0xa5390000); in rpcif_rzg2l_timing_adjust_sdr()
290 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000000); in rpcif_rzg2l_timing_adjust_sdr()
291 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00008080); in rpcif_rzg2l_timing_adjust_sdr()
292 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000022); in rpcif_rzg2l_timing_adjust_sdr()
293 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00008080); in rpcif_rzg2l_timing_adjust_sdr()
294 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000024); in rpcif_rzg2l_timing_adjust_sdr()
295 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_CKSEL(3), in rpcif_rzg2l_timing_adjust_sdr()
297 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00000030); in rpcif_rzg2l_timing_adjust_sdr()
298 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000032); in rpcif_rzg2l_timing_adjust_sdr()
301 int rpcif_hw_init(struct rpcif *rpc, bool hyperflash) in rpcif_hw_init() argument
305 pm_runtime_get_sync(rpc->dev); in rpcif_hw_init()
307 if (rpc->type == RPCIF_RZ_G2L) { in rpcif_hw_init()
310 ret = reset_control_reset(rpc->rstc); in rpcif_hw_init()
314 rpcif_rzg2l_timing_adjust_sdr(rpc); in rpcif_hw_init()
317 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_PHYMEM_MASK, in rpcif_hw_init()
320 if (rpc->type == RPCIF_RCAR_GEN3) in rpcif_hw_init()
321 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, in rpcif_hw_init()
324 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET1, RPCIF_PHYOFFSET1_DDRTMG(3), in rpcif_hw_init()
326 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET2, RPCIF_PHYOFFSET2_OCTTMG(7), in rpcif_hw_init()
330 regmap_update_bits(rpc->regmap, RPCIF_PHYINT, in rpcif_hw_init()
333 if (rpc->type == RPCIF_RCAR_GEN3) in rpcif_hw_init()
334 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, in rpcif_hw_init()
339 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, in rpcif_hw_init()
346 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF); in rpcif_hw_init()
348 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy); in rpcif_hw_init()
349 regmap_write(rpc->regmap, RPCIF_SSLDR, RPCIF_SSLDR_SPNDL(7) | in rpcif_hw_init()
352 pm_runtime_put(rpc->dev); in rpcif_hw_init()
354 rpc->bus_size = hyperflash ? 2 : 1; in rpcif_hw_init()
360 static int wait_msg_xfer_end(struct rpcif *rpc) in wait_msg_xfer_end() argument
364 return regmap_read_poll_timeout(rpc->regmap, RPCIF_CMNSR, sts, in wait_msg_xfer_end()
369 static u8 rpcif_bits_set(struct rpcif *rpc, u32 nbytes) in rpcif_bits_set() argument
371 if (rpc->bus_size == 2) in rpcif_bits_set()
382 void rpcif_prepare(struct rpcif *rpc, const struct rpcif_op *op, u64 *offs, in rpcif_prepare() argument
385 rpc->smcr = 0; in rpcif_prepare()
386 rpc->smadr = 0; in rpcif_prepare()
387 rpc->enable = 0; in rpcif_prepare()
388 rpc->command = 0; in rpcif_prepare()
389 rpc->option = 0; in rpcif_prepare()
390 rpc->dummy = 0; in rpcif_prepare()
391 rpc->ddr = 0; in rpcif_prepare()
392 rpc->xferlen = 0; in rpcif_prepare()
395 rpc->enable = RPCIF_SMENR_CDE | in rpcif_prepare()
397 rpc->command = RPCIF_SMCMR_CMD(op->cmd.opcode); in rpcif_prepare()
399 rpc->ddr = RPCIF_SMDRENR_HYPE(0x5); in rpcif_prepare()
402 rpc->enable |= RPCIF_SMENR_OCDE | in rpcif_prepare()
404 rpc->command |= RPCIF_SMCMR_OCMD(op->ocmd.opcode); in rpcif_prepare()
408 rpc->enable |= in rpcif_prepare()
411 rpc->enable |= RPCIF_SMENR_ADE(0xF); in rpcif_prepare()
413 rpc->enable |= RPCIF_SMENR_ADE(GENMASK( in rpcif_prepare()
416 rpc->ddr |= RPCIF_SMDRENR_ADDRE; in rpcif_prepare()
419 rpc->smadr = *offs; in rpcif_prepare()
421 rpc->smadr = op->addr.val; in rpcif_prepare()
425 rpc->enable |= RPCIF_SMENR_DME; in rpcif_prepare()
426 rpc->dummy = RPCIF_SMDMCR_DMCYC(op->dummy.ncycles / in rpcif_prepare()
431 rpc->enable |= RPCIF_SMENR_OPDE( in rpcif_prepare()
432 rpcif_bits_set(rpc, op->option.nbytes)) | in rpcif_prepare()
435 rpc->ddr |= RPCIF_SMDRENR_OPDRE; in rpcif_prepare()
436 rpc->option = op->option.val; in rpcif_prepare()
439 rpc->dir = op->data.dir; in rpcif_prepare()
443 rpc->buffer = op->data.buf.in; in rpcif_prepare()
446 rpc->smcr = RPCIF_SMCR_SPIRE; in rpcif_prepare()
449 rpc->smcr = RPCIF_SMCR_SPIWE; in rpcif_prepare()
455 rpc->ddr |= RPCIF_SMDRENR_SPIDRE; in rpcif_prepare()
461 rpc->xferlen = nbytes; in rpcif_prepare()
463 rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth)); in rpcif_prepare()
468 int rpcif_manual_xfer(struct rpcif *rpc) in rpcif_manual_xfer() argument
470 u32 smenr, smcr, pos = 0, max = rpc->bus_size == 2 ? 8 : 4; in rpcif_manual_xfer()
473 pm_runtime_get_sync(rpc->dev); in rpcif_manual_xfer()
475 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, in rpcif_manual_xfer()
477 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, in rpcif_manual_xfer()
479 regmap_write(rpc->regmap, RPCIF_SMCMR, rpc->command); in rpcif_manual_xfer()
480 regmap_write(rpc->regmap, RPCIF_SMOPR, rpc->option); in rpcif_manual_xfer()
481 regmap_write(rpc->regmap, RPCIF_SMDMCR, rpc->dummy); in rpcif_manual_xfer()
482 regmap_write(rpc->regmap, RPCIF_SMDRENR, rpc->ddr); in rpcif_manual_xfer()
483 regmap_write(rpc->regmap, RPCIF_SMADR, rpc->smadr); in rpcif_manual_xfer()
484 smenr = rpc->enable; in rpcif_manual_xfer()
486 switch (rpc->dir) { in rpcif_manual_xfer()
488 while (pos < rpc->xferlen) { in rpcif_manual_xfer()
489 u32 bytes_left = rpc->xferlen - pos; in rpcif_manual_xfer()
492 smcr = rpc->smcr | RPCIF_SMCR_SPIE; in rpcif_manual_xfer()
499 smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes)); in rpcif_manual_xfer()
500 regmap_write(rpc->regmap, RPCIF_SMENR, smenr); in rpcif_manual_xfer()
501 rpc->xfer_size = nbytes; in rpcif_manual_xfer()
503 memcpy(data, rpc->buffer + pos, nbytes); in rpcif_manual_xfer()
505 regmap_write(rpc->regmap, RPCIF_SMWDR1, *p++); in rpcif_manual_xfer()
506 regmap_write(rpc->regmap, RPCIF_SMWDR0, *p); in rpcif_manual_xfer()
508 regmap_write(rpc->regmap, RPCIF_SMCR, smcr); in rpcif_manual_xfer()
509 ret = wait_msg_xfer_end(rpc); in rpcif_manual_xfer()
514 smenr = rpc->enable & in rpcif_manual_xfer()
525 if (!(smenr & RPCIF_SMENR_ADE(0xF)) && rpc->dirmap) { in rpcif_manual_xfer()
528 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, in rpcif_manual_xfer()
530 regmap_write(rpc->regmap, RPCIF_DRCR, in rpcif_manual_xfer()
532 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command); in rpcif_manual_xfer()
533 regmap_write(rpc->regmap, RPCIF_DREAR, in rpcif_manual_xfer()
535 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option); in rpcif_manual_xfer()
536 regmap_write(rpc->regmap, RPCIF_DRENR, in rpcif_manual_xfer()
538 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy); in rpcif_manual_xfer()
539 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr); in rpcif_manual_xfer()
540 memcpy_fromio(rpc->buffer, rpc->dirmap, rpc->xferlen); in rpcif_manual_xfer()
541 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF); in rpcif_manual_xfer()
543 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy); in rpcif_manual_xfer()
546 while (pos < rpc->xferlen) { in rpcif_manual_xfer()
547 u32 bytes_left = rpc->xferlen - pos; in rpcif_manual_xfer()
553 regmap_write(rpc->regmap, RPCIF_SMADR, in rpcif_manual_xfer()
554 rpc->smadr + pos); in rpcif_manual_xfer()
556 smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes)); in rpcif_manual_xfer()
557 regmap_write(rpc->regmap, RPCIF_SMENR, smenr); in rpcif_manual_xfer()
558 regmap_write(rpc->regmap, RPCIF_SMCR, in rpcif_manual_xfer()
559 rpc->smcr | RPCIF_SMCR_SPIE); in rpcif_manual_xfer()
560 rpc->xfer_size = nbytes; in rpcif_manual_xfer()
561 ret = wait_msg_xfer_end(rpc); in rpcif_manual_xfer()
566 regmap_read(rpc->regmap, RPCIF_SMRDR1, p++); in rpcif_manual_xfer()
567 regmap_read(rpc->regmap, RPCIF_SMRDR0, p); in rpcif_manual_xfer()
568 memcpy(rpc->buffer + pos, data, nbytes); in rpcif_manual_xfer()
574 regmap_write(rpc->regmap, RPCIF_SMENR, rpc->enable); in rpcif_manual_xfer()
575 regmap_write(rpc->regmap, RPCIF_SMCR, in rpcif_manual_xfer()
576 rpc->smcr | RPCIF_SMCR_SPIE); in rpcif_manual_xfer()
577 ret = wait_msg_xfer_end(rpc); in rpcif_manual_xfer()
583 pm_runtime_put(rpc->dev); in rpcif_manual_xfer()
587 if (reset_control_reset(rpc->rstc)) in rpcif_manual_xfer()
588 dev_err(rpc->dev, "Failed to reset HW\n"); in rpcif_manual_xfer()
589 rpcif_hw_init(rpc, rpc->bus_size == 2); in rpcif_manual_xfer()
636 ssize_t rpcif_dirmap_read(struct rpcif *rpc, u64 offs, size_t len, void *buf) in rpcif_dirmap_read() argument
638 loff_t from = offs & (rpc->size - 1); in rpcif_dirmap_read()
639 size_t size = rpc->size - from; in rpcif_dirmap_read()
644 pm_runtime_get_sync(rpc->dev); in rpcif_dirmap_read()
646 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_MD, 0); in rpcif_dirmap_read()
647 regmap_write(rpc->regmap, RPCIF_DRCR, 0); in rpcif_dirmap_read()
648 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command); in rpcif_dirmap_read()
649 regmap_write(rpc->regmap, RPCIF_DREAR, in rpcif_dirmap_read()
651 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option); in rpcif_dirmap_read()
652 regmap_write(rpc->regmap, RPCIF_DRENR, in rpcif_dirmap_read()
653 rpc->enable & ~RPCIF_SMENR_SPIDE(0xF)); in rpcif_dirmap_read()
654 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy); in rpcif_dirmap_read()
655 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr); in rpcif_dirmap_read()
657 if (rpc->bus_size == 2) in rpcif_dirmap_read()
658 memcpy_fromio_readw(buf, rpc->dirmap + from, len); in rpcif_dirmap_read()
660 memcpy_fromio(buf, rpc->dirmap + from, len); in rpcif_dirmap_read()
662 pm_runtime_put(rpc->dev); in rpcif_dirmap_read()