Lines Matching +full:i2c +full:- +full:transfer +full:- +full:timeout +full:- +full:us

1 /* SPDX-License-Identifier: GPL-2.0 */
9 #include "intel-thc-dev.h"
10 #include "intel-thc-hw.h"
16 void __iomem *base = thc_ctx->mmio_addr; in thc_regmap_read()
26 void __iomem *base = thc_ctx->mmio_addr; in thc_regmap_write()
58 * thc_clear_state - Clear THC hardware state
71 regmap_write_bits(dev->thc_regmap, THC_M_PRT_ERR_CAUSE_OFFSET, val, val); in thc_clear_state()
74 regmap_write_bits(dev->thc_regmap, THC_M_PRT_READ_DMA_CNTRL_1_OFFSET, in thc_clear_state()
77 regmap_write_bits(dev->thc_regmap, THC_M_PRT_READ_DMA_CNTRL_2_OFFSET, in thc_clear_state()
81 regmap_write_bits(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_clear_state()
84 regmap_write_bits(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_clear_state()
91 regmap_write_bits(dev->thc_regmap, THC_M_PRT_INT_EN_OFFSET, val, val); in thc_clear_state()
95 regmap_write_bits(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, val, val); in thc_clear_state()
98 regmap_write_bits(dev->thc_regmap, THC_M_PRT_READ_DMA_CNTRL_1_OFFSET, in thc_clear_state()
100 regmap_write_bits(dev->thc_regmap, THC_M_PRT_READ_DMA_CNTRL_2_OFFSET, in thc_clear_state()
103 regmap_write_bits(dev->thc_regmap, THC_M_PRT_READ_DMA_INT_STS_1_OFFSET, in thc_clear_state()
106 regmap_write_bits(dev->thc_regmap, THC_M_PRT_READ_DMA_INT_STS_2_OFFSET, in thc_clear_state()
109 regmap_write_bits(dev->thc_regmap, THC_M_PRT_READ_DMA_INT_STS_1_OFFSET, in thc_clear_state()
114 regmap_write_bits(dev->thc_regmap, THC_M_PRT_WRITE_DMA_CNTRL_OFFSET, in thc_clear_state()
121 regmap_write_bits(dev->thc_regmap, THC_M_PRT_WRITE_INT_STS_OFFSET, val, val); in thc_clear_state()
124 regmap_write_bits(dev->thc_regmap, THC_M_PRT_DB_CNT_1_OFFSET, in thc_clear_state()
128 regmap_write_bits(dev->thc_regmap, THC_M_PRT_DEVINT_CNT_OFFSET, in thc_clear_state()
131 regmap_write_bits(dev->thc_regmap, THC_M_PRT_READ_DMA_CNTRL_1_OFFSET, in thc_clear_state()
136 regmap_write_bits(dev->thc_regmap, THC_M_PRT_FRAME_DROP_CNT_1_OFFSET, in thc_clear_state()
139 regmap_write_bits(dev->thc_regmap, THC_M_PRT_FRAME_DROP_CNT_2_OFFSET, in thc_clear_state()
143 regmap_write_bits(dev->thc_regmap, THC_M_PRT_FRM_CNT_1_OFFSET, in thc_clear_state()
146 regmap_write_bits(dev->thc_regmap, THC_M_PRT_FRM_CNT_2_OFFSET, in thc_clear_state()
150 regmap_write_bits(dev->thc_regmap, THC_M_PRT_RXDMA_PKT_CNT_1_OFFSET, in thc_clear_state()
153 regmap_write_bits(dev->thc_regmap, THC_M_PRT_RXDMA_PKT_CNT_2_OFFSET, in thc_clear_state()
157 regmap_write_bits(dev->thc_regmap, THC_M_PRT_SWINT_CNT_1_OFFSET, in thc_clear_state()
160 regmap_write_bits(dev->thc_regmap, THC_M_PRT_SWINT_CNT_1_OFFSET, in thc_clear_state()
164 regmap_write_bits(dev->thc_regmap, THC_M_PRT_TX_FRM_CNT_OFFSET, in thc_clear_state()
168 regmap_write_bits(dev->thc_regmap, THC_M_PRT_TXDMA_PKT_CNT_OFFSET, in thc_clear_state()
172 regmap_write_bits(dev->thc_regmap, THC_M_PRT_UFRM_CNT_1_OFFSET, in thc_clear_state()
175 regmap_write_bits(dev->thc_regmap, THC_M_PRT_UFRM_CNT_2_OFFSET, in thc_clear_state()
179 regmap_write_bits(dev->thc_regmap, THC_M_PRT_PRD_EMPTY_CNT_1_OFFSET, in thc_clear_state()
182 regmap_write_bits(dev->thc_regmap, THC_M_PRT_PRD_EMPTY_CNT_2_OFFSET, in thc_clear_state()
188 * thc_dev_init - Allocate and initialize the THC device structure
202 return ERR_PTR(-ENOMEM); in thc_dev_init()
204 thc_dev->dev = device; in thc_dev_init()
205 thc_dev->mmio_addr = mem_addr; in thc_dev_init()
206 thc_dev->thc_regmap = devm_regmap_init(device, NULL, thc_dev, &thc_regmap_cfg); in thc_dev_init()
207 if (IS_ERR(thc_dev->thc_regmap)) { in thc_dev_init()
208 ret = PTR_ERR(thc_dev->thc_regmap); in thc_dev_init()
215 mutex_init(&thc_dev->thc_bus_lock); in thc_dev_init()
216 init_waitqueue_head(&thc_dev->write_complete_wait); in thc_dev_init()
217 init_waitqueue_head(&thc_dev->swdma_complete_wait); in thc_dev_init()
219 thc_dev->dma_ctx = thc_dma_init(thc_dev); in thc_dev_init()
220 if (!thc_dev->dma_ctx) { in thc_dev_init()
222 return ERR_PTR(-ENOMEM); in thc_dev_init()
234 regmap_read(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, &sts); in prepare_pio()
238 dev_err_once(dev->dev, "THC PIO is still busy!\n"); in prepare_pio()
239 return -EBUSY; in prepare_pio()
245 regmap_write(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, sts); in prepare_pio()
250 if (dev->pio_int_supported) in prepare_pio()
256 regmap_write_bits(dev->thc_regmap, in prepare_pio()
262 regmap_write_bits(dev->thc_regmap, in prepare_pio()
271 regmap_bulk_write(dev->thc_regmap, THC_M_PRT_SW_SEQ_DATA1_OFFSET, in pio_start()
275 regmap_write_bits(dev->thc_regmap, in pio_start()
286 regmap_read(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, &sts); in pio_complete()
288 dev_err_once(dev->dev, "PIO operation error\n"); in pio_complete()
289 return -EBUSY; in pio_complete()
293 regmap_read(dev->thc_regmap, THC_M_PRT_SW_SEQ_CNTRL_OFFSET, &ctrl); in pio_complete()
296 regmap_bulk_read(dev->thc_regmap, THC_M_PRT_SW_SEQ_DATA1_OFFSET, in pio_complete()
301 regmap_write(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, sts); in pio_complete()
310 ret = regmap_read_poll_timeout(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, sts, in pio_wait()
315 dev_err_once(dev->dev, "Timeout while polling PIO operation done\n"); in pio_wait()
321 * thc_tic_pio_read - Read data from touch device by PIO
338 dev_err(dev->dev, "Invalid input parameters, size %u, actual_size %p, buffer %p\n", in thc_tic_pio_read()
340 return -EINVAL; in thc_tic_pio_read()
343 if (mutex_lock_interruptible(&dev->thc_bus_lock)) in thc_tic_pio_read()
344 return -EINTR; in thc_tic_pio_read()
346 opcode = (dev->port_type == THC_PORT_TYPE_SPI) ? in thc_tic_pio_read()
362 mutex_unlock(&dev->thc_bus_lock); in thc_tic_pio_read()
368 * thc_tic_pio_write - Write data to touch device by PIO
384 dev_err(dev->dev, "Invalid input parameters, size %u, buffer %p\n", in thc_tic_pio_write()
386 return -EINVAL; in thc_tic_pio_write()
389 if (mutex_lock_interruptible(&dev->thc_bus_lock)) in thc_tic_pio_write()
390 return -EINTR; in thc_tic_pio_write()
392 opcode = (dev->port_type == THC_PORT_TYPE_SPI) ? in thc_tic_pio_write()
408 mutex_unlock(&dev->thc_bus_lock); in thc_tic_pio_write()
414 * thc_tic_pio_write_and_read - Write data followed by read data by PIO
433 if (dev->port_type == THC_PORT_TYPE_SPI) { in thc_tic_pio_write_and_read()
434 dev_err(dev->dev, "SPI port type doesn't support pio write and read!"); in thc_tic_pio_write_and_read()
435 return -EINVAL; in thc_tic_pio_write_and_read()
438 if (mutex_lock_interruptible(&dev->thc_bus_lock)) in thc_tic_pio_write_and_read()
439 return -EINTR; in thc_tic_pio_write_and_read()
441 /* Config i2c PIO write and read sequence */ in thc_tic_pio_write_and_read()
445 regmap_write_bits(dev->thc_regmap, THC_M_PRT_SW_SEQ_I2C_WR_CNTRL_OFFSET, in thc_tic_pio_write_and_read()
448 regmap_write_bits(dev->thc_regmap, THC_M_PRT_SW_SEQ_I2C_WR_CNTRL_OFFSET, in thc_tic_pio_write_and_read()
465 mutex_unlock(&dev->thc_bus_lock); in thc_tic_pio_write_and_read()
471 * thc_interrupt_config - Configure THC interrupts
482 regmap_write_bits(dev->thc_regmap, in thc_interrupt_config()
490 regmap_write_bits(dev->thc_regmap, in thc_interrupt_config()
497 regmap_write_bits(dev->thc_regmap, in thc_interrupt_config()
502 regmap_read(dev->thc_regmap, in thc_interrupt_config()
507 regmap_write(dev->thc_regmap, in thc_interrupt_config()
515 regmap_write_bits(dev->thc_regmap, in thc_interrupt_config()
520 regmap_write_bits(dev->thc_regmap, in thc_interrupt_config()
527 regmap_write_bits(dev->thc_regmap, in thc_interrupt_config()
535 regmap_write_bits(dev->thc_regmap, in thc_interrupt_config()
539 /* Enable Non-DMA device inband interrupt */ in thc_interrupt_config()
541 regmap_write(dev->thc_regmap, in thc_interrupt_config()
545 if (dev->port_type == THC_PORT_TYPE_SPI) { in thc_interrupt_config()
547 regmap_write_bits(dev->thc_regmap, THC_M_PRT_TSEQ_CNTRL_1_OFFSET, in thc_interrupt_config()
552 regmap_write_bits(dev->thc_regmap, THC_M_PRT_TSEQ_CNTRL_1_OFFSET, in thc_interrupt_config()
562 regmap_write_bits(dev->thc_regmap, THC_M_PRT_INT_EN_OFFSET, in thc_interrupt_config()
569 if (dev->port_type == THC_PORT_TYPE_SPI) { in thc_interrupt_config()
582 regmap_write_bits(dev->thc_regmap, THC_M_PRT_DEVINT_CFG_1_OFFSET, in thc_interrupt_config()
598 regmap_write_bits(dev->thc_regmap, THC_M_PRT_DEVINT_CFG_2_OFFSET, in thc_interrupt_config()
605 * thc_int_trigger_type_select - Select THC interrupt trigger type
612 regmap_write_bits(dev->thc_regmap, THC_M_PRT_TSEQ_CNTRL_1_OFFSET, in thc_int_trigger_type_select()
619 * thc_interrupt_enable - Enable or disable THC interrupt
626 regmap_write_bits(dev->thc_regmap, THC_M_PRT_INT_EN_OFFSET, in thc_interrupt_enable()
633 * thc_interrupt_quiesce - Quiesce or unquiesce external touch device interrupt
645 regmap_read(dev->thc_regmap, THC_M_PRT_CONTROL_OFFSET, &ctrl); in thc_interrupt_quiesce()
647 dev_warn(dev->dev, "THC interrupt already unquiesce\n"); in thc_interrupt_quiesce()
652 dev_warn(dev->dev, "THC interrupt already quiesce\n"); in thc_interrupt_quiesce()
656 /* Quiesce device interrupt - Set quiesce bit and waiting for THC HW to ACK */ in thc_interrupt_quiesce()
658 regmap_write_bits(dev->thc_regmap, THC_M_PRT_CONTROL_OFFSET, in thc_interrupt_quiesce()
662 ret = regmap_read_poll_timeout(dev->thc_regmap, THC_M_PRT_CONTROL_OFFSET, ctrl, in thc_interrupt_quiesce()
666 dev_err_once(dev->dev, in thc_interrupt_quiesce()
667 "Timeout while waiting THC idle, target quiesce state = %s\n", in thc_interrupt_quiesce()
672 /* Unquiesce device interrupt - Clear the quiesce bit */ in thc_interrupt_quiesce()
674 regmap_write_bits(dev->thc_regmap, THC_M_PRT_CONTROL_OFFSET, in thc_interrupt_quiesce()
682 * thc_set_pio_interrupt_support - Determine PIO interrupt is supported or not
689 dev->pio_int_supported = supported; in thc_set_pio_interrupt_support()
694 * thc_ltr_config - Configure THC Latency Tolerance Reporting(LTR) settings
697 * @active_ltr_us: active LTR value, unit is us
698 * @lp_ltr_us: low power LTR value, unit is us
736 regmap_read(dev->thc_regmap, THC_M_CMN_LTR_CTRL_OFFSET, &orig); in thc_ltr_config()
757 regmap_write(dev->thc_regmap, THC_M_CMN_LTR_CTRL_OFFSET, tmp); in thc_ltr_config()
762 * thc_change_ltr_mode - Change THC LTR mode
770 regmap_write_bits(dev->thc_regmap, THC_M_CMN_LTR_CTRL_OFFSET, in thc_change_ltr_mode()
772 regmap_write_bits(dev->thc_regmap, THC_M_CMN_LTR_CTRL_OFFSET, in thc_change_ltr_mode()
778 regmap_write_bits(dev->thc_regmap, THC_M_CMN_LTR_CTRL_OFFSET, in thc_change_ltr_mode()
780 regmap_write_bits(dev->thc_regmap, THC_M_CMN_LTR_CTRL_OFFSET, in thc_change_ltr_mode()
787 * thc_ltr_unconfig - Unconfigure THC Latency Tolerance Reporting(LTR) settings
795 regmap_read(dev->thc_regmap, THC_M_CMN_LTR_CTRL_OFFSET, &ltr_ctrl); in thc_ltr_unconfig()
803 regmap_write(dev->thc_regmap, THC_M_CMN_LTR_CTRL_OFFSET, ltr_ctrl); in thc_ltr_unconfig()
808 * thc_int_cause_read - Read interrupt cause register value
818 regmap_read(dev->thc_regmap, in thc_int_cause_read()
830 regmap_read(dev->thc_regmap, THC_M_PRT_ERR_CAUSE_OFFSET, &cause); in thc_print_txn_error_cause()
833 dev_err(dev->dev, "TXN Error: Invalid PRD Entry\n"); in thc_print_txn_error_cause()
837 dev_err(dev->dev, "TXN Error: THC Buffer Overrun\n"); in thc_print_txn_error_cause()
841 dev_err(dev->dev, "TXN Error: Frame Babble\n"); in thc_print_txn_error_cause()
845 dev_err(dev->dev, "TXN Error: Invalid Device Register Setting\n"); in thc_print_txn_error_cause()
850 regmap_write(dev->thc_regmap, THC_M_PRT_ERR_CAUSE_OFFSET, cause); in thc_print_txn_error_cause()
853 dev_err(dev->dev, "TXN Error does not match any known value: 0x%X\n", in thc_print_txn_error_cause()
858 * thc_interrupt_handler - Handle THC interrupts
860 * THC interrupts include several types: external touch device (TIC) non-DMA
861 * interrupts, PIO completion interrupts, DMA interrtups, I2C subIP raw
878 regmap_read(dev->thc_regmap, in thc_interrupt_handler()
882 dev_dbg(dev->dev, "THC non-DMA device interrupt\n"); in thc_interrupt_handler()
884 regmap_write(dev->thc_regmap, THC_M_PRT_READ_DMA_INT_STS_1_OFFSET, in thc_interrupt_handler()
892 regmap_read(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, &int_sts); in thc_interrupt_handler()
895 dev_err(dev->dev, "THC transaction error, int_sts: 0x%08X\n", int_sts); in thc_interrupt_handler()
898 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
906 regmap_read(dev->thc_regmap, THC_M_PRT_ERR_CAUSE_OFFSET, &err_cause); in thc_interrupt_handler()
907 regmap_read(dev->thc_regmap, in thc_interrupt_handler()
913 dev_err(dev->dev, "Buffer overrun or RxDMA engine stalled!\n"); in thc_interrupt_handler()
916 regmap_write(dev->thc_regmap, THC_M_PRT_READ_DMA_INT_STS_2_OFFSET, in thc_interrupt_handler()
918 regmap_write(dev->thc_regmap, THC_M_PRT_READ_DMA_INT_STS_1_OFFSET, in thc_interrupt_handler()
920 regmap_write(dev->thc_regmap, THC_M_PRT_ERR_CAUSE_OFFSET, in thc_interrupt_handler()
929 dev_err_once(dev->dev, "THC FATAL error, int_sts: 0x%08X\n", int_sts); in thc_interrupt_handler()
931 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
939 regmap_read(dev->thc_regmap, in thc_interrupt_handler()
941 regmap_read(dev->thc_regmap, in thc_interrupt_handler()
946 dev_dbg(dev->dev, "THC_SS_CD_IE and TSSDONE are set\n"); in thc_interrupt_handler()
951 dev_dbg(dev->dev, "Got RxDMA1 Read Interrupt\n"); in thc_interrupt_handler()
953 regmap_write(dev->thc_regmap, in thc_interrupt_handler()
960 dev_dbg(dev->dev, "Got RxDMA2 Read Interrupt\n"); in thc_interrupt_handler()
962 regmap_write(dev->thc_regmap, in thc_interrupt_handler()
968 regmap_read(dev->thc_regmap, in thc_interrupt_handler()
972 dev_dbg(dev->dev, "Got SwDMA Read Interrupt\n"); in thc_interrupt_handler()
974 regmap_write(dev->thc_regmap, in thc_interrupt_handler()
977 dev->swdma_done = true; in thc_interrupt_handler()
978 wake_up_interruptible(&dev->swdma_complete_wait); in thc_interrupt_handler()
983 regmap_read(dev->thc_regmap, in thc_interrupt_handler()
987 dev_dbg(dev->dev, "Got TxDMA Write complete Interrupt\n"); in thc_interrupt_handler()
989 regmap_write(dev->thc_regmap, in thc_interrupt_handler()
992 dev->write_done = true; in thc_interrupt_handler()
993 wake_up_interruptible(&dev->write_complete_wait); in thc_interrupt_handler()
999 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1004 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1009 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1014 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1019 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1024 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1029 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1034 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1039 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1044 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1049 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1054 regmap_write(dev->thc_regmap, THC_M_PRT_INT_STATUS_OFFSET, in thc_interrupt_handler()
1067 * thc_port_select - Set THC port type
1079 dev_dbg(dev->dev, "Set THC port type to SPI\n"); in thc_port_select()
1080 dev->port_type = THC_PORT_TYPE_SPI; in thc_port_select()
1088 regmap_write_bits(dev->thc_regmap, THC_M_PRT_SPI_DUTYC_CFG_OFFSET, in thc_port_select()
1091 dev_dbg(dev->dev, "Set THC port type to I2C\n"); in thc_port_select()
1092 dev->port_type = THC_PORT_TYPE_I2C; in thc_port_select()
1094 /* Set THC transition arbitration policy to frame boundary for I2C */ in thc_port_select()
1099 regmap_write_bits(dev->thc_regmap, THC_M_PRT_CONTROL_OFFSET, mask, ctrl); in thc_port_select()
1101 dev_err(dev->dev, "unsupported THC port type: %d\n", port_type); in thc_port_select()
1102 return -EINVAL; in thc_port_select()
1108 regmap_write_bits(dev->thc_regmap, THC_M_PRT_CONTROL_OFFSET, mask, ctrl); in thc_port_select()
1149 for (i = size - 1; i >= 0; i--) in thc_get_spi_freq_div_val()
1150 if ((int)spi_freq_val - frequency[i] >= 0) in thc_get_spi_freq_div_val()
1154 dev_err_once(dev->dev, "Not supported SPI frequency %d\n", spi_freq_val); in thc_get_spi_freq_div_val()
1161 dev_dbg(dev->dev, in thc_get_spi_freq_div_val()
1169 * thc_spi_read_config - Configure SPI bus read attributes
1188 return -EINVAL; in thc_spi_read_config()
1202 regmap_write_bits(dev->thc_regmap, in thc_spi_read_config()
1212 regmap_write(dev->thc_regmap, THC_M_PRT_SPI_ICRRD_OPCODE_OFFSET, opcode); in thc_spi_read_config()
1213 regmap_write(dev->thc_regmap, THC_M_PRT_SPI_DMARD_OPCODE_OFFSET, opcode); in thc_spi_read_config()
1220 * thc_spi_write_config - Configure SPI bus write attributes
1227 * @perf_limit: Performance limitation in unit of 10us
1241 return -EINVAL; in thc_spi_write_config()
1255 regmap_write_bits(dev->thc_regmap, in thc_spi_write_config()
1265 regmap_write(dev->thc_regmap, THC_M_PRT_SPI_WR_OPCODE_OFFSET, opcode); in thc_spi_write_config()
1267 dev->perf_limit = perf_limit; in thc_spi_write_config()
1274 * thc_spi_input_output_address_config - Configure SPI input and output addresses
1284 regmap_write(dev->thc_regmap, in thc_spi_input_output_address_config()
1286 regmap_write(dev->thc_regmap, in thc_spi_input_output_address_config()
1288 regmap_write(dev->thc_regmap, in thc_spi_input_output_address_config()
1290 regmap_write(dev->thc_regmap, in thc_spi_input_output_address_config()
1301 dev_err(dev->dev, "Invalid input parameters, size %p, buffer %p\n", in thc_i2c_subip_pio_read()
1303 return -EINVAL; in thc_i2c_subip_pio_read()
1306 if (mutex_lock_interruptible(&dev->thc_bus_lock)) in thc_i2c_subip_pio_read()
1307 return -EINTR; in thc_i2c_subip_pio_read()
1324 mutex_unlock(&dev->thc_bus_lock); in thc_i2c_subip_pio_read()
1327 dev_err_once(dev->dev, "Read THC I2C SubIP register failed %d, offset %u\n", in thc_i2c_subip_pio_read()
1339 dev_err(dev->dev, "Invalid input parameters, size %u, buffer %p\n", in thc_i2c_subip_pio_write()
1341 return -EINVAL; in thc_i2c_subip_pio_write()
1344 if (mutex_lock_interruptible(&dev->thc_bus_lock)) in thc_i2c_subip_pio_write()
1345 return -EINTR; in thc_i2c_subip_pio_write()
1362 mutex_unlock(&dev->thc_bus_lock); in thc_i2c_subip_pio_write()
1365 dev_err_once(dev->dev, "Write THC I2C SubIP register failed %d, offset %u\n", in thc_i2c_subip_pio_write()
1402 dev_err_once(dev->dev, "Unsupported i2c speed %d\n", speed); in thc_i2c_subip_set_speed()
1403 ret = -EINVAL; in thc_i2c_subip_set_speed()
1443 * thc_i2c_subip_init - Initialize and configure THC I2C subsystem
1447 * @speed: I2C bus frequency speed mode
1448 * @hcnt: I2C clock SCL high count
1449 * @lcnt: I2C clock SCL low count
1522 dev->i2c_subip_regs = devm_kzalloc(dev->dev, sizeof(i2c_subip_regs), GFP_KERNEL); in thc_i2c_subip_init()
1523 if (!dev->i2c_subip_regs) in thc_i2c_subip_init()
1524 return -ENOMEM; in thc_i2c_subip_init()
1531 * thc_i2c_subip_regs_save - Save THC I2C sub-subsystem register values to THC device context
1544 &read_size, &dev->i2c_subip_regs[i]); in thc_i2c_subip_regs_save()
1554 * thc_i2c_subip_regs_restore - Restore THC I2C subsystem registers from THC device context
1567 write_size, &dev->i2c_subip_regs[i]); in thc_i2c_subip_regs_restore()
1577 * thc_i2c_set_rx_max_size - Set I2C Rx transfer max input size
1581 * Set @max_rx_size for I2C RxDMA max input size control feature.
1591 return -EINVAL; in thc_i2c_set_rx_max_size()
1594 return -EOPNOTSUPP; in thc_i2c_set_rx_max_size()
1596 ret = regmap_read(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, &val); in thc_i2c_set_rx_max_size()
1602 ret = regmap_write(dev->thc_regmap, THC_M_PRT_SPI_ICRRD_OPCODE_OFFSET, val); in thc_i2c_set_rx_max_size()
1606 dev->i2c_max_rx_size = max_rx_size; in thc_i2c_set_rx_max_size()
1613 * thc_i2c_rx_max_size_enable - Enable I2C Rx max input size control
1617 * Enable or disable I2C RxDMA max input size control feature.
1630 return -EINVAL; in thc_i2c_rx_max_size_enable()
1632 if (!dev->i2c_max_rx_size) in thc_i2c_rx_max_size_enable()
1633 return -EOPNOTSUPP; in thc_i2c_rx_max_size_enable()
1635 ret = regmap_write_bits(dev->thc_regmap, THC_M_PRT_SPI_ICRRD_OPCODE_OFFSET, mask, val); in thc_i2c_rx_max_size_enable()
1639 dev->i2c_max_rx_size_en = enable; in thc_i2c_rx_max_size_enable()
1646 * thc_i2c_set_rx_int_delay - Set I2C Rx input interrupt delay value
1648 * @delay_us: Interrupt delay value, unit is us
1650 * Set @delay_us for I2C RxDMA input interrupt delay feature.
1660 return -EINVAL; in thc_i2c_set_rx_int_delay()
1663 return -EOPNOTSUPP; in thc_i2c_set_rx_int_delay()
1665 ret = regmap_read(dev->thc_regmap, THC_M_PRT_SW_SEQ_STS_OFFSET, &val); in thc_i2c_set_rx_int_delay()
1669 /* THC hardware counts at 10us unit */ in thc_i2c_set_rx_int_delay()
1672 ret = regmap_write(dev->thc_regmap, THC_M_PRT_SPI_ICRRD_OPCODE_OFFSET, val); in thc_i2c_set_rx_int_delay()
1676 dev->i2c_int_delay_us = delay_us; in thc_i2c_set_rx_int_delay()
1683 * thc_i2c_rx_int_delay_enable - Enable I2C Rx interrupt delay
1687 * Enable or disable I2C RxDMA input interrupt delay feature.
1700 return -EINVAL; in thc_i2c_rx_int_delay_enable()
1702 if (!dev->i2c_int_delay_us) in thc_i2c_rx_int_delay_enable()
1703 return -EOPNOTSUPP; in thc_i2c_rx_int_delay_enable()
1705 ret = regmap_write_bits(dev->thc_regmap, THC_M_PRT_SPI_ICRRD_OPCODE_OFFSET, mask, val); in thc_i2c_rx_int_delay_enable()
1709 dev->i2c_int_delay_en = enable; in thc_i2c_rx_int_delay_enable()