Lines Matching +full:zynq +full:- +full:gpio +full:- +full:1

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2009 - 2014 Xilinx, Inc.
37 #define CDNS_I2C_CR_MS BIT(1)
38 /* Read or Write Master transfer 0 = Transmitter, 1 = Receiver */
40 /* 1 = Auto init FIFO to zeroes */
79 #define CDNS_I2C_IXR_DATA BIT(1)
121 #define CDNS_I2C_TRANSFER_SIZE(max) ((max) - 3)
123 #define DRIVER_NAME "cdns-i2c"
135 #define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset)
136 #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset)
140 * enum cdns_i2c_mode - I2C Controller current operating mode
151 * enum cdns_i2c_slave_state - Slave state when I2C is operating in slave mode
165 * struct cdns_i2c - I2C device private data structure
186 * @rinfo: I2C GPIO recovery information
237 * cdns_i2c_init - Controller initialisation
245 cdns_i2c_writereg(id->ctrl_reg, CDNS_I2C_CR_OFFSET); in cdns_i2c_init()
257 * cdns_i2c_runtime_suspend - Runtime suspend method for the driver
268 clk_disable(xi2c->clk); in cdns_i2c_runtime_suspend()
274 * cdns_i2c_runtime_resume - Runtime resume
286 ret = clk_enable(xi2c->clk); in cdns_i2c_runtime_resume()
297 * cdns_i2c_clear_bus_hold - Clear bus hold bit
312 (id->curr_recv_count == id->fifo_depth + 1)); in cdns_is_holdquirk()
325 id->dev_mode = mode; in cdns_i2c_set_mode()
326 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_set_mode()
331 cdns_i2c_writereg(id->ctrl_reg_diva_divb | in cdns_i2c_set_mode()
344 cdns_i2c_writereg(id->ctrl_reg_diva_divb & in cdns_i2c_set_mode()
349 cdns_i2c_writereg(id->slave->addr & CDNS_I2C_ADDR_MASK, in cdns_i2c_set_mode()
365 if (id->slave_state == CDNS_I2C_SLAVE_STATE_IDLE) { in cdns_i2c_slave_rcv_data()
366 id->slave_state = CDNS_I2C_SLAVE_STATE_RECV; in cdns_i2c_slave_rcv_data()
367 i2c_slave_event(id->slave, I2C_SLAVE_WRITE_REQUESTED, NULL); in cdns_i2c_slave_rcv_data()
374 while (bytes--) { in cdns_i2c_slave_rcv_data()
376 i2c_slave_event(id->slave, I2C_SLAVE_WRITE_RECEIVED, &data); in cdns_i2c_slave_rcv_data()
385 if (id->slave_state == CDNS_I2C_SLAVE_STATE_IDLE) { in cdns_i2c_slave_send_data()
386 id->slave_state = CDNS_I2C_SLAVE_STATE_SEND; in cdns_i2c_slave_send_data()
387 i2c_slave_event(id->slave, I2C_SLAVE_READ_REQUESTED, &data); in cdns_i2c_slave_send_data()
389 i2c_slave_event(id->slave, I2C_SLAVE_READ_PROCESSED, &data); in cdns_i2c_slave_send_data()
397 * cdns_i2c_slave_isr - Interrupt handler for the I2C device in slave role
427 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_slave_isr()
428 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL); in cdns_i2c_slave_isr()
437 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_slave_isr()
438 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL); in cdns_i2c_slave_isr()
445 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_slave_isr()
446 i2c_slave_event(id->slave, I2C_SLAVE_STOP, NULL); in cdns_i2c_slave_isr()
455 * cdns_i2c_master_isr - Interrupt handler for the I2C device in master role
475 id->err_status = 0; in cdns_i2c_master_isr()
479 done_flag = 1; in cdns_i2c_master_isr()
487 updatetx = id->recv_count > id->curr_recv_count; in cdns_i2c_master_isr()
490 if (id->p_recv_buf && in cdns_i2c_master_isr()
496 if (id->recv_count > 0) { in cdns_i2c_master_isr()
497 *(id->p_recv_buf)++ = in cdns_i2c_master_isr()
499 id->recv_count--; in cdns_i2c_master_isr()
500 id->curr_recv_count--; in cdns_i2c_master_isr()
507 if (id->recv_count <= id->fifo_depth && in cdns_i2c_master_isr()
508 !id->bus_hold_flag) in cdns_i2c_master_isr()
512 dev_err(id->adap.dev.parent, in cdns_i2c_master_isr()
514 id->err_status |= CDNS_I2C_IXR_TO; in cdns_i2c_master_isr()
526 * maintain transfer size non-zero while performing a large in cdns_i2c_master_isr()
532 (id->curr_recv_count - id->fifo_depth)) in cdns_i2c_master_isr()
539 if (((int)(id->recv_count) - id->fifo_depth) > in cdns_i2c_master_isr()
540 id->transfer_size) { in cdns_i2c_master_isr()
541 cdns_i2c_writereg(id->transfer_size, in cdns_i2c_master_isr()
543 id->curr_recv_count = id->transfer_size + in cdns_i2c_master_isr()
544 id->fifo_depth; in cdns_i2c_master_isr()
546 cdns_i2c_writereg(id->recv_count - in cdns_i2c_master_isr()
547 id->fifo_depth, in cdns_i2c_master_isr()
549 id->curr_recv_count = id->recv_count; in cdns_i2c_master_isr()
554 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->recv_count) { in cdns_i2c_master_isr()
555 if (!id->bus_hold_flag) in cdns_i2c_master_isr()
557 done_flag = 1; in cdns_i2c_master_isr()
564 if ((isr_status & CDNS_I2C_IXR_COMP) && !id->p_recv_buf) { in cdns_i2c_master_isr()
569 if (id->send_count) { in cdns_i2c_master_isr()
570 avail_bytes = id->fifo_depth - in cdns_i2c_master_isr()
572 if (id->send_count > avail_bytes) in cdns_i2c_master_isr()
575 bytes_to_send = id->send_count; in cdns_i2c_master_isr()
577 while (bytes_to_send--) { in cdns_i2c_master_isr()
579 (*(id->p_send_buf)++), in cdns_i2c_master_isr()
581 id->send_count--; in cdns_i2c_master_isr()
589 done_flag = 1; in cdns_i2c_master_isr()
591 if (!id->send_count && !id->bus_hold_flag) in cdns_i2c_master_isr()
598 id->err_status |= isr_status & CDNS_I2C_IXR_ERR_INTR_MASK; in cdns_i2c_master_isr()
599 if (id->err_status) in cdns_i2c_master_isr()
603 complete(&id->xfer_done); in cdns_i2c_master_isr()
609 * cdns_i2c_isr - Interrupt handler for the I2C device
623 if (id->dev_mode == CDNS_I2C_MODE_SLAVE) in cdns_i2c_isr()
633 id->err_status = 0; in cdns_i2c_error_check()
638 id->err_status = isr_status & CDNS_I2C_IXR_ERR_INTR_MASK; in cdns_i2c_error_check()
640 return !!id->err_status; in cdns_i2c_error_check()
645 while (id->recv_count > 0) { in cdns_i2c_mrecv_atomic()
652 updatetx = id->recv_count > id->curr_recv_count; in cdns_i2c_mrecv_atomic()
654 while (id->curr_recv_count > 0) { in cdns_i2c_mrecv_atomic()
656 *id->p_recv_buf = cdns_i2c_readreg(CDNS_I2C_DATA_OFFSET); in cdns_i2c_mrecv_atomic()
657 id->p_recv_buf++; in cdns_i2c_mrecv_atomic()
658 id->recv_count--; in cdns_i2c_mrecv_atomic()
659 id->curr_recv_count--; in cdns_i2c_mrecv_atomic()
666 if (id->recv_count <= id->fifo_depth && !id->bus_hold_flag) in cdns_i2c_mrecv_atomic()
679 * maintain transfer size non-zero while performing a large in cdns_i2c_mrecv_atomic()
685 (id->curr_recv_count - id->fifo_depth)) in cdns_i2c_mrecv_atomic()
692 if ((id->recv_count - id->fifo_depth) > in cdns_i2c_mrecv_atomic()
693 id->transfer_size) { in cdns_i2c_mrecv_atomic()
694 cdns_i2c_writereg(id->transfer_size, in cdns_i2c_mrecv_atomic()
696 id->curr_recv_count = id->transfer_size + in cdns_i2c_mrecv_atomic()
697 id->fifo_depth; in cdns_i2c_mrecv_atomic()
699 cdns_i2c_writereg(id->recv_count - in cdns_i2c_mrecv_atomic()
700 id->fifo_depth, in cdns_i2c_mrecv_atomic()
702 id->curr_recv_count = id->recv_count; in cdns_i2c_mrecv_atomic()
708 if (!id->recv_count && !id->bus_hold_flag) in cdns_i2c_mrecv_atomic()
713 * cdns_i2c_mrecv - Prepare and start a master receive operation
726 id->p_recv_buf = id->p_msg->buf; in cdns_i2c_mrecv()
727 id->recv_count = id->p_msg->len; in cdns_i2c_mrecv()
735 * byte, plus one checksum byte if PEC is enabled. p_msg->len will be 2 if in cdns_i2c_mrecv()
736 * PEC is enabled, otherwise 1. in cdns_i2c_mrecv()
738 if (id->p_msg->flags & I2C_M_RECV_LEN) in cdns_i2c_mrecv()
739 id->recv_count = I2C_SMBUS_BLOCK_MAX + id->p_msg->len; in cdns_i2c_mrecv()
741 id->curr_recv_count = id->recv_count; in cdns_i2c_mrecv()
747 if (id->recv_count > id->fifo_depth) in cdns_i2c_mrecv()
762 if (id->recv_count > id->transfer_size) { in cdns_i2c_mrecv()
763 cdns_i2c_writereg(id->transfer_size, in cdns_i2c_mrecv()
765 id->curr_recv_count = id->transfer_size; in cdns_i2c_mrecv()
767 cdns_i2c_writereg(id->recv_count, CDNS_I2C_XFER_SIZE_OFFSET); in cdns_i2c_mrecv()
771 if (!id->bus_hold_flag && id->recv_count <= id->fifo_depth) { in cdns_i2c_mrecv()
774 if (id->quirks & CDNS_I2C_BROKEN_HOLD_BIT) in cdns_i2c_mrecv()
779 addr = id->p_msg->addr; in cdns_i2c_mrecv()
786 * In case of Xilinx Zynq SOC, clear the HOLD bit before transfer size in cdns_i2c_mrecv()
806 if (!id->atomic) in cdns_i2c_mrecv()
814 while (id->send_count) { in cdns_i2c_msend_rem_atomic()
818 avail_bytes = id->fifo_depth - cdns_i2c_readreg(CDNS_I2C_XFER_SIZE_OFFSET); in cdns_i2c_msend_rem_atomic()
819 if (id->send_count > avail_bytes) in cdns_i2c_msend_rem_atomic()
822 bytes_to_send = id->send_count; in cdns_i2c_msend_rem_atomic()
824 while (bytes_to_send--) { in cdns_i2c_msend_rem_atomic()
825 cdns_i2c_writereg((*id->p_send_buf++), CDNS_I2C_DATA_OFFSET); in cdns_i2c_msend_rem_atomic()
826 id->send_count--; in cdns_i2c_msend_rem_atomic()
832 if (!id->send_count && !id->bus_hold_flag) in cdns_i2c_msend_rem_atomic()
837 * cdns_i2c_msend - Prepare and start a master send operation
847 id->p_recv_buf = NULL; in cdns_i2c_msend()
848 id->p_send_buf = id->p_msg->buf; in cdns_i2c_msend()
849 id->send_count = id->p_msg->len; in cdns_i2c_msend()
860 if (id->send_count > id->fifo_depth) in cdns_i2c_msend()
873 avail_bytes = id->fifo_depth - in cdns_i2c_msend()
876 if (id->send_count > avail_bytes) in cdns_i2c_msend()
879 bytes_to_send = id->send_count; in cdns_i2c_msend()
881 while (bytes_to_send--) { in cdns_i2c_msend()
882 cdns_i2c_writereg((*(id->p_send_buf)++), CDNS_I2C_DATA_OFFSET); in cdns_i2c_msend()
883 id->send_count--; in cdns_i2c_msend()
890 if (!id->bus_hold_flag && !id->send_count) in cdns_i2c_msend()
892 /* Set the slave address in address register - triggers operation. */ in cdns_i2c_msend()
893 cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, in cdns_i2c_msend()
896 if (!id->atomic) in cdns_i2c_msend()
898 else if (id->send_count > 0) in cdns_i2c_msend()
903 * cdns_i2c_master_reset - Reset the interface
911 struct cdns_i2c *id = adap->algo_data; in cdns_i2c_master_reset()
937 id->p_msg = msg; in cdns_i2c_process_msg()
938 id->err_status = 0; in cdns_i2c_process_msg()
939 if (!id->atomic) in cdns_i2c_process_msg()
940 reinit_completion(&id->xfer_done); in cdns_i2c_process_msg()
944 if (msg->flags & I2C_M_TEN) { in cdns_i2c_process_msg()
955 if (msg->flags & I2C_M_RD) in cdns_i2c_process_msg()
961 msg_timeout = msecs_to_jiffies((1000 * msg->len * BITS_PER_BYTE) / id->i2c_clk); in cdns_i2c_process_msg()
965 * For non-atomic contexts, 500 ms is added to the timeout. in cdns_i2c_process_msg()
969 if (!id->atomic) in cdns_i2c_process_msg()
974 if (msg_timeout < adap->timeout) in cdns_i2c_process_msg()
975 msg_timeout = adap->timeout; in cdns_i2c_process_msg()
977 if (!id->atomic) { in cdns_i2c_process_msg()
979 time_left = wait_for_completion_timeout(&id->xfer_done, msg_timeout); in cdns_i2c_process_msg()
981 /* 0 is success, -ETIMEDOUT is error */ in cdns_i2c_process_msg()
982 time_left = !readl_poll_timeout_atomic(id->membase + CDNS_I2C_ISR_OFFSET, in cdns_i2c_process_msg()
989 return -ETIMEDOUT; in cdns_i2c_process_msg()
996 if (id->err_status & CDNS_I2C_IXR_ARB_LOST) in cdns_i2c_process_msg()
997 return -EAGAIN; in cdns_i2c_process_msg()
999 if (msg->flags & I2C_M_RECV_LEN) in cdns_i2c_process_msg()
1000 msg->len += min_t(unsigned int, msg->buf[0], I2C_SMBUS_BLOCK_MAX); in cdns_i2c_process_msg()
1011 struct cdns_i2c *id = adap->algo_data; in cdns_i2c_master_common_xfer()
1015 if (!id->atomic) in cdns_i2c_master_common_xfer()
1016 ret = readl_relaxed_poll_timeout(id->membase + CDNS_I2C_SR_OFFSET, in cdns_i2c_master_common_xfer()
1021 ret = readl_poll_timeout_atomic(id->membase + CDNS_I2C_SR_OFFSET, in cdns_i2c_master_common_xfer()
1026 ret = -EAGAIN; in cdns_i2c_master_common_xfer()
1027 if (id->adap.bus_recovery_info) in cdns_i2c_master_common_xfer()
1032 hold_quirk = !!(id->quirks & CDNS_I2C_BROKEN_HOLD_BIT); in cdns_i2c_master_common_xfer()
1037 if (num > 1) { in cdns_i2c_master_common_xfer()
1045 for (count = 0; (count < num - 1 && hold_quirk); count++) { in cdns_i2c_master_common_xfer()
1047 dev_warn(adap->dev.parent, in cdns_i2c_master_common_xfer()
1049 return -EOPNOTSUPP; in cdns_i2c_master_common_xfer()
1052 id->bus_hold_flag = 1; in cdns_i2c_master_common_xfer()
1057 id->bus_hold_flag = 0; in cdns_i2c_master_common_xfer()
1062 if (count == (num - 1)) in cdns_i2c_master_common_xfer()
1063 id->bus_hold_flag = 0; in cdns_i2c_master_common_xfer()
1070 if (id->err_status || id->err_status_atomic) { in cdns_i2c_master_common_xfer()
1073 if (id->err_status & CDNS_I2C_IXR_NACK) in cdns_i2c_master_common_xfer()
1074 return -ENXIO; in cdns_i2c_master_common_xfer()
1076 return -EIO; in cdns_i2c_master_common_xfer()
1083 * cdns_i2c_master_xfer - The main i2c transfer function
1096 struct cdns_i2c *id = adap->algo_data; in cdns_i2c_master_xfer()
1101 ret = pm_runtime_resume_and_get(id->dev); in cdns_i2c_master_xfer()
1107 if (id->dev_mode == CDNS_I2C_MODE_SLAVE) { in cdns_i2c_master_xfer()
1108 if (id->slave_state != CDNS_I2C_SLAVE_STATE_IDLE) { in cdns_i2c_master_xfer()
1109 ret = -EAGAIN; in cdns_i2c_master_xfer()
1131 pm_runtime_mark_last_busy(id->dev); in cdns_i2c_master_xfer()
1132 pm_runtime_put_autosuspend(id->dev); in cdns_i2c_master_xfer()
1137 * cdns_i2c_master_xfer_atomic - The i2c transfer function in atomic mode
1148 struct cdns_i2c *id = adap->algo_data; in cdns_i2c_master_xfer_atomic()
1150 ret = cdns_i2c_runtime_resume(id->dev); in cdns_i2c_master_xfer_atomic()
1154 if (id->quirks & CDNS_I2C_BROKEN_HOLD_BIT) { in cdns_i2c_master_xfer_atomic()
1155 dev_warn(id->adap.dev.parent, in cdns_i2c_master_xfer_atomic()
1160 id->atomic = true; in cdns_i2c_master_xfer_atomic()
1165 id->atomic = false; in cdns_i2c_master_xfer_atomic()
1166 cdns_i2c_runtime_suspend(id->dev); in cdns_i2c_master_xfer_atomic()
1172 * cdns_i2c_func - Returns the supported features of the I2C driver
1194 struct cdns_i2c *id = container_of(slave->adapter, struct cdns_i2c, in cdns_reg_slave()
1197 if (id->slave) in cdns_reg_slave()
1198 return -EBUSY; in cdns_reg_slave()
1200 if (slave->flags & I2C_CLIENT_TEN) in cdns_reg_slave()
1201 return -EAFNOSUPPORT; in cdns_reg_slave()
1203 ret = pm_runtime_resume_and_get(id->dev); in cdns_reg_slave()
1208 id->slave = slave; in cdns_reg_slave()
1218 struct cdns_i2c *id = container_of(slave->adapter, struct cdns_i2c, in cdns_unreg_slave()
1221 pm_runtime_put(id->dev); in cdns_unreg_slave()
1224 id->slave = NULL; in cdns_unreg_slave()
1244 * cdns_i2c_calc_divs - Calculate clock dividers
1262 /* calculate (divisor_a+1) x (divisor_b+1) */ in cdns_i2c_calc_divs()
1270 return -EINVAL; in cdns_i2c_calc_divs()
1272 last_error = -1; in cdns_i2c_calc_divs()
1274 div_b = DIV_ROUND_UP(input_clk, 22 * fscl * (div_a + 1)); in cdns_i2c_calc_divs()
1276 if ((div_b < 1) || (div_b > CDNS_I2C_DIVB_MAX)) in cdns_i2c_calc_divs()
1278 div_b--; in cdns_i2c_calc_divs()
1280 actual_fscl = input_clk / (22 * (div_a + 1) * (div_b + 1)); in cdns_i2c_calc_divs()
1285 current_error = fscl - actual_fscl; in cdns_i2c_calc_divs()
1303 * cdns_i2c_setclk - This function sets the serial clock rate for the I2C device
1311 * Fscl = Fpclk/(22 x (divisor_a+1) x (divisor_b+1))
1323 unsigned long fscl = id->i2c_clk; in cdns_i2c_setclk()
1329 ctrl_reg = id->ctrl_reg; in cdns_i2c_setclk()
1333 id->ctrl_reg = ctrl_reg; in cdns_i2c_setclk()
1336 id->ctrl_reg_diva_divb = ctrl_reg & (CDNS_I2C_CR_DIVA_MASK | in cdns_i2c_setclk()
1343 * cdns_i2c_clk_notifier_cb - Clock rate change callback
1351 * New dividers are written to the HW in the pre- or post change notification
1364 if (pm_runtime_suspended(id->dev)) in cdns_i2c_clk_notifier_cb()
1370 unsigned long input_clk = ndata->new_rate; in cdns_i2c_clk_notifier_cb()
1371 unsigned long fscl = id->i2c_clk; in cdns_i2c_clk_notifier_cb()
1377 dev_warn(id->adap.dev.parent, in cdns_i2c_clk_notifier_cb()
1383 if (ndata->new_rate > ndata->old_rate) in cdns_i2c_clk_notifier_cb()
1384 cdns_i2c_setclk(ndata->new_rate, id); in cdns_i2c_clk_notifier_cb()
1389 id->input_clk = ndata->new_rate; in cdns_i2c_clk_notifier_cb()
1391 if (ndata->new_rate < ndata->old_rate) in cdns_i2c_clk_notifier_cb()
1392 cdns_i2c_setclk(ndata->new_rate, id); in cdns_i2c_clk_notifier_cb()
1396 if (ndata->new_rate > ndata->old_rate) in cdns_i2c_clk_notifier_cb()
1397 cdns_i2c_setclk(ndata->old_rate, id); in cdns_i2c_clk_notifier_cb()
1408 i2c_mark_adapter_suspended(&xi2c->adap); in cdns_i2c_suspend()
1431 i2c_mark_adapter_resumed(&xi2c->adap); in cdns_i2c_resume()
1447 { .compatible = "cdns,i2c-r1p10", .data = &r1p10_i2c_def },
1448 { .compatible = "cdns,i2c-r1p14",},
1454 * cdns_i2c_detect_transfer_size - Detect the maximum transfer size supported
1479 id->transfer_size = CDNS_I2C_TRANSFER_SIZE(val); in cdns_i2c_detect_transfer_size()
1485 * cdns_i2c_probe - Platform registration call
1501 id = devm_kzalloc(&pdev->dev, sizeof(*id), GFP_KERNEL); in cdns_i2c_probe()
1503 return -ENOMEM; in cdns_i2c_probe()
1505 id->dev = &pdev->dev; in cdns_i2c_probe()
1508 match = of_match_node(cdns_i2c_of_match, pdev->dev.of_node); in cdns_i2c_probe()
1509 if (match && match->data) { in cdns_i2c_probe()
1510 const struct cdns_platform_data *data = match->data; in cdns_i2c_probe()
1511 id->quirks = data->quirks; in cdns_i2c_probe()
1514 id->rinfo.pinctrl = devm_pinctrl_get(&pdev->dev); in cdns_i2c_probe()
1515 if (IS_ERR(id->rinfo.pinctrl)) { in cdns_i2c_probe()
1516 int err = PTR_ERR(id->rinfo.pinctrl); in cdns_i2c_probe()
1518 dev_info(&pdev->dev, "can't get pinctrl, bus recovery not supported\n"); in cdns_i2c_probe()
1519 if (err != -ENODEV) in cdns_i2c_probe()
1522 id->adap.bus_recovery_info = &id->rinfo; in cdns_i2c_probe()
1525 id->membase = devm_platform_get_and_ioremap_resource(pdev, 0, &r_mem); in cdns_i2c_probe()
1526 if (IS_ERR(id->membase)) in cdns_i2c_probe()
1527 return PTR_ERR(id->membase); in cdns_i2c_probe()
1533 id->adap.owner = THIS_MODULE; in cdns_i2c_probe()
1534 id->adap.dev.of_node = pdev->dev.of_node; in cdns_i2c_probe()
1535 id->adap.algo = &cdns_i2c_algo; in cdns_i2c_probe()
1536 id->adap.timeout = CDNS_I2C_TIMEOUT; in cdns_i2c_probe()
1537 id->adap.retries = 3; /* Default retry value. */ in cdns_i2c_probe()
1538 id->adap.algo_data = id; in cdns_i2c_probe()
1539 id->adap.dev.parent = &pdev->dev; in cdns_i2c_probe()
1540 init_completion(&id->xfer_done); in cdns_i2c_probe()
1541 snprintf(id->adap.name, sizeof(id->adap.name), in cdns_i2c_probe()
1542 "Cadence I2C at %08lx", (unsigned long)r_mem->start); in cdns_i2c_probe()
1544 id->clk = devm_clk_get(&pdev->dev, NULL); in cdns_i2c_probe()
1545 if (IS_ERR(id->clk)) in cdns_i2c_probe()
1546 return dev_err_probe(&pdev->dev, PTR_ERR(id->clk), in cdns_i2c_probe()
1549 id->reset = devm_reset_control_get_optional_shared(&pdev->dev, NULL); in cdns_i2c_probe()
1550 if (IS_ERR(id->reset)) in cdns_i2c_probe()
1551 return dev_err_probe(&pdev->dev, PTR_ERR(id->reset), in cdns_i2c_probe()
1554 ret = clk_prepare_enable(id->clk); in cdns_i2c_probe()
1556 dev_err(&pdev->dev, "Unable to enable clock.\n"); in cdns_i2c_probe()
1558 ret = reset_control_deassert(id->reset); in cdns_i2c_probe()
1560 dev_err_probe(&pdev->dev, ret, in cdns_i2c_probe()
1561 "Failed to de-assert reset.\n"); in cdns_i2c_probe()
1565 pm_runtime_set_autosuspend_delay(id->dev, CNDS_I2C_PM_TIMEOUT); in cdns_i2c_probe()
1566 pm_runtime_use_autosuspend(id->dev); in cdns_i2c_probe()
1567 pm_runtime_set_active(id->dev); in cdns_i2c_probe()
1568 pm_runtime_enable(id->dev); in cdns_i2c_probe()
1570 id->clk_rate_change_nb.notifier_call = cdns_i2c_clk_notifier_cb; in cdns_i2c_probe()
1571 if (clk_notifier_register(id->clk, &id->clk_rate_change_nb)) in cdns_i2c_probe()
1572 dev_warn(&pdev->dev, "Unable to register clock notifier.\n"); in cdns_i2c_probe()
1573 id->input_clk = clk_get_rate(id->clk); in cdns_i2c_probe()
1575 ret = of_property_read_u32(pdev->dev.of_node, "clock-frequency", in cdns_i2c_probe()
1576 &id->i2c_clk); in cdns_i2c_probe()
1577 if (ret || (id->i2c_clk > I2C_MAX_FAST_MODE_FREQ)) in cdns_i2c_probe()
1578 id->i2c_clk = I2C_MAX_STANDARD_MODE_FREQ; in cdns_i2c_probe()
1582 id->dev_mode = CDNS_I2C_MODE_MASTER; in cdns_i2c_probe()
1583 id->slave_state = CDNS_I2C_SLAVE_STATE_IDLE; in cdns_i2c_probe()
1585 id->ctrl_reg = CDNS_I2C_CR_ACK_EN | CDNS_I2C_CR_NEA | CDNS_I2C_CR_MS; in cdns_i2c_probe()
1587 id->fifo_depth = CDNS_I2C_FIFO_DEPTH_DEFAULT; in cdns_i2c_probe()
1588 of_property_read_u32(pdev->dev.of_node, "fifo-depth", &id->fifo_depth); in cdns_i2c_probe()
1592 ret = cdns_i2c_setclk(id->input_clk, id); in cdns_i2c_probe()
1594 dev_err(&pdev->dev, "invalid SCL clock: %u Hz\n", id->i2c_clk); in cdns_i2c_probe()
1595 ret = -EINVAL; in cdns_i2c_probe()
1599 ret = devm_request_irq(&pdev->dev, irq, cdns_i2c_isr, 0, in cdns_i2c_probe()
1602 dev_err(&pdev->dev, "cannot get irq %d\n", irq); in cdns_i2c_probe()
1607 ret = i2c_add_adapter(&id->adap); in cdns_i2c_probe()
1611 dev_info(&pdev->dev, "%u kHz mmio %08lx irq %d\n", in cdns_i2c_probe()
1612 id->i2c_clk / 1000, (unsigned long)r_mem->start, irq); in cdns_i2c_probe()
1617 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb); in cdns_i2c_probe()
1618 reset_control_assert(id->reset); in cdns_i2c_probe()
1620 clk_disable_unprepare(id->clk); in cdns_i2c_probe()
1621 pm_runtime_disable(&pdev->dev); in cdns_i2c_probe()
1622 pm_runtime_set_suspended(&pdev->dev); in cdns_i2c_probe()
1627 * cdns_i2c_remove - Unregister the device after releasing the resources
1638 pm_runtime_disable(&pdev->dev); in cdns_i2c_remove()
1639 pm_runtime_set_suspended(&pdev->dev); in cdns_i2c_remove()
1640 pm_runtime_dont_use_autosuspend(&pdev->dev); in cdns_i2c_remove()
1642 i2c_del_adapter(&id->adap); in cdns_i2c_remove()
1643 clk_notifier_unregister(id->clk, &id->clk_rate_change_nb); in cdns_i2c_remove()
1644 reset_control_assert(id->reset); in cdns_i2c_remove()
1645 clk_disable_unprepare(id->clk); in cdns_i2c_remove()