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)
226 static void cdns_i2c_clear_bus_hold(struct cdns_i2c *id) in cdns_i2c_clear_bus_hold() argument
233 static inline bool cdns_is_holdquirk(struct cdns_i2c *id, bool hold_wrkaround) in cdns_is_holdquirk() argument
236 (id->curr_recv_count == CDNS_I2C_FIFO_DEPTH + 1)); in cdns_is_holdquirk()
240 static void cdns_i2c_set_mode(enum cdns_i2c_mode mode, struct cdns_i2c *id) in cdns_i2c_set_mode() argument
249 id->dev_mode = mode; in cdns_i2c_set_mode()
250 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_set_mode()
255 cdns_i2c_writereg(id->ctrl_reg_diva_divb | in cdns_i2c_set_mode()
268 cdns_i2c_writereg(id->ctrl_reg_diva_divb & in cdns_i2c_set_mode()
273 cdns_i2c_writereg(id->slave->addr & CDNS_I2C_ADDR_MASK, in cdns_i2c_set_mode()
283 static void cdns_i2c_slave_rcv_data(struct cdns_i2c *id) in cdns_i2c_slave_rcv_data() argument
289 if (id->slave_state == CDNS_I2C_SLAVE_STATE_IDLE) { in cdns_i2c_slave_rcv_data()
290 id->slave_state = CDNS_I2C_SLAVE_STATE_RECV; in cdns_i2c_slave_rcv_data()
291 i2c_slave_event(id->slave, I2C_SLAVE_WRITE_REQUESTED, NULL); in cdns_i2c_slave_rcv_data()
300 i2c_slave_event(id->slave, I2C_SLAVE_WRITE_RECEIVED, &data); in cdns_i2c_slave_rcv_data()
304 static void cdns_i2c_slave_send_data(struct cdns_i2c *id) in cdns_i2c_slave_send_data() argument
309 if (id->slave_state == CDNS_I2C_SLAVE_STATE_IDLE) { in cdns_i2c_slave_send_data()
310 id->slave_state = CDNS_I2C_SLAVE_STATE_SEND; in cdns_i2c_slave_send_data()
311 i2c_slave_event(id->slave, I2C_SLAVE_READ_REQUESTED, &data); in cdns_i2c_slave_send_data()
313 i2c_slave_event(id->slave, I2C_SLAVE_READ_PROCESSED, &data); in cdns_i2c_slave_send_data()
331 struct cdns_i2c *id = ptr; in cdns_i2c_slave_isr() local
348 cdns_i2c_slave_send_data(id); in cdns_i2c_slave_isr()
351 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_slave_isr()
352 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL); in cdns_i2c_slave_isr()
357 cdns_i2c_slave_rcv_data(id); in cdns_i2c_slave_isr()
360 cdns_i2c_slave_rcv_data(id); in cdns_i2c_slave_isr()
361 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_slave_isr()
362 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL); in cdns_i2c_slave_isr()
369 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_slave_isr()
370 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL); in cdns_i2c_slave_isr()
392 struct cdns_i2c *id = ptr; in cdns_i2c_master_isr() local
399 id->err_status = 0; in cdns_i2c_master_isr()
411 updatetx = id->recv_count > id->curr_recv_count; in cdns_i2c_master_isr()
414 if (id->p_recv_buf && in cdns_i2c_master_isr()
420 if (id->recv_count > 0) { in cdns_i2c_master_isr()
421 *(id->p_recv_buf)++ = in cdns_i2c_master_isr()
423 id->recv_count--; in cdns_i2c_master_isr()
424 id->curr_recv_count--; in cdns_i2c_master_isr()
431 if (id->recv_count <= CDNS_I2C_FIFO_DEPTH && in cdns_i2c_master_isr()
432 !id->bus_hold_flag) in cdns_i2c_master_isr()
433 cdns_i2c_clear_bus_hold(id); in cdns_i2c_master_isr()
436 dev_err(id->adap.dev.parent, in cdns_i2c_master_isr()
438 id->err_status |= CDNS_I2C_IXR_TO; in cdns_i2c_master_isr()
442 if (cdns_is_holdquirk(id, updatetx)) in cdns_i2c_master_isr()
453 if (cdns_is_holdquirk(id, updatetx)) { in cdns_i2c_master_isr()
456 (id->curr_recv_count - CDNS_I2C_FIFO_DEPTH)) in cdns_i2c_master_isr()
463 if (((int)(id->recv_count) - CDNS_I2C_FIFO_DEPTH) > in cdns_i2c_master_isr()
467 id->curr_recv_count = CDNS_I2C_TRANSFER_SIZE + in cdns_i2c_master_isr()
470 cdns_i2c_writereg(id->recv_count - in cdns_i2c_master_isr()
473 id->curr_recv_count = id->recv_count; in cdns_i2c_master_isr()
478 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->recv_count) { in cdns_i2c_master_isr()
479 if (!id->bus_hold_flag) in cdns_i2c_master_isr()
480 cdns_i2c_clear_bus_hold(id); in cdns_i2c_master_isr()
488 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->p_recv_buf) { in cdns_i2c_master_isr()
493 if (id->send_count) { in cdns_i2c_master_isr()
496 if (id->send_count > avail_bytes) in cdns_i2c_master_isr()
499 bytes_to_send = id->send_count; in cdns_i2c_master_isr()
503 (*(id->p_send_buf)++), in cdns_i2c_master_isr()
505 id->send_count--; in cdns_i2c_master_isr()
515 if (!id->send_count && !id->bus_hold_flag) in cdns_i2c_master_isr()
516 cdns_i2c_clear_bus_hold(id); in cdns_i2c_master_isr()
522 id->err_status |= isr_status & CDNS_I2C_IXR_ERR_INTR_MASK; in cdns_i2c_master_isr()
523 if (id->err_status) in cdns_i2c_master_isr()
527 complete(&id->xfer_done); in cdns_i2c_master_isr()
545 struct cdns_i2c *id = ptr; in cdns_i2c_isr() local
547 if (id->dev_mode == CDNS_I2C_MODE_SLAVE) in cdns_i2c_isr()
557 static void cdns_i2c_mrecv(struct cdns_i2c *id) in cdns_i2c_mrecv() argument
562 id->p_recv_buf = id->p_msg->buf; in cdns_i2c_mrecv()
563 id->recv_count = id->p_msg->len; in cdns_i2c_mrecv()
574 if (id->p_msg->flags & I2C_M_RECV_LEN) in cdns_i2c_mrecv()
575 id->recv_count = I2C_SMBUS_BLOCK_MAX + id->p_msg->len; in cdns_i2c_mrecv()
577 id->curr_recv_count = id->recv_count; in cdns_i2c_mrecv()
583 if (id->recv_count > CDNS_I2C_FIFO_DEPTH) in cdns_i2c_mrecv()
598 if (id->recv_count > CDNS_I2C_TRANSFER_SIZE) { in cdns_i2c_mrecv()
601 id->curr_recv_count = CDNS_I2C_TRANSFER_SIZE; in cdns_i2c_mrecv()
603 cdns_i2c_writereg(id->recv_count, CDNS_I2C_XFER_SIZE_OFFSET); in cdns_i2c_mrecv()
607 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, in cdns_i2c_mrecv()
610 if (!id->bus_hold_flag && in cdns_i2c_mrecv()
611 ((id->p_msg->flags & I2C_M_RECV_LEN) != I2C_M_RECV_LEN) && in cdns_i2c_mrecv()
612 (id->recv_count <= CDNS_I2C_FIFO_DEPTH)) in cdns_i2c_mrecv()
613 cdns_i2c_clear_bus_hold(id); in cdns_i2c_mrecv()
621 static void cdns_i2c_msend(struct cdns_i2c *id) in cdns_i2c_msend() argument
628 id->p_recv_buf = NULL; in cdns_i2c_msend()
629 id->p_send_buf = id->p_msg->buf; in cdns_i2c_msend()
630 id->send_count = id->p_msg->len; in cdns_i2c_msend()
641 if (id->send_count > CDNS_I2C_FIFO_DEPTH) in cdns_i2c_msend()
657 if (id->send_count > avail_bytes) in cdns_i2c_msend()
660 bytes_to_send = id->send_count; in cdns_i2c_msend()
663 cdns_i2c_writereg((*(id->p_send_buf)++), CDNS_I2C_DATA_OFFSET); in cdns_i2c_msend()
664 id->send_count--; in cdns_i2c_msend()
671 if (!id->bus_hold_flag && !id->send_count) in cdns_i2c_msend()
672 cdns_i2c_clear_bus_hold(id); in cdns_i2c_msend()
674 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, in cdns_i2c_msend()
689 struct cdns_i2c *id = adap->algo_data; in cdns_i2c_master_reset() local
709 static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, in cdns_i2c_process_msg() argument
715 id->p_msg = msg; in cdns_i2c_process_msg()
716 id->err_status = 0; in cdns_i2c_process_msg()
717 reinit_completion(&id->xfer_done); in cdns_i2c_process_msg()
733 cdns_i2c_mrecv(id); in cdns_i2c_process_msg()
735 cdns_i2c_msend(id); in cdns_i2c_process_msg()
738 msg_timeout = msecs_to_jiffies((1000 * msg->len * BITS_PER_BYTE) / id->i2c_clk); in cdns_i2c_process_msg()
746 time_left = wait_for_completion_timeout(&id->xfer_done, msg_timeout); in cdns_i2c_process_msg()
749 dev_err(id->adap.dev.parent, in cdns_i2c_process_msg()
758 if (id->err_status & CDNS_I2C_IXR_ARB_LOST) in cdns_i2c_process_msg()
782 struct cdns_i2c *id = adap->algo_data; in cdns_i2c_master_xfer() local
788 ret = pm_runtime_resume_and_get(id->dev); in cdns_i2c_master_xfer()
794 if (id->dev_mode == CDNS_I2C_MODE_SLAVE) { in cdns_i2c_master_xfer()
795 if (id->slave_state != CDNS_I2C_SLAVE_STATE_IDLE) in cdns_i2c_master_xfer()
799 cdns_i2c_set_mode(CDNS_I2C_MODE_MASTER, id); in cdns_i2c_master_xfer()
812 hold_quirk = !!(id->quirks & CDNS_I2C_BROKEN_HOLD_BIT); in cdns_i2c_master_xfer()
833 id->bus_hold_flag = 1; in cdns_i2c_master_xfer()
838 id->bus_hold_flag = 0; in cdns_i2c_master_xfer()
844 id->bus_hold_flag = 0; in cdns_i2c_master_xfer()
846 ret = cdns_i2c_process_msg(id, msgs, adap); in cdns_i2c_master_xfer()
851 if (id->err_status) { in cdns_i2c_master_xfer()
854 if (id->err_status & CDNS_I2C_IXR_NACK) { in cdns_i2c_master_xfer()
870 cdns_i2c_set_mode(CDNS_I2C_MODE_SLAVE, id); in cdns_i2c_master_xfer()
873 pm_runtime_mark_last_busy(id->dev); in cdns_i2c_master_xfer()
874 pm_runtime_put_autosuspend(id->dev); in cdns_i2c_master_xfer()
901 struct cdns_i2c *id = container_of(slave->adapter, struct cdns_i2c, in cdns_reg_slave() local
904 if (id->slave) in cdns_reg_slave()
910 ret = pm_runtime_resume_and_get(id->dev); in cdns_reg_slave()
915 id->slave = slave; in cdns_reg_slave()
918 cdns_i2c_set_mode(CDNS_I2C_MODE_SLAVE, id); in cdns_reg_slave()
925 struct cdns_i2c *id = container_of(slave->adapter, struct cdns_i2c, in cdns_unreg_slave() local
928 pm_runtime_put(id->dev); in cdns_unreg_slave()
931 id->slave = NULL; in cdns_unreg_slave()
934 cdns_i2c_set_mode(CDNS_I2C_MODE_MASTER, id); in cdns_unreg_slave()
1025 static int cdns_i2c_setclk(unsigned long clk_in, struct cdns_i2c *id) in cdns_i2c_setclk() argument
1030 unsigned long fscl = id->i2c_clk; in cdns_i2c_setclk()
1042 id->ctrl_reg_diva_divb = ctrl_reg & (CDNS_I2C_CR_DIVA_MASK | in cdns_i2c_setclk()
1068 struct cdns_i2c *id = to_cdns_i2c(nb); in cdns_i2c_clk_notifier_cb() local
1070 if (pm_runtime_suspended(id->dev)) in cdns_i2c_clk_notifier_cb()
1077 unsigned long fscl = id->i2c_clk; in cdns_i2c_clk_notifier_cb()
1083 dev_warn(id->adap.dev.parent, in cdns_i2c_clk_notifier_cb()
1090 cdns_i2c_setclk(ndata->new_rate, id); in cdns_i2c_clk_notifier_cb()
1095 id->input_clk = ndata->new_rate; in cdns_i2c_clk_notifier_cb()
1098 cdns_i2c_setclk(ndata->new_rate, id); in cdns_i2c_clk_notifier_cb()
1103 cdns_i2c_setclk(ndata->old_rate, id); in cdns_i2c_clk_notifier_cb()
1178 struct cdns_i2c *id; in cdns_i2c_probe() local
1182 id = devm_kzalloc(&pdev->dev, sizeof(*id), GFP_KERNEL); in cdns_i2c_probe()
1183 if (!id) in cdns_i2c_probe()
1186 id->dev = &pdev->dev; in cdns_i2c_probe()
1187 platform_set_drvdata(pdev, id); in cdns_i2c_probe()
1192 id->quirks = data->quirks; in cdns_i2c_probe()
1195 id->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &r_mem); in cdns_i2c_probe()
1196 if (IS_ERR(id->membase)) in cdns_i2c_probe()
1197 return PTR_ERR(id->membase); in cdns_i2c_probe()
1202 id->irq = ret; in cdns_i2c_probe()
1204 id->adap.owner = THIS_MODULE; in cdns_i2c_probe()
1205 id->adap.dev.of_node = pdev->dev.of_node; in cdns_i2c_probe()
1206 id->adap.algo = &cdns_i2c_algo; in cdns_i2c_probe()
1207 id->adap.timeout = CDNS_I2C_TIMEOUT; in cdns_i2c_probe()
1208 id->adap.retries = 3; /* Default retry value. */ in cdns_i2c_probe()
1209 id->adap.algo_data = id; in cdns_i2c_probe()
1210 id->adap.dev.parent = &pdev->dev; in cdns_i2c_probe()
1211 init_completion(&id->xfer_done); in cdns_i2c_probe()
1212 snprintf(id->adap.name, sizeof(id->adap.name), in cdns_i2c_probe()
1215 id->clk = devm_clk_get(&pdev->dev, NULL); in cdns_i2c_probe()
1216 if (IS_ERR(id->clk)) { in cdns_i2c_probe()
1217 if (PTR_ERR(id->clk) != -EPROBE_DEFER) in cdns_i2c_probe()
1219 return PTR_ERR(id->clk); in cdns_i2c_probe()
1221 ret = clk_prepare_enable(id->clk); in cdns_i2c_probe()
1225 pm_runtime_set_autosuspend_delay(id->dev, CNDS_I2C_PM_TIMEOUT); in cdns_i2c_probe()
1226 pm_runtime_use_autosuspend(id->dev); in cdns_i2c_probe()
1227 pm_runtime_set_active(id->dev); in cdns_i2c_probe()
1228 pm_runtime_enable(id->dev); in cdns_i2c_probe()
1230 id->clk_rate_change_nb.notifier_call = cdns_i2c_clk_notifier_cb; in cdns_i2c_probe()
1231 if (clk_notifier_register(id->clk, &id->clk_rate_change_nb)) in cdns_i2c_probe()
1233 id->input_clk = clk_get_rate(id->clk); in cdns_i2c_probe()
1236 &id->i2c_clk); in cdns_i2c_probe()
1237 if (ret || (id->i2c_clk > I2C_MAX_FAST_MODE_FREQ)) in cdns_i2c_probe()
1238 id->i2c_clk = I2C_MAX_STANDARD_MODE_FREQ; in cdns_i2c_probe()
1242 id->dev_mode = CDNS_I2C_MODE_MASTER; in cdns_i2c_probe()
1243 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_probe()
1247 ret = cdns_i2c_setclk(id->input_clk, id); in cdns_i2c_probe()
1249 dev_err(&pdev->dev, "invalid SCL clock: %u Hz\n", id->i2c_clk); in cdns_i2c_probe()
1254 ret = devm_request_irq(&pdev->dev, id->irq, cdns_i2c_isr, 0, in cdns_i2c_probe()
1255 DRIVER_NAME, id); in cdns_i2c_probe()
1257 dev_err(&pdev->dev, "cannot get irq %d\n", id->irq); in cdns_i2c_probe()
1270 ret = i2c_add_adapter(&id->adap); in cdns_i2c_probe()
1275 id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq); in cdns_i2c_probe()
1280 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb); in cdns_i2c_probe()
1281 clk_disable_unprepare(id->clk); in cdns_i2c_probe()
1297 struct cdns_i2c *id = platform_get_drvdata(pdev); in cdns_i2c_remove() local
1303 i2c_del_adapter(&id->adap); in cdns_i2c_remove()
1304 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb); in cdns_i2c_remove()
1305 clk_disable_unprepare(id->clk); in cdns_i2c_remove()