0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/kernel.h>
0009 #include <linux/module.h>
0010
0011 #include <linux/i2c.h>
0012 #include <linux/time.h>
0013 #include <linux/interrupt.h>
0014 #include <linux/delay.h>
0015 #include <linux/errno.h>
0016 #include <linux/err.h>
0017 #include <linux/platform_device.h>
0018 #include <linux/clk.h>
0019 #include <linux/slab.h>
0020 #include <linux/io.h>
0021 #include <linux/of_address.h>
0022 #include <linux/of_device.h>
0023 #include <linux/of_irq.h>
0024 #include <linux/spinlock.h>
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 #define HSI2C_CTL 0x00
0040 #define HSI2C_FIFO_CTL 0x04
0041 #define HSI2C_TRAILIG_CTL 0x08
0042 #define HSI2C_CLK_CTL 0x0C
0043 #define HSI2C_CLK_SLOT 0x10
0044 #define HSI2C_INT_ENABLE 0x20
0045 #define HSI2C_INT_STATUS 0x24
0046 #define HSI2C_ERR_STATUS 0x2C
0047 #define HSI2C_FIFO_STATUS 0x30
0048 #define HSI2C_TX_DATA 0x34
0049 #define HSI2C_RX_DATA 0x38
0050 #define HSI2C_CONF 0x40
0051 #define HSI2C_AUTO_CONF 0x44
0052 #define HSI2C_TIMEOUT 0x48
0053 #define HSI2C_MANUAL_CMD 0x4C
0054 #define HSI2C_TRANS_STATUS 0x50
0055 #define HSI2C_TIMING_HS1 0x54
0056 #define HSI2C_TIMING_HS2 0x58
0057 #define HSI2C_TIMING_HS3 0x5C
0058 #define HSI2C_TIMING_FS1 0x60
0059 #define HSI2C_TIMING_FS2 0x64
0060 #define HSI2C_TIMING_FS3 0x68
0061 #define HSI2C_TIMING_SLA 0x6C
0062 #define HSI2C_ADDR 0x70
0063
0064
0065 #define HSI2C_FUNC_MODE_I2C (1u << 0)
0066 #define HSI2C_MASTER (1u << 3)
0067 #define HSI2C_RXCHON (1u << 6)
0068 #define HSI2C_TXCHON (1u << 7)
0069 #define HSI2C_SW_RST (1u << 31)
0070
0071
0072 #define HSI2C_RXFIFO_EN (1u << 0)
0073 #define HSI2C_TXFIFO_EN (1u << 1)
0074 #define HSI2C_RXFIFO_TRIGGER_LEVEL(x) ((x) << 4)
0075 #define HSI2C_TXFIFO_TRIGGER_LEVEL(x) ((x) << 16)
0076
0077
0078 #define HSI2C_TRAILING_COUNT (0xf)
0079
0080
0081 #define HSI2C_INT_TX_ALMOSTEMPTY_EN (1u << 0)
0082 #define HSI2C_INT_RX_ALMOSTFULL_EN (1u << 1)
0083 #define HSI2C_INT_TRAILING_EN (1u << 6)
0084
0085
0086 #define HSI2C_INT_TX_ALMOSTEMPTY (1u << 0)
0087 #define HSI2C_INT_RX_ALMOSTFULL (1u << 1)
0088 #define HSI2C_INT_TX_UNDERRUN (1u << 2)
0089 #define HSI2C_INT_TX_OVERRUN (1u << 3)
0090 #define HSI2C_INT_RX_UNDERRUN (1u << 4)
0091 #define HSI2C_INT_RX_OVERRUN (1u << 5)
0092 #define HSI2C_INT_TRAILING (1u << 6)
0093 #define HSI2C_INT_I2C (1u << 9)
0094
0095 #define HSI2C_INT_TRANS_DONE (1u << 7)
0096 #define HSI2C_INT_TRANS_ABORT (1u << 8)
0097 #define HSI2C_INT_NO_DEV_ACK (1u << 9)
0098 #define HSI2C_INT_NO_DEV (1u << 10)
0099 #define HSI2C_INT_TIMEOUT (1u << 11)
0100 #define HSI2C_INT_I2C_TRANS (HSI2C_INT_TRANS_DONE | \
0101 HSI2C_INT_TRANS_ABORT | \
0102 HSI2C_INT_NO_DEV_ACK | \
0103 HSI2C_INT_NO_DEV | \
0104 HSI2C_INT_TIMEOUT)
0105
0106
0107 #define HSI2C_RX_FIFO_EMPTY (1u << 24)
0108 #define HSI2C_RX_FIFO_FULL (1u << 23)
0109 #define HSI2C_RX_FIFO_LVL(x) ((x >> 16) & 0x7f)
0110 #define HSI2C_TX_FIFO_EMPTY (1u << 8)
0111 #define HSI2C_TX_FIFO_FULL (1u << 7)
0112 #define HSI2C_TX_FIFO_LVL(x) ((x >> 0) & 0x7f)
0113
0114
0115 #define HSI2C_AUTO_MODE (1u << 31)
0116 #define HSI2C_10BIT_ADDR_MODE (1u << 30)
0117 #define HSI2C_HS_MODE (1u << 29)
0118
0119
0120 #define HSI2C_READ_WRITE (1u << 16)
0121 #define HSI2C_STOP_AFTER_TRANS (1u << 17)
0122 #define HSI2C_MASTER_RUN (1u << 31)
0123
0124
0125 #define HSI2C_TIMEOUT_EN (1u << 31)
0126 #define HSI2C_TIMEOUT_MASK 0xff
0127
0128
0129 #define HSI2C_CMD_READ_DATA (1u << 4)
0130 #define HSI2C_CMD_SEND_STOP (1u << 2)
0131
0132
0133 #define HSI2C_MASTER_BUSY (1u << 17)
0134 #define HSI2C_SLAVE_BUSY (1u << 16)
0135
0136
0137 #define HSI2C_TIMEOUT_AUTO (1u << 4)
0138 #define HSI2C_NO_DEV (1u << 3)
0139 #define HSI2C_NO_DEV_ACK (1u << 2)
0140 #define HSI2C_TRANS_ABORT (1u << 1)
0141 #define HSI2C_TRANS_DONE (1u << 0)
0142
0143
0144 #define HSI2C_MASTER_ST_MASK 0xf
0145 #define HSI2C_MASTER_ST_IDLE 0x0
0146 #define HSI2C_MASTER_ST_START 0x1
0147 #define HSI2C_MASTER_ST_RESTART 0x2
0148 #define HSI2C_MASTER_ST_STOP 0x3
0149 #define HSI2C_MASTER_ST_MASTER_ID 0x4
0150 #define HSI2C_MASTER_ST_ADDR0 0x5
0151 #define HSI2C_MASTER_ST_ADDR1 0x6
0152 #define HSI2C_MASTER_ST_ADDR2 0x7
0153 #define HSI2C_MASTER_ST_ADDR_SR 0x8
0154 #define HSI2C_MASTER_ST_READ 0x9
0155 #define HSI2C_MASTER_ST_WRITE 0xa
0156 #define HSI2C_MASTER_ST_NO_ACK 0xb
0157 #define HSI2C_MASTER_ST_LOSE 0xc
0158 #define HSI2C_MASTER_ST_WAIT 0xd
0159 #define HSI2C_MASTER_ST_WAIT_CMD 0xe
0160
0161
0162 #define HSI2C_SLV_ADDR_SLV(x) ((x & 0x3ff) << 0)
0163 #define HSI2C_SLV_ADDR_MAS(x) ((x & 0x3ff) << 10)
0164 #define HSI2C_MASTER_ID(x) ((x & 0xff) << 24)
0165 #define MASTER_ID(x) ((x & 0x7) + 0x08)
0166
0167 #define EXYNOS5_I2C_TIMEOUT (msecs_to_jiffies(100))
0168
0169 enum i2c_type_exynos {
0170 I2C_TYPE_EXYNOS5,
0171 I2C_TYPE_EXYNOS7,
0172 I2C_TYPE_EXYNOSAUTOV9,
0173 };
0174
0175 struct exynos5_i2c {
0176 struct i2c_adapter adap;
0177
0178 struct i2c_msg *msg;
0179 struct completion msg_complete;
0180 unsigned int msg_ptr;
0181
0182 unsigned int irq;
0183
0184 void __iomem *regs;
0185 struct clk *clk;
0186 struct clk *pclk;
0187 struct device *dev;
0188 int state;
0189
0190 spinlock_t lock;
0191
0192
0193
0194
0195
0196
0197 int trans_done;
0198
0199
0200 unsigned int op_clock;
0201
0202
0203 const struct exynos_hsi2c_variant *variant;
0204 };
0205
0206
0207
0208
0209
0210
0211
0212
0213
0214
0215 struct exynos_hsi2c_variant {
0216 unsigned int fifo_depth;
0217 enum i2c_type_exynos hw;
0218 };
0219
0220 static const struct exynos_hsi2c_variant exynos5250_hsi2c_data = {
0221 .fifo_depth = 64,
0222 .hw = I2C_TYPE_EXYNOS5,
0223 };
0224
0225 static const struct exynos_hsi2c_variant exynos5260_hsi2c_data = {
0226 .fifo_depth = 16,
0227 .hw = I2C_TYPE_EXYNOS5,
0228 };
0229
0230 static const struct exynos_hsi2c_variant exynos7_hsi2c_data = {
0231 .fifo_depth = 16,
0232 .hw = I2C_TYPE_EXYNOS7,
0233 };
0234
0235 static const struct exynos_hsi2c_variant exynosautov9_hsi2c_data = {
0236 .fifo_depth = 64,
0237 .hw = I2C_TYPE_EXYNOSAUTOV9,
0238 };
0239
0240 static const struct of_device_id exynos5_i2c_match[] = {
0241 {
0242 .compatible = "samsung,exynos5-hsi2c",
0243 .data = &exynos5250_hsi2c_data
0244 }, {
0245 .compatible = "samsung,exynos5250-hsi2c",
0246 .data = &exynos5250_hsi2c_data
0247 }, {
0248 .compatible = "samsung,exynos5260-hsi2c",
0249 .data = &exynos5260_hsi2c_data
0250 }, {
0251 .compatible = "samsung,exynos7-hsi2c",
0252 .data = &exynos7_hsi2c_data
0253 }, {
0254 .compatible = "samsung,exynosautov9-hsi2c",
0255 .data = &exynosautov9_hsi2c_data
0256 }, {},
0257 };
0258 MODULE_DEVICE_TABLE(of, exynos5_i2c_match);
0259
0260 static void exynos5_i2c_clr_pend_irq(struct exynos5_i2c *i2c)
0261 {
0262 writel(readl(i2c->regs + HSI2C_INT_STATUS),
0263 i2c->regs + HSI2C_INT_STATUS);
0264 }
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276 static int exynos5_i2c_set_timing(struct exynos5_i2c *i2c, bool hs_timings)
0277 {
0278 u32 i2c_timing_s1;
0279 u32 i2c_timing_s2;
0280 u32 i2c_timing_s3;
0281 u32 i2c_timing_sla;
0282 unsigned int t_start_su, t_start_hd;
0283 unsigned int t_stop_su;
0284 unsigned int t_data_su, t_data_hd;
0285 unsigned int t_scl_l, t_scl_h;
0286 unsigned int t_sr_release;
0287 unsigned int t_ftl_cycle;
0288 unsigned int clkin = clk_get_rate(i2c->clk);
0289 unsigned int op_clk = hs_timings ? i2c->op_clock :
0290 (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ) ? I2C_MAX_STANDARD_MODE_FREQ :
0291 i2c->op_clock;
0292 int div, clk_cycle, temp;
0293
0294
0295
0296
0297
0298
0299
0300
0301
0302
0303
0304
0305
0306
0307
0308 if (i2c->variant->hw == I2C_TYPE_EXYNOSAUTOV9) {
0309 div = ((clkin / (16 * i2c->op_clock)) - 1);
0310 i2c_timing_s3 = div << 16;
0311 if (hs_timings)
0312 writel(i2c_timing_s3, i2c->regs + HSI2C_TIMING_HS3);
0313 else
0314 writel(i2c_timing_s3, i2c->regs + HSI2C_TIMING_FS3);
0315
0316 return 0;
0317 }
0318
0319
0320
0321
0322
0323
0324
0325
0326
0327
0328
0329
0330
0331
0332
0333
0334 t_ftl_cycle = (readl(i2c->regs + HSI2C_CONF) >> 16) & 0x7;
0335 temp = clkin / op_clk - 8 - t_ftl_cycle;
0336 if (i2c->variant->hw != I2C_TYPE_EXYNOS7)
0337 temp -= t_ftl_cycle;
0338 div = temp / 512;
0339 clk_cycle = temp / (div + 1) - 2;
0340 if (temp < 4 || div >= 256 || clk_cycle < 2) {
0341 dev_err(i2c->dev, "%s clock set-up failed\n",
0342 hs_timings ? "HS" : "FS");
0343 return -EINVAL;
0344 }
0345
0346 t_scl_l = clk_cycle / 2;
0347 t_scl_h = clk_cycle / 2;
0348 t_start_su = t_scl_l;
0349 t_start_hd = t_scl_l;
0350 t_stop_su = t_scl_l;
0351 t_data_su = t_scl_l / 2;
0352 t_data_hd = t_scl_l / 2;
0353 t_sr_release = clk_cycle;
0354
0355 i2c_timing_s1 = t_start_su << 24 | t_start_hd << 16 | t_stop_su << 8;
0356 i2c_timing_s2 = t_data_su << 24 | t_scl_l << 8 | t_scl_h << 0;
0357 i2c_timing_s3 = div << 16 | t_sr_release << 0;
0358 i2c_timing_sla = t_data_hd << 0;
0359
0360 dev_dbg(i2c->dev, "tSTART_SU: %X, tSTART_HD: %X, tSTOP_SU: %X\n",
0361 t_start_su, t_start_hd, t_stop_su);
0362 dev_dbg(i2c->dev, "tDATA_SU: %X, tSCL_L: %X, tSCL_H: %X\n",
0363 t_data_su, t_scl_l, t_scl_h);
0364 dev_dbg(i2c->dev, "nClkDiv: %X, tSR_RELEASE: %X\n",
0365 div, t_sr_release);
0366 dev_dbg(i2c->dev, "tDATA_HD: %X\n", t_data_hd);
0367
0368 if (hs_timings) {
0369 writel(i2c_timing_s1, i2c->regs + HSI2C_TIMING_HS1);
0370 writel(i2c_timing_s2, i2c->regs + HSI2C_TIMING_HS2);
0371 writel(i2c_timing_s3, i2c->regs + HSI2C_TIMING_HS3);
0372 } else {
0373 writel(i2c_timing_s1, i2c->regs + HSI2C_TIMING_FS1);
0374 writel(i2c_timing_s2, i2c->regs + HSI2C_TIMING_FS2);
0375 writel(i2c_timing_s3, i2c->regs + HSI2C_TIMING_FS3);
0376 }
0377 writel(i2c_timing_sla, i2c->regs + HSI2C_TIMING_SLA);
0378
0379 return 0;
0380 }
0381
0382 static int exynos5_hsi2c_clock_setup(struct exynos5_i2c *i2c)
0383 {
0384
0385 int ret = exynos5_i2c_set_timing(i2c, false);
0386
0387 if (ret < 0 || i2c->op_clock < I2C_MAX_FAST_MODE_PLUS_FREQ)
0388 return ret;
0389
0390 return exynos5_i2c_set_timing(i2c, true);
0391 }
0392
0393
0394
0395
0396
0397 static void exynos5_i2c_init(struct exynos5_i2c *i2c)
0398 {
0399 u32 i2c_conf = readl(i2c->regs + HSI2C_CONF);
0400 u32 i2c_timeout = readl(i2c->regs + HSI2C_TIMEOUT);
0401
0402
0403 i2c_timeout &= ~HSI2C_TIMEOUT_EN;
0404 writel(i2c_timeout, i2c->regs + HSI2C_TIMEOUT);
0405
0406 writel((HSI2C_FUNC_MODE_I2C | HSI2C_MASTER),
0407 i2c->regs + HSI2C_CTL);
0408 writel(HSI2C_TRAILING_COUNT, i2c->regs + HSI2C_TRAILIG_CTL);
0409
0410 if (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ) {
0411 writel(HSI2C_MASTER_ID(MASTER_ID(i2c->adap.nr)),
0412 i2c->regs + HSI2C_ADDR);
0413 i2c_conf |= HSI2C_HS_MODE;
0414 }
0415
0416 writel(i2c_conf | HSI2C_AUTO_MODE, i2c->regs + HSI2C_CONF);
0417 }
0418
0419 static void exynos5_i2c_reset(struct exynos5_i2c *i2c)
0420 {
0421 u32 i2c_ctl;
0422
0423
0424 i2c_ctl = readl(i2c->regs + HSI2C_CTL);
0425 i2c_ctl |= HSI2C_SW_RST;
0426 writel(i2c_ctl, i2c->regs + HSI2C_CTL);
0427
0428 i2c_ctl = readl(i2c->regs + HSI2C_CTL);
0429 i2c_ctl &= ~HSI2C_SW_RST;
0430 writel(i2c_ctl, i2c->regs + HSI2C_CTL);
0431
0432
0433 exynos5_hsi2c_clock_setup(i2c);
0434
0435 exynos5_i2c_init(i2c);
0436 }
0437
0438
0439
0440
0441
0442
0443
0444
0445 static irqreturn_t exynos5_i2c_irq(int irqno, void *dev_id)
0446 {
0447 struct exynos5_i2c *i2c = dev_id;
0448 u32 fifo_level, int_status, fifo_status, trans_status;
0449 unsigned char byte;
0450 int len = 0;
0451
0452 i2c->state = -EINVAL;
0453
0454 spin_lock(&i2c->lock);
0455
0456 int_status = readl(i2c->regs + HSI2C_INT_STATUS);
0457 writel(int_status, i2c->regs + HSI2C_INT_STATUS);
0458
0459
0460 switch (i2c->variant->hw) {
0461 case I2C_TYPE_EXYNOSAUTOV9:
0462 fallthrough;
0463 case I2C_TYPE_EXYNOS7:
0464 if (int_status & HSI2C_INT_TRANS_DONE) {
0465 i2c->trans_done = 1;
0466 i2c->state = 0;
0467 } else if (int_status & HSI2C_INT_TRANS_ABORT) {
0468 dev_dbg(i2c->dev, "Deal with arbitration lose\n");
0469 i2c->state = -EAGAIN;
0470 goto stop;
0471 } else if (int_status & HSI2C_INT_NO_DEV_ACK) {
0472 dev_dbg(i2c->dev, "No ACK from device\n");
0473 i2c->state = -ENXIO;
0474 goto stop;
0475 } else if (int_status & HSI2C_INT_NO_DEV) {
0476 dev_dbg(i2c->dev, "No device\n");
0477 i2c->state = -ENXIO;
0478 goto stop;
0479 } else if (int_status & HSI2C_INT_TIMEOUT) {
0480 dev_dbg(i2c->dev, "Accessing device timed out\n");
0481 i2c->state = -ETIMEDOUT;
0482 goto stop;
0483 }
0484
0485 break;
0486 case I2C_TYPE_EXYNOS5:
0487 if (!(int_status & HSI2C_INT_I2C))
0488 break;
0489
0490 trans_status = readl(i2c->regs + HSI2C_TRANS_STATUS);
0491 if (trans_status & HSI2C_NO_DEV_ACK) {
0492 dev_dbg(i2c->dev, "No ACK from device\n");
0493 i2c->state = -ENXIO;
0494 goto stop;
0495 } else if (trans_status & HSI2C_NO_DEV) {
0496 dev_dbg(i2c->dev, "No device\n");
0497 i2c->state = -ENXIO;
0498 goto stop;
0499 } else if (trans_status & HSI2C_TRANS_ABORT) {
0500 dev_dbg(i2c->dev, "Deal with arbitration lose\n");
0501 i2c->state = -EAGAIN;
0502 goto stop;
0503 } else if (trans_status & HSI2C_TIMEOUT_AUTO) {
0504 dev_dbg(i2c->dev, "Accessing device timed out\n");
0505 i2c->state = -ETIMEDOUT;
0506 goto stop;
0507 } else if (trans_status & HSI2C_TRANS_DONE) {
0508 i2c->trans_done = 1;
0509 i2c->state = 0;
0510 }
0511
0512 break;
0513 }
0514
0515 if ((i2c->msg->flags & I2C_M_RD) && (int_status &
0516 (HSI2C_INT_TRAILING | HSI2C_INT_RX_ALMOSTFULL))) {
0517 fifo_status = readl(i2c->regs + HSI2C_FIFO_STATUS);
0518 fifo_level = HSI2C_RX_FIFO_LVL(fifo_status);
0519 len = min(fifo_level, i2c->msg->len - i2c->msg_ptr);
0520
0521 while (len > 0) {
0522 byte = (unsigned char)
0523 readl(i2c->regs + HSI2C_RX_DATA);
0524 i2c->msg->buf[i2c->msg_ptr++] = byte;
0525 len--;
0526 }
0527 i2c->state = 0;
0528 } else if (int_status & HSI2C_INT_TX_ALMOSTEMPTY) {
0529 fifo_status = readl(i2c->regs + HSI2C_FIFO_STATUS);
0530 fifo_level = HSI2C_TX_FIFO_LVL(fifo_status);
0531
0532 len = i2c->variant->fifo_depth - fifo_level;
0533 if (len > (i2c->msg->len - i2c->msg_ptr)) {
0534 u32 int_en = readl(i2c->regs + HSI2C_INT_ENABLE);
0535
0536 int_en &= ~HSI2C_INT_TX_ALMOSTEMPTY_EN;
0537 writel(int_en, i2c->regs + HSI2C_INT_ENABLE);
0538 len = i2c->msg->len - i2c->msg_ptr;
0539 }
0540
0541 while (len > 0) {
0542 byte = i2c->msg->buf[i2c->msg_ptr++];
0543 writel(byte, i2c->regs + HSI2C_TX_DATA);
0544 len--;
0545 }
0546 i2c->state = 0;
0547 }
0548
0549 stop:
0550 if ((i2c->trans_done && (i2c->msg->len == i2c->msg_ptr)) ||
0551 (i2c->state < 0)) {
0552 writel(0, i2c->regs + HSI2C_INT_ENABLE);
0553 exynos5_i2c_clr_pend_irq(i2c);
0554 complete(&i2c->msg_complete);
0555 }
0556
0557 spin_unlock(&i2c->lock);
0558
0559 return IRQ_HANDLED;
0560 }
0561
0562
0563
0564
0565
0566
0567
0568
0569
0570 static int exynos5_i2c_wait_bus_idle(struct exynos5_i2c *i2c)
0571 {
0572 unsigned long stop_time;
0573 u32 trans_status;
0574
0575
0576 stop_time = jiffies + msecs_to_jiffies(100) + 1;
0577 do {
0578 trans_status = readl(i2c->regs + HSI2C_TRANS_STATUS);
0579 if (!(trans_status & HSI2C_MASTER_BUSY))
0580 return 0;
0581
0582 usleep_range(50, 200);
0583 } while (time_before(jiffies, stop_time));
0584
0585 return -EBUSY;
0586 }
0587
0588 static void exynos5_i2c_bus_recover(struct exynos5_i2c *i2c)
0589 {
0590 u32 val;
0591
0592 val = readl(i2c->regs + HSI2C_CTL) | HSI2C_RXCHON;
0593 writel(val, i2c->regs + HSI2C_CTL);
0594 val = readl(i2c->regs + HSI2C_CONF) & ~HSI2C_AUTO_MODE;
0595 writel(val, i2c->regs + HSI2C_CONF);
0596
0597
0598
0599
0600
0601
0602 writel(HSI2C_CMD_READ_DATA, i2c->regs + HSI2C_MANUAL_CMD);
0603 exynos5_i2c_wait_bus_idle(i2c);
0604 writel(HSI2C_CMD_SEND_STOP, i2c->regs + HSI2C_MANUAL_CMD);
0605 exynos5_i2c_wait_bus_idle(i2c);
0606
0607 val = readl(i2c->regs + HSI2C_CTL) & ~HSI2C_RXCHON;
0608 writel(val, i2c->regs + HSI2C_CTL);
0609 val = readl(i2c->regs + HSI2C_CONF) | HSI2C_AUTO_MODE;
0610 writel(val, i2c->regs + HSI2C_CONF);
0611 }
0612
0613 static void exynos5_i2c_bus_check(struct exynos5_i2c *i2c)
0614 {
0615 unsigned long timeout;
0616
0617 if (i2c->variant->hw == I2C_TYPE_EXYNOS5)
0618 return;
0619
0620
0621
0622
0623
0624
0625 timeout = jiffies + msecs_to_jiffies(100);
0626 for (;;) {
0627 u32 st = readl(i2c->regs + HSI2C_TRANS_STATUS);
0628
0629 if ((st & HSI2C_MASTER_ST_MASK) != HSI2C_MASTER_ST_LOSE)
0630 return;
0631
0632 if (time_is_before_jiffies(timeout))
0633 return;
0634
0635 exynos5_i2c_bus_recover(i2c);
0636 }
0637 }
0638
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649 static void exynos5_i2c_message_start(struct exynos5_i2c *i2c, int stop)
0650 {
0651 u32 i2c_ctl;
0652 u32 int_en = 0;
0653 u32 i2c_auto_conf = 0;
0654 u32 i2c_addr = 0;
0655 u32 fifo_ctl;
0656 unsigned long flags;
0657 unsigned short trig_lvl;
0658
0659 if (i2c->variant->hw == I2C_TYPE_EXYNOS5)
0660 int_en |= HSI2C_INT_I2C;
0661 else
0662 int_en |= HSI2C_INT_I2C_TRANS;
0663
0664 i2c_ctl = readl(i2c->regs + HSI2C_CTL);
0665 i2c_ctl &= ~(HSI2C_TXCHON | HSI2C_RXCHON);
0666 fifo_ctl = HSI2C_RXFIFO_EN | HSI2C_TXFIFO_EN;
0667
0668 if (i2c->msg->flags & I2C_M_RD) {
0669 i2c_ctl |= HSI2C_RXCHON;
0670
0671 i2c_auto_conf |= HSI2C_READ_WRITE;
0672
0673 trig_lvl = (i2c->msg->len > i2c->variant->fifo_depth) ?
0674 (i2c->variant->fifo_depth * 3 / 4) : i2c->msg->len;
0675 fifo_ctl |= HSI2C_RXFIFO_TRIGGER_LEVEL(trig_lvl);
0676
0677 int_en |= (HSI2C_INT_RX_ALMOSTFULL_EN |
0678 HSI2C_INT_TRAILING_EN);
0679 } else {
0680 i2c_ctl |= HSI2C_TXCHON;
0681
0682 trig_lvl = (i2c->msg->len > i2c->variant->fifo_depth) ?
0683 (i2c->variant->fifo_depth * 1 / 4) : i2c->msg->len;
0684 fifo_ctl |= HSI2C_TXFIFO_TRIGGER_LEVEL(trig_lvl);
0685
0686 int_en |= HSI2C_INT_TX_ALMOSTEMPTY_EN;
0687 }
0688
0689 i2c_addr = HSI2C_SLV_ADDR_MAS(i2c->msg->addr);
0690
0691 if (i2c->op_clock >= I2C_MAX_FAST_MODE_PLUS_FREQ)
0692 i2c_addr |= HSI2C_MASTER_ID(MASTER_ID(i2c->adap.nr));
0693
0694 writel(i2c_addr, i2c->regs + HSI2C_ADDR);
0695
0696 writel(fifo_ctl, i2c->regs + HSI2C_FIFO_CTL);
0697 writel(i2c_ctl, i2c->regs + HSI2C_CTL);
0698
0699 exynos5_i2c_bus_check(i2c);
0700
0701
0702
0703
0704
0705 spin_lock_irqsave(&i2c->lock, flags);
0706 writel(int_en, i2c->regs + HSI2C_INT_ENABLE);
0707
0708 if (stop == 1)
0709 i2c_auto_conf |= HSI2C_STOP_AFTER_TRANS;
0710 i2c_auto_conf |= i2c->msg->len;
0711 i2c_auto_conf |= HSI2C_MASTER_RUN;
0712 writel(i2c_auto_conf, i2c->regs + HSI2C_AUTO_CONF);
0713 spin_unlock_irqrestore(&i2c->lock, flags);
0714 }
0715
0716 static int exynos5_i2c_xfer_msg(struct exynos5_i2c *i2c,
0717 struct i2c_msg *msgs, int stop)
0718 {
0719 unsigned long timeout;
0720 int ret;
0721
0722 i2c->msg = msgs;
0723 i2c->msg_ptr = 0;
0724 i2c->trans_done = 0;
0725
0726 reinit_completion(&i2c->msg_complete);
0727
0728 exynos5_i2c_message_start(i2c, stop);
0729
0730 timeout = wait_for_completion_timeout(&i2c->msg_complete,
0731 EXYNOS5_I2C_TIMEOUT);
0732 if (timeout == 0)
0733 ret = -ETIMEDOUT;
0734 else
0735 ret = i2c->state;
0736
0737
0738
0739
0740
0741 if (ret == 0 && stop)
0742 ret = exynos5_i2c_wait_bus_idle(i2c);
0743
0744 if (ret < 0) {
0745 exynos5_i2c_reset(i2c);
0746 if (ret == -ETIMEDOUT)
0747 dev_warn(i2c->dev, "%s timeout\n",
0748 (msgs->flags & I2C_M_RD) ? "rx" : "tx");
0749 }
0750
0751
0752 return ret;
0753 }
0754
0755 static int exynos5_i2c_xfer(struct i2c_adapter *adap,
0756 struct i2c_msg *msgs, int num)
0757 {
0758 struct exynos5_i2c *i2c = adap->algo_data;
0759 int i, ret;
0760
0761 ret = clk_enable(i2c->pclk);
0762 if (ret)
0763 return ret;
0764
0765 ret = clk_enable(i2c->clk);
0766 if (ret)
0767 goto err_pclk;
0768
0769 for (i = 0; i < num; ++i) {
0770 ret = exynos5_i2c_xfer_msg(i2c, msgs + i, i + 1 == num);
0771 if (ret)
0772 break;
0773 }
0774
0775 clk_disable(i2c->clk);
0776 err_pclk:
0777 clk_disable(i2c->pclk);
0778
0779 return ret ?: num;
0780 }
0781
0782 static u32 exynos5_i2c_func(struct i2c_adapter *adap)
0783 {
0784 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
0785 }
0786
0787 static const struct i2c_algorithm exynos5_i2c_algorithm = {
0788 .master_xfer = exynos5_i2c_xfer,
0789 .functionality = exynos5_i2c_func,
0790 };
0791
0792 static int exynos5_i2c_probe(struct platform_device *pdev)
0793 {
0794 struct device_node *np = pdev->dev.of_node;
0795 struct exynos5_i2c *i2c;
0796 int ret;
0797
0798 i2c = devm_kzalloc(&pdev->dev, sizeof(struct exynos5_i2c), GFP_KERNEL);
0799 if (!i2c)
0800 return -ENOMEM;
0801
0802 if (of_property_read_u32(np, "clock-frequency", &i2c->op_clock))
0803 i2c->op_clock = I2C_MAX_STANDARD_MODE_FREQ;
0804
0805 strscpy(i2c->adap.name, "exynos5-i2c", sizeof(i2c->adap.name));
0806 i2c->adap.owner = THIS_MODULE;
0807 i2c->adap.algo = &exynos5_i2c_algorithm;
0808 i2c->adap.retries = 3;
0809
0810 i2c->dev = &pdev->dev;
0811 i2c->clk = devm_clk_get(&pdev->dev, "hsi2c");
0812 if (IS_ERR(i2c->clk)) {
0813 dev_err(&pdev->dev, "cannot get clock\n");
0814 return -ENOENT;
0815 }
0816
0817 i2c->pclk = devm_clk_get_optional(&pdev->dev, "hsi2c_pclk");
0818 if (IS_ERR(i2c->pclk)) {
0819 return dev_err_probe(&pdev->dev, PTR_ERR(i2c->pclk),
0820 "cannot get pclk");
0821 }
0822
0823 ret = clk_prepare_enable(i2c->pclk);
0824 if (ret)
0825 return ret;
0826
0827 ret = clk_prepare_enable(i2c->clk);
0828 if (ret)
0829 goto err_pclk;
0830
0831 i2c->regs = devm_platform_ioremap_resource(pdev, 0);
0832 if (IS_ERR(i2c->regs)) {
0833 ret = PTR_ERR(i2c->regs);
0834 goto err_clk;
0835 }
0836
0837 i2c->adap.dev.of_node = np;
0838 i2c->adap.algo_data = i2c;
0839 i2c->adap.dev.parent = &pdev->dev;
0840
0841
0842 exynos5_i2c_clr_pend_irq(i2c);
0843
0844 spin_lock_init(&i2c->lock);
0845 init_completion(&i2c->msg_complete);
0846
0847 i2c->irq = ret = platform_get_irq(pdev, 0);
0848 if (ret < 0)
0849 goto err_clk;
0850
0851 ret = devm_request_irq(&pdev->dev, i2c->irq, exynos5_i2c_irq,
0852 IRQF_NO_SUSPEND, dev_name(&pdev->dev), i2c);
0853 if (ret != 0) {
0854 dev_err(&pdev->dev, "cannot request HS-I2C IRQ %d\n", i2c->irq);
0855 goto err_clk;
0856 }
0857
0858 i2c->variant = of_device_get_match_data(&pdev->dev);
0859
0860 ret = exynos5_hsi2c_clock_setup(i2c);
0861 if (ret)
0862 goto err_clk;
0863
0864 exynos5_i2c_reset(i2c);
0865
0866 ret = i2c_add_adapter(&i2c->adap);
0867 if (ret < 0)
0868 goto err_clk;
0869
0870 platform_set_drvdata(pdev, i2c);
0871
0872 clk_disable(i2c->clk);
0873 clk_disable(i2c->pclk);
0874
0875 return 0;
0876
0877 err_clk:
0878 clk_disable_unprepare(i2c->clk);
0879
0880 err_pclk:
0881 clk_disable_unprepare(i2c->pclk);
0882 return ret;
0883 }
0884
0885 static int exynos5_i2c_remove(struct platform_device *pdev)
0886 {
0887 struct exynos5_i2c *i2c = platform_get_drvdata(pdev);
0888
0889 i2c_del_adapter(&i2c->adap);
0890
0891 clk_unprepare(i2c->clk);
0892 clk_unprepare(i2c->pclk);
0893
0894 return 0;
0895 }
0896
0897 #ifdef CONFIG_PM_SLEEP
0898 static int exynos5_i2c_suspend_noirq(struct device *dev)
0899 {
0900 struct exynos5_i2c *i2c = dev_get_drvdata(dev);
0901
0902 i2c_mark_adapter_suspended(&i2c->adap);
0903 clk_unprepare(i2c->clk);
0904 clk_unprepare(i2c->pclk);
0905
0906 return 0;
0907 }
0908
0909 static int exynos5_i2c_resume_noirq(struct device *dev)
0910 {
0911 struct exynos5_i2c *i2c = dev_get_drvdata(dev);
0912 int ret = 0;
0913
0914 ret = clk_prepare_enable(i2c->pclk);
0915 if (ret)
0916 return ret;
0917
0918 ret = clk_prepare_enable(i2c->clk);
0919 if (ret)
0920 goto err_pclk;
0921
0922 ret = exynos5_hsi2c_clock_setup(i2c);
0923 if (ret)
0924 goto err_clk;
0925
0926 exynos5_i2c_init(i2c);
0927 clk_disable(i2c->clk);
0928 clk_disable(i2c->pclk);
0929 i2c_mark_adapter_resumed(&i2c->adap);
0930
0931 return 0;
0932
0933 err_clk:
0934 clk_disable_unprepare(i2c->clk);
0935 err_pclk:
0936 clk_disable_unprepare(i2c->pclk);
0937 return ret;
0938 }
0939 #endif
0940
0941 static const struct dev_pm_ops exynos5_i2c_dev_pm_ops = {
0942 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(exynos5_i2c_suspend_noirq,
0943 exynos5_i2c_resume_noirq)
0944 };
0945
0946 static struct platform_driver exynos5_i2c_driver = {
0947 .probe = exynos5_i2c_probe,
0948 .remove = exynos5_i2c_remove,
0949 .driver = {
0950 .name = "exynos5-hsi2c",
0951 .pm = &exynos5_i2c_dev_pm_ops,
0952 .of_match_table = exynos5_i2c_match,
0953 },
0954 };
0955
0956 module_platform_driver(exynos5_i2c_driver);
0957
0958 MODULE_DESCRIPTION("Exynos5 HS-I2C Bus driver");
0959 MODULE_AUTHOR("Naveen Krishna Chatradhi <ch.naveen@samsung.com>");
0960 MODULE_AUTHOR("Taekgyun Ko <taeggyun.ko@samsung.com>");
0961 MODULE_LICENSE("GPL v2");