Lines Matching refs:id
134 #define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset)
135 #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset)
233 * @id: Pointer to driver data struct
237 static void cdns_i2c_clear_bus_hold(struct cdns_i2c *id)
244 static inline bool cdns_is_holdquirk(struct cdns_i2c *id, bool hold_wrkaround)
247 (id->curr_recv_count == id->fifo_depth + 1));
251 static void cdns_i2c_set_mode(enum cdns_i2c_mode mode, struct cdns_i2c *id)
260 id->dev_mode = mode;
261 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
266 cdns_i2c_writereg(id->ctrl_reg_diva_divb |
279 cdns_i2c_writereg(id->ctrl_reg_diva_divb &
284 cdns_i2c_writereg(id->slave->addr & CDNS_I2C_ADDR_MASK,
294 static void cdns_i2c_slave_rcv_data(struct cdns_i2c *id)
300 if (id->slave_state == CDNS_I2C_SLAVE_STATE_IDLE) {
301 id->slave_state = CDNS_I2C_SLAVE_STATE_RECV;
302 i2c_slave_event(id->slave, I2C_SLAVE_WRITE_REQUESTED, NULL);
311 i2c_slave_event(id->slave, I2C_SLAVE_WRITE_RECEIVED, &data);
315 static void cdns_i2c_slave_send_data(struct cdns_i2c *id)
320 if (id->slave_state == CDNS_I2C_SLAVE_STATE_IDLE) {
321 id->slave_state = CDNS_I2C_SLAVE_STATE_SEND;
322 i2c_slave_event(id->slave, I2C_SLAVE_READ_REQUESTED, &data);
324 i2c_slave_event(id->slave, I2C_SLAVE_READ_PROCESSED, &data);
342 struct cdns_i2c *id = ptr;
359 cdns_i2c_slave_send_data(id);
362 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
363 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL);
368 cdns_i2c_slave_rcv_data(id);
371 cdns_i2c_slave_rcv_data(id);
372 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
373 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL);
380 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
381 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL);
403 struct cdns_i2c *id = ptr;
410 id->err_status = 0;
422 updatetx = id->recv_count > id->curr_recv_count;
425 if (id->p_recv_buf &&
431 if (id->recv_count > 0) {
432 *(id->p_recv_buf)++ =
434 id->recv_count--;
435 id->curr_recv_count--;
442 if (id->recv_count <= id->fifo_depth &&
443 !id->bus_hold_flag)
444 cdns_i2c_clear_bus_hold(id);
447 dev_err(id->adap.dev.parent,
449 id->err_status |= CDNS_I2C_IXR_TO;
453 if (cdns_is_holdquirk(id, updatetx))
464 if (cdns_is_holdquirk(id, updatetx)) {
467 (id->curr_recv_count - id->fifo_depth))
474 if (((int)(id->recv_count) - id->fifo_depth) >
475 id->transfer_size) {
476 cdns_i2c_writereg(id->transfer_size,
478 id->curr_recv_count = id->transfer_size +
479 id->fifo_depth;
481 cdns_i2c_writereg(id->recv_count -
482 id->fifo_depth,
484 id->curr_recv_count = id->recv_count;
489 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->recv_count) {
490 if (!id->bus_hold_flag)
491 cdns_i2c_clear_bus_hold(id);
499 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->p_recv_buf) {
504 if (id->send_count) {
505 avail_bytes = id->fifo_depth -
507 if (id->send_count > avail_bytes)
510 bytes_to_send = id->send_count;
514 (*(id->p_send_buf)++),
516 id->send_count--;
526 if (!id->send_count && !id->bus_hold_flag)
527 cdns_i2c_clear_bus_hold(id);
533 id->err_status |= isr_status & CDNS_I2C_IXR_ERR_INTR_MASK;
534 if (id->err_status)
538 complete(&id->xfer_done);
556 struct cdns_i2c *id = ptr;
558 if (id->dev_mode == CDNS_I2C_MODE_SLAVE)
566 * @id: pointer to the i2c device structure
568 static void cdns_i2c_mrecv(struct cdns_i2c *id)
578 id->p_recv_buf = id->p_msg->buf;
579 id->recv_count = id->p_msg->len;
590 if (id->p_msg->flags & I2C_M_RECV_LEN)
591 id->recv_count = I2C_SMBUS_BLOCK_MAX + id->p_msg->len;
593 id->curr_recv_count = id->recv_count;
599 if (id->recv_count > id->fifo_depth)
614 if (id->recv_count > id->transfer_size) {
615 cdns_i2c_writereg(id->transfer_size,
617 id->curr_recv_count = id->transfer_size;
619 cdns_i2c_writereg(id->recv_count, CDNS_I2C_XFER_SIZE_OFFSET);
623 if (!id->bus_hold_flag && id->recv_count <= id->fifo_depth) {
626 if (id->quirks & CDNS_I2C_BROKEN_HOLD_BIT)
631 addr = id->p_msg->addr;
662 * @id: pointer to the i2c device
664 static void cdns_i2c_msend(struct cdns_i2c *id)
671 id->p_recv_buf = NULL;
672 id->p_send_buf = id->p_msg->buf;
673 id->send_count = id->p_msg->len;
684 if (id->send_count > id->fifo_depth)
697 avail_bytes = id->fifo_depth -
700 if (id->send_count > avail_bytes)
703 bytes_to_send = id->send_count;
706 cdns_i2c_writereg((*(id->p_send_buf)++), CDNS_I2C_DATA_OFFSET);
707 id->send_count--;
714 if (!id->bus_hold_flag && !id->send_count)
715 cdns_i2c_clear_bus_hold(id);
717 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK,
732 struct cdns_i2c *id = adap->algo_data;
752 static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg,
758 id->p_msg = msg;
759 id->err_status = 0;
760 reinit_completion(&id->xfer_done);
776 cdns_i2c_mrecv(id);
778 cdns_i2c_msend(id);
781 msg_timeout = msecs_to_jiffies((1000 * msg->len * BITS_PER_BYTE) / id->i2c_clk);
789 time_left = wait_for_completion_timeout(&id->xfer_done, msg_timeout);
792 dev_err(id->adap.dev.parent,
801 if (id->err_status & CDNS_I2C_IXR_ARB_LOST)
825 struct cdns_i2c *id = adap->algo_data;
831 ret = pm_runtime_resume_and_get(id->dev);
837 if (id->dev_mode == CDNS_I2C_MODE_SLAVE) {
838 if (id->slave_state != CDNS_I2C_SLAVE_STATE_IDLE) {
844 cdns_i2c_set_mode(CDNS_I2C_MODE_MASTER, id);
853 ret = readl_relaxed_poll_timeout(id->membase + CDNS_I2C_SR_OFFSET,
859 if (id->adap.bus_recovery_info)
864 hold_quirk = !!(id->quirks & CDNS_I2C_BROKEN_HOLD_BIT);
885 id->bus_hold_flag = 1;
890 id->bus_hold_flag = 0;
896 id->bus_hold_flag = 0;
898 ret = cdns_i2c_process_msg(id, msgs, adap);
903 if (id->err_status) {
906 if (id->err_status & CDNS_I2C_IXR_NACK) {
922 cdns_i2c_set_mode(CDNS_I2C_MODE_SLAVE, id);
925 pm_runtime_mark_last_busy(id->dev);
926 pm_runtime_put_autosuspend(id->dev);
953 struct cdns_i2c *id = container_of(slave->adapter, struct cdns_i2c,
956 if (id->slave)
962 ret = pm_runtime_resume_and_get(id->dev);
967 id->slave = slave;
970 cdns_i2c_set_mode(CDNS_I2C_MODE_SLAVE, id);
977 struct cdns_i2c *id = container_of(slave->adapter, struct cdns_i2c,
980 pm_runtime_put(id->dev);
983 id->slave = NULL;
986 cdns_i2c_set_mode(CDNS_I2C_MODE_MASTER, id);
1063 * @id: Pointer to the I2C device structure
1076 static int cdns_i2c_setclk(unsigned long clk_in, struct cdns_i2c *id)
1081 unsigned long fscl = id->i2c_clk;
1087 ctrl_reg = id->ctrl_reg;
1091 id->ctrl_reg = ctrl_reg;
1094 id->ctrl_reg_diva_divb = ctrl_reg & (CDNS_I2C_CR_DIVA_MASK |
1120 struct cdns_i2c *id = to_cdns_i2c(nb);
1122 if (pm_runtime_suspended(id->dev))
1129 unsigned long fscl = id->i2c_clk;
1135 dev_warn(id->adap.dev.parent,
1142 cdns_i2c_setclk(ndata->new_rate, id);
1147 id->input_clk = ndata->new_rate;
1150 cdns_i2c_setclk(ndata->new_rate, id);
1155 cdns_i2c_setclk(ndata->old_rate, id);
1181 * @id: Device private data structure
1186 static void cdns_i2c_init(struct cdns_i2c *id)
1188 cdns_i2c_writereg(id->ctrl_reg, CDNS_I2C_CR_OFFSET);
1240 * @id: Device private data structure
1245 static void cdns_i2c_detect_transfer_size(struct cdns_i2c *id)
1264 id->transfer_size = CDNS_I2C_TRANSFER_SIZE(val);
1282 struct cdns_i2c *id;
1286 id = devm_kzalloc(&pdev->dev, sizeof(*id), GFP_KERNEL);
1287 if (!id)
1290 id->dev = &pdev->dev;
1291 platform_set_drvdata(pdev, id);
1296 id->quirks = data->quirks;
1299 id->rinfo.pinctrl = devm_pinctrl_get(&pdev->dev);
1300 if (IS_ERR(id->rinfo.pinctrl)) {
1301 int err = PTR_ERR(id->rinfo.pinctrl);
1307 id->adap.bus_recovery_info = &id->rinfo;
1310 id->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &r_mem);
1311 if (IS_ERR(id->membase))
1312 return PTR_ERR(id->membase);
1318 id->adap.owner = THIS_MODULE;
1319 id->adap.dev.of_node = pdev->dev.of_node;
1320 id->adap.algo = &cdns_i2c_algo;
1321 id->adap.timeout = CDNS_I2C_TIMEOUT;
1322 id->adap.retries = 3; /* Default retry value. */
1323 id->adap.algo_data = id;
1324 id->adap.dev.parent = &pdev->dev;
1325 init_completion(&id->xfer_done);
1326 snprintf(id->adap.name, sizeof(id->adap.name),
1329 id->clk = devm_clk_get(&pdev->dev, NULL);
1330 if (IS_ERR(id->clk))
1331 return dev_err_probe(&pdev->dev, PTR_ERR(id->clk),
1334 id->reset = devm_reset_control_get_optional_shared(&pdev->dev, NULL);
1335 if (IS_ERR(id->reset))
1336 return dev_err_probe(&pdev->dev, PTR_ERR(id->reset),
1339 ret = clk_prepare_enable(id->clk);
1343 ret = reset_control_deassert(id->reset);
1350 pm_runtime_set_autosuspend_delay(id->dev, CNDS_I2C_PM_TIMEOUT);
1351 pm_runtime_use_autosuspend(id->dev);
1352 pm_runtime_set_active(id->dev);
1353 pm_runtime_enable(id->dev);
1355 id->clk_rate_change_nb.notifier_call = cdns_i2c_clk_notifier_cb;
1356 if (clk_notifier_register(id->clk, &id->clk_rate_change_nb))
1358 id->input_clk = clk_get_rate(id->clk);
1361 &id->i2c_clk);
1362 if (ret || (id->i2c_clk > I2C_MAX_FAST_MODE_FREQ))
1363 id->i2c_clk = I2C_MAX_STANDARD_MODE_FREQ;
1367 id->dev_mode = CDNS_I2C_MODE_MASTER;
1368 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE;
1370 id->ctrl_reg = CDNS_I2C_CR_ACK_EN | CDNS_I2C_CR_NEA | CDNS_I2C_CR_MS;
1372 id->fifo_depth = CDNS_I2C_FIFO_DEPTH_DEFAULT;
1373 of_property_read_u32(pdev->dev.of_node, "fifo-depth", &id->fifo_depth);
1375 cdns_i2c_detect_transfer_size(id);
1377 ret = cdns_i2c_setclk(id->input_clk, id);
1379 dev_err(&pdev->dev, "invalid SCL clock: %u Hz\n", id->i2c_clk);
1385 DRIVER_NAME, id);
1390 cdns_i2c_init(id);
1392 ret = i2c_add_adapter(&id->adap);
1397 id->i2c_clk / 1000, (unsigned long)r_mem->start, irq);
1402 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb);
1403 reset_control_assert(id->reset);
1405 clk_disable_unprepare(id->clk);
1421 struct cdns_i2c *id = platform_get_drvdata(pdev);
1427 i2c_del_adapter(&id->adap);
1428 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb);
1429 reset_control_assert(id->reset);
1430 clk_disable_unprepare(id->clk);