0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/delay.h>
0012 #include <linux/err.h>
0013 #include <linux/errno.h>
0014 #include <linux/export.h>
0015 #include <linux/gpio/consumer.h>
0016 #include <linux/i2c.h>
0017 #include <linux/interrupt.h>
0018 #include <linux/io.h>
0019 #include <linux/module.h>
0020 #include <linux/pm_runtime.h>
0021 #include <linux/regmap.h>
0022 #include <linux/reset.h>
0023
0024 #include "i2c-designware-core.h"
0025
0026 #define AMD_TIMEOUT_MIN_US 25
0027 #define AMD_TIMEOUT_MAX_US 250
0028 #define AMD_MASTERCFG_MASK GENMASK(15, 0)
0029
0030 static void i2c_dw_configure_fifo_master(struct dw_i2c_dev *dev)
0031 {
0032
0033 regmap_write(dev->map, DW_IC_TX_TL, dev->tx_fifo_depth / 2);
0034 regmap_write(dev->map, DW_IC_RX_TL, 0);
0035
0036
0037 regmap_write(dev->map, DW_IC_CON, dev->master_cfg);
0038 }
0039
0040 static int i2c_dw_set_timings_master(struct dw_i2c_dev *dev)
0041 {
0042 u32 comp_param1;
0043 u32 sda_falling_time, scl_falling_time;
0044 struct i2c_timings *t = &dev->timings;
0045 const char *fp_str = "";
0046 u32 ic_clk;
0047 int ret;
0048
0049 ret = i2c_dw_acquire_lock(dev);
0050 if (ret)
0051 return ret;
0052
0053 ret = regmap_read(dev->map, DW_IC_COMP_PARAM_1, &comp_param1);
0054 i2c_dw_release_lock(dev);
0055 if (ret)
0056 return ret;
0057
0058
0059 sda_falling_time = t->sda_fall_ns ?: 300;
0060 scl_falling_time = t->scl_fall_ns ?: 300;
0061
0062
0063 if (!dev->ss_hcnt || !dev->ss_lcnt) {
0064 ic_clk = i2c_dw_clk_rate(dev);
0065 dev->ss_hcnt =
0066 i2c_dw_scl_hcnt(ic_clk,
0067 4000,
0068 sda_falling_time,
0069 0,
0070 0);
0071 dev->ss_lcnt =
0072 i2c_dw_scl_lcnt(ic_clk,
0073 4700,
0074 scl_falling_time,
0075 0);
0076 }
0077 dev_dbg(dev->dev, "Standard Mode HCNT:LCNT = %d:%d\n",
0078 dev->ss_hcnt, dev->ss_lcnt);
0079
0080
0081
0082
0083
0084
0085 if (t->bus_freq_hz == I2C_MAX_FAST_MODE_PLUS_FREQ) {
0086
0087
0088
0089
0090 if (dev->fp_hcnt && dev->fp_lcnt) {
0091 dev->fs_hcnt = dev->fp_hcnt;
0092 dev->fs_lcnt = dev->fp_lcnt;
0093 } else {
0094 ic_clk = i2c_dw_clk_rate(dev);
0095 dev->fs_hcnt =
0096 i2c_dw_scl_hcnt(ic_clk,
0097 260,
0098 sda_falling_time,
0099 0,
0100 0);
0101 dev->fs_lcnt =
0102 i2c_dw_scl_lcnt(ic_clk,
0103 500,
0104 scl_falling_time,
0105 0);
0106 }
0107 fp_str = " Plus";
0108 }
0109
0110
0111
0112
0113 if (!dev->fs_hcnt || !dev->fs_lcnt) {
0114 ic_clk = i2c_dw_clk_rate(dev);
0115 dev->fs_hcnt =
0116 i2c_dw_scl_hcnt(ic_clk,
0117 600,
0118 sda_falling_time,
0119 0,
0120 0);
0121 dev->fs_lcnt =
0122 i2c_dw_scl_lcnt(ic_clk,
0123 1300,
0124 scl_falling_time,
0125 0);
0126 }
0127 dev_dbg(dev->dev, "Fast Mode%s HCNT:LCNT = %d:%d\n",
0128 fp_str, dev->fs_hcnt, dev->fs_lcnt);
0129
0130
0131 if ((dev->master_cfg & DW_IC_CON_SPEED_MASK) ==
0132 DW_IC_CON_SPEED_HIGH) {
0133 if ((comp_param1 & DW_IC_COMP_PARAM_1_SPEED_MODE_MASK)
0134 != DW_IC_COMP_PARAM_1_SPEED_MODE_HIGH) {
0135 dev_err(dev->dev, "High Speed not supported!\n");
0136 t->bus_freq_hz = I2C_MAX_FAST_MODE_FREQ;
0137 dev->master_cfg &= ~DW_IC_CON_SPEED_MASK;
0138 dev->master_cfg |= DW_IC_CON_SPEED_FAST;
0139 dev->hs_hcnt = 0;
0140 dev->hs_lcnt = 0;
0141 } else if (!dev->hs_hcnt || !dev->hs_lcnt) {
0142 ic_clk = i2c_dw_clk_rate(dev);
0143 dev->hs_hcnt =
0144 i2c_dw_scl_hcnt(ic_clk,
0145 160,
0146 sda_falling_time,
0147 0,
0148 0);
0149 dev->hs_lcnt =
0150 i2c_dw_scl_lcnt(ic_clk,
0151 320,
0152 scl_falling_time,
0153 0);
0154 }
0155 dev_dbg(dev->dev, "High Speed Mode HCNT:LCNT = %d:%d\n",
0156 dev->hs_hcnt, dev->hs_lcnt);
0157 }
0158
0159 ret = i2c_dw_set_sda_hold(dev);
0160 if (ret)
0161 return ret;
0162
0163 dev_dbg(dev->dev, "Bus speed: %s\n", i2c_freq_mode_string(t->bus_freq_hz));
0164 return 0;
0165 }
0166
0167
0168
0169
0170
0171
0172
0173
0174
0175 static int i2c_dw_init_master(struct dw_i2c_dev *dev)
0176 {
0177 int ret;
0178
0179 ret = i2c_dw_acquire_lock(dev);
0180 if (ret)
0181 return ret;
0182
0183
0184 __i2c_dw_disable(dev);
0185
0186
0187 regmap_write(dev->map, DW_IC_SS_SCL_HCNT, dev->ss_hcnt);
0188 regmap_write(dev->map, DW_IC_SS_SCL_LCNT, dev->ss_lcnt);
0189
0190
0191 regmap_write(dev->map, DW_IC_FS_SCL_HCNT, dev->fs_hcnt);
0192 regmap_write(dev->map, DW_IC_FS_SCL_LCNT, dev->fs_lcnt);
0193
0194
0195 if (dev->hs_hcnt && dev->hs_lcnt) {
0196 regmap_write(dev->map, DW_IC_HS_SCL_HCNT, dev->hs_hcnt);
0197 regmap_write(dev->map, DW_IC_HS_SCL_LCNT, dev->hs_lcnt);
0198 }
0199
0200
0201 if (dev->sda_hold_time)
0202 regmap_write(dev->map, DW_IC_SDA_HOLD, dev->sda_hold_time);
0203
0204 i2c_dw_configure_fifo_master(dev);
0205 i2c_dw_release_lock(dev);
0206
0207 return 0;
0208 }
0209
0210 static void i2c_dw_xfer_init(struct dw_i2c_dev *dev)
0211 {
0212 struct i2c_msg *msgs = dev->msgs;
0213 u32 ic_con = 0, ic_tar = 0;
0214 u32 dummy;
0215
0216
0217 __i2c_dw_disable(dev);
0218
0219
0220 if (msgs[dev->msg_write_idx].flags & I2C_M_TEN) {
0221 ic_con = DW_IC_CON_10BITADDR_MASTER;
0222
0223
0224
0225
0226
0227
0228 ic_tar = DW_IC_TAR_10BITADDR_MASTER;
0229 }
0230
0231 regmap_update_bits(dev->map, DW_IC_CON, DW_IC_CON_10BITADDR_MASTER,
0232 ic_con);
0233
0234
0235
0236
0237
0238 regmap_write(dev->map, DW_IC_TAR,
0239 msgs[dev->msg_write_idx].addr | ic_tar);
0240
0241
0242 i2c_dw_disable_int(dev);
0243
0244
0245 __i2c_dw_enable(dev);
0246
0247
0248 regmap_read(dev->map, DW_IC_ENABLE_STATUS, &dummy);
0249
0250
0251 regmap_read(dev->map, DW_IC_CLR_INTR, &dummy);
0252 regmap_write(dev->map, DW_IC_INTR_MASK, DW_IC_INTR_MASTER_MASK);
0253 }
0254
0255 static int i2c_dw_check_stopbit(struct dw_i2c_dev *dev)
0256 {
0257 u32 val;
0258 int ret;
0259
0260 ret = regmap_read_poll_timeout(dev->map, DW_IC_INTR_STAT, val,
0261 !(val & DW_IC_INTR_STOP_DET),
0262 1100, 20000);
0263 if (ret)
0264 dev_err(dev->dev, "i2c timeout error %d\n", ret);
0265
0266 return ret;
0267 }
0268
0269 static int i2c_dw_status(struct dw_i2c_dev *dev)
0270 {
0271 int status;
0272
0273 status = i2c_dw_wait_bus_not_busy(dev);
0274 if (status)
0275 return status;
0276
0277 return i2c_dw_check_stopbit(dev);
0278 }
0279
0280
0281
0282
0283
0284 static int amd_i2c_dw_xfer_quirk(struct i2c_adapter *adap, struct i2c_msg *msgs, int num_msgs)
0285 {
0286 struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
0287 int msg_wrt_idx, msg_itr_lmt, buf_len, data_idx;
0288 int cmd = 0, status;
0289 u8 *tx_buf;
0290 u32 val;
0291
0292
0293
0294
0295
0296
0297 regmap_write(dev->map, AMD_UCSI_INTR_REG, AMD_UCSI_INTR_EN);
0298
0299 dev->msgs = msgs;
0300 dev->msgs_num = num_msgs;
0301 i2c_dw_xfer_init(dev);
0302 i2c_dw_disable_int(dev);
0303
0304
0305 for (msg_wrt_idx = 0; msg_wrt_idx < num_msgs; msg_wrt_idx++) {
0306 tx_buf = msgs[msg_wrt_idx].buf;
0307 buf_len = msgs[msg_wrt_idx].len;
0308
0309 if (!(msgs[msg_wrt_idx].flags & I2C_M_RD))
0310 regmap_write(dev->map, DW_IC_TX_TL, buf_len - 1);
0311
0312
0313
0314
0315
0316 for (msg_itr_lmt = buf_len; msg_itr_lmt > 0; msg_itr_lmt--) {
0317 if (msg_wrt_idx == num_msgs - 1 && msg_itr_lmt == 1)
0318 cmd |= BIT(9);
0319
0320 if (msgs[msg_wrt_idx].flags & I2C_M_RD) {
0321
0322 regmap_write(dev->map, DW_IC_DATA_CMD, 0x100);
0323 regmap_write(dev->map, DW_IC_DATA_CMD, 0x100 | cmd);
0324 if (cmd) {
0325 regmap_write(dev->map, DW_IC_TX_TL, 2 * (buf_len - 1));
0326 regmap_write(dev->map, DW_IC_RX_TL, 2 * (buf_len - 1));
0327
0328
0329
0330
0331
0332 status = i2c_dw_status(dev);
0333 if (status)
0334 return status;
0335
0336 for (data_idx = 0; data_idx < buf_len; data_idx++) {
0337 regmap_read(dev->map, DW_IC_DATA_CMD, &val);
0338 tx_buf[data_idx] = val;
0339 }
0340 status = i2c_dw_check_stopbit(dev);
0341 if (status)
0342 return status;
0343 }
0344 } else {
0345 regmap_write(dev->map, DW_IC_DATA_CMD, *tx_buf++ | cmd);
0346 usleep_range(AMD_TIMEOUT_MIN_US, AMD_TIMEOUT_MAX_US);
0347 }
0348 }
0349 status = i2c_dw_check_stopbit(dev);
0350 if (status)
0351 return status;
0352 }
0353
0354 return 0;
0355 }
0356
0357
0358
0359
0360
0361
0362
0363 static void
0364 i2c_dw_xfer_msg(struct dw_i2c_dev *dev)
0365 {
0366 struct i2c_msg *msgs = dev->msgs;
0367 u32 intr_mask;
0368 int tx_limit, rx_limit;
0369 u32 addr = msgs[dev->msg_write_idx].addr;
0370 u32 buf_len = dev->tx_buf_len;
0371 u8 *buf = dev->tx_buf;
0372 bool need_restart = false;
0373 unsigned int flr;
0374
0375 intr_mask = DW_IC_INTR_MASTER_MASK;
0376
0377 for (; dev->msg_write_idx < dev->msgs_num; dev->msg_write_idx++) {
0378 u32 flags = msgs[dev->msg_write_idx].flags;
0379
0380
0381
0382
0383
0384
0385 if (msgs[dev->msg_write_idx].addr != addr) {
0386 dev_err(dev->dev,
0387 "%s: invalid target address\n", __func__);
0388 dev->msg_err = -EINVAL;
0389 break;
0390 }
0391
0392 if (!(dev->status & STATUS_WRITE_IN_PROGRESS)) {
0393
0394 buf = msgs[dev->msg_write_idx].buf;
0395 buf_len = msgs[dev->msg_write_idx].len;
0396
0397
0398
0399
0400
0401 if ((dev->master_cfg & DW_IC_CON_RESTART_EN) &&
0402 (dev->msg_write_idx > 0))
0403 need_restart = true;
0404 }
0405
0406 regmap_read(dev->map, DW_IC_TXFLR, &flr);
0407 tx_limit = dev->tx_fifo_depth - flr;
0408
0409 regmap_read(dev->map, DW_IC_RXFLR, &flr);
0410 rx_limit = dev->rx_fifo_depth - flr;
0411
0412 while (buf_len > 0 && tx_limit > 0 && rx_limit > 0) {
0413 u32 cmd = 0;
0414
0415
0416
0417
0418
0419
0420
0421
0422
0423
0424
0425
0426
0427
0428 if (dev->msg_write_idx == dev->msgs_num - 1 &&
0429 buf_len == 1 && !(flags & I2C_M_RECV_LEN))
0430 cmd |= BIT(9);
0431
0432 if (need_restart) {
0433 cmd |= BIT(10);
0434 need_restart = false;
0435 }
0436
0437 if (msgs[dev->msg_write_idx].flags & I2C_M_RD) {
0438
0439
0440 if (dev->rx_outstanding >= dev->rx_fifo_depth)
0441 break;
0442
0443 regmap_write(dev->map, DW_IC_DATA_CMD,
0444 cmd | 0x100);
0445 rx_limit--;
0446 dev->rx_outstanding++;
0447 } else {
0448 regmap_write(dev->map, DW_IC_DATA_CMD,
0449 cmd | *buf++);
0450 }
0451 tx_limit--; buf_len--;
0452 }
0453
0454 dev->tx_buf = buf;
0455 dev->tx_buf_len = buf_len;
0456
0457
0458
0459
0460
0461
0462 if (buf_len > 0 || flags & I2C_M_RECV_LEN) {
0463
0464 dev->status |= STATUS_WRITE_IN_PROGRESS;
0465 break;
0466 } else
0467 dev->status &= ~STATUS_WRITE_IN_PROGRESS;
0468 }
0469
0470
0471
0472
0473
0474 if (dev->msg_write_idx == dev->msgs_num)
0475 intr_mask &= ~DW_IC_INTR_TX_EMPTY;
0476
0477 if (dev->msg_err)
0478 intr_mask = 0;
0479
0480 regmap_write(dev->map, DW_IC_INTR_MASK, intr_mask);
0481 }
0482
0483 static u8
0484 i2c_dw_recv_len(struct dw_i2c_dev *dev, u8 len)
0485 {
0486 struct i2c_msg *msgs = dev->msgs;
0487 u32 flags = msgs[dev->msg_read_idx].flags;
0488
0489
0490
0491
0492
0493 len += (flags & I2C_CLIENT_PEC) ? 2 : 1;
0494 dev->tx_buf_len = len - min_t(u8, len, dev->rx_outstanding);
0495 msgs[dev->msg_read_idx].len = len;
0496 msgs[dev->msg_read_idx].flags &= ~I2C_M_RECV_LEN;
0497
0498 return len;
0499 }
0500
0501 static void
0502 i2c_dw_read(struct dw_i2c_dev *dev)
0503 {
0504 struct i2c_msg *msgs = dev->msgs;
0505 unsigned int rx_valid;
0506
0507 for (; dev->msg_read_idx < dev->msgs_num; dev->msg_read_idx++) {
0508 u32 len, tmp;
0509 u8 *buf;
0510
0511 if (!(msgs[dev->msg_read_idx].flags & I2C_M_RD))
0512 continue;
0513
0514 if (!(dev->status & STATUS_READ_IN_PROGRESS)) {
0515 len = msgs[dev->msg_read_idx].len;
0516 buf = msgs[dev->msg_read_idx].buf;
0517 } else {
0518 len = dev->rx_buf_len;
0519 buf = dev->rx_buf;
0520 }
0521
0522 regmap_read(dev->map, DW_IC_RXFLR, &rx_valid);
0523
0524 for (; len > 0 && rx_valid > 0; len--, rx_valid--) {
0525 u32 flags = msgs[dev->msg_read_idx].flags;
0526
0527 regmap_read(dev->map, DW_IC_DATA_CMD, &tmp);
0528
0529 if (flags & I2C_M_RECV_LEN &&
0530 (tmp & DW_IC_DATA_CMD_DAT) <= I2C_SMBUS_BLOCK_MAX && tmp > 0) {
0531 len = i2c_dw_recv_len(dev, tmp);
0532 }
0533 *buf++ = tmp;
0534 dev->rx_outstanding--;
0535 }
0536
0537 if (len > 0) {
0538 dev->status |= STATUS_READ_IN_PROGRESS;
0539 dev->rx_buf_len = len;
0540 dev->rx_buf = buf;
0541 return;
0542 } else
0543 dev->status &= ~STATUS_READ_IN_PROGRESS;
0544 }
0545 }
0546
0547
0548
0549
0550 static int
0551 i2c_dw_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num)
0552 {
0553 struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
0554 int ret;
0555
0556 dev_dbg(dev->dev, "%s: msgs: %d\n", __func__, num);
0557
0558 pm_runtime_get_sync(dev->dev);
0559
0560
0561
0562
0563
0564
0565 if ((dev->flags & MODEL_MASK) == MODEL_AMD_NAVI_GPU) {
0566 ret = amd_i2c_dw_xfer_quirk(adap, msgs, num);
0567 goto done_nolock;
0568 }
0569
0570 reinit_completion(&dev->cmd_complete);
0571 dev->msgs = msgs;
0572 dev->msgs_num = num;
0573 dev->cmd_err = 0;
0574 dev->msg_write_idx = 0;
0575 dev->msg_read_idx = 0;
0576 dev->msg_err = 0;
0577 dev->status = STATUS_IDLE;
0578 dev->abort_source = 0;
0579 dev->rx_outstanding = 0;
0580
0581 ret = i2c_dw_acquire_lock(dev);
0582 if (ret)
0583 goto done_nolock;
0584
0585 ret = i2c_dw_wait_bus_not_busy(dev);
0586 if (ret < 0)
0587 goto done;
0588
0589
0590 i2c_dw_xfer_init(dev);
0591
0592
0593 if (!wait_for_completion_timeout(&dev->cmd_complete, adap->timeout)) {
0594 dev_err(dev->dev, "controller timed out\n");
0595
0596 i2c_recover_bus(&dev->adapter);
0597 i2c_dw_init_master(dev);
0598 ret = -ETIMEDOUT;
0599 goto done;
0600 }
0601
0602
0603
0604
0605
0606
0607
0608
0609
0610 __i2c_dw_disable_nowait(dev);
0611
0612 if (dev->msg_err) {
0613 ret = dev->msg_err;
0614 goto done;
0615 }
0616
0617
0618 if (likely(!dev->cmd_err && !dev->status)) {
0619 ret = num;
0620 goto done;
0621 }
0622
0623
0624 if (dev->cmd_err == DW_IC_ERR_TX_ABRT) {
0625 ret = i2c_dw_handle_tx_abort(dev);
0626 goto done;
0627 }
0628
0629 if (dev->status)
0630 dev_err(dev->dev,
0631 "transfer terminated early - interrupt latency too high?\n");
0632
0633 ret = -EIO;
0634
0635 done:
0636 i2c_dw_release_lock(dev);
0637
0638 done_nolock:
0639 pm_runtime_mark_last_busy(dev->dev);
0640 pm_runtime_put_autosuspend(dev->dev);
0641
0642 return ret;
0643 }
0644
0645 static const struct i2c_algorithm i2c_dw_algo = {
0646 .master_xfer = i2c_dw_xfer,
0647 .functionality = i2c_dw_func,
0648 };
0649
0650 static const struct i2c_adapter_quirks i2c_dw_quirks = {
0651 .flags = I2C_AQ_NO_ZERO_LEN,
0652 };
0653
0654 static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev)
0655 {
0656 u32 stat, dummy;
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669
0670 regmap_read(dev->map, DW_IC_INTR_STAT, &stat);
0671
0672
0673
0674
0675
0676
0677
0678
0679 if (stat & DW_IC_INTR_RX_UNDER)
0680 regmap_read(dev->map, DW_IC_CLR_RX_UNDER, &dummy);
0681 if (stat & DW_IC_INTR_RX_OVER)
0682 regmap_read(dev->map, DW_IC_CLR_RX_OVER, &dummy);
0683 if (stat & DW_IC_INTR_TX_OVER)
0684 regmap_read(dev->map, DW_IC_CLR_TX_OVER, &dummy);
0685 if (stat & DW_IC_INTR_RD_REQ)
0686 regmap_read(dev->map, DW_IC_CLR_RD_REQ, &dummy);
0687 if (stat & DW_IC_INTR_TX_ABRT) {
0688
0689
0690
0691
0692 regmap_read(dev->map, DW_IC_TX_ABRT_SOURCE, &dev->abort_source);
0693 regmap_read(dev->map, DW_IC_CLR_TX_ABRT, &dummy);
0694 }
0695 if (stat & DW_IC_INTR_RX_DONE)
0696 regmap_read(dev->map, DW_IC_CLR_RX_DONE, &dummy);
0697 if (stat & DW_IC_INTR_ACTIVITY)
0698 regmap_read(dev->map, DW_IC_CLR_ACTIVITY, &dummy);
0699 if ((stat & DW_IC_INTR_STOP_DET) &&
0700 ((dev->rx_outstanding == 0) || (stat & DW_IC_INTR_RX_FULL)))
0701 regmap_read(dev->map, DW_IC_CLR_STOP_DET, &dummy);
0702 if (stat & DW_IC_INTR_START_DET)
0703 regmap_read(dev->map, DW_IC_CLR_START_DET, &dummy);
0704 if (stat & DW_IC_INTR_GEN_CALL)
0705 regmap_read(dev->map, DW_IC_CLR_GEN_CALL, &dummy);
0706
0707 return stat;
0708 }
0709
0710
0711
0712
0713
0714 static int i2c_dw_irq_handler_master(struct dw_i2c_dev *dev)
0715 {
0716 u32 stat;
0717
0718 stat = i2c_dw_read_clear_intrbits(dev);
0719 if (stat & DW_IC_INTR_TX_ABRT) {
0720 dev->cmd_err |= DW_IC_ERR_TX_ABRT;
0721 dev->status = STATUS_IDLE;
0722 dev->rx_outstanding = 0;
0723
0724
0725
0726
0727
0728 regmap_write(dev->map, DW_IC_INTR_MASK, 0);
0729 goto tx_aborted;
0730 }
0731
0732 if (stat & DW_IC_INTR_RX_FULL)
0733 i2c_dw_read(dev);
0734
0735 if (stat & DW_IC_INTR_TX_EMPTY)
0736 i2c_dw_xfer_msg(dev);
0737
0738
0739
0740
0741
0742
0743
0744 tx_aborted:
0745 if (((stat & (DW_IC_INTR_TX_ABRT | DW_IC_INTR_STOP_DET)) || dev->msg_err) &&
0746 (dev->rx_outstanding == 0))
0747 complete(&dev->cmd_complete);
0748 else if (unlikely(dev->flags & ACCESS_INTR_MASK)) {
0749
0750 regmap_read(dev->map, DW_IC_INTR_MASK, &stat);
0751 i2c_dw_disable_int(dev);
0752 regmap_write(dev->map, DW_IC_INTR_MASK, stat);
0753 }
0754
0755 return 0;
0756 }
0757
0758 static irqreturn_t i2c_dw_isr(int this_irq, void *dev_id)
0759 {
0760 struct dw_i2c_dev *dev = dev_id;
0761 u32 stat, enabled;
0762
0763 regmap_read(dev->map, DW_IC_ENABLE, &enabled);
0764 regmap_read(dev->map, DW_IC_RAW_INTR_STAT, &stat);
0765 dev_dbg(dev->dev, "enabled=%#x stat=%#x\n", enabled, stat);
0766 if (!enabled || !(stat & ~DW_IC_INTR_ACTIVITY))
0767 return IRQ_NONE;
0768
0769 i2c_dw_irq_handler_master(dev);
0770
0771 return IRQ_HANDLED;
0772 }
0773
0774 void i2c_dw_configure_master(struct dw_i2c_dev *dev)
0775 {
0776 struct i2c_timings *t = &dev->timings;
0777
0778 dev->functionality = I2C_FUNC_10BIT_ADDR | DW_IC_DEFAULT_FUNCTIONALITY;
0779
0780 dev->master_cfg = DW_IC_CON_MASTER | DW_IC_CON_SLAVE_DISABLE |
0781 DW_IC_CON_RESTART_EN;
0782
0783 dev->mode = DW_IC_MASTER;
0784
0785 switch (t->bus_freq_hz) {
0786 case I2C_MAX_STANDARD_MODE_FREQ:
0787 dev->master_cfg |= DW_IC_CON_SPEED_STD;
0788 break;
0789 case I2C_MAX_HIGH_SPEED_MODE_FREQ:
0790 dev->master_cfg |= DW_IC_CON_SPEED_HIGH;
0791 break;
0792 default:
0793 dev->master_cfg |= DW_IC_CON_SPEED_FAST;
0794 }
0795 }
0796 EXPORT_SYMBOL_GPL(i2c_dw_configure_master);
0797
0798 static void i2c_dw_prepare_recovery(struct i2c_adapter *adap)
0799 {
0800 struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
0801
0802 i2c_dw_disable(dev);
0803 reset_control_assert(dev->rst);
0804 i2c_dw_prepare_clk(dev, false);
0805 }
0806
0807 static void i2c_dw_unprepare_recovery(struct i2c_adapter *adap)
0808 {
0809 struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
0810
0811 i2c_dw_prepare_clk(dev, true);
0812 reset_control_deassert(dev->rst);
0813 i2c_dw_init_master(dev);
0814 }
0815
0816 static int i2c_dw_init_recovery_info(struct dw_i2c_dev *dev)
0817 {
0818 struct i2c_bus_recovery_info *rinfo = &dev->rinfo;
0819 struct i2c_adapter *adap = &dev->adapter;
0820 struct gpio_desc *gpio;
0821
0822 gpio = devm_gpiod_get_optional(dev->dev, "scl", GPIOD_OUT_HIGH);
0823 if (IS_ERR_OR_NULL(gpio))
0824 return PTR_ERR_OR_ZERO(gpio);
0825
0826 rinfo->scl_gpiod = gpio;
0827
0828 gpio = devm_gpiod_get_optional(dev->dev, "sda", GPIOD_IN);
0829 if (IS_ERR(gpio))
0830 return PTR_ERR(gpio);
0831 rinfo->sda_gpiod = gpio;
0832
0833 rinfo->recover_bus = i2c_generic_scl_recovery;
0834 rinfo->prepare_recovery = i2c_dw_prepare_recovery;
0835 rinfo->unprepare_recovery = i2c_dw_unprepare_recovery;
0836 adap->bus_recovery_info = rinfo;
0837
0838 dev_info(dev->dev, "running with gpio recovery mode! scl%s",
0839 rinfo->sda_gpiod ? ",sda" : "");
0840
0841 return 0;
0842 }
0843
0844 static int amd_i2c_adap_quirk(struct dw_i2c_dev *dev)
0845 {
0846 struct i2c_adapter *adap = &dev->adapter;
0847 int ret;
0848
0849 pm_runtime_get_noresume(dev->dev);
0850 ret = i2c_add_numbered_adapter(adap);
0851 if (ret)
0852 dev_err(dev->dev, "Failed to add adapter: %d\n", ret);
0853 pm_runtime_put_noidle(dev->dev);
0854
0855 return ret;
0856 }
0857
0858 int i2c_dw_probe_master(struct dw_i2c_dev *dev)
0859 {
0860 struct i2c_adapter *adap = &dev->adapter;
0861 unsigned long irq_flags;
0862 int ret;
0863
0864 init_completion(&dev->cmd_complete);
0865
0866 dev->init = i2c_dw_init_master;
0867 dev->disable = i2c_dw_disable;
0868 dev->disable_int = i2c_dw_disable_int;
0869
0870 ret = i2c_dw_init_regmap(dev);
0871 if (ret)
0872 return ret;
0873
0874 ret = i2c_dw_set_timings_master(dev);
0875 if (ret)
0876 return ret;
0877
0878 ret = i2c_dw_set_fifo_size(dev);
0879 if (ret)
0880 return ret;
0881
0882 ret = dev->init(dev);
0883 if (ret)
0884 return ret;
0885
0886 snprintf(adap->name, sizeof(adap->name),
0887 "Synopsys DesignWare I2C adapter");
0888 adap->retries = 3;
0889 adap->algo = &i2c_dw_algo;
0890 adap->quirks = &i2c_dw_quirks;
0891 adap->dev.parent = dev->dev;
0892 i2c_set_adapdata(adap, dev);
0893
0894 if ((dev->flags & MODEL_MASK) == MODEL_AMD_NAVI_GPU)
0895 return amd_i2c_adap_quirk(dev);
0896
0897 if (dev->flags & ACCESS_NO_IRQ_SUSPEND) {
0898 irq_flags = IRQF_NO_SUSPEND;
0899 } else {
0900 irq_flags = IRQF_SHARED | IRQF_COND_SUSPEND;
0901 }
0902
0903 ret = i2c_dw_acquire_lock(dev);
0904 if (ret)
0905 return ret;
0906
0907 i2c_dw_disable_int(dev);
0908 i2c_dw_release_lock(dev);
0909
0910 ret = devm_request_irq(dev->dev, dev->irq, i2c_dw_isr, irq_flags,
0911 dev_name(dev->dev), dev);
0912 if (ret) {
0913 dev_err(dev->dev, "failure requesting irq %i: %d\n",
0914 dev->irq, ret);
0915 return ret;
0916 }
0917
0918 ret = i2c_dw_init_recovery_info(dev);
0919 if (ret)
0920 return ret;
0921
0922
0923
0924
0925
0926
0927
0928 pm_runtime_get_noresume(dev->dev);
0929 ret = i2c_add_numbered_adapter(adap);
0930 if (ret)
0931 dev_err(dev->dev, "failure adding adapter: %d\n", ret);
0932 pm_runtime_put_noidle(dev->dev);
0933
0934 return ret;
0935 }
0936 EXPORT_SYMBOL_GPL(i2c_dw_probe_master);
0937
0938 MODULE_DESCRIPTION("Synopsys DesignWare I2C bus master adapter");
0939 MODULE_LICENSE("GPL");