Lines Matching refs:id
131 #define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset)
132 #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset)
222 * @id: Pointer to driver data struct
226 static void cdns_i2c_clear_bus_hold(struct cdns_i2c *id)
233 static inline bool cdns_is_holdquirk(struct cdns_i2c *id, bool hold_wrkaround)
236 (id->curr_recv_count == CDNS_I2C_FIFO_DEPTH + 1));
240 static void cdns_i2c_set_mode(enum cdns_i2c_mode mode, struct cdns_i2c *id)
249 id->dev_mode = mode;
250 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
255 cdns_i2c_writereg(id->ctrl_reg_diva_divb |
268 cdns_i2c_writereg(id->ctrl_reg_diva_divb &
273 cdns_i2c_writereg(id->slave->addr & CDNS_I2C_ADDR_MASK,
283 static void cdns_i2c_slave_rcv_data(struct cdns_i2c *id)
289 if (id->slave_state == CDNS_I2C_SLAVE_STATE_IDLE) {
290 id->slave_state = CDNS_I2C_SLAVE_STATE_RECV;
291 i2c_slave_event(id->slave, I2C_SLAVE_WRITE_REQUESTED, NULL);
300 i2c_slave_event(id->slave, I2C_SLAVE_WRITE_RECEIVED, &data);
304 static void cdns_i2c_slave_send_data(struct cdns_i2c *id)
309 if (id->slave_state == CDNS_I2C_SLAVE_STATE_IDLE) {
310 id->slave_state = CDNS_I2C_SLAVE_STATE_SEND;
311 i2c_slave_event(id->slave, I2C_SLAVE_READ_REQUESTED, &data);
313 i2c_slave_event(id->slave, I2C_SLAVE_READ_PROCESSED, &data);
331 struct cdns_i2c *id = ptr;
348 cdns_i2c_slave_send_data(id);
351 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
352 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL);
357 cdns_i2c_slave_rcv_data(id);
360 cdns_i2c_slave_rcv_data(id);
361 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
362 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL);
369 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
370 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL);
392 struct cdns_i2c *id = ptr;
399 id->err_status = 0;
411 updatetx = id->recv_count > id->curr_recv_count;
414 if (id->p_recv_buf &&
420 if (id->recv_count > 0) {
421 *(id->p_recv_buf)++ =
423 id->recv_count--;
424 id->curr_recv_count--;
431 if (id->recv_count <= CDNS_I2C_FIFO_DEPTH &&
432 !id->bus_hold_flag)
433 cdns_i2c_clear_bus_hold(id);
436 dev_err(id->adap.dev.parent,
438 id->err_status |= CDNS_I2C_IXR_TO;
442 if (cdns_is_holdquirk(id, updatetx))
453 if (cdns_is_holdquirk(id, updatetx)) {
456 (id->curr_recv_count - CDNS_I2C_FIFO_DEPTH))
463 if (((int)(id->recv_count) - CDNS_I2C_FIFO_DEPTH) >
467 id->curr_recv_count = CDNS_I2C_TRANSFER_SIZE +
470 cdns_i2c_writereg(id->recv_count -
473 id->curr_recv_count = id->recv_count;
478 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->recv_count) {
479 if (!id->bus_hold_flag)
480 cdns_i2c_clear_bus_hold(id);
488 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->p_recv_buf) {
493 if (id->send_count) {
496 if (id->send_count > avail_bytes)
499 bytes_to_send = id->send_count;
503 (*(id->p_send_buf)++),
505 id->send_count--;
515 if (!id->send_count && !id->bus_hold_flag)
516 cdns_i2c_clear_bus_hold(id);
522 id->err_status |= isr_status & CDNS_I2C_IXR_ERR_INTR_MASK;
523 if (id->err_status)
527 complete(&id->xfer_done);
545 struct cdns_i2c *id = ptr;
547 if (id->dev_mode == CDNS_I2C_MODE_SLAVE)
555 * @id: pointer to the i2c device structure
557 static void cdns_i2c_mrecv(struct cdns_i2c *id)
562 id->p_recv_buf = id->p_msg->buf;
563 id->recv_count = id->p_msg->len;
574 if (id->p_msg->flags & I2C_M_RECV_LEN)
575 id->recv_count = I2C_SMBUS_BLOCK_MAX + id->p_msg->len;
577 id->curr_recv_count = id->recv_count;
583 if (id->recv_count > CDNS_I2C_FIFO_DEPTH)
598 if (id->recv_count > CDNS_I2C_TRANSFER_SIZE) {
601 id->curr_recv_count = CDNS_I2C_TRANSFER_SIZE;
603 cdns_i2c_writereg(id->recv_count, CDNS_I2C_XFER_SIZE_OFFSET);
607 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK,
610 if (!id->bus_hold_flag &&
611 ((id->p_msg->flags & I2C_M_RECV_LEN) != I2C_M_RECV_LEN) &&
612 (id->recv_count <= CDNS_I2C_FIFO_DEPTH))
613 cdns_i2c_clear_bus_hold(id);
619 * @id: pointer to the i2c device
621 static void cdns_i2c_msend(struct cdns_i2c *id)
628 id->p_recv_buf = NULL;
629 id->p_send_buf = id->p_msg->buf;
630 id->send_count = id->p_msg->len;
641 if (id->send_count > CDNS_I2C_FIFO_DEPTH)
657 if (id->send_count > avail_bytes)
660 bytes_to_send = id->send_count;
663 cdns_i2c_writereg((*(id->p_send_buf)++), CDNS_I2C_DATA_OFFSET);
664 id->send_count--;
671 if (!id->bus_hold_flag && !id->send_count)
672 cdns_i2c_clear_bus_hold(id);
674 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK,
689 struct cdns_i2c *id = adap->algo_data;
709 static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg,
715 id->p_msg = msg;
716 id->err_status = 0;
717 reinit_completion(&id->xfer_done);
733 cdns_i2c_mrecv(id);
735 cdns_i2c_msend(id);
738 msg_timeout = msecs_to_jiffies((1000 * msg->len * BITS_PER_BYTE) / id->i2c_clk);
746 time_left = wait_for_completion_timeout(&id->xfer_done, msg_timeout);
749 dev_err(id->adap.dev.parent,
758 if (id->err_status & CDNS_I2C_IXR_ARB_LOST)
782 struct cdns_i2c *id = adap->algo_data;
788 ret = pm_runtime_resume_and_get(id->dev);
794 if (id->dev_mode == CDNS_I2C_MODE_SLAVE) {
795 if (id->slave_state != CDNS_I2C_SLAVE_STATE_IDLE) {
801 cdns_i2c_set_mode(CDNS_I2C_MODE_MASTER, id);
814 hold_quirk = !!(id->quirks & CDNS_I2C_BROKEN_HOLD_BIT);
835 id->bus_hold_flag = 1;
840 id->bus_hold_flag = 0;
846 id->bus_hold_flag = 0;
848 ret = cdns_i2c_process_msg(id, msgs, adap);
853 if (id->err_status) {
856 if (id->err_status & CDNS_I2C_IXR_NACK) {
872 cdns_i2c_set_mode(CDNS_I2C_MODE_SLAVE, id);
875 pm_runtime_mark_last_busy(id->dev);
876 pm_runtime_put_autosuspend(id->dev);
903 struct cdns_i2c *id = container_of(slave->adapter, struct cdns_i2c,
906 if (id->slave)
912 ret = pm_runtime_resume_and_get(id->dev);
917 id->slave = slave;
920 cdns_i2c_set_mode(CDNS_I2C_MODE_SLAVE, id);
927 struct cdns_i2c *id = container_of(slave->adapter, struct cdns_i2c,
930 pm_runtime_put(id->dev);
933 id->slave = NULL;
936 cdns_i2c_set_mode(CDNS_I2C_MODE_MASTER, id);
1014 * @id: Pointer to the I2C device structure
1027 static int cdns_i2c_setclk(unsigned long clk_in, struct cdns_i2c *id)
1032 unsigned long fscl = id->i2c_clk;
1044 id->ctrl_reg_diva_divb = ctrl_reg & (CDNS_I2C_CR_DIVA_MASK |
1070 struct cdns_i2c *id = to_cdns_i2c(nb);
1072 if (pm_runtime_suspended(id->dev))
1079 unsigned long fscl = id->i2c_clk;
1085 dev_warn(id->adap.dev.parent,
1092 cdns_i2c_setclk(ndata->new_rate, id);
1097 id->input_clk = ndata->new_rate;
1100 cdns_i2c_setclk(ndata->new_rate, id);
1105 cdns_i2c_setclk(ndata->old_rate, id);
1180 struct cdns_i2c *id;
1184 id = devm_kzalloc(&pdev->dev, sizeof(*id), GFP_KERNEL);
1185 if (!id)
1188 id->dev = &pdev->dev;
1189 platform_set_drvdata(pdev, id);
1194 id->quirks = data->quirks;
1197 id->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &r_mem);
1198 if (IS_ERR(id->membase))
1199 return PTR_ERR(id->membase);
1204 id->irq = ret;
1206 id->adap.owner = THIS_MODULE;
1207 id->adap.dev.of_node = pdev->dev.of_node;
1208 id->adap.algo = &cdns_i2c_algo;
1209 id->adap.timeout = CDNS_I2C_TIMEOUT;
1210 id->adap.retries = 3; /* Default retry value. */
1211 id->adap.algo_data = id;
1212 id->adap.dev.parent = &pdev->dev;
1213 init_completion(&id->xfer_done);
1214 snprintf(id->adap.name, sizeof(id->adap.name),
1217 id->clk = devm_clk_get(&pdev->dev, NULL);
1218 if (IS_ERR(id->clk)) {
1219 if (PTR_ERR(id->clk) != -EPROBE_DEFER)
1221 return PTR_ERR(id->clk);
1223 ret = clk_prepare_enable(id->clk);
1227 pm_runtime_set_autosuspend_delay(id->dev, CNDS_I2C_PM_TIMEOUT);
1228 pm_runtime_use_autosuspend(id->dev);
1229 pm_runtime_set_active(id->dev);
1230 pm_runtime_enable(id->dev);
1232 id->clk_rate_change_nb.notifier_call = cdns_i2c_clk_notifier_cb;
1233 if (clk_notifier_register(id->clk, &id->clk_rate_change_nb))
1235 id->input_clk = clk_get_rate(id->clk);
1238 &id->i2c_clk);
1239 if (ret || (id->i2c_clk > I2C_MAX_FAST_MODE_FREQ))
1240 id->i2c_clk = I2C_MAX_STANDARD_MODE_FREQ;
1244 id->dev_mode = CDNS_I2C_MODE_MASTER;
1245 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
1249 ret = cdns_i2c_setclk(id->input_clk, id);
1251 dev_err(&pdev->dev, "invalid SCL clock: %u Hz\n", id->i2c_clk);
1256 ret = devm_request_irq(&pdev->dev, id->irq, cdns_i2c_isr, 0,
1257 DRIVER_NAME, id);
1259 dev_err(&pdev->dev, "cannot get irq %d\n", id->irq);
1272 ret = i2c_add_adapter(&id->adap);
1277 id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq);
1282 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb);
1283 clk_disable_unprepare(id->clk);
1299 struct cdns_i2c *id = platform_get_drvdata(pdev);
1305 i2c_del_adapter(&id->adap);
1306 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb);
1307 clk_disable_unprepare(id->clk);