Lines Matching +full:len +full:- +full:or +full:- +full:define
5 * Redistribution and use in source and binary forms, with or without
12 * documentation and/or other materials provided with the distribution.
14 * contributors may be used to endorse or promote products derived from
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
43 #define MLXPLAT_CPLD_LPC_I2C_BASE_ADDR 0x2000
44 #define MLXCPLD_I2C_DEVICE_NAME "i2c_mlxcpld"
45 #define MLXCPLD_I2C_VALID_FLAG (I2C_M_RECV_LEN | I2C_M_RD)
46 #define MLXCPLD_I2C_BUS_NUM 1
47 #define MLXCPLD_I2C_DATA_REG_SZ 36
48 #define MLXCPLD_I2C_DATA_SZ_BIT BIT(5)
49 #define MLXCPLD_I2C_DATA_SZ_MASK GENMASK(6, 5)
50 #define MLXCPLD_I2C_SMBUS_BLK_BIT BIT(7)
51 #define MLXCPLD_I2C_MAX_ADDR_LEN 4
52 #define MLXCPLD_I2C_RETR_NUM 2
53 #define MLXCPLD_I2C_XFER_TO 500000 /* usec */
54 #define MLXCPLD_I2C_POLL_TIME 2000 /* usec */
57 #define MLXCPLD_LPCI2C_CPBLTY_REG 0x0
58 #define MLXCPLD_LPCI2C_CTRL_REG 0x1
59 #define MLXCPLD_LPCI2C_HALF_CYC_REG 0x4
60 #define MLXCPLD_LPCI2C_I2C_HOLD_REG 0x5
61 #define MLXCPLD_LPCI2C_CMD_REG 0x6
62 #define MLXCPLD_LPCI2C_NUM_DAT_REG 0x7
63 #define MLXCPLD_LPCI2C_NUM_ADDR_REG 0x8
64 #define MLXCPLD_LPCI2C_STATUS_REG 0x9
65 #define MLXCPLD_LPCI2C_DATA_REG 0xa
68 #define MLXCPLD_LPCI2C_RST_SEL_MASK 0x1
69 #define MLXCPLD_LPCI2C_TRANS_END 0x1
70 #define MLXCPLD_LPCI2C_STATUS_NACK 0x10
71 #define MLXCPLD_LPCI2C_NO_IND 0
72 #define MLXCPLD_LPCI2C_ACK_IND 1
73 #define MLXCPLD_LPCI2C_NACK_IND 2
92 static void mlxcpld_i2c_lpc_write_buf(u8 *data, u8 len, u32 addr) in mlxcpld_i2c_lpc_write_buf() argument
96 for (i = 0; i < len - len % 4; i += 4) in mlxcpld_i2c_lpc_write_buf()
98 for (; i < len; ++i) in mlxcpld_i2c_lpc_write_buf()
102 static void mlxcpld_i2c_lpc_read_buf(u8 *data, u8 len, u32 addr) in mlxcpld_i2c_lpc_read_buf() argument
106 for (i = 0; i < len - len % 4; i += 4) in mlxcpld_i2c_lpc_read_buf()
108 for (; i < len; ++i) in mlxcpld_i2c_lpc_read_buf()
115 u32 addr = priv->base_addr + offs; in mlxcpld_i2c_read_comm()
140 u32 addr = priv->base_addr + offs; in mlxcpld_i2c_write_comm()
164 * Returns 0 if OK, other - in case of invalid parameters.
172 dev_err(priv->dev, "Incorrect 0 num of messages\n"); in mlxcpld_i2c_check_msg_params()
173 return -EINVAL; in mlxcpld_i2c_check_msg_params()
177 dev_err(priv->dev, "Invalid address 0x%03x\n", in mlxcpld_i2c_check_msg_params()
179 return -EINVAL; in mlxcpld_i2c_check_msg_params()
184 dev_err(priv->dev, "Invalid buf in msg[%d]\n", in mlxcpld_i2c_check_msg_params()
186 return -EINVAL; in mlxcpld_i2c_check_msg_params()
189 dev_err(priv->dev, "Invalid addr in msg[%d]\n", in mlxcpld_i2c_check_msg_params()
191 return -EINVAL; in mlxcpld_i2c_check_msg_params()
200 * Returns 0 - transfer completed (both ACK or NACK),
201 * negative - transfer isn't finished.
213 * slave, command not understood, or unable to accept in mlxcpld_i2c_check_status()
223 return -EIO; in mlxcpld_i2c_check_status()
230 priv->xfer.msg = msgs; in mlxcpld_i2c_set_transf_data()
231 priv->xfer.msg_num = num; in mlxcpld_i2c_set_transf_data()
237 * or 68 bytes in the current x86 LPCI2C bridge. in mlxcpld_i2c_set_transf_data()
239 priv->xfer.cmd = msgs[num - 1].flags & I2C_M_RD; in mlxcpld_i2c_set_transf_data()
241 if (priv->xfer.cmd == I2C_M_RD && comm_len != msgs[0].len) { in mlxcpld_i2c_set_transf_data()
242 priv->xfer.addr_width = msgs[0].len; in mlxcpld_i2c_set_transf_data()
243 priv->xfer.data_len = comm_len - priv->xfer.addr_width; in mlxcpld_i2c_set_transf_data()
245 priv->xfer.addr_width = 0; in mlxcpld_i2c_set_transf_data()
246 priv->xfer.data_len = comm_len; in mlxcpld_i2c_set_transf_data()
255 mutex_lock(&priv->lock); in mlxcpld_i2c_reset()
261 mutex_unlock(&priv->lock); in mlxcpld_i2c_reset()
274 return -EIO; in mlxcpld_i2c_check_busy()
289 return -ETIMEDOUT; in mlxcpld_i2c_wait_for_free()
296 * It puts current process to sleep until we get interrupt or timeout expires.
297 * Returns the number of transferred or read bytes or error (<0).
313 return -ETIMEDOUT; in mlxcpld_i2c_wait_for_tc()
316 if (priv->xfer.cmd != I2C_M_RD) in mlxcpld_i2c_wait_for_tc()
317 return (priv->xfer.addr_width + priv->xfer.data_len); in mlxcpld_i2c_wait_for_tc()
319 if (priv->xfer.msg_num == 1) in mlxcpld_i2c_wait_for_tc()
324 if (!priv->xfer.msg[i].buf) in mlxcpld_i2c_wait_for_tc()
325 return -EINVAL; in mlxcpld_i2c_wait_for_tc()
328 * Actual read data len will be always the same as in mlxcpld_i2c_wait_for_tc()
329 * requested len. 0xff (line pull-up) will be returned in mlxcpld_i2c_wait_for_tc()
332 * SMBus block read transaction data len can be different, in mlxcpld_i2c_wait_for_tc()
337 if (priv->smbus_block && (val & MLXCPLD_I2C_SMBUS_BLK_BIT)) { in mlxcpld_i2c_wait_for_tc()
341 dev_err(priv->dev, "Incorrect smbus block read message len\n"); in mlxcpld_i2c_wait_for_tc()
342 return -EPROTO; in mlxcpld_i2c_wait_for_tc()
345 datalen = priv->xfer.data_len; in mlxcpld_i2c_wait_for_tc()
349 priv->xfer.msg[i].buf, datalen); in mlxcpld_i2c_wait_for_tc()
354 return -ENXIO; in mlxcpld_i2c_wait_for_tc()
357 return -EINVAL; in mlxcpld_i2c_wait_for_tc()
363 int i, len = 0; in mlxcpld_i2c_xfer_msg() local
367 &priv->xfer.data_len, 1); in mlxcpld_i2c_xfer_msg()
369 val = priv->xfer.addr_width; in mlxcpld_i2c_xfer_msg()
371 if (priv->smbus_block && priv->xfer.msg_num >= 2 && in mlxcpld_i2c_xfer_msg()
372 priv->xfer.msg[1].len == 1 && in mlxcpld_i2c_xfer_msg()
373 (priv->xfer.msg[1].flags & I2C_M_RECV_LEN) && in mlxcpld_i2c_xfer_msg()
374 (priv->xfer.msg[1].flags & I2C_M_RD)) in mlxcpld_i2c_xfer_msg()
379 for (i = 0; i < priv->xfer.msg_num; i++) { in mlxcpld_i2c_xfer_msg()
380 if ((priv->xfer.msg[i].flags & I2C_M_RD) != I2C_M_RD) { in mlxcpld_i2c_xfer_msg()
383 len, priv->xfer.msg[i].buf, in mlxcpld_i2c_xfer_msg()
384 priv->xfer.msg[i].len); in mlxcpld_i2c_xfer_msg()
385 len += priv->xfer.msg[i].len; in mlxcpld_i2c_xfer_msg()
393 cmd = (priv->xfer.msg[0].addr << 1) | priv->xfer.cmd; in mlxcpld_i2c_xfer_msg()
398 * Generic lpc-i2c transfer.
399 * Returns the number of processed messages or error (<0).
410 dev_err(priv->dev, "Incorrect message\n"); in mlxcpld_i2c_xfer()
415 comm_len += msgs[i].len; in mlxcpld_i2c_xfer()
419 dev_err(priv->dev, "LPCI2C bridge is busy\n"); in mlxcpld_i2c_xfer()
427 * The only reasonable thing - is soft reset. in mlxcpld_i2c_xfer()
431 dev_err(priv->dev, "LPCI2C bridge is busy after reset\n"); in mlxcpld_i2c_xfer()
432 return -EIO; in mlxcpld_i2c_xfer()
438 mutex_lock(&priv->lock); in mlxcpld_i2c_xfer()
446 mutex_unlock(&priv->lock); in mlxcpld_i2c_xfer()
455 if (priv->smbus_block) in mlxcpld_i2c_func()
470 .max_read_len = MLXCPLD_I2C_DATA_REG_SZ - MLXCPLD_I2C_MAX_ADDR_LEN,
477 .max_read_len = MLXCPLD_I2C_DATA_REG_SZ * 2 - MLXCPLD_I2C_MAX_ADDR_LEN,
484 .name = "i2c-mlxcpld",
498 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in mlxcpld_i2c_probe()
500 return -ENOMEM; in mlxcpld_i2c_probe()
502 mutex_init(&priv->lock); in mlxcpld_i2c_probe()
505 priv->dev = &pdev->dev; in mlxcpld_i2c_probe()
506 priv->base_addr = MLXPLAT_CPLD_LPC_I2C_BASE_ADDR; in mlxcpld_i2c_probe()
517 priv->smbus_block = true; in mlxcpld_i2c_probe()
518 if (pdev->id >= -1) in mlxcpld_i2c_probe()
519 mlxcpld_i2c_adapter.nr = pdev->id; in mlxcpld_i2c_probe()
520 priv->adap = mlxcpld_i2c_adapter; in mlxcpld_i2c_probe()
521 priv->adap.dev.parent = &pdev->dev; in mlxcpld_i2c_probe()
522 i2c_set_adapdata(&priv->adap, priv); in mlxcpld_i2c_probe()
524 err = i2c_add_numbered_adapter(&priv->adap); in mlxcpld_i2c_probe()
526 mutex_destroy(&priv->lock); in mlxcpld_i2c_probe()
535 i2c_del_adapter(&priv->adap); in mlxcpld_i2c_remove()
536 mutex_destroy(&priv->lock); in mlxcpld_i2c_remove()
552 MODULE_DESCRIPTION("Mellanox I2C-CPLD controller driver");
554 MODULE_ALIAS("platform:i2c-mlxcpld");