Lines Matching +full:merge +full:- +full:fifo +full:- +full:en

37  *     copy, modify, merge, publish, distribute, sublicense, and/or sell copies
94 * copy, modify, merge, publish, distribute, sublicense, and/or sell copies
116 #include "xgbe-common.h"
141 XI2C_IOWRITE_BITS(pdata, IC_ENABLE, EN, 1); in xgbe_i2c_abort()
146 while (wait--) { in xgbe_i2c_abort()
153 return (-EBUSY); in xgbe_i2c_abort()
162 while (wait--) { in xgbe_i2c_set_enable()
163 XI2C_IOWRITE_BITS(pdata, IC_ENABLE, EN, mode); in xgbe_i2c_set_enable()
164 if (XI2C_IOREAD_BITS(pdata, IC_ENABLE_STATUS, EN) == mode) in xgbe_i2c_set_enable()
170 return (-EBUSY); in xgbe_i2c_set_enable()
222 struct xgbe_i2c_op_state *state = &pdata->i2c.op_state; in xgbe_i2c_write()
225 /* Configured to never receive Rx overflows, so fill up Tx fifo */ in xgbe_i2c_write()
226 tx_slots = pdata->i2c.tx_fifo_size - XI2C_IOREAD(pdata, IC_TXFLR); in xgbe_i2c_write()
228 state->tx_len); in xgbe_i2c_write()
230 while (tx_slots && state->tx_len) { in xgbe_i2c_write()
231 if (state->op->cmd == XGBE_I2C_CMD_READ) in xgbe_i2c_write()
234 cmd = *state->tx_buf++; in xgbe_i2c_write()
237 state->tx_len); in xgbe_i2c_write()
239 if (state->tx_len == 1) in xgbe_i2c_write()
244 tx_slots--; in xgbe_i2c_write()
245 state->tx_len--; in xgbe_i2c_write()
249 if (!state->tx_len) in xgbe_i2c_write()
256 struct xgbe_i2c_op_state *state = &pdata->i2c.op_state; in xgbe_i2c_read()
260 axgbe_printf(3, "%s: op cmd %d\n", __func__, state->op->cmd); in xgbe_i2c_read()
261 if (state->op->cmd != XGBE_I2C_CMD_READ) in xgbe_i2c_read()
266 state->rx_len); in xgbe_i2c_read()
268 while (rx_slots && state->rx_len) { in xgbe_i2c_read()
269 *state->rx_buf++ = XI2C_IOREAD(pdata, IC_DATA_CMD); in xgbe_i2c_read()
270 state->rx_len--; in xgbe_i2c_read()
271 rx_slots--; in xgbe_i2c_read()
278 struct xgbe_i2c_op_state *state = &pdata->i2c.op_state; in xgbe_i2c_clear_isr_interrupts()
281 state->tx_abort_source = XI2C_IOREAD(pdata, IC_TX_ABRT_SOURCE); in xgbe_i2c_clear_isr_interrupts()
293 struct xgbe_i2c_op_state *state = &pdata->i2c.op_state; in xgbe_i2c_isr()
307 "%#04x\n", __func__, state->tx_abort_source, in xgbe_i2c_isr()
308 state->op->target); in xgbe_i2c_isr()
312 state->ret = -EIO; in xgbe_i2c_isr()
316 /* Check for data in the Rx fifo */ in xgbe_i2c_isr()
319 /* Fill up the Tx fifo next */ in xgbe_i2c_isr()
324 axgbe_printf(3, "%s: ret %d stop %d\n", __func__, state->ret, in xgbe_i2c_isr()
327 if (state->ret || XI2C_GET_BITS(isr, IC_RAW_INTR_STAT, STOP_DET)) in xgbe_i2c_isr()
328 pdata->i2c_complete = true; in xgbe_i2c_isr()
332 if (pdata->vdata->irq_reissue_support) in xgbe_i2c_isr()
353 struct xgbe_i2c *i2c = &pdata->i2c; in xgbe_i2c_get_features()
357 i2c->max_speed_mode = XI2C_GET_BITS(reg, IC_COMP_PARAM_1, in xgbe_i2c_get_features()
359 i2c->rx_fifo_size = XI2C_GET_BITS(reg, IC_COMP_PARAM_1, in xgbe_i2c_get_features()
361 i2c->tx_fifo_size = XI2C_GET_BITS(reg, IC_COMP_PARAM_1, in xgbe_i2c_get_features()
365 "MAX_SPEED_MODE", i2c->max_speed_mode, in xgbe_i2c_get_features()
366 "RX_BUFFER_DEPTH", i2c->rx_fifo_size, in xgbe_i2c_get_features()
367 "TX_BUFFER_DEPTH", i2c->tx_fifo_size); in xgbe_i2c_get_features()
385 struct xgbe_i2c_op_state *state = &pdata->i2c.op_state; in xgbe_i2c_xfer()
389 mtx_lock(&pdata->i2c_mutex); in xgbe_i2c_xfer()
391 axgbe_printf(3, "i2c xfer started ---->>>\n"); in xgbe_i2c_xfer()
399 xgbe_i2c_set_target(pdata, op->target); in xgbe_i2c_xfer()
402 state->op = op; in xgbe_i2c_xfer()
403 state->tx_len = op->len; in xgbe_i2c_xfer()
404 state->tx_buf = op->buf; in xgbe_i2c_xfer()
405 state->rx_len = op->len; in xgbe_i2c_xfer()
406 state->rx_buf = op->buf; in xgbe_i2c_xfer()
415 /* Enabling the interrupts will cause the TX FIFO empty interrupt to in xgbe_i2c_xfer()
423 if (!pdata->i2c_complete) { in xgbe_i2c_xfer()
432 if ((ticks >= timeout) && !pdata->i2c_complete) { in xgbe_i2c_xfer()
434 ret = -ETIMEDOUT; in xgbe_i2c_xfer()
438 ret = state->ret; in xgbe_i2c_xfer()
440 ret, state->tx_abort_source); in xgbe_i2c_xfer()
443 ret, state->tx_abort_source); in xgbe_i2c_xfer()
444 if (state->tx_abort_source & IC_TX_ABRT_7B_ADDR_NOACK) in xgbe_i2c_xfer()
445 ret = -ENOTCONN; in xgbe_i2c_xfer()
446 else if (state->tx_abort_source & IC_TX_ABRT_ARB_LOST) in xgbe_i2c_xfer()
447 ret = -EAGAIN; in xgbe_i2c_xfer()
450 axgbe_printf(3, "i2c xfer finished ---->>>\n"); in xgbe_i2c_xfer()
453 pdata->i2c_complete = false; in xgbe_i2c_xfer()
458 mtx_unlock(&pdata->i2c_mutex); in xgbe_i2c_xfer()
465 if (!pdata->i2c.started) in xgbe_i2c_stop()
470 pdata->i2c.started = 0; in xgbe_i2c_stop()
480 if (pdata->i2c.started) in xgbe_i2c_start()
483 pdata->i2c.started = 1; in xgbe_i2c_start()
494 mtx_init(&pdata->i2c_mutex, "xgbe i2c mutex lock", NULL, MTX_DEF); in xgbe_i2c_init()
495 pdata->i2c_complete = false; in xgbe_i2c_init()
519 i2c_if->i2c_init = xgbe_i2c_init; in xgbe_init_function_ptrs_i2c()
521 i2c_if->i2c_start = xgbe_i2c_start; in xgbe_init_function_ptrs_i2c()
522 i2c_if->i2c_stop = xgbe_i2c_stop; in xgbe_init_function_ptrs_i2c()
524 i2c_if->i2c_xfer = xgbe_i2c_xfer; in xgbe_init_function_ptrs_i2c()
526 i2c_if->i2c_isr = xgbe_i2c_combined_isr; in xgbe_init_function_ptrs_i2c()