0001
0002
0003
0004 #include <linux/acpi.h>
0005 #include <linux/clk.h>
0006 #include <linux/dmaengine.h>
0007 #include <linux/dma-mapping.h>
0008 #include <linux/dma/qcom-gpi-dma.h>
0009 #include <linux/err.h>
0010 #include <linux/i2c.h>
0011 #include <linux/interrupt.h>
0012 #include <linux/io.h>
0013 #include <linux/module.h>
0014 #include <linux/of.h>
0015 #include <linux/platform_device.h>
0016 #include <linux/pm_runtime.h>
0017 #include <linux/qcom-geni-se.h>
0018 #include <linux/spinlock.h>
0019
0020 #define SE_I2C_TX_TRANS_LEN 0x26c
0021 #define SE_I2C_RX_TRANS_LEN 0x270
0022 #define SE_I2C_SCL_COUNTERS 0x278
0023
0024 #define SE_I2C_ERR (M_CMD_OVERRUN_EN | M_ILLEGAL_CMD_EN | M_CMD_FAILURE_EN |\
0025 M_GP_IRQ_1_EN | M_GP_IRQ_3_EN | M_GP_IRQ_4_EN)
0026 #define SE_I2C_ABORT BIT(1)
0027
0028
0029 #define I2C_WRITE 0x1
0030 #define I2C_READ 0x2
0031 #define I2C_WRITE_READ 0x3
0032 #define I2C_ADDR_ONLY 0x4
0033 #define I2C_BUS_CLEAR 0x6
0034 #define I2C_STOP_ON_BUS 0x7
0035
0036 #define PRE_CMD_DELAY BIT(0)
0037 #define TIMESTAMP_BEFORE BIT(1)
0038 #define STOP_STRETCH BIT(2)
0039 #define TIMESTAMP_AFTER BIT(3)
0040 #define POST_COMMAND_DELAY BIT(4)
0041 #define IGNORE_ADD_NACK BIT(6)
0042 #define READ_FINISHED_WITH_ACK BIT(7)
0043 #define BYPASS_ADDR_PHASE BIT(8)
0044 #define SLV_ADDR_MSK GENMASK(15, 9)
0045 #define SLV_ADDR_SHFT 9
0046
0047 #define HIGH_COUNTER_MSK GENMASK(29, 20)
0048 #define HIGH_COUNTER_SHFT 20
0049 #define LOW_COUNTER_MSK GENMASK(19, 10)
0050 #define LOW_COUNTER_SHFT 10
0051 #define CYCLE_COUNTER_MSK GENMASK(9, 0)
0052
0053 #define I2C_PACK_TX BIT(0)
0054 #define I2C_PACK_RX BIT(1)
0055
0056 enum geni_i2c_err_code {
0057 GP_IRQ0,
0058 NACK,
0059 GP_IRQ2,
0060 BUS_PROTO,
0061 ARB_LOST,
0062 GP_IRQ5,
0063 GENI_OVERRUN,
0064 GENI_ILLEGAL_CMD,
0065 GENI_ABORT_DONE,
0066 GENI_TIMEOUT,
0067 };
0068
0069 #define DM_I2C_CB_ERR ((BIT(NACK) | BIT(BUS_PROTO) | BIT(ARB_LOST)) \
0070 << 5)
0071
0072 #define I2C_AUTO_SUSPEND_DELAY 250
0073 #define KHZ(freq) (1000 * freq)
0074 #define PACKING_BYTES_PW 4
0075
0076 #define ABORT_TIMEOUT HZ
0077 #define XFER_TIMEOUT HZ
0078 #define RST_TIMEOUT HZ
0079
0080 struct geni_i2c_dev {
0081 struct geni_se se;
0082 u32 tx_wm;
0083 int irq;
0084 int err;
0085 struct i2c_adapter adap;
0086 struct completion done;
0087 struct i2c_msg *cur;
0088 int cur_wr;
0089 int cur_rd;
0090 spinlock_t lock;
0091 u32 clk_freq_out;
0092 const struct geni_i2c_clk_fld *clk_fld;
0093 int suspended;
0094 void *dma_buf;
0095 size_t xfer_len;
0096 dma_addr_t dma_addr;
0097 struct dma_chan *tx_c;
0098 struct dma_chan *rx_c;
0099 bool gpi_mode;
0100 bool abort_done;
0101 };
0102
0103 struct geni_i2c_err_log {
0104 int err;
0105 const char *msg;
0106 };
0107
0108 static const struct geni_i2c_err_log gi2c_log[] = {
0109 [GP_IRQ0] = {-EIO, "Unknown I2C err GP_IRQ0"},
0110 [NACK] = {-ENXIO, "NACK: slv unresponsive, check its power/reset-ln"},
0111 [GP_IRQ2] = {-EIO, "Unknown I2C err GP IRQ2"},
0112 [BUS_PROTO] = {-EPROTO, "Bus proto err, noisy/unexpected start/stop"},
0113 [ARB_LOST] = {-EAGAIN, "Bus arbitration lost, clock line undriveable"},
0114 [GP_IRQ5] = {-EIO, "Unknown I2C err GP IRQ5"},
0115 [GENI_OVERRUN] = {-EIO, "Cmd overrun, check GENI cmd-state machine"},
0116 [GENI_ILLEGAL_CMD] = {-EIO, "Illegal cmd, check GENI cmd-state machine"},
0117 [GENI_ABORT_DONE] = {-ETIMEDOUT, "Abort after timeout successful"},
0118 [GENI_TIMEOUT] = {-ETIMEDOUT, "I2C TXN timed out"},
0119 };
0120
0121 struct geni_i2c_clk_fld {
0122 u32 clk_freq_out;
0123 u8 clk_div;
0124 u8 t_high_cnt;
0125 u8 t_low_cnt;
0126 u8 t_cycle_cnt;
0127 };
0128
0129
0130
0131
0132
0133
0134
0135
0136
0137
0138
0139
0140
0141 static const struct geni_i2c_clk_fld geni_i2c_clk_map[] = {
0142 {KHZ(100), 7, 10, 11, 26},
0143 {KHZ(400), 2, 5, 12, 24},
0144 {KHZ(1000), 1, 3, 9, 18},
0145 };
0146
0147 static int geni_i2c_clk_map_idx(struct geni_i2c_dev *gi2c)
0148 {
0149 int i;
0150 const struct geni_i2c_clk_fld *itr = geni_i2c_clk_map;
0151
0152 for (i = 0; i < ARRAY_SIZE(geni_i2c_clk_map); i++, itr++) {
0153 if (itr->clk_freq_out == gi2c->clk_freq_out) {
0154 gi2c->clk_fld = itr;
0155 return 0;
0156 }
0157 }
0158 return -EINVAL;
0159 }
0160
0161 static void qcom_geni_i2c_conf(struct geni_i2c_dev *gi2c)
0162 {
0163 const struct geni_i2c_clk_fld *itr = gi2c->clk_fld;
0164 u32 val;
0165
0166 writel_relaxed(0, gi2c->se.base + SE_GENI_CLK_SEL);
0167
0168 val = (itr->clk_div << CLK_DIV_SHFT) | SER_CLK_EN;
0169 writel_relaxed(val, gi2c->se.base + GENI_SER_M_CLK_CFG);
0170
0171 val = itr->t_high_cnt << HIGH_COUNTER_SHFT;
0172 val |= itr->t_low_cnt << LOW_COUNTER_SHFT;
0173 val |= itr->t_cycle_cnt;
0174 writel_relaxed(val, gi2c->se.base + SE_I2C_SCL_COUNTERS);
0175 }
0176
0177 static void geni_i2c_err_misc(struct geni_i2c_dev *gi2c)
0178 {
0179 u32 m_cmd = readl_relaxed(gi2c->se.base + SE_GENI_M_CMD0);
0180 u32 m_stat = readl_relaxed(gi2c->se.base + SE_GENI_M_IRQ_STATUS);
0181 u32 geni_s = readl_relaxed(gi2c->se.base + SE_GENI_STATUS);
0182 u32 geni_ios = readl_relaxed(gi2c->se.base + SE_GENI_IOS);
0183 u32 dma = readl_relaxed(gi2c->se.base + SE_GENI_DMA_MODE_EN);
0184 u32 rx_st, tx_st;
0185
0186 if (dma) {
0187 rx_st = readl_relaxed(gi2c->se.base + SE_DMA_RX_IRQ_STAT);
0188 tx_st = readl_relaxed(gi2c->se.base + SE_DMA_TX_IRQ_STAT);
0189 } else {
0190 rx_st = readl_relaxed(gi2c->se.base + SE_GENI_RX_FIFO_STATUS);
0191 tx_st = readl_relaxed(gi2c->se.base + SE_GENI_TX_FIFO_STATUS);
0192 }
0193 dev_dbg(gi2c->se.dev, "DMA:%d tx_stat:0x%x, rx_stat:0x%x, irq-stat:0x%x\n",
0194 dma, tx_st, rx_st, m_stat);
0195 dev_dbg(gi2c->se.dev, "m_cmd:0x%x, geni_status:0x%x, geni_ios:0x%x\n",
0196 m_cmd, geni_s, geni_ios);
0197 }
0198
0199 static void geni_i2c_err(struct geni_i2c_dev *gi2c, int err)
0200 {
0201 if (!gi2c->err)
0202 gi2c->err = gi2c_log[err].err;
0203 if (gi2c->cur)
0204 dev_dbg(gi2c->se.dev, "len:%d, slv-addr:0x%x, RD/WR:%d\n",
0205 gi2c->cur->len, gi2c->cur->addr, gi2c->cur->flags);
0206
0207 switch (err) {
0208 case GENI_ABORT_DONE:
0209 gi2c->abort_done = true;
0210 break;
0211 case NACK:
0212 case GENI_TIMEOUT:
0213 dev_dbg(gi2c->se.dev, "%s\n", gi2c_log[err].msg);
0214 break;
0215 default:
0216 dev_err(gi2c->se.dev, "%s\n", gi2c_log[err].msg);
0217 geni_i2c_err_misc(gi2c);
0218 break;
0219 }
0220 }
0221
0222 static irqreturn_t geni_i2c_irq(int irq, void *dev)
0223 {
0224 struct geni_i2c_dev *gi2c = dev;
0225 void __iomem *base = gi2c->se.base;
0226 int j, p;
0227 u32 m_stat;
0228 u32 rx_st;
0229 u32 dm_tx_st;
0230 u32 dm_rx_st;
0231 u32 dma;
0232 u32 val;
0233 struct i2c_msg *cur;
0234
0235 spin_lock(&gi2c->lock);
0236 m_stat = readl_relaxed(base + SE_GENI_M_IRQ_STATUS);
0237 rx_st = readl_relaxed(base + SE_GENI_RX_FIFO_STATUS);
0238 dm_tx_st = readl_relaxed(base + SE_DMA_TX_IRQ_STAT);
0239 dm_rx_st = readl_relaxed(base + SE_DMA_RX_IRQ_STAT);
0240 dma = readl_relaxed(base + SE_GENI_DMA_MODE_EN);
0241 cur = gi2c->cur;
0242
0243 if (!cur ||
0244 m_stat & (M_CMD_FAILURE_EN | M_CMD_ABORT_EN) ||
0245 dm_rx_st & (DM_I2C_CB_ERR)) {
0246 if (m_stat & M_GP_IRQ_1_EN)
0247 geni_i2c_err(gi2c, NACK);
0248 if (m_stat & M_GP_IRQ_3_EN)
0249 geni_i2c_err(gi2c, BUS_PROTO);
0250 if (m_stat & M_GP_IRQ_4_EN)
0251 geni_i2c_err(gi2c, ARB_LOST);
0252 if (m_stat & M_CMD_OVERRUN_EN)
0253 geni_i2c_err(gi2c, GENI_OVERRUN);
0254 if (m_stat & M_ILLEGAL_CMD_EN)
0255 geni_i2c_err(gi2c, GENI_ILLEGAL_CMD);
0256 if (m_stat & M_CMD_ABORT_EN)
0257 geni_i2c_err(gi2c, GENI_ABORT_DONE);
0258 if (m_stat & M_GP_IRQ_0_EN)
0259 geni_i2c_err(gi2c, GP_IRQ0);
0260
0261
0262 if (!dma)
0263 writel_relaxed(0, base + SE_GENI_TX_WATERMARK_REG);
0264 } else if (dma) {
0265 dev_dbg(gi2c->se.dev, "i2c dma tx:0x%x, dma rx:0x%x\n",
0266 dm_tx_st, dm_rx_st);
0267 } else if (cur->flags & I2C_M_RD &&
0268 m_stat & (M_RX_FIFO_WATERMARK_EN | M_RX_FIFO_LAST_EN)) {
0269 u32 rxcnt = rx_st & RX_FIFO_WC_MSK;
0270
0271 for (j = 0; j < rxcnt; j++) {
0272 p = 0;
0273 val = readl_relaxed(base + SE_GENI_RX_FIFOn);
0274 while (gi2c->cur_rd < cur->len && p < sizeof(val)) {
0275 cur->buf[gi2c->cur_rd++] = val & 0xff;
0276 val >>= 8;
0277 p++;
0278 }
0279 if (gi2c->cur_rd == cur->len)
0280 break;
0281 }
0282 } else if (!(cur->flags & I2C_M_RD) &&
0283 m_stat & M_TX_FIFO_WATERMARK_EN) {
0284 for (j = 0; j < gi2c->tx_wm; j++) {
0285 u32 temp;
0286
0287 val = 0;
0288 p = 0;
0289 while (gi2c->cur_wr < cur->len && p < sizeof(val)) {
0290 temp = cur->buf[gi2c->cur_wr++];
0291 val |= temp << (p * 8);
0292 p++;
0293 }
0294 writel_relaxed(val, base + SE_GENI_TX_FIFOn);
0295
0296 if (gi2c->cur_wr == cur->len) {
0297 writel_relaxed(0, base + SE_GENI_TX_WATERMARK_REG);
0298 break;
0299 }
0300 }
0301 }
0302
0303 if (m_stat)
0304 writel_relaxed(m_stat, base + SE_GENI_M_IRQ_CLEAR);
0305
0306 if (dma && dm_tx_st)
0307 writel_relaxed(dm_tx_st, base + SE_DMA_TX_IRQ_CLR);
0308 if (dma && dm_rx_st)
0309 writel_relaxed(dm_rx_st, base + SE_DMA_RX_IRQ_CLR);
0310
0311
0312 if (m_stat & M_CMD_DONE_EN || m_stat & M_CMD_ABORT_EN ||
0313 dm_tx_st & TX_DMA_DONE || dm_tx_st & TX_RESET_DONE ||
0314 dm_rx_st & RX_DMA_DONE || dm_rx_st & RX_RESET_DONE)
0315 complete(&gi2c->done);
0316
0317 spin_unlock(&gi2c->lock);
0318
0319 return IRQ_HANDLED;
0320 }
0321
0322 static void geni_i2c_abort_xfer(struct geni_i2c_dev *gi2c)
0323 {
0324 unsigned long time_left = ABORT_TIMEOUT;
0325 unsigned long flags;
0326
0327 spin_lock_irqsave(&gi2c->lock, flags);
0328 geni_i2c_err(gi2c, GENI_TIMEOUT);
0329 gi2c->cur = NULL;
0330 gi2c->abort_done = false;
0331 geni_se_abort_m_cmd(&gi2c->se);
0332 spin_unlock_irqrestore(&gi2c->lock, flags);
0333
0334 do {
0335 time_left = wait_for_completion_timeout(&gi2c->done, time_left);
0336 } while (!gi2c->abort_done && time_left);
0337
0338 if (!time_left)
0339 dev_err(gi2c->se.dev, "Timeout abort_m_cmd\n");
0340 }
0341
0342 static void geni_i2c_rx_fsm_rst(struct geni_i2c_dev *gi2c)
0343 {
0344 u32 val;
0345 unsigned long time_left = RST_TIMEOUT;
0346
0347 writel_relaxed(1, gi2c->se.base + SE_DMA_RX_FSM_RST);
0348 do {
0349 time_left = wait_for_completion_timeout(&gi2c->done, time_left);
0350 val = readl_relaxed(gi2c->se.base + SE_DMA_RX_IRQ_STAT);
0351 } while (!(val & RX_RESET_DONE) && time_left);
0352
0353 if (!(val & RX_RESET_DONE))
0354 dev_err(gi2c->se.dev, "Timeout resetting RX_FSM\n");
0355 }
0356
0357 static void geni_i2c_tx_fsm_rst(struct geni_i2c_dev *gi2c)
0358 {
0359 u32 val;
0360 unsigned long time_left = RST_TIMEOUT;
0361
0362 writel_relaxed(1, gi2c->se.base + SE_DMA_TX_FSM_RST);
0363 do {
0364 time_left = wait_for_completion_timeout(&gi2c->done, time_left);
0365 val = readl_relaxed(gi2c->se.base + SE_DMA_TX_IRQ_STAT);
0366 } while (!(val & TX_RESET_DONE) && time_left);
0367
0368 if (!(val & TX_RESET_DONE))
0369 dev_err(gi2c->se.dev, "Timeout resetting TX_FSM\n");
0370 }
0371
0372 static void geni_i2c_rx_msg_cleanup(struct geni_i2c_dev *gi2c,
0373 struct i2c_msg *cur)
0374 {
0375 gi2c->cur_rd = 0;
0376 if (gi2c->dma_buf) {
0377 if (gi2c->err)
0378 geni_i2c_rx_fsm_rst(gi2c);
0379 geni_se_rx_dma_unprep(&gi2c->se, gi2c->dma_addr, gi2c->xfer_len);
0380 i2c_put_dma_safe_msg_buf(gi2c->dma_buf, cur, !gi2c->err);
0381 }
0382 }
0383
0384 static void geni_i2c_tx_msg_cleanup(struct geni_i2c_dev *gi2c,
0385 struct i2c_msg *cur)
0386 {
0387 gi2c->cur_wr = 0;
0388 if (gi2c->dma_buf) {
0389 if (gi2c->err)
0390 geni_i2c_tx_fsm_rst(gi2c);
0391 geni_se_tx_dma_unprep(&gi2c->se, gi2c->dma_addr, gi2c->xfer_len);
0392 i2c_put_dma_safe_msg_buf(gi2c->dma_buf, cur, !gi2c->err);
0393 }
0394 }
0395
0396 static int geni_i2c_rx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
0397 u32 m_param)
0398 {
0399 dma_addr_t rx_dma = 0;
0400 unsigned long time_left;
0401 void *dma_buf;
0402 struct geni_se *se = &gi2c->se;
0403 size_t len = msg->len;
0404 struct i2c_msg *cur;
0405
0406 dma_buf = i2c_get_dma_safe_msg_buf(msg, 32);
0407 if (dma_buf)
0408 geni_se_select_mode(se, GENI_SE_DMA);
0409 else
0410 geni_se_select_mode(se, GENI_SE_FIFO);
0411
0412 writel_relaxed(len, se->base + SE_I2C_RX_TRANS_LEN);
0413 geni_se_setup_m_cmd(se, I2C_READ, m_param);
0414
0415 if (dma_buf && geni_se_rx_dma_prep(se, dma_buf, len, &rx_dma)) {
0416 geni_se_select_mode(se, GENI_SE_FIFO);
0417 i2c_put_dma_safe_msg_buf(dma_buf, msg, false);
0418 dma_buf = NULL;
0419 } else {
0420 gi2c->xfer_len = len;
0421 gi2c->dma_addr = rx_dma;
0422 gi2c->dma_buf = dma_buf;
0423 }
0424
0425 cur = gi2c->cur;
0426 time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT);
0427 if (!time_left)
0428 geni_i2c_abort_xfer(gi2c);
0429
0430 geni_i2c_rx_msg_cleanup(gi2c, cur);
0431
0432 return gi2c->err;
0433 }
0434
0435 static int geni_i2c_tx_one_msg(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
0436 u32 m_param)
0437 {
0438 dma_addr_t tx_dma = 0;
0439 unsigned long time_left;
0440 void *dma_buf;
0441 struct geni_se *se = &gi2c->se;
0442 size_t len = msg->len;
0443 struct i2c_msg *cur;
0444
0445 dma_buf = i2c_get_dma_safe_msg_buf(msg, 32);
0446 if (dma_buf)
0447 geni_se_select_mode(se, GENI_SE_DMA);
0448 else
0449 geni_se_select_mode(se, GENI_SE_FIFO);
0450
0451 writel_relaxed(len, se->base + SE_I2C_TX_TRANS_LEN);
0452 geni_se_setup_m_cmd(se, I2C_WRITE, m_param);
0453
0454 if (dma_buf && geni_se_tx_dma_prep(se, dma_buf, len, &tx_dma)) {
0455 geni_se_select_mode(se, GENI_SE_FIFO);
0456 i2c_put_dma_safe_msg_buf(dma_buf, msg, false);
0457 dma_buf = NULL;
0458 } else {
0459 gi2c->xfer_len = len;
0460 gi2c->dma_addr = tx_dma;
0461 gi2c->dma_buf = dma_buf;
0462 }
0463
0464 if (!dma_buf)
0465 writel_relaxed(1, se->base + SE_GENI_TX_WATERMARK_REG);
0466
0467 cur = gi2c->cur;
0468 time_left = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT);
0469 if (!time_left)
0470 geni_i2c_abort_xfer(gi2c);
0471
0472 geni_i2c_tx_msg_cleanup(gi2c, cur);
0473
0474 return gi2c->err;
0475 }
0476
0477 static void i2c_gpi_cb_result(void *cb, const struct dmaengine_result *result)
0478 {
0479 struct geni_i2c_dev *gi2c = cb;
0480
0481 if (result->result != DMA_TRANS_NOERROR) {
0482 dev_err(gi2c->se.dev, "DMA txn failed:%d\n", result->result);
0483 gi2c->err = -EIO;
0484 } else if (result->residue) {
0485 dev_dbg(gi2c->se.dev, "DMA xfer has pending: %d\n", result->residue);
0486 }
0487
0488 complete(&gi2c->done);
0489 }
0490
0491 static void geni_i2c_gpi_unmap(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
0492 void *tx_buf, dma_addr_t tx_addr,
0493 void *rx_buf, dma_addr_t rx_addr)
0494 {
0495 if (tx_buf) {
0496 dma_unmap_single(gi2c->se.dev->parent, tx_addr, msg->len, DMA_TO_DEVICE);
0497 i2c_put_dma_safe_msg_buf(tx_buf, msg, !gi2c->err);
0498 }
0499
0500 if (rx_buf) {
0501 dma_unmap_single(gi2c->se.dev->parent, rx_addr, msg->len, DMA_FROM_DEVICE);
0502 i2c_put_dma_safe_msg_buf(rx_buf, msg, !gi2c->err);
0503 }
0504 }
0505
0506 static int geni_i2c_gpi(struct geni_i2c_dev *gi2c, struct i2c_msg *msg,
0507 struct dma_slave_config *config, dma_addr_t *dma_addr_p,
0508 void **buf, unsigned int op, struct dma_chan *dma_chan)
0509 {
0510 struct gpi_i2c_config *peripheral;
0511 unsigned int flags;
0512 void *dma_buf;
0513 dma_addr_t addr;
0514 enum dma_data_direction map_dirn;
0515 enum dma_transfer_direction dma_dirn;
0516 struct dma_async_tx_descriptor *desc;
0517 int ret;
0518
0519 peripheral = config->peripheral_config;
0520
0521 dma_buf = i2c_get_dma_safe_msg_buf(msg, 1);
0522 if (!dma_buf)
0523 return -ENOMEM;
0524
0525 if (op == I2C_WRITE)
0526 map_dirn = DMA_TO_DEVICE;
0527 else
0528 map_dirn = DMA_FROM_DEVICE;
0529
0530 addr = dma_map_single(gi2c->se.dev->parent, dma_buf, msg->len, map_dirn);
0531 if (dma_mapping_error(gi2c->se.dev->parent, addr)) {
0532 i2c_put_dma_safe_msg_buf(dma_buf, msg, false);
0533 return -ENOMEM;
0534 }
0535
0536
0537 peripheral->rx_len = msg->len;
0538 peripheral->op = op;
0539
0540 ret = dmaengine_slave_config(dma_chan, config);
0541 if (ret) {
0542 dev_err(gi2c->se.dev, "dma config error: %d for op:%d\n", ret, op);
0543 goto err_config;
0544 }
0545
0546 peripheral->set_config = 0;
0547 peripheral->multi_msg = true;
0548 flags = DMA_PREP_INTERRUPT | DMA_CTRL_ACK;
0549
0550 if (op == I2C_WRITE)
0551 dma_dirn = DMA_MEM_TO_DEV;
0552 else
0553 dma_dirn = DMA_DEV_TO_MEM;
0554
0555 desc = dmaengine_prep_slave_single(dma_chan, addr, msg->len, dma_dirn, flags);
0556 if (!desc) {
0557 dev_err(gi2c->se.dev, "prep_slave_sg failed\n");
0558 ret = -EIO;
0559 goto err_config;
0560 }
0561
0562 desc->callback_result = i2c_gpi_cb_result;
0563 desc->callback_param = gi2c;
0564
0565 dmaengine_submit(desc);
0566 *buf = dma_buf;
0567 *dma_addr_p = addr;
0568
0569 return 0;
0570
0571 err_config:
0572 dma_unmap_single(gi2c->se.dev->parent, addr, msg->len, map_dirn);
0573 i2c_put_dma_safe_msg_buf(dma_buf, msg, false);
0574 return ret;
0575 }
0576
0577 static int geni_i2c_gpi_xfer(struct geni_i2c_dev *gi2c, struct i2c_msg msgs[], int num)
0578 {
0579 struct dma_slave_config config = {};
0580 struct gpi_i2c_config peripheral = {};
0581 int i, ret = 0, timeout;
0582 dma_addr_t tx_addr, rx_addr;
0583 void *tx_buf = NULL, *rx_buf = NULL;
0584 const struct geni_i2c_clk_fld *itr = gi2c->clk_fld;
0585
0586 config.peripheral_config = &peripheral;
0587 config.peripheral_size = sizeof(peripheral);
0588
0589 peripheral.pack_enable = I2C_PACK_TX | I2C_PACK_RX;
0590 peripheral.cycle_count = itr->t_cycle_cnt;
0591 peripheral.high_count = itr->t_high_cnt;
0592 peripheral.low_count = itr->t_low_cnt;
0593 peripheral.clk_div = itr->clk_div;
0594 peripheral.set_config = 1;
0595 peripheral.multi_msg = false;
0596
0597 for (i = 0; i < num; i++) {
0598 gi2c->cur = &msgs[i];
0599 gi2c->err = 0;
0600 dev_dbg(gi2c->se.dev, "msg[%d].len:%d\n", i, gi2c->cur->len);
0601
0602 peripheral.stretch = 0;
0603 if (i < num - 1)
0604 peripheral.stretch = 1;
0605
0606 peripheral.addr = msgs[i].addr;
0607
0608 if (msgs[i].flags & I2C_M_RD) {
0609 ret = geni_i2c_gpi(gi2c, &msgs[i], &config,
0610 &rx_addr, &rx_buf, I2C_READ, gi2c->rx_c);
0611 if (ret)
0612 goto err;
0613 }
0614
0615 ret = geni_i2c_gpi(gi2c, &msgs[i], &config,
0616 &tx_addr, &tx_buf, I2C_WRITE, gi2c->tx_c);
0617 if (ret)
0618 goto err;
0619
0620 if (msgs[i].flags & I2C_M_RD)
0621 dma_async_issue_pending(gi2c->rx_c);
0622 dma_async_issue_pending(gi2c->tx_c);
0623
0624 timeout = wait_for_completion_timeout(&gi2c->done, XFER_TIMEOUT);
0625 if (!timeout) {
0626 dev_err(gi2c->se.dev, "I2C timeout gpi flags:%d addr:0x%x\n",
0627 gi2c->cur->flags, gi2c->cur->addr);
0628 gi2c->err = -ETIMEDOUT;
0629 goto err;
0630 }
0631
0632 if (gi2c->err) {
0633 ret = gi2c->err;
0634 goto err;
0635 }
0636
0637 geni_i2c_gpi_unmap(gi2c, &msgs[i], tx_buf, tx_addr, rx_buf, rx_addr);
0638 }
0639
0640 return num;
0641
0642 err:
0643 dev_err(gi2c->se.dev, "GPI transfer failed: %d\n", ret);
0644 dmaengine_terminate_sync(gi2c->rx_c);
0645 dmaengine_terminate_sync(gi2c->tx_c);
0646 geni_i2c_gpi_unmap(gi2c, &msgs[i], tx_buf, tx_addr, rx_buf, rx_addr);
0647 return ret;
0648 }
0649
0650 static int geni_i2c_fifo_xfer(struct geni_i2c_dev *gi2c,
0651 struct i2c_msg msgs[], int num)
0652 {
0653 int i, ret = 0;
0654
0655 for (i = 0; i < num; i++) {
0656 u32 m_param = i < (num - 1) ? STOP_STRETCH : 0;
0657
0658 m_param |= ((msgs[i].addr << SLV_ADDR_SHFT) & SLV_ADDR_MSK);
0659
0660 gi2c->cur = &msgs[i];
0661 if (msgs[i].flags & I2C_M_RD)
0662 ret = geni_i2c_rx_one_msg(gi2c, &msgs[i], m_param);
0663 else
0664 ret = geni_i2c_tx_one_msg(gi2c, &msgs[i], m_param);
0665
0666 if (ret)
0667 return ret;
0668 }
0669
0670 return num;
0671 }
0672
0673 static int geni_i2c_xfer(struct i2c_adapter *adap,
0674 struct i2c_msg msgs[],
0675 int num)
0676 {
0677 struct geni_i2c_dev *gi2c = i2c_get_adapdata(adap);
0678 int ret;
0679
0680 gi2c->err = 0;
0681 reinit_completion(&gi2c->done);
0682 ret = pm_runtime_get_sync(gi2c->se.dev);
0683 if (ret < 0) {
0684 dev_err(gi2c->se.dev, "error turning SE resources:%d\n", ret);
0685 pm_runtime_put_noidle(gi2c->se.dev);
0686
0687 pm_runtime_set_suspended(gi2c->se.dev);
0688 return ret;
0689 }
0690
0691 qcom_geni_i2c_conf(gi2c);
0692
0693 if (gi2c->gpi_mode)
0694 ret = geni_i2c_gpi_xfer(gi2c, msgs, num);
0695 else
0696 ret = geni_i2c_fifo_xfer(gi2c, msgs, num);
0697
0698 pm_runtime_mark_last_busy(gi2c->se.dev);
0699 pm_runtime_put_autosuspend(gi2c->se.dev);
0700 gi2c->cur = NULL;
0701 gi2c->err = 0;
0702 return ret;
0703 }
0704
0705 static u32 geni_i2c_func(struct i2c_adapter *adap)
0706 {
0707 return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK);
0708 }
0709
0710 static const struct i2c_algorithm geni_i2c_algo = {
0711 .master_xfer = geni_i2c_xfer,
0712 .functionality = geni_i2c_func,
0713 };
0714
0715 #ifdef CONFIG_ACPI
0716 static const struct acpi_device_id geni_i2c_acpi_match[] = {
0717 { "QCOM0220"},
0718 { },
0719 };
0720 MODULE_DEVICE_TABLE(acpi, geni_i2c_acpi_match);
0721 #endif
0722
0723 static void release_gpi_dma(struct geni_i2c_dev *gi2c)
0724 {
0725 if (gi2c->rx_c)
0726 dma_release_channel(gi2c->rx_c);
0727
0728 if (gi2c->tx_c)
0729 dma_release_channel(gi2c->tx_c);
0730 }
0731
0732 static int setup_gpi_dma(struct geni_i2c_dev *gi2c)
0733 {
0734 int ret;
0735
0736 geni_se_select_mode(&gi2c->se, GENI_GPI_DMA);
0737 gi2c->tx_c = dma_request_chan(gi2c->se.dev, "tx");
0738 if (IS_ERR(gi2c->tx_c)) {
0739 ret = dev_err_probe(gi2c->se.dev, PTR_ERR(gi2c->tx_c),
0740 "Failed to get tx DMA ch\n");
0741 goto err_tx;
0742 }
0743
0744 gi2c->rx_c = dma_request_chan(gi2c->se.dev, "rx");
0745 if (IS_ERR(gi2c->rx_c)) {
0746 ret = dev_err_probe(gi2c->se.dev, PTR_ERR(gi2c->rx_c),
0747 "Failed to get rx DMA ch\n");
0748 goto err_rx;
0749 }
0750
0751 dev_dbg(gi2c->se.dev, "Grabbed GPI dma channels\n");
0752 return 0;
0753
0754 err_rx:
0755 dma_release_channel(gi2c->tx_c);
0756 err_tx:
0757 return ret;
0758 }
0759
0760 static int geni_i2c_probe(struct platform_device *pdev)
0761 {
0762 struct geni_i2c_dev *gi2c;
0763 struct resource *res;
0764 u32 proto, tx_depth, fifo_disable;
0765 int ret;
0766 struct device *dev = &pdev->dev;
0767
0768 gi2c = devm_kzalloc(dev, sizeof(*gi2c), GFP_KERNEL);
0769 if (!gi2c)
0770 return -ENOMEM;
0771
0772 gi2c->se.dev = dev;
0773 gi2c->se.wrapper = dev_get_drvdata(dev->parent);
0774 res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
0775 gi2c->se.base = devm_ioremap_resource(dev, res);
0776 if (IS_ERR(gi2c->se.base))
0777 return PTR_ERR(gi2c->se.base);
0778
0779 gi2c->se.clk = devm_clk_get(dev, "se");
0780 if (IS_ERR(gi2c->se.clk) && !has_acpi_companion(dev))
0781 return PTR_ERR(gi2c->se.clk);
0782
0783 ret = device_property_read_u32(dev, "clock-frequency",
0784 &gi2c->clk_freq_out);
0785 if (ret) {
0786 dev_info(dev, "Bus frequency not specified, default to 100kHz.\n");
0787 gi2c->clk_freq_out = KHZ(100);
0788 }
0789
0790 if (has_acpi_companion(dev))
0791 ACPI_COMPANION_SET(&gi2c->adap.dev, ACPI_COMPANION(dev));
0792
0793 gi2c->irq = platform_get_irq(pdev, 0);
0794 if (gi2c->irq < 0)
0795 return gi2c->irq;
0796
0797 ret = geni_i2c_clk_map_idx(gi2c);
0798 if (ret) {
0799 dev_err(dev, "Invalid clk frequency %d Hz: %d\n",
0800 gi2c->clk_freq_out, ret);
0801 return ret;
0802 }
0803
0804 gi2c->adap.algo = &geni_i2c_algo;
0805 init_completion(&gi2c->done);
0806 spin_lock_init(&gi2c->lock);
0807 platform_set_drvdata(pdev, gi2c);
0808 ret = devm_request_irq(dev, gi2c->irq, geni_i2c_irq, 0,
0809 dev_name(dev), gi2c);
0810 if (ret) {
0811 dev_err(dev, "Request_irq failed:%d: err:%d\n",
0812 gi2c->irq, ret);
0813 return ret;
0814 }
0815
0816 disable_irq(gi2c->irq);
0817 i2c_set_adapdata(&gi2c->adap, gi2c);
0818 gi2c->adap.dev.parent = dev;
0819 gi2c->adap.dev.of_node = dev->of_node;
0820 strscpy(gi2c->adap.name, "Geni-I2C", sizeof(gi2c->adap.name));
0821
0822 ret = geni_icc_get(&gi2c->se, "qup-memory");
0823 if (ret)
0824 return ret;
0825
0826
0827
0828
0829
0830 gi2c->se.icc_paths[GENI_TO_CORE].avg_bw = GENI_DEFAULT_BW;
0831 gi2c->se.icc_paths[CPU_TO_GENI].avg_bw = GENI_DEFAULT_BW;
0832 gi2c->se.icc_paths[GENI_TO_DDR].avg_bw = Bps_to_icc(gi2c->clk_freq_out);
0833
0834 ret = geni_icc_set_bw(&gi2c->se);
0835 if (ret)
0836 return ret;
0837
0838 ret = geni_se_resources_on(&gi2c->se);
0839 if (ret) {
0840 dev_err(dev, "Error turning on resources %d\n", ret);
0841 return ret;
0842 }
0843 proto = geni_se_read_proto(&gi2c->se);
0844 if (proto != GENI_SE_I2C) {
0845 dev_err(dev, "Invalid proto %d\n", proto);
0846 geni_se_resources_off(&gi2c->se);
0847 return -ENXIO;
0848 }
0849
0850 fifo_disable = readl_relaxed(gi2c->se.base + GENI_IF_DISABLE_RO) & FIFO_IF_DISABLE;
0851 if (fifo_disable) {
0852
0853 gi2c->gpi_mode = true;
0854 ret = setup_gpi_dma(gi2c);
0855 if (ret)
0856 return dev_err_probe(dev, ret, "Failed to setup GPI DMA mode\n");
0857
0858 dev_dbg(dev, "Using GPI DMA mode for I2C\n");
0859 } else {
0860 gi2c->gpi_mode = false;
0861 tx_depth = geni_se_get_tx_fifo_depth(&gi2c->se);
0862 gi2c->tx_wm = tx_depth - 1;
0863 geni_se_init(&gi2c->se, gi2c->tx_wm, tx_depth);
0864 geni_se_config_packing(&gi2c->se, BITS_PER_BYTE,
0865 PACKING_BYTES_PW, true, true, true);
0866
0867 dev_dbg(dev, "i2c fifo/se-dma mode. fifo depth:%d\n", tx_depth);
0868 }
0869
0870 ret = geni_se_resources_off(&gi2c->se);
0871 if (ret) {
0872 dev_err(dev, "Error turning off resources %d\n", ret);
0873 goto err_dma;
0874 }
0875
0876 ret = geni_icc_disable(&gi2c->se);
0877 if (ret)
0878 goto err_dma;
0879
0880 gi2c->suspended = 1;
0881 pm_runtime_set_suspended(gi2c->se.dev);
0882 pm_runtime_set_autosuspend_delay(gi2c->se.dev, I2C_AUTO_SUSPEND_DELAY);
0883 pm_runtime_use_autosuspend(gi2c->se.dev);
0884 pm_runtime_enable(gi2c->se.dev);
0885
0886 ret = i2c_add_adapter(&gi2c->adap);
0887 if (ret) {
0888 dev_err(dev, "Error adding i2c adapter %d\n", ret);
0889 pm_runtime_disable(gi2c->se.dev);
0890 goto err_dma;
0891 }
0892
0893 dev_dbg(dev, "Geni-I2C adaptor successfully added\n");
0894
0895 return 0;
0896
0897 err_dma:
0898 release_gpi_dma(gi2c);
0899 return ret;
0900 }
0901
0902 static int geni_i2c_remove(struct platform_device *pdev)
0903 {
0904 struct geni_i2c_dev *gi2c = platform_get_drvdata(pdev);
0905
0906 i2c_del_adapter(&gi2c->adap);
0907 release_gpi_dma(gi2c);
0908 pm_runtime_disable(gi2c->se.dev);
0909 return 0;
0910 }
0911
0912 static void geni_i2c_shutdown(struct platform_device *pdev)
0913 {
0914 struct geni_i2c_dev *gi2c = platform_get_drvdata(pdev);
0915
0916
0917 i2c_mark_adapter_suspended(&gi2c->adap);
0918 }
0919
0920 static int __maybe_unused geni_i2c_runtime_suspend(struct device *dev)
0921 {
0922 int ret;
0923 struct geni_i2c_dev *gi2c = dev_get_drvdata(dev);
0924
0925 disable_irq(gi2c->irq);
0926 ret = geni_se_resources_off(&gi2c->se);
0927 if (ret) {
0928 enable_irq(gi2c->irq);
0929 return ret;
0930
0931 } else {
0932 gi2c->suspended = 1;
0933 }
0934
0935 return geni_icc_disable(&gi2c->se);
0936 }
0937
0938 static int __maybe_unused geni_i2c_runtime_resume(struct device *dev)
0939 {
0940 int ret;
0941 struct geni_i2c_dev *gi2c = dev_get_drvdata(dev);
0942
0943 ret = geni_icc_enable(&gi2c->se);
0944 if (ret)
0945 return ret;
0946
0947 ret = geni_se_resources_on(&gi2c->se);
0948 if (ret)
0949 return ret;
0950
0951 enable_irq(gi2c->irq);
0952 gi2c->suspended = 0;
0953 return 0;
0954 }
0955
0956 static int __maybe_unused geni_i2c_suspend_noirq(struct device *dev)
0957 {
0958 struct geni_i2c_dev *gi2c = dev_get_drvdata(dev);
0959
0960 i2c_mark_adapter_suspended(&gi2c->adap);
0961
0962 if (!gi2c->suspended) {
0963 geni_i2c_runtime_suspend(dev);
0964 pm_runtime_disable(dev);
0965 pm_runtime_set_suspended(dev);
0966 pm_runtime_enable(dev);
0967 }
0968 return 0;
0969 }
0970
0971 static int __maybe_unused geni_i2c_resume_noirq(struct device *dev)
0972 {
0973 struct geni_i2c_dev *gi2c = dev_get_drvdata(dev);
0974
0975 i2c_mark_adapter_resumed(&gi2c->adap);
0976 return 0;
0977 }
0978
0979 static const struct dev_pm_ops geni_i2c_pm_ops = {
0980 SET_NOIRQ_SYSTEM_SLEEP_PM_OPS(geni_i2c_suspend_noirq, geni_i2c_resume_noirq)
0981 SET_RUNTIME_PM_OPS(geni_i2c_runtime_suspend, geni_i2c_runtime_resume,
0982 NULL)
0983 };
0984
0985 static const struct of_device_id geni_i2c_dt_match[] = {
0986 { .compatible = "qcom,geni-i2c" },
0987 {}
0988 };
0989 MODULE_DEVICE_TABLE(of, geni_i2c_dt_match);
0990
0991 static struct platform_driver geni_i2c_driver = {
0992 .probe = geni_i2c_probe,
0993 .remove = geni_i2c_remove,
0994 .shutdown = geni_i2c_shutdown,
0995 .driver = {
0996 .name = "geni_i2c",
0997 .pm = &geni_i2c_pm_ops,
0998 .of_match_table = geni_i2c_dt_match,
0999 .acpi_match_table = ACPI_PTR(geni_i2c_acpi_match),
1000 },
1001 };
1002
1003 module_platform_driver(geni_i2c_driver);
1004
1005 MODULE_DESCRIPTION("I2C Controller Driver for GENI based QUP cores");
1006 MODULE_LICENSE("GPL v2");