0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/clk.h>
0011 #include <linux/io.h>
0012 #include <linux/module.h>
0013 #include <linux/platform_device.h>
0014 #include <linux/of.h>
0015 #include <linux/of_device.h>
0016 #include <linux/regmap.h>
0017 #include <linux/reset.h>
0018
0019 #include <memory/renesas-rpc-if.h>
0020
0021 #define RPCIF_CMNCR 0x0000
0022 #define RPCIF_CMNCR_MD BIT(31)
0023 #define RPCIF_CMNCR_MOIIO3(val) (((val) & 0x3) << 22)
0024 #define RPCIF_CMNCR_MOIIO2(val) (((val) & 0x3) << 20)
0025 #define RPCIF_CMNCR_MOIIO1(val) (((val) & 0x3) << 18)
0026 #define RPCIF_CMNCR_MOIIO0(val) (((val) & 0x3) << 16)
0027 #define RPCIF_CMNCR_MOIIO(val) (RPCIF_CMNCR_MOIIO0(val) | RPCIF_CMNCR_MOIIO1(val) | \
0028 RPCIF_CMNCR_MOIIO2(val) | RPCIF_CMNCR_MOIIO3(val))
0029 #define RPCIF_CMNCR_IO3FV(val) (((val) & 0x3) << 14)
0030 #define RPCIF_CMNCR_IO2FV(val) (((val) & 0x3) << 12)
0031 #define RPCIF_CMNCR_IO0FV(val) (((val) & 0x3) << 8)
0032 #define RPCIF_CMNCR_IOFV(val) (RPCIF_CMNCR_IO0FV(val) | RPCIF_CMNCR_IO2FV(val) | \
0033 RPCIF_CMNCR_IO3FV(val))
0034 #define RPCIF_CMNCR_BSZ(val) (((val) & 0x3) << 0)
0035
0036 #define RPCIF_SSLDR 0x0004
0037 #define RPCIF_SSLDR_SPNDL(d) (((d) & 0x7) << 16)
0038 #define RPCIF_SSLDR_SLNDL(d) (((d) & 0x7) << 8)
0039 #define RPCIF_SSLDR_SCKDL(d) (((d) & 0x7) << 0)
0040
0041 #define RPCIF_DRCR 0x000C
0042 #define RPCIF_DRCR_SSLN BIT(24)
0043 #define RPCIF_DRCR_RBURST(v) ((((v) - 1) & 0x1F) << 16)
0044 #define RPCIF_DRCR_RCF BIT(9)
0045 #define RPCIF_DRCR_RBE BIT(8)
0046 #define RPCIF_DRCR_SSLE BIT(0)
0047
0048 #define RPCIF_DRCMR 0x0010
0049 #define RPCIF_DRCMR_CMD(c) (((c) & 0xFF) << 16)
0050 #define RPCIF_DRCMR_OCMD(c) (((c) & 0xFF) << 0)
0051
0052 #define RPCIF_DREAR 0x0014
0053 #define RPCIF_DREAR_EAV(c) (((c) & 0xF) << 16)
0054 #define RPCIF_DREAR_EAC(c) (((c) & 0x7) << 0)
0055
0056 #define RPCIF_DROPR 0x0018
0057
0058 #define RPCIF_DRENR 0x001C
0059 #define RPCIF_DRENR_CDB(o) (u32)((((o) & 0x3) << 30))
0060 #define RPCIF_DRENR_OCDB(o) (((o) & 0x3) << 28)
0061 #define RPCIF_DRENR_ADB(o) (((o) & 0x3) << 24)
0062 #define RPCIF_DRENR_OPDB(o) (((o) & 0x3) << 20)
0063 #define RPCIF_DRENR_DRDB(o) (((o) & 0x3) << 16)
0064 #define RPCIF_DRENR_DME BIT(15)
0065 #define RPCIF_DRENR_CDE BIT(14)
0066 #define RPCIF_DRENR_OCDE BIT(12)
0067 #define RPCIF_DRENR_ADE(v) (((v) & 0xF) << 8)
0068 #define RPCIF_DRENR_OPDE(v) (((v) & 0xF) << 4)
0069
0070 #define RPCIF_SMCR 0x0020
0071 #define RPCIF_SMCR_SSLKP BIT(8)
0072 #define RPCIF_SMCR_SPIRE BIT(2)
0073 #define RPCIF_SMCR_SPIWE BIT(1)
0074 #define RPCIF_SMCR_SPIE BIT(0)
0075
0076 #define RPCIF_SMCMR 0x0024
0077 #define RPCIF_SMCMR_CMD(c) (((c) & 0xFF) << 16)
0078 #define RPCIF_SMCMR_OCMD(c) (((c) & 0xFF) << 0)
0079
0080 #define RPCIF_SMADR 0x0028
0081
0082 #define RPCIF_SMOPR 0x002C
0083 #define RPCIF_SMOPR_OPD3(o) (((o) & 0xFF) << 24)
0084 #define RPCIF_SMOPR_OPD2(o) (((o) & 0xFF) << 16)
0085 #define RPCIF_SMOPR_OPD1(o) (((o) & 0xFF) << 8)
0086 #define RPCIF_SMOPR_OPD0(o) (((o) & 0xFF) << 0)
0087
0088 #define RPCIF_SMENR 0x0030
0089 #define RPCIF_SMENR_CDB(o) (((o) & 0x3) << 30)
0090 #define RPCIF_SMENR_OCDB(o) (((o) & 0x3) << 28)
0091 #define RPCIF_SMENR_ADB(o) (((o) & 0x3) << 24)
0092 #define RPCIF_SMENR_OPDB(o) (((o) & 0x3) << 20)
0093 #define RPCIF_SMENR_SPIDB(o) (((o) & 0x3) << 16)
0094 #define RPCIF_SMENR_DME BIT(15)
0095 #define RPCIF_SMENR_CDE BIT(14)
0096 #define RPCIF_SMENR_OCDE BIT(12)
0097 #define RPCIF_SMENR_ADE(v) (((v) & 0xF) << 8)
0098 #define RPCIF_SMENR_OPDE(v) (((v) & 0xF) << 4)
0099 #define RPCIF_SMENR_SPIDE(v) (((v) & 0xF) << 0)
0100
0101 #define RPCIF_SMRDR0 0x0038
0102 #define RPCIF_SMRDR1 0x003C
0103 #define RPCIF_SMWDR0 0x0040
0104 #define RPCIF_SMWDR1 0x0044
0105
0106 #define RPCIF_CMNSR 0x0048
0107 #define RPCIF_CMNSR_SSLF BIT(1)
0108 #define RPCIF_CMNSR_TEND BIT(0)
0109
0110 #define RPCIF_DRDMCR 0x0058
0111 #define RPCIF_DMDMCR_DMCYC(v) ((((v) - 1) & 0x1F) << 0)
0112
0113 #define RPCIF_DRDRENR 0x005C
0114 #define RPCIF_DRDRENR_HYPE(v) (((v) & 0x7) << 12)
0115 #define RPCIF_DRDRENR_ADDRE BIT(8)
0116 #define RPCIF_DRDRENR_OPDRE BIT(4)
0117 #define RPCIF_DRDRENR_DRDRE BIT(0)
0118
0119 #define RPCIF_SMDMCR 0x0060
0120 #define RPCIF_SMDMCR_DMCYC(v) ((((v) - 1) & 0x1F) << 0)
0121
0122 #define RPCIF_SMDRENR 0x0064
0123 #define RPCIF_SMDRENR_HYPE(v) (((v) & 0x7) << 12)
0124 #define RPCIF_SMDRENR_ADDRE BIT(8)
0125 #define RPCIF_SMDRENR_OPDRE BIT(4)
0126 #define RPCIF_SMDRENR_SPIDRE BIT(0)
0127
0128 #define RPCIF_PHYADD 0x0070
0129 #define RPCIF_PHYWR 0x0074
0130
0131 #define RPCIF_PHYCNT 0x007C
0132 #define RPCIF_PHYCNT_CAL BIT(31)
0133 #define RPCIF_PHYCNT_OCTA(v) (((v) & 0x3) << 22)
0134 #define RPCIF_PHYCNT_EXDS BIT(21)
0135 #define RPCIF_PHYCNT_OCT BIT(20)
0136 #define RPCIF_PHYCNT_DDRCAL BIT(19)
0137 #define RPCIF_PHYCNT_HS BIT(18)
0138 #define RPCIF_PHYCNT_CKSEL(v) (((v) & 0x3) << 16)
0139 #define RPCIF_PHYCNT_STRTIM(v) (((v) & 0x7) << 15)
0140 #define RPCIF_PHYCNT_WBUF2 BIT(4)
0141 #define RPCIF_PHYCNT_WBUF BIT(2)
0142 #define RPCIF_PHYCNT_PHYMEM(v) (((v) & 0x3) << 0)
0143 #define RPCIF_PHYCNT_PHYMEM_MASK GENMASK(1, 0)
0144
0145 #define RPCIF_PHYOFFSET1 0x0080
0146 #define RPCIF_PHYOFFSET1_DDRTMG(v) (((v) & 0x3) << 28)
0147
0148 #define RPCIF_PHYOFFSET2 0x0084
0149 #define RPCIF_PHYOFFSET2_OCTTMG(v) (((v) & 0x7) << 8)
0150
0151 #define RPCIF_PHYINT 0x0088
0152 #define RPCIF_PHYINT_WPVAL BIT(1)
0153
0154 static const struct regmap_range rpcif_volatile_ranges[] = {
0155 regmap_reg_range(RPCIF_SMRDR0, RPCIF_SMRDR1),
0156 regmap_reg_range(RPCIF_SMWDR0, RPCIF_SMWDR1),
0157 regmap_reg_range(RPCIF_CMNSR, RPCIF_CMNSR),
0158 };
0159
0160 static const struct regmap_access_table rpcif_volatile_table = {
0161 .yes_ranges = rpcif_volatile_ranges,
0162 .n_yes_ranges = ARRAY_SIZE(rpcif_volatile_ranges),
0163 };
0164
0165
0166
0167
0168
0169
0170 static int rpcif_reg_read(void *context, unsigned int reg, unsigned int *val)
0171 {
0172 struct rpcif *rpc = context;
0173
0174 switch (reg) {
0175 case RPCIF_SMRDR0:
0176 case RPCIF_SMWDR0:
0177 switch (rpc->xfer_size) {
0178 case 1:
0179 *val = readb(rpc->base + reg);
0180 return 0;
0181
0182 case 2:
0183 *val = readw(rpc->base + reg);
0184 return 0;
0185
0186 case 4:
0187 case 8:
0188 *val = readl(rpc->base + reg);
0189 return 0;
0190
0191 default:
0192 return -EILSEQ;
0193 }
0194
0195 case RPCIF_SMRDR1:
0196 case RPCIF_SMWDR1:
0197 if (rpc->xfer_size != 8)
0198 return -EILSEQ;
0199 break;
0200 }
0201
0202 *val = readl(rpc->base + reg);
0203 return 0;
0204 }
0205
0206 static int rpcif_reg_write(void *context, unsigned int reg, unsigned int val)
0207 {
0208 struct rpcif *rpc = context;
0209
0210 switch (reg) {
0211 case RPCIF_SMWDR0:
0212 switch (rpc->xfer_size) {
0213 case 1:
0214 writeb(val, rpc->base + reg);
0215 return 0;
0216
0217 case 2:
0218 writew(val, rpc->base + reg);
0219 return 0;
0220
0221 case 4:
0222 case 8:
0223 writel(val, rpc->base + reg);
0224 return 0;
0225
0226 default:
0227 return -EILSEQ;
0228 }
0229
0230 case RPCIF_SMWDR1:
0231 if (rpc->xfer_size != 8)
0232 return -EILSEQ;
0233 break;
0234
0235 case RPCIF_SMRDR0:
0236 case RPCIF_SMRDR1:
0237 return -EPERM;
0238 }
0239
0240 writel(val, rpc->base + reg);
0241 return 0;
0242 }
0243
0244 static const struct regmap_config rpcif_regmap_config = {
0245 .reg_bits = 32,
0246 .val_bits = 32,
0247 .reg_stride = 4,
0248 .reg_read = rpcif_reg_read,
0249 .reg_write = rpcif_reg_write,
0250 .fast_io = true,
0251 .max_register = RPCIF_PHYINT,
0252 .volatile_table = &rpcif_volatile_table,
0253 };
0254
0255 int rpcif_sw_init(struct rpcif *rpc, struct device *dev)
0256 {
0257 struct platform_device *pdev = to_platform_device(dev);
0258 struct resource *res;
0259
0260 rpc->dev = dev;
0261
0262 rpc->base = devm_platform_ioremap_resource_byname(pdev, "regs");
0263 if (IS_ERR(rpc->base))
0264 return PTR_ERR(rpc->base);
0265
0266 rpc->regmap = devm_regmap_init(&pdev->dev, NULL, rpc, &rpcif_regmap_config);
0267 if (IS_ERR(rpc->regmap)) {
0268 dev_err(&pdev->dev,
0269 "failed to init regmap for rpcif, error %ld\n",
0270 PTR_ERR(rpc->regmap));
0271 return PTR_ERR(rpc->regmap);
0272 }
0273
0274 res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "dirmap");
0275 rpc->dirmap = devm_ioremap_resource(&pdev->dev, res);
0276 if (IS_ERR(rpc->dirmap))
0277 return PTR_ERR(rpc->dirmap);
0278 rpc->size = resource_size(res);
0279
0280 rpc->type = (uintptr_t)of_device_get_match_data(dev);
0281 rpc->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL);
0282
0283 return PTR_ERR_OR_ZERO(rpc->rstc);
0284 }
0285 EXPORT_SYMBOL(rpcif_sw_init);
0286
0287 static void rpcif_rzg2l_timing_adjust_sdr(struct rpcif *rpc)
0288 {
0289 regmap_write(rpc->regmap, RPCIF_PHYWR, 0xa5390000);
0290 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000000);
0291 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00008080);
0292 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000022);
0293 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00008080);
0294 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000024);
0295 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_CKSEL(3),
0296 RPCIF_PHYCNT_CKSEL(3));
0297 regmap_write(rpc->regmap, RPCIF_PHYWR, 0x00000030);
0298 regmap_write(rpc->regmap, RPCIF_PHYADD, 0x80000032);
0299 }
0300
0301 int rpcif_hw_init(struct rpcif *rpc, bool hyperflash)
0302 {
0303 u32 dummy;
0304
0305 pm_runtime_get_sync(rpc->dev);
0306
0307 if (rpc->type == RPCIF_RZ_G2L) {
0308 int ret;
0309
0310 ret = reset_control_reset(rpc->rstc);
0311 if (ret)
0312 return ret;
0313 usleep_range(200, 300);
0314 rpcif_rzg2l_timing_adjust_sdr(rpc);
0315 }
0316
0317 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT, RPCIF_PHYCNT_PHYMEM_MASK,
0318 RPCIF_PHYCNT_PHYMEM(hyperflash ? 3 : 0));
0319
0320 if (rpc->type == RPCIF_RCAR_GEN3)
0321 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
0322 RPCIF_PHYCNT_STRTIM(7), RPCIF_PHYCNT_STRTIM(7));
0323
0324 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET1, RPCIF_PHYOFFSET1_DDRTMG(3),
0325 RPCIF_PHYOFFSET1_DDRTMG(3));
0326 regmap_update_bits(rpc->regmap, RPCIF_PHYOFFSET2, RPCIF_PHYOFFSET2_OCTTMG(7),
0327 RPCIF_PHYOFFSET2_OCTTMG(4));
0328
0329 if (hyperflash)
0330 regmap_update_bits(rpc->regmap, RPCIF_PHYINT,
0331 RPCIF_PHYINT_WPVAL, 0);
0332
0333 if (rpc->type == RPCIF_RCAR_GEN3)
0334 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
0335 RPCIF_CMNCR_MOIIO(3) | RPCIF_CMNCR_BSZ(3),
0336 RPCIF_CMNCR_MOIIO(3) |
0337 RPCIF_CMNCR_BSZ(hyperflash ? 1 : 0));
0338 else
0339 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
0340 RPCIF_CMNCR_MOIIO(3) | RPCIF_CMNCR_IOFV(3) |
0341 RPCIF_CMNCR_BSZ(3),
0342 RPCIF_CMNCR_MOIIO(1) | RPCIF_CMNCR_IOFV(2) |
0343 RPCIF_CMNCR_BSZ(hyperflash ? 1 : 0));
0344
0345
0346 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF);
0347
0348 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy);
0349 regmap_write(rpc->regmap, RPCIF_SSLDR, RPCIF_SSLDR_SPNDL(7) |
0350 RPCIF_SSLDR_SLNDL(7) | RPCIF_SSLDR_SCKDL(7));
0351
0352 pm_runtime_put(rpc->dev);
0353
0354 rpc->bus_size = hyperflash ? 2 : 1;
0355
0356 return 0;
0357 }
0358 EXPORT_SYMBOL(rpcif_hw_init);
0359
0360 static int wait_msg_xfer_end(struct rpcif *rpc)
0361 {
0362 u32 sts;
0363
0364 return regmap_read_poll_timeout(rpc->regmap, RPCIF_CMNSR, sts,
0365 sts & RPCIF_CMNSR_TEND, 0,
0366 USEC_PER_SEC);
0367 }
0368
0369 static u8 rpcif_bits_set(struct rpcif *rpc, u32 nbytes)
0370 {
0371 if (rpc->bus_size == 2)
0372 nbytes /= 2;
0373 nbytes = clamp(nbytes, 1U, 4U);
0374 return GENMASK(3, 4 - nbytes);
0375 }
0376
0377 static u8 rpcif_bit_size(u8 buswidth)
0378 {
0379 return buswidth > 4 ? 2 : ilog2(buswidth);
0380 }
0381
0382 void rpcif_prepare(struct rpcif *rpc, const struct rpcif_op *op, u64 *offs,
0383 size_t *len)
0384 {
0385 rpc->smcr = 0;
0386 rpc->smadr = 0;
0387 rpc->enable = 0;
0388 rpc->command = 0;
0389 rpc->option = 0;
0390 rpc->dummy = 0;
0391 rpc->ddr = 0;
0392 rpc->xferlen = 0;
0393
0394 if (op->cmd.buswidth) {
0395 rpc->enable = RPCIF_SMENR_CDE |
0396 RPCIF_SMENR_CDB(rpcif_bit_size(op->cmd.buswidth));
0397 rpc->command = RPCIF_SMCMR_CMD(op->cmd.opcode);
0398 if (op->cmd.ddr)
0399 rpc->ddr = RPCIF_SMDRENR_HYPE(0x5);
0400 }
0401 if (op->ocmd.buswidth) {
0402 rpc->enable |= RPCIF_SMENR_OCDE |
0403 RPCIF_SMENR_OCDB(rpcif_bit_size(op->ocmd.buswidth));
0404 rpc->command |= RPCIF_SMCMR_OCMD(op->ocmd.opcode);
0405 }
0406
0407 if (op->addr.buswidth) {
0408 rpc->enable |=
0409 RPCIF_SMENR_ADB(rpcif_bit_size(op->addr.buswidth));
0410 if (op->addr.nbytes == 4)
0411 rpc->enable |= RPCIF_SMENR_ADE(0xF);
0412 else
0413 rpc->enable |= RPCIF_SMENR_ADE(GENMASK(
0414 2, 3 - op->addr.nbytes));
0415 if (op->addr.ddr)
0416 rpc->ddr |= RPCIF_SMDRENR_ADDRE;
0417
0418 if (offs && len)
0419 rpc->smadr = *offs;
0420 else
0421 rpc->smadr = op->addr.val;
0422 }
0423
0424 if (op->dummy.buswidth) {
0425 rpc->enable |= RPCIF_SMENR_DME;
0426 rpc->dummy = RPCIF_SMDMCR_DMCYC(op->dummy.ncycles /
0427 op->dummy.buswidth);
0428 }
0429
0430 if (op->option.buswidth) {
0431 rpc->enable |= RPCIF_SMENR_OPDE(
0432 rpcif_bits_set(rpc, op->option.nbytes)) |
0433 RPCIF_SMENR_OPDB(rpcif_bit_size(op->option.buswidth));
0434 if (op->option.ddr)
0435 rpc->ddr |= RPCIF_SMDRENR_OPDRE;
0436 rpc->option = op->option.val;
0437 }
0438
0439 rpc->dir = op->data.dir;
0440 if (op->data.buswidth) {
0441 u32 nbytes;
0442
0443 rpc->buffer = op->data.buf.in;
0444 switch (op->data.dir) {
0445 case RPCIF_DATA_IN:
0446 rpc->smcr = RPCIF_SMCR_SPIRE;
0447 break;
0448 case RPCIF_DATA_OUT:
0449 rpc->smcr = RPCIF_SMCR_SPIWE;
0450 break;
0451 default:
0452 break;
0453 }
0454 if (op->data.ddr)
0455 rpc->ddr |= RPCIF_SMDRENR_SPIDRE;
0456
0457 if (offs && len)
0458 nbytes = *len;
0459 else
0460 nbytes = op->data.nbytes;
0461 rpc->xferlen = nbytes;
0462
0463 rpc->enable |= RPCIF_SMENR_SPIDB(rpcif_bit_size(op->data.buswidth));
0464 }
0465 }
0466 EXPORT_SYMBOL(rpcif_prepare);
0467
0468 int rpcif_manual_xfer(struct rpcif *rpc)
0469 {
0470 u32 smenr, smcr, pos = 0, max = rpc->bus_size == 2 ? 8 : 4;
0471 int ret = 0;
0472
0473 pm_runtime_get_sync(rpc->dev);
0474
0475 regmap_update_bits(rpc->regmap, RPCIF_PHYCNT,
0476 RPCIF_PHYCNT_CAL, RPCIF_PHYCNT_CAL);
0477 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
0478 RPCIF_CMNCR_MD, RPCIF_CMNCR_MD);
0479 regmap_write(rpc->regmap, RPCIF_SMCMR, rpc->command);
0480 regmap_write(rpc->regmap, RPCIF_SMOPR, rpc->option);
0481 regmap_write(rpc->regmap, RPCIF_SMDMCR, rpc->dummy);
0482 regmap_write(rpc->regmap, RPCIF_SMDRENR, rpc->ddr);
0483 regmap_write(rpc->regmap, RPCIF_SMADR, rpc->smadr);
0484 smenr = rpc->enable;
0485
0486 switch (rpc->dir) {
0487 case RPCIF_DATA_OUT:
0488 while (pos < rpc->xferlen) {
0489 u32 bytes_left = rpc->xferlen - pos;
0490 u32 nbytes, data[2], *p = data;
0491
0492 smcr = rpc->smcr | RPCIF_SMCR_SPIE;
0493
0494
0495 nbytes = bytes_left >= max ? max : (1 << ilog2(bytes_left));
0496 if (bytes_left > nbytes)
0497 smcr |= RPCIF_SMCR_SSLKP;
0498
0499 smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes));
0500 regmap_write(rpc->regmap, RPCIF_SMENR, smenr);
0501 rpc->xfer_size = nbytes;
0502
0503 memcpy(data, rpc->buffer + pos, nbytes);
0504 if (nbytes == 8)
0505 regmap_write(rpc->regmap, RPCIF_SMWDR1, *p++);
0506 regmap_write(rpc->regmap, RPCIF_SMWDR0, *p);
0507
0508 regmap_write(rpc->regmap, RPCIF_SMCR, smcr);
0509 ret = wait_msg_xfer_end(rpc);
0510 if (ret)
0511 goto err_out;
0512
0513 pos += nbytes;
0514 smenr = rpc->enable &
0515 ~RPCIF_SMENR_CDE & ~RPCIF_SMENR_ADE(0xF);
0516 }
0517 break;
0518 case RPCIF_DATA_IN:
0519
0520
0521
0522
0523
0524
0525 if (!(smenr & RPCIF_SMENR_ADE(0xF)) && rpc->dirmap) {
0526 u32 dummy;
0527
0528 regmap_update_bits(rpc->regmap, RPCIF_CMNCR,
0529 RPCIF_CMNCR_MD, 0);
0530 regmap_write(rpc->regmap, RPCIF_DRCR,
0531 RPCIF_DRCR_RBURST(32) | RPCIF_DRCR_RBE);
0532 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command);
0533 regmap_write(rpc->regmap, RPCIF_DREAR,
0534 RPCIF_DREAR_EAC(1));
0535 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option);
0536 regmap_write(rpc->regmap, RPCIF_DRENR,
0537 smenr & ~RPCIF_SMENR_SPIDE(0xF));
0538 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy);
0539 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr);
0540 memcpy_fromio(rpc->buffer, rpc->dirmap, rpc->xferlen);
0541 regmap_write(rpc->regmap, RPCIF_DRCR, RPCIF_DRCR_RCF);
0542
0543 regmap_read(rpc->regmap, RPCIF_DRCR, &dummy);
0544 break;
0545 }
0546 while (pos < rpc->xferlen) {
0547 u32 bytes_left = rpc->xferlen - pos;
0548 u32 nbytes, data[2], *p = data;
0549
0550
0551 nbytes = bytes_left >= max ? max : (1 << ilog2(bytes_left));
0552
0553 regmap_write(rpc->regmap, RPCIF_SMADR,
0554 rpc->smadr + pos);
0555 smenr &= ~RPCIF_SMENR_SPIDE(0xF);
0556 smenr |= RPCIF_SMENR_SPIDE(rpcif_bits_set(rpc, nbytes));
0557 regmap_write(rpc->regmap, RPCIF_SMENR, smenr);
0558 regmap_write(rpc->regmap, RPCIF_SMCR,
0559 rpc->smcr | RPCIF_SMCR_SPIE);
0560 rpc->xfer_size = nbytes;
0561 ret = wait_msg_xfer_end(rpc);
0562 if (ret)
0563 goto err_out;
0564
0565 if (nbytes == 8)
0566 regmap_read(rpc->regmap, RPCIF_SMRDR1, p++);
0567 regmap_read(rpc->regmap, RPCIF_SMRDR0, p);
0568 memcpy(rpc->buffer + pos, data, nbytes);
0569
0570 pos += nbytes;
0571 }
0572 break;
0573 default:
0574 regmap_write(rpc->regmap, RPCIF_SMENR, rpc->enable);
0575 regmap_write(rpc->regmap, RPCIF_SMCR,
0576 rpc->smcr | RPCIF_SMCR_SPIE);
0577 ret = wait_msg_xfer_end(rpc);
0578 if (ret)
0579 goto err_out;
0580 }
0581
0582 exit:
0583 pm_runtime_put(rpc->dev);
0584 return ret;
0585
0586 err_out:
0587 if (reset_control_reset(rpc->rstc))
0588 dev_err(rpc->dev, "Failed to reset HW\n");
0589 rpcif_hw_init(rpc, rpc->bus_size == 2);
0590 goto exit;
0591 }
0592 EXPORT_SYMBOL(rpcif_manual_xfer);
0593
0594 static void memcpy_fromio_readw(void *to,
0595 const void __iomem *from,
0596 size_t count)
0597 {
0598 const int maxw = (IS_ENABLED(CONFIG_64BIT)) ? 8 : 4;
0599 u8 buf[2];
0600
0601 if (count && ((unsigned long)from & 1)) {
0602 *(u16 *)buf = __raw_readw((void __iomem *)((unsigned long)from & ~1));
0603 *(u8 *)to = buf[1];
0604 from++;
0605 to++;
0606 count--;
0607 }
0608 while (count >= 2 && !IS_ALIGNED((unsigned long)from, maxw)) {
0609 *(u16 *)to = __raw_readw(from);
0610 from += 2;
0611 to += 2;
0612 count -= 2;
0613 }
0614 while (count >= maxw) {
0615 #ifdef CONFIG_64BIT
0616 *(u64 *)to = __raw_readq(from);
0617 #else
0618 *(u32 *)to = __raw_readl(from);
0619 #endif
0620 from += maxw;
0621 to += maxw;
0622 count -= maxw;
0623 }
0624 while (count >= 2) {
0625 *(u16 *)to = __raw_readw(from);
0626 from += 2;
0627 to += 2;
0628 count -= 2;
0629 }
0630 if (count) {
0631 *(u16 *)buf = __raw_readw(from);
0632 *(u8 *)to = buf[0];
0633 }
0634 }
0635
0636 ssize_t rpcif_dirmap_read(struct rpcif *rpc, u64 offs, size_t len, void *buf)
0637 {
0638 loff_t from = offs & (rpc->size - 1);
0639 size_t size = rpc->size - from;
0640
0641 if (len > size)
0642 len = size;
0643
0644 pm_runtime_get_sync(rpc->dev);
0645
0646 regmap_update_bits(rpc->regmap, RPCIF_CMNCR, RPCIF_CMNCR_MD, 0);
0647 regmap_write(rpc->regmap, RPCIF_DRCR, 0);
0648 regmap_write(rpc->regmap, RPCIF_DRCMR, rpc->command);
0649 regmap_write(rpc->regmap, RPCIF_DREAR,
0650 RPCIF_DREAR_EAV(offs >> 25) | RPCIF_DREAR_EAC(1));
0651 regmap_write(rpc->regmap, RPCIF_DROPR, rpc->option);
0652 regmap_write(rpc->regmap, RPCIF_DRENR,
0653 rpc->enable & ~RPCIF_SMENR_SPIDE(0xF));
0654 regmap_write(rpc->regmap, RPCIF_DRDMCR, rpc->dummy);
0655 regmap_write(rpc->regmap, RPCIF_DRDRENR, rpc->ddr);
0656
0657 if (rpc->bus_size == 2)
0658 memcpy_fromio_readw(buf, rpc->dirmap + from, len);
0659 else
0660 memcpy_fromio(buf, rpc->dirmap + from, len);
0661
0662 pm_runtime_put(rpc->dev);
0663
0664 return len;
0665 }
0666 EXPORT_SYMBOL(rpcif_dirmap_read);
0667
0668 static int rpcif_probe(struct platform_device *pdev)
0669 {
0670 struct platform_device *vdev;
0671 struct device_node *flash;
0672 const char *name;
0673 int ret;
0674
0675 flash = of_get_next_child(pdev->dev.of_node, NULL);
0676 if (!flash) {
0677 dev_warn(&pdev->dev, "no flash node found\n");
0678 return -ENODEV;
0679 }
0680
0681 if (of_device_is_compatible(flash, "jedec,spi-nor")) {
0682 name = "rpc-if-spi";
0683 } else if (of_device_is_compatible(flash, "cfi-flash")) {
0684 name = "rpc-if-hyperflash";
0685 } else {
0686 of_node_put(flash);
0687 dev_warn(&pdev->dev, "unknown flash type\n");
0688 return -ENODEV;
0689 }
0690 of_node_put(flash);
0691
0692 vdev = platform_device_alloc(name, pdev->id);
0693 if (!vdev)
0694 return -ENOMEM;
0695 vdev->dev.parent = &pdev->dev;
0696 platform_set_drvdata(pdev, vdev);
0697
0698 ret = platform_device_add(vdev);
0699 if (ret) {
0700 platform_device_put(vdev);
0701 return ret;
0702 }
0703
0704 return 0;
0705 }
0706
0707 static int rpcif_remove(struct platform_device *pdev)
0708 {
0709 struct platform_device *vdev = platform_get_drvdata(pdev);
0710
0711 platform_device_unregister(vdev);
0712
0713 return 0;
0714 }
0715
0716 static const struct of_device_id rpcif_of_match[] = {
0717 { .compatible = "renesas,rcar-gen3-rpc-if", .data = (void *)RPCIF_RCAR_GEN3 },
0718 { .compatible = "renesas,rzg2l-rpc-if", .data = (void *)RPCIF_RZ_G2L },
0719 {},
0720 };
0721 MODULE_DEVICE_TABLE(of, rpcif_of_match);
0722
0723 static struct platform_driver rpcif_driver = {
0724 .probe = rpcif_probe,
0725 .remove = rpcif_remove,
0726 .driver = {
0727 .name = "rpc-if",
0728 .of_match_table = rpcif_of_match,
0729 },
0730 };
0731 module_platform_driver(rpcif_driver);
0732
0733 MODULE_DESCRIPTION("Renesas RPC-IF core driver");
0734 MODULE_LICENSE("GPL v2");