Lines Matching full:id

117 #define cdns_i2c_readreg(offset)       readl_relaxed(id->membase + offset)
118 #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset)
172 * @id: Pointer to driver data struct
176 static void cdns_i2c_clear_bus_hold(struct cdns_i2c *id) in cdns_i2c_clear_bus_hold() argument
183 static inline bool cdns_is_holdquirk(struct cdns_i2c *id, bool hold_wrkaround) in cdns_is_holdquirk() argument
186 (id->curr_recv_count == CDNS_I2C_FIFO_DEPTH + 1)); in cdns_is_holdquirk()
204 struct cdns_i2c *id = ptr; in cdns_i2c_isr() local
223 if (id->recv_count > id->curr_recv_count) in cdns_i2c_isr()
226 hold_quirk = (id->quirks & CDNS_I2C_BROKEN_HOLD_BIT) && updatetx; in cdns_i2c_isr()
229 if (id->p_recv_buf && in cdns_i2c_isr()
240 if ((id->recv_count < CDNS_I2C_FIFO_DEPTH) && in cdns_i2c_isr()
241 !id->bus_hold_flag) in cdns_i2c_isr()
242 cdns_i2c_clear_bus_hold(id); in cdns_i2c_isr()
244 *(id->p_recv_buf)++ = in cdns_i2c_isr()
246 id->recv_count--; in cdns_i2c_isr()
247 id->curr_recv_count--; in cdns_i2c_isr()
249 if (cdns_is_holdquirk(id, hold_quirk)) in cdns_i2c_isr()
260 if (cdns_is_holdquirk(id, hold_quirk)) { in cdns_i2c_isr()
263 (id->curr_recv_count - CDNS_I2C_FIFO_DEPTH)) in cdns_i2c_isr()
270 if (((int)(id->recv_count) - CDNS_I2C_FIFO_DEPTH) > in cdns_i2c_isr()
274 id->curr_recv_count = CDNS_I2C_TRANSFER_SIZE + in cdns_i2c_isr()
277 cdns_i2c_writereg(id->recv_count - in cdns_i2c_isr()
280 id->curr_recv_count = id->recv_count; in cdns_i2c_isr()
282 } else if (id->recv_count && !hold_quirk && in cdns_i2c_isr()
283 !id->curr_recv_count) { in cdns_i2c_isr()
286 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, in cdns_i2c_isr()
289 if (id->recv_count > CDNS_I2C_TRANSFER_SIZE) { in cdns_i2c_isr()
292 id->curr_recv_count = CDNS_I2C_TRANSFER_SIZE; in cdns_i2c_isr()
294 cdns_i2c_writereg(id->recv_count, in cdns_i2c_isr()
296 id->curr_recv_count = id->recv_count; in cdns_i2c_isr()
301 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->recv_count) { in cdns_i2c_isr()
302 if (!id->bus_hold_flag) in cdns_i2c_isr()
303 cdns_i2c_clear_bus_hold(id); in cdns_i2c_isr()
311 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->p_recv_buf) { in cdns_i2c_isr()
316 if (id->send_count) { in cdns_i2c_isr()
319 if (id->send_count > avail_bytes) in cdns_i2c_isr()
322 bytes_to_send = id->send_count; in cdns_i2c_isr()
326 (*(id->p_send_buf)++), in cdns_i2c_isr()
328 id->send_count--; in cdns_i2c_isr()
338 if (!id->send_count && !id->bus_hold_flag) in cdns_i2c_isr()
339 cdns_i2c_clear_bus_hold(id); in cdns_i2c_isr()
345 id->err_status = isr_status & CDNS_I2C_IXR_ERR_INTR_MASK; in cdns_i2c_isr()
346 if (id->err_status) in cdns_i2c_isr()
350 complete(&id->xfer_done); in cdns_i2c_isr()
357 * @id: pointer to the i2c device structure
359 static void cdns_i2c_mrecv(struct cdns_i2c *id) in cdns_i2c_mrecv() argument
364 id->p_recv_buf = id->p_msg->buf; in cdns_i2c_mrecv()
365 id->recv_count = id->p_msg->len; in cdns_i2c_mrecv()
371 if (id->p_msg->flags & I2C_M_RECV_LEN) in cdns_i2c_mrecv()
372 id->recv_count = I2C_SMBUS_BLOCK_MAX + 1; in cdns_i2c_mrecv()
374 id->curr_recv_count = id->recv_count; in cdns_i2c_mrecv()
380 if ((id->recv_count > CDNS_I2C_FIFO_DEPTH) || id->bus_hold_flag) in cdns_i2c_mrecv()
397 if (id->recv_count > CDNS_I2C_TRANSFER_SIZE) { in cdns_i2c_mrecv()
400 id->curr_recv_count = CDNS_I2C_TRANSFER_SIZE; in cdns_i2c_mrecv()
402 cdns_i2c_writereg(id->recv_count, CDNS_I2C_XFER_SIZE_OFFSET); in cdns_i2c_mrecv()
406 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, in cdns_i2c_mrecv()
409 if (!id->bus_hold_flag && in cdns_i2c_mrecv()
410 ((id->p_msg->flags & I2C_M_RECV_LEN) != I2C_M_RECV_LEN) && in cdns_i2c_mrecv()
411 (id->recv_count <= CDNS_I2C_FIFO_DEPTH)) in cdns_i2c_mrecv()
412 cdns_i2c_clear_bus_hold(id); in cdns_i2c_mrecv()
418 * @id: pointer to the i2c device
420 static void cdns_i2c_msend(struct cdns_i2c *id) in cdns_i2c_msend() argument
427 id->p_recv_buf = NULL; in cdns_i2c_msend()
428 id->p_send_buf = id->p_msg->buf; in cdns_i2c_msend()
429 id->send_count = id->p_msg->len; in cdns_i2c_msend()
440 if ((id->send_count > CDNS_I2C_FIFO_DEPTH) || id->bus_hold_flag) in cdns_i2c_msend()
459 if (id->send_count > avail_bytes) in cdns_i2c_msend()
462 bytes_to_send = id->send_count; in cdns_i2c_msend()
465 cdns_i2c_writereg((*(id->p_send_buf)++), CDNS_I2C_DATA_OFFSET); in cdns_i2c_msend()
466 id->send_count--; in cdns_i2c_msend()
473 if (!id->bus_hold_flag && !id->send_count) in cdns_i2c_msend()
474 cdns_i2c_clear_bus_hold(id); in cdns_i2c_msend()
476 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, in cdns_i2c_msend()
491 struct cdns_i2c *id = adap->algo_data; in cdns_i2c_master_reset() local
511 static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, in cdns_i2c_process_msg() argument
517 id->p_msg = msg; in cdns_i2c_process_msg()
518 id->err_status = 0; in cdns_i2c_process_msg()
519 reinit_completion(&id->xfer_done); in cdns_i2c_process_msg()
535 cdns_i2c_mrecv(id); in cdns_i2c_process_msg()
537 cdns_i2c_msend(id); in cdns_i2c_process_msg()
540 time_left = wait_for_completion_timeout(&id->xfer_done, adap->timeout); in cdns_i2c_process_msg()
543 dev_err(id->adap.dev.parent, in cdns_i2c_process_msg()
552 if (id->err_status & CDNS_I2C_IXR_ARB_LOST) in cdns_i2c_process_msg()
573 struct cdns_i2c *id = adap->algo_data; in cdns_i2c_master_xfer() local
576 ret = pm_runtime_get_sync(id->dev); in cdns_i2c_master_xfer()
585 hold_quirk = !!(id->quirks & CDNS_I2C_BROKEN_HOLD_BIT); in cdns_i2c_master_xfer()
606 id->bus_hold_flag = 1; in cdns_i2c_master_xfer()
611 id->bus_hold_flag = 0; in cdns_i2c_master_xfer()
617 id->bus_hold_flag = 0; in cdns_i2c_master_xfer()
619 ret = cdns_i2c_process_msg(id, msgs, adap); in cdns_i2c_master_xfer()
624 if (id->err_status) { in cdns_i2c_master_xfer()
627 if (id->err_status & CDNS_I2C_IXR_NACK) { in cdns_i2c_master_xfer()
638 pm_runtime_mark_last_busy(id->dev); in cdns_i2c_master_xfer()
639 pm_runtime_put_autosuspend(id->dev); in cdns_i2c_master_xfer()
724 * @id: Pointer to the I2C device structure
737 static int cdns_i2c_setclk(unsigned long clk_in, struct cdns_i2c *id) in cdns_i2c_setclk() argument
742 unsigned long fscl = id->i2c_clk; in cdns_i2c_setclk()
777 struct cdns_i2c *id = to_cdns_i2c(nb); in cdns_i2c_clk_notifier_cb() local
779 if (pm_runtime_suspended(id->dev)) in cdns_i2c_clk_notifier_cb()
786 unsigned long fscl = id->i2c_clk; in cdns_i2c_clk_notifier_cb()
792 dev_warn(id->adap.dev.parent, in cdns_i2c_clk_notifier_cb()
799 cdns_i2c_setclk(ndata->new_rate, id); in cdns_i2c_clk_notifier_cb()
804 id->input_clk = ndata->new_rate; in cdns_i2c_clk_notifier_cb()
807 cdns_i2c_setclk(ndata->new_rate, id); in cdns_i2c_clk_notifier_cb()
812 cdns_i2c_setclk(ndata->old_rate, id); in cdns_i2c_clk_notifier_cb()
887 struct cdns_i2c *id; in cdns_i2c_probe() local
891 id = devm_kzalloc(&pdev->dev, sizeof(*id), GFP_KERNEL); in cdns_i2c_probe()
892 if (!id) in cdns_i2c_probe()
895 id->dev = &pdev->dev; in cdns_i2c_probe()
896 platform_set_drvdata(pdev, id); in cdns_i2c_probe()
901 id->quirks = data->quirks; in cdns_i2c_probe()
905 id->membase = devm_ioremap_resource(&pdev->dev, r_mem); in cdns_i2c_probe()
906 if (IS_ERR(id->membase)) in cdns_i2c_probe()
907 return PTR_ERR(id->membase); in cdns_i2c_probe()
909 id->irq = platform_get_irq(pdev, 0); in cdns_i2c_probe()
911 id->adap.owner = THIS_MODULE; in cdns_i2c_probe()
912 id->adap.dev.of_node = pdev->dev.of_node; in cdns_i2c_probe()
913 id->adap.algo = &cdns_i2c_algo; in cdns_i2c_probe()
914 id->adap.timeout = CDNS_I2C_TIMEOUT; in cdns_i2c_probe()
915 id->adap.retries = 3; /* Default retry value. */ in cdns_i2c_probe()
916 id->adap.algo_data = id; in cdns_i2c_probe()
917 id->adap.dev.parent = &pdev->dev; in cdns_i2c_probe()
918 init_completion(&id->xfer_done); in cdns_i2c_probe()
919 snprintf(id->adap.name, sizeof(id->adap.name), in cdns_i2c_probe()
922 id->clk = devm_clk_get(&pdev->dev, NULL); in cdns_i2c_probe()
923 if (IS_ERR(id->clk)) { in cdns_i2c_probe()
925 return PTR_ERR(id->clk); in cdns_i2c_probe()
927 ret = clk_prepare_enable(id->clk); in cdns_i2c_probe()
931 pm_runtime_enable(id->dev); in cdns_i2c_probe()
932 pm_runtime_set_autosuspend_delay(id->dev, CNDS_I2C_PM_TIMEOUT); in cdns_i2c_probe()
933 pm_runtime_use_autosuspend(id->dev); in cdns_i2c_probe()
934 pm_runtime_set_active(id->dev); in cdns_i2c_probe()
936 id->clk_rate_change_nb.notifier_call = cdns_i2c_clk_notifier_cb; in cdns_i2c_probe()
937 if (clk_notifier_register(id->clk, &id->clk_rate_change_nb)) in cdns_i2c_probe()
939 id->input_clk = clk_get_rate(id->clk); in cdns_i2c_probe()
942 &id->i2c_clk); in cdns_i2c_probe()
943 if (ret || (id->i2c_clk > CDNS_I2C_SPEED_MAX)) in cdns_i2c_probe()
944 id->i2c_clk = CDNS_I2C_SPEED_DEFAULT; in cdns_i2c_probe()
949 ret = cdns_i2c_setclk(id->input_clk, id); in cdns_i2c_probe()
951 dev_err(&pdev->dev, "invalid SCL clock: %u Hz\n", id->i2c_clk); in cdns_i2c_probe()
956 ret = devm_request_irq(&pdev->dev, id->irq, cdns_i2c_isr, 0, in cdns_i2c_probe()
957 DRIVER_NAME, id); in cdns_i2c_probe()
959 dev_err(&pdev->dev, "cannot get irq %d\n", id->irq); in cdns_i2c_probe()
972 ret = i2c_add_adapter(&id->adap); in cdns_i2c_probe()
977 id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq); in cdns_i2c_probe()
982 clk_disable_unprepare(id->clk); in cdns_i2c_probe()
998 struct cdns_i2c *id = platform_get_drvdata(pdev); in cdns_i2c_remove() local
1000 i2c_del_adapter(&id->adap); in cdns_i2c_remove()
1001 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb); in cdns_i2c_remove()
1002 clk_disable_unprepare(id->clk); in cdns_i2c_remove()