0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/bits.h>
0009 #include <linux/clk.h>
0010 #include <linux/device.h>
0011 #include <linux/err.h>
0012 #include <linux/interrupt.h>
0013 #include <linux/io.h>
0014 #include <linux/iopoll.h>
0015 #include <linux/i2c.h>
0016 #include <linux/jiffies.h>
0017 #include <linux/kernel.h>
0018 #include <linux/math64.h>
0019 #include <linux/module.h>
0020 #include <linux/mod_devicetable.h>
0021 #include <linux/platform_device.h>
0022 #include <linux/pm_runtime.h>
0023 #include <linux/reset.h>
0024
0025
0026 #define IICB0DAT 0x00
0027 #define IICB0CTL0 0x08
0028 #define IICB0TRG 0x0C
0029 #define IICB0STR0 0x10
0030 #define IICB0CTL1 0x20
0031 #define IICB0WL 0x24
0032 #define IICB0WH 0x28
0033
0034
0035 #define IICB0IICE BIT(7)
0036 #define IICB0SLWT BIT(1)
0037 #define IICB0SLAC BIT(0)
0038
0039
0040 #define IICB0WRET BIT(2)
0041 #define IICB0STT BIT(1)
0042 #define IICB0SPT BIT(0)
0043
0044
0045 #define IICB0SSAC BIT(8)
0046 #define IICB0SSBS BIT(6)
0047 #define IICB0SSSP BIT(4)
0048
0049
0050 #define IICB0MDSC BIT(7)
0051 #define IICB0SLSE BIT(1)
0052
0053 #define bit_setl(addr, val) writel(readl(addr) | (val), (addr))
0054 #define bit_clrl(addr, val) writel(readl(addr) & ~(val), (addr))
0055
0056 struct rzv2m_i2c_priv {
0057 void __iomem *base;
0058 struct i2c_adapter adap;
0059 struct clk *clk;
0060 int bus_mode;
0061 struct completion msg_tia_done;
0062 u32 iicb0wl;
0063 u32 iicb0wh;
0064 };
0065
0066 enum bcr_index {
0067 RZV2M_I2C_100K = 0,
0068 RZV2M_I2C_400K,
0069 };
0070
0071 struct bitrate_config {
0072 unsigned int percent_low;
0073 unsigned int min_hold_time_ns;
0074 };
0075
0076 static const struct bitrate_config bitrate_configs[] = {
0077 [RZV2M_I2C_100K] = { 47, 3450 },
0078 [RZV2M_I2C_400K] = { 52, 900 },
0079 };
0080
0081 static irqreturn_t rzv2m_i2c_tia_irq_handler(int this_irq, void *dev_id)
0082 {
0083 struct rzv2m_i2c_priv *priv = dev_id;
0084
0085 complete(&priv->msg_tia_done);
0086
0087 return IRQ_HANDLED;
0088 }
0089
0090
0091 static int rzv2m_i2c_clock_calculate(struct device *dev,
0092 struct rzv2m_i2c_priv *priv)
0093 {
0094 const struct bitrate_config *config;
0095 unsigned int hold_time_ns;
0096 unsigned int total_pclks;
0097 unsigned int trf_pclks;
0098 unsigned long pclk_hz;
0099 struct i2c_timings t;
0100 u32 trf_ns;
0101
0102 i2c_parse_fw_timings(dev, &t, true);
0103
0104 pclk_hz = clk_get_rate(priv->clk);
0105 total_pclks = pclk_hz / t.bus_freq_hz;
0106
0107 trf_ns = t.scl_rise_ns + t.scl_fall_ns;
0108 trf_pclks = mul_u64_u32_div(pclk_hz, trf_ns, NSEC_PER_SEC);
0109
0110
0111 switch (t.bus_freq_hz) {
0112 case I2C_MAX_FAST_MODE_FREQ:
0113 priv->bus_mode = RZV2M_I2C_400K;
0114 break;
0115 case I2C_MAX_STANDARD_MODE_FREQ:
0116 priv->bus_mode = RZV2M_I2C_100K;
0117 break;
0118 default:
0119 dev_err(dev, "transfer speed is invalid\n");
0120 return -EINVAL;
0121 }
0122 config = &bitrate_configs[priv->bus_mode];
0123
0124
0125 priv->iicb0wl = total_pclks * config->percent_low / 100;
0126 if (priv->iicb0wl > (BIT(10) - 1))
0127 return -EINVAL;
0128
0129
0130 priv->iicb0wh = total_pclks - priv->iicb0wl - trf_pclks;
0131 if (priv->iicb0wh > (BIT(10) - 1))
0132 return -EINVAL;
0133
0134
0135
0136
0137
0138
0139 hold_time_ns = div64_ul((u64)(priv->iicb0wl >> 2) * NSEC_PER_SEC, pclk_hz);
0140 if (hold_time_ns > config->min_hold_time_ns) {
0141 dev_err(dev, "data hold time %dns is over %dns\n",
0142 hold_time_ns, config->min_hold_time_ns);
0143 return -EINVAL;
0144 }
0145
0146 return 0;
0147 }
0148
0149 static void rzv2m_i2c_init(struct rzv2m_i2c_priv *priv)
0150 {
0151 u32 i2c_ctl0;
0152 u32 i2c_ctl1;
0153
0154
0155 writel(0, priv->base + IICB0CTL0);
0156
0157
0158 i2c_ctl1 = IICB0SLSE;
0159 if (priv->bus_mode == RZV2M_I2C_400K)
0160 i2c_ctl1 |= IICB0MDSC;
0161 writel(i2c_ctl1, priv->base + IICB0CTL1);
0162
0163
0164 writel(priv->iicb0wl, priv->base + IICB0WL);
0165 writel(priv->iicb0wh, priv->base + IICB0WH);
0166
0167
0168 i2c_ctl0 = IICB0SLWT | IICB0SLAC | IICB0IICE;
0169 writel(i2c_ctl0, priv->base + IICB0CTL0);
0170 }
0171
0172 static int rzv2m_i2c_write_with_ack(struct rzv2m_i2c_priv *priv, u32 data)
0173 {
0174 unsigned long time_left;
0175
0176 reinit_completion(&priv->msg_tia_done);
0177
0178 writel(data, priv->base + IICB0DAT);
0179
0180 time_left = wait_for_completion_timeout(&priv->msg_tia_done,
0181 priv->adap.timeout);
0182 if (!time_left)
0183 return -ETIMEDOUT;
0184
0185
0186 if ((readl(priv->base + IICB0STR0) & IICB0SSAC) != IICB0SSAC)
0187 return -ENXIO;
0188
0189 return 0;
0190 }
0191
0192 static int rzv2m_i2c_read_with_ack(struct rzv2m_i2c_priv *priv, u8 *data,
0193 bool last)
0194 {
0195 unsigned long time_left;
0196 u32 data_tmp;
0197
0198 reinit_completion(&priv->msg_tia_done);
0199
0200
0201 bit_clrl(priv->base + IICB0CTL0, IICB0SLWT);
0202
0203
0204 writel(IICB0WRET, priv->base + IICB0TRG);
0205
0206
0207 time_left = wait_for_completion_timeout(&priv->msg_tia_done,
0208 priv->adap.timeout);
0209 if (!time_left)
0210 return -ETIMEDOUT;
0211
0212 if (last) {
0213
0214 bit_clrl(priv->base + IICB0CTL0, IICB0SLAC);
0215
0216
0217 data_tmp = readl(priv->base + IICB0DAT);
0218
0219
0220 bit_setl(priv->base + IICB0CTL0, IICB0SLWT);
0221
0222
0223 writel(IICB0WRET, priv->base + IICB0TRG);
0224
0225
0226 time_left = wait_for_completion_timeout(&priv->msg_tia_done,
0227 priv->adap.timeout);
0228 if (!time_left)
0229 return -ETIMEDOUT;
0230
0231
0232 bit_setl(priv->base + IICB0CTL0, IICB0SLAC);
0233 } else {
0234
0235 data_tmp = readl(priv->base + IICB0DAT);
0236 }
0237
0238 *data = data_tmp;
0239
0240 return 0;
0241 }
0242
0243 static int rzv2m_i2c_send(struct rzv2m_i2c_priv *priv, struct i2c_msg *msg,
0244 unsigned int *count)
0245 {
0246 unsigned int i;
0247 int ret;
0248
0249 for (i = 0; i < msg->len; i++) {
0250 ret = rzv2m_i2c_write_with_ack(priv, msg->buf[i]);
0251 if (ret < 0)
0252 return ret;
0253 }
0254 *count = i;
0255
0256 return 0;
0257 }
0258
0259 static int rzv2m_i2c_receive(struct rzv2m_i2c_priv *priv, struct i2c_msg *msg,
0260 unsigned int *count)
0261 {
0262 unsigned int i;
0263 int ret;
0264
0265 for (i = 0; i < msg->len; i++) {
0266 ret = rzv2m_i2c_read_with_ack(priv, &msg->buf[i],
0267 (msg->len - 1) == i);
0268 if (ret < 0)
0269 return ret;
0270 }
0271 *count = i;
0272
0273 return 0;
0274 }
0275
0276 static int rzv2m_i2c_send_address(struct rzv2m_i2c_priv *priv,
0277 struct i2c_msg *msg)
0278 {
0279 u32 addr;
0280 int ret;
0281
0282 if (msg->flags & I2C_M_TEN) {
0283
0284
0285
0286
0287
0288 addr = 0xf0 | ((msg->addr & GENMASK(9, 8)) >> 7);
0289 addr |= !!(msg->flags & I2C_M_RD);
0290
0291 ret = rzv2m_i2c_write_with_ack(priv, addr);
0292 if (ret)
0293 return ret;
0294
0295
0296 ret = rzv2m_i2c_write_with_ack(priv, msg->addr & 0xff);
0297 } else {
0298
0299 addr = i2c_8bit_addr_from_msg(msg);
0300 ret = rzv2m_i2c_write_with_ack(priv, addr);
0301 }
0302
0303 return ret;
0304 }
0305
0306 static int rzv2m_i2c_stop_condition(struct rzv2m_i2c_priv *priv)
0307 {
0308 u32 value;
0309
0310
0311 writel(IICB0SPT, priv->base + IICB0TRG);
0312 return readl_poll_timeout(priv->base + IICB0STR0,
0313 value, value & IICB0SSSP,
0314 100, jiffies_to_usecs(priv->adap.timeout));
0315 }
0316
0317 static int rzv2m_i2c_master_xfer_msg(struct rzv2m_i2c_priv *priv,
0318 struct i2c_msg *msg, int stop)
0319 {
0320 unsigned int count = 0;
0321 int ret, read = !!(msg->flags & I2C_M_RD);
0322
0323
0324 writel(IICB0STT, priv->base + IICB0TRG);
0325
0326 ret = rzv2m_i2c_send_address(priv, msg);
0327 if (!ret) {
0328 if (read)
0329 ret = rzv2m_i2c_receive(priv, msg, &count);
0330 else
0331 ret = rzv2m_i2c_send(priv, msg, &count);
0332
0333 if (!ret && stop)
0334 ret = rzv2m_i2c_stop_condition(priv);
0335 }
0336
0337 if (ret == -ENXIO)
0338 rzv2m_i2c_stop_condition(priv);
0339 else if (ret < 0)
0340 rzv2m_i2c_init(priv);
0341 else
0342 ret = count;
0343
0344 return ret;
0345 }
0346
0347 static int rzv2m_i2c_master_xfer(struct i2c_adapter *adap,
0348 struct i2c_msg *msgs, int num)
0349 {
0350 struct rzv2m_i2c_priv *priv = i2c_get_adapdata(adap);
0351 struct device *dev = priv->adap.dev.parent;
0352 unsigned int i;
0353 int ret;
0354
0355 ret = pm_runtime_resume_and_get(dev);
0356 if (ret < 0)
0357 return ret;
0358
0359 if (readl(priv->base + IICB0STR0) & IICB0SSBS) {
0360 ret = -EAGAIN;
0361 goto out;
0362 }
0363
0364
0365 for (i = 0; i < num; i++) {
0366 ret = rzv2m_i2c_master_xfer_msg(priv, &msgs[i], i == (num - 1));
0367 if (ret < 0)
0368 goto out;
0369 }
0370 ret = num;
0371
0372 out:
0373 pm_runtime_mark_last_busy(dev);
0374 pm_runtime_put_autosuspend(dev);
0375
0376 return ret;
0377 }
0378
0379 static u32 rzv2m_i2c_func(struct i2c_adapter *adap)
0380 {
0381 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK) |
0382 I2C_FUNC_10BIT_ADDR;
0383 }
0384
0385 static const struct i2c_adapter_quirks rzv2m_i2c_quirks = {
0386 .flags = I2C_AQ_NO_ZERO_LEN,
0387 };
0388
0389 static struct i2c_algorithm rzv2m_i2c_algo = {
0390 .master_xfer = rzv2m_i2c_master_xfer,
0391 .functionality = rzv2m_i2c_func,
0392 };
0393
0394 static int rzv2m_i2c_probe(struct platform_device *pdev)
0395 {
0396 struct device *dev = &pdev->dev;
0397 struct rzv2m_i2c_priv *priv;
0398 struct reset_control *rstc;
0399 struct i2c_adapter *adap;
0400 struct resource *res;
0401 int irq, ret;
0402
0403 priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
0404 if (!priv)
0405 return -ENOMEM;
0406
0407 priv->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res);
0408 if (IS_ERR(priv->base))
0409 return PTR_ERR(priv->base);
0410
0411 priv->clk = devm_clk_get(dev, NULL);
0412 if (IS_ERR(priv->clk))
0413 return dev_err_probe(dev, PTR_ERR(priv->clk), "Can't get clock\n");
0414
0415 rstc = devm_reset_control_get_shared(dev, NULL);
0416 if (IS_ERR(rstc))
0417 return dev_err_probe(dev, PTR_ERR(rstc), "Missing reset ctrl\n");
0418
0419
0420
0421
0422 reset_control_deassert(rstc);
0423
0424 irq = platform_get_irq(pdev, 0);
0425 if (irq < 0)
0426 return irq;
0427
0428 ret = devm_request_irq(dev, irq, rzv2m_i2c_tia_irq_handler, 0,
0429 dev_name(dev), priv);
0430 if (ret < 0)
0431 return dev_err_probe(dev, ret, "Unable to request irq %d\n", irq);
0432
0433 adap = &priv->adap;
0434 adap->nr = pdev->id;
0435 adap->algo = &rzv2m_i2c_algo;
0436 adap->quirks = &rzv2m_i2c_quirks;
0437 adap->dev.parent = dev;
0438 adap->owner = THIS_MODULE;
0439 device_set_node(&adap->dev, dev_fwnode(dev));
0440 i2c_set_adapdata(adap, priv);
0441 strscpy(adap->name, pdev->name, sizeof(adap->name));
0442 init_completion(&priv->msg_tia_done);
0443
0444 ret = rzv2m_i2c_clock_calculate(dev, priv);
0445 if (ret < 0)
0446 return ret;
0447
0448 pm_runtime_enable(dev);
0449
0450 pm_runtime_get_sync(dev);
0451 rzv2m_i2c_init(priv);
0452 pm_runtime_put(dev);
0453
0454 platform_set_drvdata(pdev, priv);
0455
0456 ret = i2c_add_numbered_adapter(adap);
0457 if (ret < 0)
0458 pm_runtime_disable(dev);
0459
0460 return ret;
0461 }
0462
0463 static int rzv2m_i2c_remove(struct platform_device *pdev)
0464 {
0465 struct rzv2m_i2c_priv *priv = platform_get_drvdata(pdev);
0466 struct device *dev = priv->adap.dev.parent;
0467
0468 i2c_del_adapter(&priv->adap);
0469 bit_clrl(priv->base + IICB0CTL0, IICB0IICE);
0470 pm_runtime_disable(dev);
0471
0472 return 0;
0473 }
0474
0475 static int rzv2m_i2c_suspend(struct device *dev)
0476 {
0477 struct rzv2m_i2c_priv *priv = dev_get_drvdata(dev);
0478 int ret;
0479
0480 ret = pm_runtime_resume_and_get(dev);
0481 if (ret < 0)
0482 return ret;
0483
0484 bit_clrl(priv->base + IICB0CTL0, IICB0IICE);
0485 pm_runtime_put(dev);
0486
0487 return 0;
0488 }
0489
0490 static int rzv2m_i2c_resume(struct device *dev)
0491 {
0492 struct rzv2m_i2c_priv *priv = dev_get_drvdata(dev);
0493 int ret;
0494
0495 ret = rzv2m_i2c_clock_calculate(dev, priv);
0496 if (ret < 0)
0497 return ret;
0498
0499 ret = pm_runtime_resume_and_get(dev);
0500 if (ret < 0)
0501 return ret;
0502
0503 rzv2m_i2c_init(priv);
0504 pm_runtime_put(dev);
0505
0506 return 0;
0507 }
0508
0509 static const struct of_device_id rzv2m_i2c_ids[] = {
0510 { .compatible = "renesas,rzv2m-i2c" },
0511 { }
0512 };
0513 MODULE_DEVICE_TABLE(of, rzv2m_i2c_ids);
0514
0515 static const struct dev_pm_ops rzv2m_i2c_pm_ops = {
0516 SYSTEM_SLEEP_PM_OPS(rzv2m_i2c_suspend, rzv2m_i2c_resume)
0517 };
0518
0519 static struct platform_driver rzv2m_i2c_driver = {
0520 .driver = {
0521 .name = "rzv2m-i2c",
0522 .of_match_table = rzv2m_i2c_ids,
0523 .pm = pm_sleep_ptr(&rzv2m_i2c_pm_ops),
0524 },
0525 .probe = rzv2m_i2c_probe,
0526 .remove = rzv2m_i2c_remove,
0527 };
0528 module_platform_driver(rzv2m_i2c_driver);
0529
0530 MODULE_DESCRIPTION("RZ/V2M I2C bus driver");
0531 MODULE_AUTHOR("Renesas Electronics Corporation");
0532 MODULE_LICENSE("GPL");