0001
0002
0003
0004 #include <linux/device.h>
0005 #include <linux/kernel.h>
0006 #include <linux/module.h>
0007 #include <linux/sched.h>
0008 #include <linux/i2c.h>
0009 #include <linux/interrupt.h>
0010 #include <linux/platform_device.h>
0011 #include <linux/clk.h>
0012 #include <linux/io.h>
0013 #include <linux/slab.h>
0014
0015
0016 #define CS_OFFSET 0x00000020
0017 #define CS_ACK_SHIFT 3
0018 #define CS_ACK_MASK 0x00000008
0019 #define CS_ACK_CMD_GEN_START 0x00000000
0020 #define CS_ACK_CMD_GEN_RESTART 0x00000001
0021 #define CS_CMD_SHIFT 1
0022 #define CS_CMD_CMD_NO_ACTION 0x00000000
0023 #define CS_CMD_CMD_START_RESTART 0x00000001
0024 #define CS_CMD_CMD_STOP 0x00000002
0025 #define CS_EN_SHIFT 0
0026 #define CS_EN_CMD_ENABLE_BSC 0x00000001
0027
0028 #define TIM_OFFSET 0x00000024
0029 #define TIM_PRESCALE_SHIFT 6
0030 #define TIM_P_SHIFT 3
0031 #define TIM_NO_DIV_SHIFT 2
0032 #define TIM_DIV_SHIFT 0
0033
0034 #define DAT_OFFSET 0x00000028
0035
0036 #define TOUT_OFFSET 0x0000002c
0037
0038 #define TXFCR_OFFSET 0x0000003c
0039 #define TXFCR_FIFO_FLUSH_MASK 0x00000080
0040 #define TXFCR_FIFO_EN_MASK 0x00000040
0041
0042 #define IER_OFFSET 0x00000044
0043 #define IER_READ_COMPLETE_INT_MASK 0x00000010
0044 #define IER_I2C_INT_EN_MASK 0x00000008
0045 #define IER_FIFO_INT_EN_MASK 0x00000002
0046 #define IER_NOACK_EN_MASK 0x00000001
0047
0048 #define ISR_OFFSET 0x00000048
0049 #define ISR_RESERVED_MASK 0xffffff60
0050 #define ISR_CMDBUSY_MASK 0x00000080
0051 #define ISR_READ_COMPLETE_MASK 0x00000010
0052 #define ISR_SES_DONE_MASK 0x00000008
0053 #define ISR_ERR_MASK 0x00000004
0054 #define ISR_TXFIFOEMPTY_MASK 0x00000002
0055 #define ISR_NOACK_MASK 0x00000001
0056
0057 #define CLKEN_OFFSET 0x0000004C
0058 #define CLKEN_AUTOSENSE_OFF_MASK 0x00000080
0059 #define CLKEN_M_SHIFT 4
0060 #define CLKEN_N_SHIFT 1
0061 #define CLKEN_CLKEN_MASK 0x00000001
0062
0063 #define FIFO_STATUS_OFFSET 0x00000054
0064 #define FIFO_STATUS_RXFIFO_EMPTY_MASK 0x00000004
0065 #define FIFO_STATUS_TXFIFO_EMPTY_MASK 0x00000010
0066
0067 #define HSTIM_OFFSET 0x00000058
0068 #define HSTIM_HS_MODE_MASK 0x00008000
0069 #define HSTIM_HS_HOLD_SHIFT 10
0070 #define HSTIM_HS_HIGH_PHASE_SHIFT 5
0071 #define HSTIM_HS_SETUP_SHIFT 0
0072
0073 #define PADCTL_OFFSET 0x0000005c
0074 #define PADCTL_PAD_OUT_EN_MASK 0x00000004
0075
0076 #define RXFCR_OFFSET 0x00000068
0077 #define RXFCR_NACK_EN_SHIFT 7
0078 #define RXFCR_READ_COUNT_SHIFT 0
0079 #define RXFIFORDOUT_OFFSET 0x0000006c
0080
0081
0082 #define MAX_RX_FIFO_SIZE 64U
0083 #define MAX_TX_FIFO_SIZE 64U
0084
0085 #define STD_EXT_CLK_FREQ 13000000UL
0086 #define HS_EXT_CLK_FREQ 104000000UL
0087
0088 #define MASTERCODE 0x08
0089
0090 #define I2C_TIMEOUT 100
0091
0092
0093 enum bcm_kona_cmd_t {
0094 BCM_CMD_NOACTION = 0,
0095 BCM_CMD_START,
0096 BCM_CMD_RESTART,
0097 BCM_CMD_STOP,
0098 };
0099
0100 enum bus_speed_index {
0101 BCM_SPD_100K = 0,
0102 BCM_SPD_400K,
0103 BCM_SPD_1MHZ,
0104 };
0105
0106 enum hs_bus_speed_index {
0107 BCM_SPD_3P4MHZ = 0,
0108 };
0109
0110
0111 struct bus_speed_cfg {
0112 uint8_t time_m;
0113 uint8_t time_n;
0114 uint8_t prescale;
0115 uint8_t time_p;
0116 uint8_t no_div;
0117 uint8_t time_div;
0118 };
0119
0120
0121 struct hs_bus_speed_cfg {
0122 uint8_t hs_hold;
0123
0124 uint8_t hs_high_phase;
0125
0126 uint8_t hs_setup;
0127
0128 uint8_t prescale;
0129 uint8_t time_p;
0130 uint8_t no_div;
0131 uint8_t time_div;
0132 };
0133
0134 static const struct bus_speed_cfg std_cfg_table[] = {
0135 [BCM_SPD_100K] = {0x01, 0x01, 0x03, 0x06, 0x00, 0x02},
0136 [BCM_SPD_400K] = {0x05, 0x01, 0x03, 0x05, 0x01, 0x02},
0137 [BCM_SPD_1MHZ] = {0x01, 0x01, 0x03, 0x01, 0x01, 0x03},
0138 };
0139
0140 static const struct hs_bus_speed_cfg hs_cfg_table[] = {
0141 [BCM_SPD_3P4MHZ] = {0x01, 0x08, 0x14, 0x00, 0x06, 0x01, 0x00},
0142 };
0143
0144 struct bcm_kona_i2c_dev {
0145 struct device *device;
0146
0147 void __iomem *base;
0148 int irq;
0149 struct clk *external_clk;
0150
0151 struct i2c_adapter adapter;
0152
0153 struct completion done;
0154
0155 const struct bus_speed_cfg *std_cfg;
0156 const struct hs_bus_speed_cfg *hs_cfg;
0157 };
0158
0159 static void bcm_kona_i2c_send_cmd_to_ctrl(struct bcm_kona_i2c_dev *dev,
0160 enum bcm_kona_cmd_t cmd)
0161 {
0162 dev_dbg(dev->device, "%s, %d\n", __func__, cmd);
0163
0164 switch (cmd) {
0165 case BCM_CMD_NOACTION:
0166 writel((CS_CMD_CMD_NO_ACTION << CS_CMD_SHIFT) |
0167 (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT),
0168 dev->base + CS_OFFSET);
0169 break;
0170
0171 case BCM_CMD_START:
0172 writel((CS_ACK_CMD_GEN_START << CS_ACK_SHIFT) |
0173 (CS_CMD_CMD_START_RESTART << CS_CMD_SHIFT) |
0174 (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT),
0175 dev->base + CS_OFFSET);
0176 break;
0177
0178 case BCM_CMD_RESTART:
0179 writel((CS_ACK_CMD_GEN_RESTART << CS_ACK_SHIFT) |
0180 (CS_CMD_CMD_START_RESTART << CS_CMD_SHIFT) |
0181 (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT),
0182 dev->base + CS_OFFSET);
0183 break;
0184
0185 case BCM_CMD_STOP:
0186 writel((CS_CMD_CMD_STOP << CS_CMD_SHIFT) |
0187 (CS_EN_CMD_ENABLE_BSC << CS_EN_SHIFT),
0188 dev->base + CS_OFFSET);
0189 break;
0190
0191 default:
0192 dev_err(dev->device, "Unknown command %d\n", cmd);
0193 }
0194 }
0195
0196 static void bcm_kona_i2c_enable_clock(struct bcm_kona_i2c_dev *dev)
0197 {
0198 writel(readl(dev->base + CLKEN_OFFSET) | CLKEN_CLKEN_MASK,
0199 dev->base + CLKEN_OFFSET);
0200 }
0201
0202 static void bcm_kona_i2c_disable_clock(struct bcm_kona_i2c_dev *dev)
0203 {
0204 writel(readl(dev->base + CLKEN_OFFSET) & ~CLKEN_CLKEN_MASK,
0205 dev->base + CLKEN_OFFSET);
0206 }
0207
0208 static irqreturn_t bcm_kona_i2c_isr(int irq, void *devid)
0209 {
0210 struct bcm_kona_i2c_dev *dev = devid;
0211 uint32_t status = readl(dev->base + ISR_OFFSET);
0212
0213 if ((status & ~ISR_RESERVED_MASK) == 0)
0214 return IRQ_NONE;
0215
0216
0217 if (status & ISR_NOACK_MASK)
0218 writel(TXFCR_FIFO_FLUSH_MASK | TXFCR_FIFO_EN_MASK,
0219 dev->base + TXFCR_OFFSET);
0220
0221 writel(status & ~ISR_RESERVED_MASK, dev->base + ISR_OFFSET);
0222 complete(&dev->done);
0223
0224 return IRQ_HANDLED;
0225 }
0226
0227
0228 static int bcm_kona_i2c_wait_if_busy(struct bcm_kona_i2c_dev *dev)
0229 {
0230 unsigned long timeout = jiffies + msecs_to_jiffies(I2C_TIMEOUT);
0231
0232 while (readl(dev->base + ISR_OFFSET) & ISR_CMDBUSY_MASK)
0233 if (time_after(jiffies, timeout)) {
0234 dev_err(dev->device, "CMDBUSY timeout\n");
0235 return -ETIMEDOUT;
0236 }
0237
0238 return 0;
0239 }
0240
0241
0242 static int bcm_kona_send_i2c_cmd(struct bcm_kona_i2c_dev *dev,
0243 enum bcm_kona_cmd_t cmd)
0244 {
0245 int rc;
0246 unsigned long time_left = msecs_to_jiffies(I2C_TIMEOUT);
0247
0248
0249 rc = bcm_kona_i2c_wait_if_busy(dev);
0250 if (rc < 0)
0251 return rc;
0252
0253
0254 writel(IER_I2C_INT_EN_MASK, dev->base + IER_OFFSET);
0255
0256
0257 reinit_completion(&dev->done);
0258
0259
0260 bcm_kona_i2c_send_cmd_to_ctrl(dev, cmd);
0261
0262
0263 time_left = wait_for_completion_timeout(&dev->done, time_left);
0264
0265
0266 writel(0, dev->base + IER_OFFSET);
0267
0268 if (!time_left) {
0269 dev_err(dev->device, "controller timed out\n");
0270 rc = -ETIMEDOUT;
0271 }
0272
0273
0274 bcm_kona_i2c_send_cmd_to_ctrl(dev, BCM_CMD_NOACTION);
0275
0276 return rc;
0277 }
0278
0279
0280 static int bcm_kona_i2c_read_fifo_single(struct bcm_kona_i2c_dev *dev,
0281 uint8_t *buf, unsigned int len,
0282 unsigned int last_byte_nak)
0283 {
0284 unsigned long time_left = msecs_to_jiffies(I2C_TIMEOUT);
0285
0286
0287 reinit_completion(&dev->done);
0288
0289
0290 writel(IER_READ_COMPLETE_INT_MASK, dev->base + IER_OFFSET);
0291
0292
0293 writel((last_byte_nak << RXFCR_NACK_EN_SHIFT) |
0294 (len << RXFCR_READ_COUNT_SHIFT),
0295 dev->base + RXFCR_OFFSET);
0296
0297
0298 time_left = wait_for_completion_timeout(&dev->done, time_left);
0299
0300
0301 writel(0, dev->base + IER_OFFSET);
0302
0303 if (!time_left) {
0304 dev_err(dev->device, "RX FIFO time out\n");
0305 return -EREMOTEIO;
0306 }
0307
0308
0309 for (; len > 0; len--, buf++)
0310 *buf = readl(dev->base + RXFIFORDOUT_OFFSET);
0311
0312 return 0;
0313 }
0314
0315
0316 static int bcm_kona_i2c_read_fifo(struct bcm_kona_i2c_dev *dev,
0317 struct i2c_msg *msg)
0318 {
0319 unsigned int bytes_to_read = MAX_RX_FIFO_SIZE;
0320 unsigned int last_byte_nak = 0;
0321 unsigned int bytes_read = 0;
0322 int rc;
0323
0324 uint8_t *tmp_buf = msg->buf;
0325
0326 while (bytes_read < msg->len) {
0327 if (msg->len - bytes_read <= MAX_RX_FIFO_SIZE) {
0328 last_byte_nak = 1;
0329 bytes_to_read = msg->len - bytes_read;
0330 }
0331
0332 rc = bcm_kona_i2c_read_fifo_single(dev, tmp_buf, bytes_to_read,
0333 last_byte_nak);
0334 if (rc < 0)
0335 return -EREMOTEIO;
0336
0337 bytes_read += bytes_to_read;
0338 tmp_buf += bytes_to_read;
0339 }
0340
0341 return 0;
0342 }
0343
0344
0345 static int bcm_kona_i2c_write_byte(struct bcm_kona_i2c_dev *dev, uint8_t data,
0346 unsigned int nak_expected)
0347 {
0348 int rc;
0349 unsigned long time_left = msecs_to_jiffies(I2C_TIMEOUT);
0350 unsigned int nak_received;
0351
0352
0353 rc = bcm_kona_i2c_wait_if_busy(dev);
0354 if (rc < 0)
0355 return rc;
0356
0357
0358 writel(ISR_SES_DONE_MASK, dev->base + ISR_OFFSET);
0359
0360
0361 writel(IER_I2C_INT_EN_MASK, dev->base + IER_OFFSET);
0362
0363
0364 reinit_completion(&dev->done);
0365
0366
0367 writel(data, dev->base + DAT_OFFSET);
0368
0369
0370 time_left = wait_for_completion_timeout(&dev->done, time_left);
0371
0372
0373 writel(0, dev->base + IER_OFFSET);
0374
0375 if (!time_left) {
0376 dev_dbg(dev->device, "controller timed out\n");
0377 return -ETIMEDOUT;
0378 }
0379
0380 nak_received = readl(dev->base + CS_OFFSET) & CS_ACK_MASK ? 1 : 0;
0381
0382 if (nak_received ^ nak_expected) {
0383 dev_dbg(dev->device, "unexpected NAK/ACK\n");
0384 return -EREMOTEIO;
0385 }
0386
0387 return 0;
0388 }
0389
0390
0391 static int bcm_kona_i2c_write_fifo_single(struct bcm_kona_i2c_dev *dev,
0392 uint8_t *buf, unsigned int len)
0393 {
0394 int k;
0395 unsigned long time_left = msecs_to_jiffies(I2C_TIMEOUT);
0396 unsigned int fifo_status;
0397
0398
0399 reinit_completion(&dev->done);
0400
0401
0402 writel(IER_FIFO_INT_EN_MASK | IER_NOACK_EN_MASK,
0403 dev->base + IER_OFFSET);
0404
0405
0406 disable_irq(dev->irq);
0407
0408
0409 for (k = 0; k < len; k++)
0410 writel(buf[k], (dev->base + DAT_OFFSET));
0411
0412
0413 enable_irq(dev->irq);
0414
0415
0416 do {
0417 time_left = wait_for_completion_timeout(&dev->done, time_left);
0418 fifo_status = readl(dev->base + FIFO_STATUS_OFFSET);
0419 } while (time_left && !(fifo_status & FIFO_STATUS_TXFIFO_EMPTY_MASK));
0420
0421
0422 writel(0, dev->base + IER_OFFSET);
0423
0424
0425 if (readl(dev->base + CS_OFFSET) & CS_ACK_MASK) {
0426 dev_err(dev->device, "unexpected NAK\n");
0427 return -EREMOTEIO;
0428 }
0429
0430
0431 if (!time_left) {
0432 dev_err(dev->device, "completion timed out\n");
0433 return -EREMOTEIO;
0434 }
0435
0436 return 0;
0437 }
0438
0439
0440
0441 static int bcm_kona_i2c_write_fifo(struct bcm_kona_i2c_dev *dev,
0442 struct i2c_msg *msg)
0443 {
0444 unsigned int bytes_to_write = MAX_TX_FIFO_SIZE;
0445 unsigned int bytes_written = 0;
0446 int rc;
0447
0448 uint8_t *tmp_buf = msg->buf;
0449
0450 while (bytes_written < msg->len) {
0451 if (msg->len - bytes_written <= MAX_TX_FIFO_SIZE)
0452 bytes_to_write = msg->len - bytes_written;
0453
0454 rc = bcm_kona_i2c_write_fifo_single(dev, tmp_buf,
0455 bytes_to_write);
0456 if (rc < 0)
0457 return -EREMOTEIO;
0458
0459 bytes_written += bytes_to_write;
0460 tmp_buf += bytes_to_write;
0461 }
0462
0463 return 0;
0464 }
0465
0466
0467 static int bcm_kona_i2c_do_addr(struct bcm_kona_i2c_dev *dev,
0468 struct i2c_msg *msg)
0469 {
0470 unsigned char addr;
0471
0472 if (msg->flags & I2C_M_TEN) {
0473
0474 addr = 0xF0 | ((msg->addr & 0x300) >> 7);
0475 if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0)
0476 return -EREMOTEIO;
0477
0478
0479 addr = msg->addr & 0xFF;
0480 if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0)
0481 return -EREMOTEIO;
0482
0483 if (msg->flags & I2C_M_RD) {
0484
0485 if (bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART) < 0)
0486 return -EREMOTEIO;
0487
0488
0489 addr = 0xF0 | ((msg->addr & 0x300) >> 7) | 0x01;
0490 if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0)
0491 return -EREMOTEIO;
0492 }
0493 } else {
0494 addr = i2c_8bit_addr_from_msg(msg);
0495
0496 if (bcm_kona_i2c_write_byte(dev, addr, 0) < 0)
0497 return -EREMOTEIO;
0498 }
0499
0500 return 0;
0501 }
0502
0503 static void bcm_kona_i2c_enable_autosense(struct bcm_kona_i2c_dev *dev)
0504 {
0505 writel(readl(dev->base + CLKEN_OFFSET) & ~CLKEN_AUTOSENSE_OFF_MASK,
0506 dev->base + CLKEN_OFFSET);
0507 }
0508
0509 static void bcm_kona_i2c_config_timing(struct bcm_kona_i2c_dev *dev)
0510 {
0511 writel(readl(dev->base + HSTIM_OFFSET) & ~HSTIM_HS_MODE_MASK,
0512 dev->base + HSTIM_OFFSET);
0513
0514 writel((dev->std_cfg->prescale << TIM_PRESCALE_SHIFT) |
0515 (dev->std_cfg->time_p << TIM_P_SHIFT) |
0516 (dev->std_cfg->no_div << TIM_NO_DIV_SHIFT) |
0517 (dev->std_cfg->time_div << TIM_DIV_SHIFT),
0518 dev->base + TIM_OFFSET);
0519
0520 writel((dev->std_cfg->time_m << CLKEN_M_SHIFT) |
0521 (dev->std_cfg->time_n << CLKEN_N_SHIFT) |
0522 CLKEN_CLKEN_MASK,
0523 dev->base + CLKEN_OFFSET);
0524 }
0525
0526 static void bcm_kona_i2c_config_timing_hs(struct bcm_kona_i2c_dev *dev)
0527 {
0528 writel((dev->hs_cfg->prescale << TIM_PRESCALE_SHIFT) |
0529 (dev->hs_cfg->time_p << TIM_P_SHIFT) |
0530 (dev->hs_cfg->no_div << TIM_NO_DIV_SHIFT) |
0531 (dev->hs_cfg->time_div << TIM_DIV_SHIFT),
0532 dev->base + TIM_OFFSET);
0533
0534 writel((dev->hs_cfg->hs_hold << HSTIM_HS_HOLD_SHIFT) |
0535 (dev->hs_cfg->hs_high_phase << HSTIM_HS_HIGH_PHASE_SHIFT) |
0536 (dev->hs_cfg->hs_setup << HSTIM_HS_SETUP_SHIFT),
0537 dev->base + HSTIM_OFFSET);
0538
0539 writel(readl(dev->base + HSTIM_OFFSET) | HSTIM_HS_MODE_MASK,
0540 dev->base + HSTIM_OFFSET);
0541 }
0542
0543 static int bcm_kona_i2c_switch_to_hs(struct bcm_kona_i2c_dev *dev)
0544 {
0545 int rc;
0546
0547
0548 rc = bcm_kona_i2c_write_byte(dev, MASTERCODE, 1);
0549 if (rc < 0) {
0550 pr_err("High speed handshake failed\n");
0551 return rc;
0552 }
0553
0554
0555 rc = clk_set_rate(dev->external_clk, HS_EXT_CLK_FREQ);
0556 if (rc) {
0557 dev_err(dev->device, "%s: clk_set_rate returned %d\n",
0558 __func__, rc);
0559 return rc;
0560 }
0561
0562
0563 bcm_kona_i2c_config_timing_hs(dev);
0564
0565
0566 rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART);
0567 if (rc < 0)
0568 dev_err(dev->device, "High speed restart command failed\n");
0569
0570 return rc;
0571 }
0572
0573 static int bcm_kona_i2c_switch_to_std(struct bcm_kona_i2c_dev *dev)
0574 {
0575 int rc;
0576
0577
0578 bcm_kona_i2c_config_timing(dev);
0579
0580
0581 rc = clk_set_rate(dev->external_clk, STD_EXT_CLK_FREQ);
0582 if (rc) {
0583 dev_err(dev->device, "%s: clk_set_rate returned %d\n",
0584 __func__, rc);
0585 }
0586
0587 return rc;
0588 }
0589
0590
0591 static int bcm_kona_i2c_xfer(struct i2c_adapter *adapter,
0592 struct i2c_msg msgs[], int num)
0593 {
0594 struct bcm_kona_i2c_dev *dev = i2c_get_adapdata(adapter);
0595 struct i2c_msg *pmsg;
0596 int rc = 0;
0597 int i;
0598
0599 rc = clk_prepare_enable(dev->external_clk);
0600 if (rc) {
0601 dev_err(dev->device, "%s: peri clock enable failed. err %d\n",
0602 __func__, rc);
0603 return rc;
0604 }
0605
0606
0607 writel(0, dev->base + PADCTL_OFFSET);
0608
0609
0610 bcm_kona_i2c_enable_clock(dev);
0611
0612
0613 rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_START);
0614 if (rc < 0) {
0615 dev_err(dev->device, "Start command failed rc = %d\n", rc);
0616 goto xfer_disable_pad;
0617 }
0618
0619
0620 if (dev->hs_cfg) {
0621 rc = bcm_kona_i2c_switch_to_hs(dev);
0622 if (rc < 0)
0623 goto xfer_send_stop;
0624 }
0625
0626
0627 for (i = 0; i < num; i++) {
0628 pmsg = &msgs[i];
0629
0630
0631 if ((i != 0) && ((pmsg->flags & I2C_M_NOSTART) == 0)) {
0632 rc = bcm_kona_send_i2c_cmd(dev, BCM_CMD_RESTART);
0633 if (rc < 0) {
0634 dev_err(dev->device,
0635 "restart cmd failed rc = %d\n", rc);
0636 goto xfer_send_stop;
0637 }
0638 }
0639
0640
0641 if (!(pmsg->flags & I2C_M_NOSTART)) {
0642 rc = bcm_kona_i2c_do_addr(dev, pmsg);
0643 if (rc < 0) {
0644 dev_err(dev->device,
0645 "NAK from addr %2.2x msg#%d rc = %d\n",
0646 pmsg->addr, i, rc);
0647 goto xfer_send_stop;
0648 }
0649 }
0650
0651
0652 if (pmsg->flags & I2C_M_RD) {
0653 rc = bcm_kona_i2c_read_fifo(dev, pmsg);
0654 if (rc < 0) {
0655 dev_err(dev->device, "read failure\n");
0656 goto xfer_send_stop;
0657 }
0658 } else {
0659 rc = bcm_kona_i2c_write_fifo(dev, pmsg);
0660 if (rc < 0) {
0661 dev_err(dev->device, "write failure");
0662 goto xfer_send_stop;
0663 }
0664 }
0665 }
0666
0667 rc = num;
0668
0669 xfer_send_stop:
0670
0671 bcm_kona_send_i2c_cmd(dev, BCM_CMD_STOP);
0672
0673
0674 if (dev->hs_cfg) {
0675 int hs_rc = bcm_kona_i2c_switch_to_std(dev);
0676
0677 if (hs_rc)
0678 rc = hs_rc;
0679 }
0680
0681 xfer_disable_pad:
0682
0683 writel(PADCTL_PAD_OUT_EN_MASK, dev->base + PADCTL_OFFSET);
0684
0685
0686 bcm_kona_i2c_disable_clock(dev);
0687
0688 clk_disable_unprepare(dev->external_clk);
0689
0690 return rc;
0691 }
0692
0693 static uint32_t bcm_kona_i2c_functionality(struct i2c_adapter *adap)
0694 {
0695 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR |
0696 I2C_FUNC_NOSTART;
0697 }
0698
0699 static const struct i2c_algorithm bcm_algo = {
0700 .master_xfer = bcm_kona_i2c_xfer,
0701 .functionality = bcm_kona_i2c_functionality,
0702 };
0703
0704 static int bcm_kona_i2c_assign_bus_speed(struct bcm_kona_i2c_dev *dev)
0705 {
0706 unsigned int bus_speed;
0707 int ret = of_property_read_u32(dev->device->of_node, "clock-frequency",
0708 &bus_speed);
0709 if (ret < 0) {
0710 dev_err(dev->device, "missing clock-frequency property\n");
0711 return -ENODEV;
0712 }
0713
0714 switch (bus_speed) {
0715 case I2C_MAX_STANDARD_MODE_FREQ:
0716 dev->std_cfg = &std_cfg_table[BCM_SPD_100K];
0717 break;
0718 case I2C_MAX_FAST_MODE_FREQ:
0719 dev->std_cfg = &std_cfg_table[BCM_SPD_400K];
0720 break;
0721 case I2C_MAX_FAST_MODE_PLUS_FREQ:
0722 dev->std_cfg = &std_cfg_table[BCM_SPD_1MHZ];
0723 break;
0724 case I2C_MAX_HIGH_SPEED_MODE_FREQ:
0725
0726 dev->std_cfg = &std_cfg_table[BCM_SPD_100K];
0727 dev->hs_cfg = &hs_cfg_table[BCM_SPD_3P4MHZ];
0728 break;
0729 default:
0730 pr_err("%d hz bus speed not supported\n", bus_speed);
0731 pr_err("Valid speeds are 100khz, 400khz, 1mhz, and 3.4mhz\n");
0732 return -EINVAL;
0733 }
0734
0735 return 0;
0736 }
0737
0738 static int bcm_kona_i2c_probe(struct platform_device *pdev)
0739 {
0740 int rc = 0;
0741 struct bcm_kona_i2c_dev *dev;
0742 struct i2c_adapter *adap;
0743
0744
0745 dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL);
0746 if (!dev)
0747 return -ENOMEM;
0748
0749 platform_set_drvdata(pdev, dev);
0750 dev->device = &pdev->dev;
0751 init_completion(&dev->done);
0752
0753
0754 dev->base = devm_platform_ioremap_resource(pdev, 0);
0755 if (IS_ERR(dev->base))
0756 return PTR_ERR(dev->base);
0757
0758
0759 dev->external_clk = devm_clk_get(dev->device, NULL);
0760 if (IS_ERR(dev->external_clk)) {
0761 dev_err(dev->device, "couldn't get clock\n");
0762 return -ENODEV;
0763 }
0764
0765 rc = clk_set_rate(dev->external_clk, STD_EXT_CLK_FREQ);
0766 if (rc) {
0767 dev_err(dev->device, "%s: clk_set_rate returned %d\n",
0768 __func__, rc);
0769 return rc;
0770 }
0771
0772 rc = clk_prepare_enable(dev->external_clk);
0773 if (rc) {
0774 dev_err(dev->device, "couldn't enable clock\n");
0775 return rc;
0776 }
0777
0778
0779 rc = bcm_kona_i2c_assign_bus_speed(dev);
0780 if (rc)
0781 goto probe_disable_clk;
0782
0783
0784 bcm_kona_i2c_enable_clock(dev);
0785
0786
0787 bcm_kona_i2c_config_timing(dev);
0788
0789
0790 writel(0, dev->base + TOUT_OFFSET);
0791
0792
0793 bcm_kona_i2c_enable_autosense(dev);
0794
0795
0796 writel(TXFCR_FIFO_FLUSH_MASK | TXFCR_FIFO_EN_MASK,
0797 dev->base + TXFCR_OFFSET);
0798
0799
0800 writel(0, dev->base + IER_OFFSET);
0801
0802
0803 writel(ISR_CMDBUSY_MASK |
0804 ISR_READ_COMPLETE_MASK |
0805 ISR_SES_DONE_MASK |
0806 ISR_ERR_MASK |
0807 ISR_TXFIFOEMPTY_MASK |
0808 ISR_NOACK_MASK,
0809 dev->base + ISR_OFFSET);
0810
0811
0812 dev->irq = platform_get_irq(pdev, 0);
0813 if (dev->irq < 0) {
0814 rc = dev->irq;
0815 goto probe_disable_clk;
0816 }
0817
0818
0819 rc = devm_request_irq(&pdev->dev, dev->irq, bcm_kona_i2c_isr,
0820 IRQF_SHARED, pdev->name, dev);
0821 if (rc) {
0822 dev_err(dev->device, "failed to request irq %i\n", dev->irq);
0823 goto probe_disable_clk;
0824 }
0825
0826
0827 bcm_kona_i2c_send_cmd_to_ctrl(dev, BCM_CMD_NOACTION);
0828
0829
0830 writel(PADCTL_PAD_OUT_EN_MASK, dev->base + PADCTL_OFFSET);
0831
0832
0833 bcm_kona_i2c_disable_clock(dev);
0834
0835
0836 clk_disable_unprepare(dev->external_clk);
0837
0838
0839 adap = &dev->adapter;
0840 i2c_set_adapdata(adap, dev);
0841 adap->owner = THIS_MODULE;
0842 strscpy(adap->name, "Broadcom I2C adapter", sizeof(adap->name));
0843 adap->algo = &bcm_algo;
0844 adap->dev.parent = &pdev->dev;
0845 adap->dev.of_node = pdev->dev.of_node;
0846
0847 rc = i2c_add_adapter(adap);
0848 if (rc)
0849 return rc;
0850
0851 dev_info(dev->device, "device registered successfully\n");
0852
0853 return 0;
0854
0855 probe_disable_clk:
0856 bcm_kona_i2c_disable_clock(dev);
0857 clk_disable_unprepare(dev->external_clk);
0858
0859 return rc;
0860 }
0861
0862 static int bcm_kona_i2c_remove(struct platform_device *pdev)
0863 {
0864 struct bcm_kona_i2c_dev *dev = platform_get_drvdata(pdev);
0865
0866 i2c_del_adapter(&dev->adapter);
0867
0868 return 0;
0869 }
0870
0871 static const struct of_device_id bcm_kona_i2c_of_match[] = {
0872 {.compatible = "brcm,kona-i2c",},
0873 {},
0874 };
0875 MODULE_DEVICE_TABLE(of, bcm_kona_i2c_of_match);
0876
0877 static struct platform_driver bcm_kona_i2c_driver = {
0878 .driver = {
0879 .name = "bcm-kona-i2c",
0880 .of_match_table = bcm_kona_i2c_of_match,
0881 },
0882 .probe = bcm_kona_i2c_probe,
0883 .remove = bcm_kona_i2c_remove,
0884 };
0885 module_platform_driver(bcm_kona_i2c_driver);
0886
0887 MODULE_AUTHOR("Tim Kryger <tkryger@broadcom.com>");
0888 MODULE_DESCRIPTION("Broadcom Kona I2C Driver");
0889 MODULE_LICENSE("GPL v2");