Lines Matching +full:byte +full:- +full:len

1 // SPDX-License-Identifier: GPL-2.0-or-later
7 * (e.g. smbalert) are handled in a separate i2c-smbus module.
9 * All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
16 #include <linux/i2c-smbus.h>
19 #include "i2c-core.h"
50 /* Assume a 7-bit address, which is reasonable for SMBus */
58 return i2c_smbus_pec(pec, msg->buf, msg->len); in i2c_smbus_msg_pec()
64 msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg); in i2c_smbus_add_pec()
65 msg->len++; in i2c_smbus_add_pec()
72 message length to hide the CRC byte from the caller). */
75 u8 rpec = msg->buf[--msg->len]; in i2c_smbus_check_pec()
81 return -EBADMSG; in i2c_smbus_check_pec()
87 * i2c_smbus_read_byte - SMBus "receive byte" protocol
90 * This executes the SMBus "receive byte" protocol, returning negative errno
91 * else the byte received from the device.
98 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_read_byte()
101 return (status < 0) ? status : data.byte; in i2c_smbus_read_byte()
106 * i2c_smbus_write_byte - SMBus "send byte" protocol
108 * @value: Byte to be sent
110 * This executes the SMBus "send byte" protocol, returning negative errno
115 return i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_write_byte()
121 * i2c_smbus_read_byte_data - SMBus "read byte" protocol
123 * @command: Byte interpreted by slave
125 * This executes the SMBus "read byte" protocol, returning negative errno
126 * else a data byte received from the device.
133 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_read_byte_data()
136 return (status < 0) ? status : data.byte; in i2c_smbus_read_byte_data()
141 * i2c_smbus_write_byte_data - SMBus "write byte" protocol
143 * @command: Byte interpreted by slave
144 * @value: Byte being written
146 * This executes the SMBus "write byte" protocol, returning negative errno
153 data.byte = value; in i2c_smbus_write_byte_data()
154 return i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_write_byte_data()
161 * i2c_smbus_read_word_data - SMBus "read word" protocol
163 * @command: Byte interpreted by slave
166 * else a 16-bit unsigned "word" received from the device.
173 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_read_word_data()
181 * i2c_smbus_write_word_data - SMBus "write word" protocol
183 * @command: Byte interpreted by slave
184 * @value: 16-bit "word" being written
194 return i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_write_word_data()
201 * i2c_smbus_read_block_data - SMBus "block read" protocol
203 * @command: Byte interpreted by slave
204 * @values: Byte array into which data will be read; big enough to hold
221 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_read_block_data()
233 * i2c_smbus_write_block_data - SMBus "block write" protocol
235 * @command: Byte interpreted by slave
237 * @values: Byte array which will be written.
251 return i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_write_block_data()
267 status = i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_read_i2c_block_data()
287 return i2c_smbus_xfer(client->adapter, client->addr, client->flags, in i2c_smbus_write_i2c_block_data()
295 bool is_read = msg->flags & I2C_M_RD; in i2c_smbus_try_get_dmabuf()
302 msg->buf = dma_buf; in i2c_smbus_try_get_dmabuf()
303 msg->flags |= I2C_M_DMA_SAFE; in i2c_smbus_try_get_dmabuf()
306 msg->buf[0] = init_val; in i2c_smbus_try_get_dmabuf()
334 .len = 1, in i2c_smbus_xfer_emulated()
339 .len = 0, in i2c_smbus_xfer_emulated()
347 msg[0].len = 0; in i2c_smbus_xfer_emulated()
362 msg[1].len = 1; in i2c_smbus_xfer_emulated()
364 msg[0].len = 2; in i2c_smbus_xfer_emulated()
365 msgbuf0[1] = data->byte; in i2c_smbus_xfer_emulated()
370 msg[1].len = 2; in i2c_smbus_xfer_emulated()
372 msg[0].len = 3; in i2c_smbus_xfer_emulated()
373 msgbuf0[1] = data->word & 0xff; in i2c_smbus_xfer_emulated()
374 msgbuf0[2] = data->word >> 8; in i2c_smbus_xfer_emulated()
380 msg[0].len = 3; in i2c_smbus_xfer_emulated()
381 msg[1].len = 2; in i2c_smbus_xfer_emulated()
382 msgbuf0[1] = data->word & 0xff; in i2c_smbus_xfer_emulated()
383 msgbuf0[2] = data->word >> 8; in i2c_smbus_xfer_emulated()
388 msg[1].len = 1; /* block length will be added by in i2c_smbus_xfer_emulated()
392 msg[0].len = data->block[0] + 2; in i2c_smbus_xfer_emulated()
393 if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) { in i2c_smbus_xfer_emulated()
394 dev_err(&adapter->dev, in i2c_smbus_xfer_emulated()
396 data->block[0]); in i2c_smbus_xfer_emulated()
397 return -EINVAL; in i2c_smbus_xfer_emulated()
401 for (i = 1; i < msg[0].len; i++) in i2c_smbus_xfer_emulated()
402 msg[0].buf[i] = data->block[i - 1]; in i2c_smbus_xfer_emulated()
408 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) { in i2c_smbus_xfer_emulated()
409 dev_err(&adapter->dev, in i2c_smbus_xfer_emulated()
411 data->block[0]); in i2c_smbus_xfer_emulated()
412 return -EINVAL; in i2c_smbus_xfer_emulated()
415 msg[0].len = data->block[0] + 2; in i2c_smbus_xfer_emulated()
417 for (i = 1; i < msg[0].len; i++) in i2c_smbus_xfer_emulated()
418 msg[0].buf[i] = data->block[i - 1]; in i2c_smbus_xfer_emulated()
421 msg[1].len = 1; /* block length will be added by in i2c_smbus_xfer_emulated()
426 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) { in i2c_smbus_xfer_emulated()
427 dev_err(&adapter->dev, "Invalid block %s size %d\n", in i2c_smbus_xfer_emulated()
429 data->block[0]); in i2c_smbus_xfer_emulated()
430 return -EINVAL; in i2c_smbus_xfer_emulated()
434 msg[1].len = data->block[0]; in i2c_smbus_xfer_emulated()
437 msg[0].len = data->block[0] + 1; in i2c_smbus_xfer_emulated()
440 for (i = 1; i <= data->block[0]; i++) in i2c_smbus_xfer_emulated()
441 msg[0].buf[i] = data->block[i]; in i2c_smbus_xfer_emulated()
445 dev_err(&adapter->dev, "Unsupported transaction %d\n", size); in i2c_smbus_xfer_emulated()
446 return -EOPNOTSUPP; in i2c_smbus_xfer_emulated()
460 if (msg[num-1].flags & I2C_M_RD) in i2c_smbus_xfer_emulated()
461 msg[num-1].len++; in i2c_smbus_xfer_emulated()
468 status = -EIO; in i2c_smbus_xfer_emulated()
474 if (i && (msg[num-1].flags & I2C_M_RD)) { in i2c_smbus_xfer_emulated()
475 status = i2c_smbus_check_pec(partial_pec, &msg[num-1]); in i2c_smbus_xfer_emulated()
483 data->byte = msgbuf0[0]; in i2c_smbus_xfer_emulated()
486 data->byte = msgbuf1[0]; in i2c_smbus_xfer_emulated()
490 data->word = msgbuf1[0] | (msgbuf1[1] << 8); in i2c_smbus_xfer_emulated()
493 for (i = 0; i < data->block[0]; i++) in i2c_smbus_xfer_emulated()
494 data->block[i + 1] = msg[1].buf[i]; in i2c_smbus_xfer_emulated()
499 dev_err(&adapter->dev, in i2c_smbus_xfer_emulated()
502 status = -EPROTO; in i2c_smbus_xfer_emulated()
506 data->block[i] = msg[1].buf[i]; in i2c_smbus_xfer_emulated()
520 * i2c_smbus_xfer - execute SMBus protocol operations
525 * @command: Byte interpreted by slave, for protocols which use such bytes
575 xfer_func = adapter->algo->smbus_xfer; in __i2c_smbus_xfer()
577 if (adapter->algo->smbus_xfer_atomic) in __i2c_smbus_xfer()
578 xfer_func = adapter->algo->smbus_xfer_atomic; in __i2c_smbus_xfer()
579 else if (adapter->algo->master_xfer_atomic) in __i2c_smbus_xfer()
586 for (res = 0, try = 0; try <= adapter->retries; try++) { in __i2c_smbus_xfer()
589 if (res != -EAGAIN) in __i2c_smbus_xfer()
592 orig_jiffies + adapter->timeout)) in __i2c_smbus_xfer()
596 if (res != -EOPNOTSUPP || !adapter->algo->master_xfer) in __i2c_smbus_xfer()
619 * i2c_smbus_read_i2c_block_data_or_emulated - read block or emulate
621 * @command: Byte interpreted by slave
623 * @values: Byte array into which data will be read; big enough to hold
628 * If block read is not supported, it emulates it using either word or byte
633 * effect as a byte read. Before using this function you must double-check
634 * if the I2C slave does support exchanging a block transfer with a byte
646 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK)) in i2c_smbus_read_i2c_block_data_or_emulated()
649 if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA)) in i2c_smbus_read_i2c_block_data_or_emulated()
650 return -EOPNOTSUPP; in i2c_smbus_read_i2c_block_data_or_emulated()
652 if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA)) { in i2c_smbus_read_i2c_block_data_or_emulated()
676 * i2c_new_smbus_alert_device - get ara client for SMBus alert support
707 irq = of_property_match_string(adapter->dev.of_node, "interrupt-names", in of_i2c_setup_smbus_alert()
709 if (irq == -EINVAL || irq == -ENODATA) in of_i2c_setup_smbus_alert()