LCOV - code coverage report
Current view: top level - drivers/i2c - i2c-core-smbus.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 217 0.0 %
Date: 2023-04-06 08:38:28 Functions: 0 18 0.0 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-or-later
       2             : /*
       3             :  * Linux I2C core SMBus and SMBus emulation code
       4             :  *
       5             :  * This file contains the SMBus functions which are always included in the I2C
       6             :  * core because they can be emulated via I2C. SMBus specific extensions
       7             :  * (e.g. smbalert) are handled in a separate i2c-smbus module.
       8             :  *
       9             :  * All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
      10             :  * SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> and
      11             :  * Jean Delvare <jdelvare@suse.de>
      12             :  */
      13             : #include <linux/device.h>
      14             : #include <linux/err.h>
      15             : #include <linux/i2c.h>
      16             : #include <linux/i2c-smbus.h>
      17             : #include <linux/property.h>
      18             : #include <linux/slab.h>
      19             : 
      20             : #include "i2c-core.h"
      21             : 
      22             : #define CREATE_TRACE_POINTS
      23             : #include <trace/events/smbus.h>
      24             : 
      25             : 
      26             : /* The SMBus parts */
      27             : 
      28             : #define POLY    (0x1070U << 3)
      29             : static u8 crc8(u16 data)
      30             : {
      31             :         int i;
      32             : 
      33           0 :         for (i = 0; i < 8; i++) {
      34           0 :                 if (data & 0x8000)
      35           0 :                         data = data ^ POLY;
      36           0 :                 data = data << 1;
      37             :         }
      38           0 :         return (u8)(data >> 8);
      39             : }
      40             : 
      41             : /**
      42             :  * i2c_smbus_pec - Incremental CRC8 over the given input data array
      43             :  * @crc: previous return crc8 value
      44             :  * @p: pointer to data buffer.
      45             :  * @count: number of bytes in data buffer.
      46             :  *
      47             :  * Incremental CRC8 over count bytes in the array pointed to by p
      48             :  */
      49           0 : u8 i2c_smbus_pec(u8 crc, u8 *p, size_t count)
      50             : {
      51             :         int i;
      52             : 
      53           0 :         for (i = 0; i < count; i++)
      54           0 :                 crc = crc8((crc ^ p[i]) << 8);
      55           0 :         return crc;
      56             : }
      57             : EXPORT_SYMBOL(i2c_smbus_pec);
      58             : 
      59             : /* Assume a 7-bit address, which is reasonable for SMBus */
      60           0 : static u8 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
      61             : {
      62             :         /* The address will be sent first */
      63           0 :         u8 addr = i2c_8bit_addr_from_msg(msg);
      64           0 :         pec = i2c_smbus_pec(pec, &addr, 1);
      65             : 
      66             :         /* The data buffer follows */
      67           0 :         return i2c_smbus_pec(pec, msg->buf, msg->len);
      68             : }
      69             : 
      70             : /* Used for write only transactions */
      71             : static inline void i2c_smbus_add_pec(struct i2c_msg *msg)
      72             : {
      73           0 :         msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
      74           0 :         msg->len++;
      75             : }
      76             : 
      77             : /* Return <0 on CRC error
      78             :    If there was a write before this read (most cases) we need to take the
      79             :    partial CRC from the write part into account.
      80             :    Note that this function does modify the message (we need to decrease the
      81             :    message length to hide the CRC byte from the caller). */
      82             : static int i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
      83             : {
      84           0 :         u8 rpec = msg->buf[--msg->len];
      85           0 :         cpec = i2c_smbus_msg_pec(cpec, msg);
      86             : 
      87           0 :         if (rpec != cpec) {
      88             :                 pr_debug("Bad PEC 0x%02x vs. 0x%02x\n",
      89             :                         rpec, cpec);
      90             :                 return -EBADMSG;
      91             :         }
      92             :         return 0;
      93             : }
      94             : 
      95             : /**
      96             :  * i2c_smbus_read_byte - SMBus "receive byte" protocol
      97             :  * @client: Handle to slave device
      98             :  *
      99             :  * This executes the SMBus "receive byte" protocol, returning negative errno
     100             :  * else the byte received from the device.
     101             :  */
     102           0 : s32 i2c_smbus_read_byte(const struct i2c_client *client)
     103             : {
     104             :         union i2c_smbus_data data;
     105             :         int status;
     106             : 
     107           0 :         status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     108             :                                 I2C_SMBUS_READ, 0,
     109             :                                 I2C_SMBUS_BYTE, &data);
     110           0 :         return (status < 0) ? status : data.byte;
     111             : }
     112             : EXPORT_SYMBOL(i2c_smbus_read_byte);
     113             : 
     114             : /**
     115             :  * i2c_smbus_write_byte - SMBus "send byte" protocol
     116             :  * @client: Handle to slave device
     117             :  * @value: Byte to be sent
     118             :  *
     119             :  * This executes the SMBus "send byte" protocol, returning negative errno
     120             :  * else zero on success.
     121             :  */
     122           0 : s32 i2c_smbus_write_byte(const struct i2c_client *client, u8 value)
     123             : {
     124           0 :         return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     125             :                               I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
     126             : }
     127             : EXPORT_SYMBOL(i2c_smbus_write_byte);
     128             : 
     129             : /**
     130             :  * i2c_smbus_read_byte_data - SMBus "read byte" protocol
     131             :  * @client: Handle to slave device
     132             :  * @command: Byte interpreted by slave
     133             :  *
     134             :  * This executes the SMBus "read byte" protocol, returning negative errno
     135             :  * else a data byte received from the device.
     136             :  */
     137           0 : s32 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)
     138             : {
     139             :         union i2c_smbus_data data;
     140             :         int status;
     141             : 
     142           0 :         status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     143             :                                 I2C_SMBUS_READ, command,
     144             :                                 I2C_SMBUS_BYTE_DATA, &data);
     145           0 :         return (status < 0) ? status : data.byte;
     146             : }
     147             : EXPORT_SYMBOL(i2c_smbus_read_byte_data);
     148             : 
     149             : /**
     150             :  * i2c_smbus_write_byte_data - SMBus "write byte" protocol
     151             :  * @client: Handle to slave device
     152             :  * @command: Byte interpreted by slave
     153             :  * @value: Byte being written
     154             :  *
     155             :  * This executes the SMBus "write byte" protocol, returning negative errno
     156             :  * else zero on success.
     157             :  */
     158           0 : s32 i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command,
     159             :                               u8 value)
     160             : {
     161             :         union i2c_smbus_data data;
     162           0 :         data.byte = value;
     163           0 :         return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     164             :                               I2C_SMBUS_WRITE, command,
     165             :                               I2C_SMBUS_BYTE_DATA, &data);
     166             : }
     167             : EXPORT_SYMBOL(i2c_smbus_write_byte_data);
     168             : 
     169             : /**
     170             :  * i2c_smbus_read_word_data - SMBus "read word" protocol
     171             :  * @client: Handle to slave device
     172             :  * @command: Byte interpreted by slave
     173             :  *
     174             :  * This executes the SMBus "read word" protocol, returning negative errno
     175             :  * else a 16-bit unsigned "word" received from the device.
     176             :  */
     177           0 : s32 i2c_smbus_read_word_data(const struct i2c_client *client, u8 command)
     178             : {
     179             :         union i2c_smbus_data data;
     180             :         int status;
     181             : 
     182           0 :         status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     183             :                                 I2C_SMBUS_READ, command,
     184             :                                 I2C_SMBUS_WORD_DATA, &data);
     185           0 :         return (status < 0) ? status : data.word;
     186             : }
     187             : EXPORT_SYMBOL(i2c_smbus_read_word_data);
     188             : 
     189             : /**
     190             :  * i2c_smbus_write_word_data - SMBus "write word" protocol
     191             :  * @client: Handle to slave device
     192             :  * @command: Byte interpreted by slave
     193             :  * @value: 16-bit "word" being written
     194             :  *
     195             :  * This executes the SMBus "write word" protocol, returning negative errno
     196             :  * else zero on success.
     197             :  */
     198           0 : s32 i2c_smbus_write_word_data(const struct i2c_client *client, u8 command,
     199             :                               u16 value)
     200             : {
     201             :         union i2c_smbus_data data;
     202           0 :         data.word = value;
     203           0 :         return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     204             :                               I2C_SMBUS_WRITE, command,
     205             :                               I2C_SMBUS_WORD_DATA, &data);
     206             : }
     207             : EXPORT_SYMBOL(i2c_smbus_write_word_data);
     208             : 
     209             : /**
     210             :  * i2c_smbus_read_block_data - SMBus "block read" protocol
     211             :  * @client: Handle to slave device
     212             :  * @command: Byte interpreted by slave
     213             :  * @values: Byte array into which data will be read; big enough to hold
     214             :  *      the data returned by the slave.  SMBus allows at most 32 bytes.
     215             :  *
     216             :  * This executes the SMBus "block read" protocol, returning negative errno
     217             :  * else the number of data bytes in the slave's response.
     218             :  *
     219             :  * Note that using this function requires that the client's adapter support
     220             :  * the I2C_FUNC_SMBUS_READ_BLOCK_DATA functionality.  Not all adapter drivers
     221             :  * support this; its emulation through I2C messaging relies on a specific
     222             :  * mechanism (I2C_M_RECV_LEN) which may not be implemented.
     223             :  */
     224           0 : s32 i2c_smbus_read_block_data(const struct i2c_client *client, u8 command,
     225             :                               u8 *values)
     226             : {
     227             :         union i2c_smbus_data data;
     228             :         int status;
     229             : 
     230           0 :         status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     231             :                                 I2C_SMBUS_READ, command,
     232             :                                 I2C_SMBUS_BLOCK_DATA, &data);
     233           0 :         if (status)
     234             :                 return status;
     235             : 
     236           0 :         memcpy(values, &data.block[1], data.block[0]);
     237           0 :         return data.block[0];
     238             : }
     239             : EXPORT_SYMBOL(i2c_smbus_read_block_data);
     240             : 
     241             : /**
     242             :  * i2c_smbus_write_block_data - SMBus "block write" protocol
     243             :  * @client: Handle to slave device
     244             :  * @command: Byte interpreted by slave
     245             :  * @length: Size of data block; SMBus allows at most 32 bytes
     246             :  * @values: Byte array which will be written.
     247             :  *
     248             :  * This executes the SMBus "block write" protocol, returning negative errno
     249             :  * else zero on success.
     250             :  */
     251           0 : s32 i2c_smbus_write_block_data(const struct i2c_client *client, u8 command,
     252             :                                u8 length, const u8 *values)
     253             : {
     254             :         union i2c_smbus_data data;
     255             : 
     256           0 :         if (length > I2C_SMBUS_BLOCK_MAX)
     257           0 :                 length = I2C_SMBUS_BLOCK_MAX;
     258           0 :         data.block[0] = length;
     259           0 :         memcpy(&data.block[1], values, length);
     260           0 :         return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     261             :                               I2C_SMBUS_WRITE, command,
     262             :                               I2C_SMBUS_BLOCK_DATA, &data);
     263             : }
     264             : EXPORT_SYMBOL(i2c_smbus_write_block_data);
     265             : 
     266             : /* Returns the number of read bytes */
     267           0 : s32 i2c_smbus_read_i2c_block_data(const struct i2c_client *client, u8 command,
     268             :                                   u8 length, u8 *values)
     269             : {
     270             :         union i2c_smbus_data data;
     271             :         int status;
     272             : 
     273           0 :         if (length > I2C_SMBUS_BLOCK_MAX)
     274           0 :                 length = I2C_SMBUS_BLOCK_MAX;
     275           0 :         data.block[0] = length;
     276           0 :         status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     277             :                                 I2C_SMBUS_READ, command,
     278             :                                 I2C_SMBUS_I2C_BLOCK_DATA, &data);
     279           0 :         if (status < 0)
     280             :                 return status;
     281             : 
     282           0 :         memcpy(values, &data.block[1], data.block[0]);
     283           0 :         return data.block[0];
     284             : }
     285             : EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data);
     286             : 
     287           0 : s32 i2c_smbus_write_i2c_block_data(const struct i2c_client *client, u8 command,
     288             :                                    u8 length, const u8 *values)
     289             : {
     290             :         union i2c_smbus_data data;
     291             : 
     292           0 :         if (length > I2C_SMBUS_BLOCK_MAX)
     293           0 :                 length = I2C_SMBUS_BLOCK_MAX;
     294           0 :         data.block[0] = length;
     295           0 :         memcpy(data.block + 1, values, length);
     296           0 :         return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
     297             :                               I2C_SMBUS_WRITE, command,
     298             :                               I2C_SMBUS_I2C_BLOCK_DATA, &data);
     299             : }
     300             : EXPORT_SYMBOL(i2c_smbus_write_i2c_block_data);
     301             : 
     302           0 : static void i2c_smbus_try_get_dmabuf(struct i2c_msg *msg, u8 init_val)
     303             : {
     304           0 :         bool is_read = msg->flags & I2C_M_RD;
     305             :         unsigned char *dma_buf;
     306             : 
     307           0 :         dma_buf = kzalloc(I2C_SMBUS_BLOCK_MAX + (is_read ? 2 : 3), GFP_KERNEL);
     308           0 :         if (!dma_buf)
     309             :                 return;
     310             : 
     311           0 :         msg->buf = dma_buf;
     312           0 :         msg->flags |= I2C_M_DMA_SAFE;
     313             : 
     314           0 :         if (init_val)
     315           0 :                 msg->buf[0] = init_val;
     316             : }
     317             : 
     318             : /*
     319             :  * Simulate a SMBus command using the I2C protocol.
     320             :  * No checking of parameters is done!
     321             :  */
     322           0 : static s32 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,
     323             :                                    unsigned short flags,
     324             :                                    char read_write, u8 command, int size,
     325             :                                    union i2c_smbus_data *data)
     326             : {
     327             :         /*
     328             :          * So we need to generate a series of msgs. In the case of writing, we
     329             :          * need to use only one message; when reading, we need two. We
     330             :          * initialize most things with sane defaults, to keep the code below
     331             :          * somewhat simpler.
     332             :          */
     333             :         unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX+3];
     334             :         unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX+2];
     335           0 :         int nmsgs = read_write == I2C_SMBUS_READ ? 2 : 1;
     336           0 :         u8 partial_pec = 0;
     337             :         int status;
     338           0 :         struct i2c_msg msg[2] = {
     339             :                 {
     340             :                         .addr = addr,
     341             :                         .flags = flags,
     342             :                         .len = 1,
     343             :                         .buf = msgbuf0,
     344             :                 }, {
     345             :                         .addr = addr,
     346             :                         .flags = flags | I2C_M_RD,
     347             :                         .len = 0,
     348             :                         .buf = msgbuf1,
     349             :                 },
     350             :         };
     351           0 :         bool wants_pec = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
     352           0 :                           && size != I2C_SMBUS_I2C_BLOCK_DATA);
     353             : 
     354           0 :         msgbuf0[0] = command;
     355           0 :         switch (size) {
     356             :         case I2C_SMBUS_QUICK:
     357           0 :                 msg[0].len = 0;
     358             :                 /* Special case: The read/write field is used as data */
     359           0 :                 msg[0].flags = flags | (read_write == I2C_SMBUS_READ ?
     360           0 :                                         I2C_M_RD : 0);
     361           0 :                 nmsgs = 1;
     362           0 :                 break;
     363             :         case I2C_SMBUS_BYTE:
     364           0 :                 if (read_write == I2C_SMBUS_READ) {
     365             :                         /* Special case: only a read! */
     366           0 :                         msg[0].flags = I2C_M_RD | flags;
     367           0 :                         nmsgs = 1;
     368             :                 }
     369             :                 break;
     370             :         case I2C_SMBUS_BYTE_DATA:
     371           0 :                 if (read_write == I2C_SMBUS_READ)
     372           0 :                         msg[1].len = 1;
     373             :                 else {
     374           0 :                         msg[0].len = 2;
     375           0 :                         msgbuf0[1] = data->byte;
     376             :                 }
     377             :                 break;
     378             :         case I2C_SMBUS_WORD_DATA:
     379           0 :                 if (read_write == I2C_SMBUS_READ)
     380           0 :                         msg[1].len = 2;
     381             :                 else {
     382           0 :                         msg[0].len = 3;
     383           0 :                         msgbuf0[1] = data->word & 0xff;
     384           0 :                         msgbuf0[2] = data->word >> 8;
     385             :                 }
     386             :                 break;
     387             :         case I2C_SMBUS_PROC_CALL:
     388           0 :                 nmsgs = 2; /* Special case */
     389           0 :                 read_write = I2C_SMBUS_READ;
     390           0 :                 msg[0].len = 3;
     391           0 :                 msg[1].len = 2;
     392           0 :                 msgbuf0[1] = data->word & 0xff;
     393           0 :                 msgbuf0[2] = data->word >> 8;
     394           0 :                 break;
     395             :         case I2C_SMBUS_BLOCK_DATA:
     396           0 :                 if (read_write == I2C_SMBUS_READ) {
     397           0 :                         msg[1].flags |= I2C_M_RECV_LEN;
     398           0 :                         msg[1].len = 1; /* block length will be added by
     399             :                                            the underlying bus driver */
     400           0 :                         i2c_smbus_try_get_dmabuf(&msg[1], 0);
     401             :                 } else {
     402           0 :                         msg[0].len = data->block[0] + 2;
     403           0 :                         if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
     404           0 :                                 dev_err(&adapter->dev,
     405             :                                         "Invalid block write size %d\n",
     406             :                                         data->block[0]);
     407           0 :                                 return -EINVAL;
     408             :                         }
     409             : 
     410           0 :                         i2c_smbus_try_get_dmabuf(&msg[0], command);
     411           0 :                         memcpy(msg[0].buf + 1, data->block, msg[0].len - 1);
     412             :                 }
     413             :                 break;
     414             :         case I2C_SMBUS_BLOCK_PROC_CALL:
     415           0 :                 nmsgs = 2; /* Another special case */
     416           0 :                 read_write = I2C_SMBUS_READ;
     417           0 :                 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
     418           0 :                         dev_err(&adapter->dev,
     419             :                                 "Invalid block write size %d\n",
     420             :                                 data->block[0]);
     421           0 :                         return -EINVAL;
     422             :                 }
     423             : 
     424           0 :                 msg[0].len = data->block[0] + 2;
     425           0 :                 i2c_smbus_try_get_dmabuf(&msg[0], command);
     426           0 :                 memcpy(msg[0].buf + 1, data->block, msg[0].len - 1);
     427             : 
     428           0 :                 msg[1].flags |= I2C_M_RECV_LEN;
     429           0 :                 msg[1].len = 1; /* block length will be added by
     430             :                                    the underlying bus driver */
     431           0 :                 i2c_smbus_try_get_dmabuf(&msg[1], 0);
     432           0 :                 break;
     433             :         case I2C_SMBUS_I2C_BLOCK_DATA:
     434           0 :                 if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
     435           0 :                         dev_err(&adapter->dev, "Invalid block %s size %d\n",
     436             :                                 read_write == I2C_SMBUS_READ ? "read" : "write",
     437             :                                 data->block[0]);
     438           0 :                         return -EINVAL;
     439             :                 }
     440             : 
     441           0 :                 if (read_write == I2C_SMBUS_READ) {
     442           0 :                         msg[1].len = data->block[0];
     443           0 :                         i2c_smbus_try_get_dmabuf(&msg[1], 0);
     444             :                 } else {
     445           0 :                         msg[0].len = data->block[0] + 1;
     446             : 
     447           0 :                         i2c_smbus_try_get_dmabuf(&msg[0], command);
     448           0 :                         memcpy(msg[0].buf + 1, data->block + 1, data->block[0]);
     449             :                 }
     450             :                 break;
     451             :         default:
     452           0 :                 dev_err(&adapter->dev, "Unsupported transaction %d\n", size);
     453           0 :                 return -EOPNOTSUPP;
     454             :         }
     455             : 
     456           0 :         if (wants_pec) {
     457             :                 /* Compute PEC if first message is a write */
     458           0 :                 if (!(msg[0].flags & I2C_M_RD)) {
     459           0 :                         if (nmsgs == 1) /* Write only */
     460             :                                 i2c_smbus_add_pec(&msg[0]);
     461             :                         else /* Write followed by read */
     462           0 :                                 partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
     463             :                 }
     464             :                 /* Ask for PEC if last message is a read */
     465           0 :                 if (msg[nmsgs - 1].flags & I2C_M_RD)
     466           0 :                         msg[nmsgs - 1].len++;
     467             :         }
     468             : 
     469           0 :         status = __i2c_transfer(adapter, msg, nmsgs);
     470           0 :         if (status < 0)
     471             :                 goto cleanup;
     472           0 :         if (status != nmsgs) {
     473             :                 status = -EIO;
     474             :                 goto cleanup;
     475             :         }
     476           0 :         status = 0;
     477             : 
     478             :         /* Check PEC if last message is a read */
     479           0 :         if (wants_pec && (msg[nmsgs - 1].flags & I2C_M_RD)) {
     480           0 :                 status = i2c_smbus_check_pec(partial_pec, &msg[nmsgs - 1]);
     481           0 :                 if (status < 0)
     482             :                         goto cleanup;
     483             :         }
     484             : 
     485           0 :         if (read_write == I2C_SMBUS_READ)
     486           0 :                 switch (size) {
     487             :                 case I2C_SMBUS_BYTE:
     488           0 :                         data->byte = msgbuf0[0];
     489           0 :                         break;
     490             :                 case I2C_SMBUS_BYTE_DATA:
     491           0 :                         data->byte = msgbuf1[0];
     492           0 :                         break;
     493             :                 case I2C_SMBUS_WORD_DATA:
     494             :                 case I2C_SMBUS_PROC_CALL:
     495           0 :                         data->word = msgbuf1[0] | (msgbuf1[1] << 8);
     496           0 :                         break;
     497             :                 case I2C_SMBUS_I2C_BLOCK_DATA:
     498           0 :                         memcpy(data->block + 1, msg[1].buf, data->block[0]);
     499           0 :                         break;
     500             :                 case I2C_SMBUS_BLOCK_DATA:
     501             :                 case I2C_SMBUS_BLOCK_PROC_CALL:
     502           0 :                         if (msg[1].buf[0] > I2C_SMBUS_BLOCK_MAX) {
     503           0 :                                 dev_err(&adapter->dev,
     504             :                                         "Invalid block size returned: %d\n",
     505             :                                         msg[1].buf[0]);
     506           0 :                                 status = -EPROTO;
     507           0 :                                 goto cleanup;
     508             :                         }
     509           0 :                         memcpy(data->block, msg[1].buf, msg[1].buf[0] + 1);
     510           0 :                         break;
     511             :                 }
     512             : 
     513             : cleanup:
     514           0 :         if (msg[0].flags & I2C_M_DMA_SAFE)
     515           0 :                 kfree(msg[0].buf);
     516           0 :         if (msg[1].flags & I2C_M_DMA_SAFE)
     517           0 :                 kfree(msg[1].buf);
     518             : 
     519             :         return status;
     520             : }
     521             : 
     522             : /**
     523             :  * i2c_smbus_xfer - execute SMBus protocol operations
     524             :  * @adapter: Handle to I2C bus
     525             :  * @addr: Address of SMBus slave on that bus
     526             :  * @flags: I2C_CLIENT_* flags (usually zero or I2C_CLIENT_PEC)
     527             :  * @read_write: I2C_SMBUS_READ or I2C_SMBUS_WRITE
     528             :  * @command: Byte interpreted by slave, for protocols which use such bytes
     529             :  * @protocol: SMBus protocol operation to execute, such as I2C_SMBUS_PROC_CALL
     530             :  * @data: Data to be read or written
     531             :  *
     532             :  * This executes an SMBus protocol operation, and returns a negative
     533             :  * errno code else zero on success.
     534             :  */
     535           0 : s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
     536             :                    unsigned short flags, char read_write,
     537             :                    u8 command, int protocol, union i2c_smbus_data *data)
     538             : {
     539             :         s32 res;
     540             : 
     541           0 :         res = __i2c_lock_bus_helper(adapter);
     542           0 :         if (res)
     543             :                 return res;
     544             : 
     545           0 :         res = __i2c_smbus_xfer(adapter, addr, flags, read_write,
     546             :                                command, protocol, data);
     547           0 :         i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT);
     548             : 
     549           0 :         return res;
     550             : }
     551             : EXPORT_SYMBOL(i2c_smbus_xfer);
     552             : 
     553           0 : s32 __i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr,
     554             :                      unsigned short flags, char read_write,
     555             :                      u8 command, int protocol, union i2c_smbus_data *data)
     556             : {
     557             :         int (*xfer_func)(struct i2c_adapter *adap, u16 addr,
     558             :                          unsigned short flags, char read_write,
     559             :                          u8 command, int size, union i2c_smbus_data *data);
     560             :         unsigned long orig_jiffies;
     561             :         int try;
     562             :         s32 res;
     563             : 
     564           0 :         res = __i2c_check_suspended(adapter);
     565           0 :         if (res)
     566             :                 return res;
     567             : 
     568             :         /* If enabled, the following two tracepoints are conditional on
     569             :          * read_write and protocol.
     570             :          */
     571           0 :         trace_smbus_write(adapter, addr, flags, read_write,
     572             :                           command, protocol, data);
     573           0 :         trace_smbus_read(adapter, addr, flags, read_write,
     574             :                          command, protocol);
     575             : 
     576           0 :         flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
     577             : 
     578           0 :         xfer_func = adapter->algo->smbus_xfer;
     579           0 :         if (i2c_in_atomic_xfer_mode()) {
     580           0 :                 if (adapter->algo->smbus_xfer_atomic)
     581             :                         xfer_func = adapter->algo->smbus_xfer_atomic;
     582           0 :                 else if (adapter->algo->master_xfer_atomic)
     583           0 :                         xfer_func = NULL; /* fallback to I2C emulation */
     584             :         }
     585             : 
     586           0 :         if (xfer_func) {
     587             :                 /* Retry automatically on arbitration loss */
     588           0 :                 orig_jiffies = jiffies;
     589           0 :                 for (res = 0, try = 0; try <= adapter->retries; try++) {
     590           0 :                         res = xfer_func(adapter, addr, flags, read_write,
     591             :                                         command, protocol, data);
     592           0 :                         if (res != -EAGAIN)
     593             :                                 break;
     594           0 :                         if (time_after(jiffies,
     595             :                                        orig_jiffies + adapter->timeout))
     596             :                                 break;
     597             :                 }
     598             : 
     599           0 :                 if (res != -EOPNOTSUPP || !adapter->algo->master_xfer)
     600             :                         goto trace;
     601             :                 /*
     602             :                  * Fall back to i2c_smbus_xfer_emulated if the adapter doesn't
     603             :                  * implement native support for the SMBus operation.
     604             :                  */
     605             :         }
     606             : 
     607           0 :         res = i2c_smbus_xfer_emulated(adapter, addr, flags, read_write,
     608             :                                       command, protocol, data);
     609             : 
     610             : trace:
     611             :         /* If enabled, the reply tracepoint is conditional on read_write. */
     612           0 :         trace_smbus_reply(adapter, addr, flags, read_write,
     613             :                           command, protocol, data, res);
     614           0 :         trace_smbus_result(adapter, addr, flags, read_write,
     615             :                            command, protocol, res);
     616             : 
     617           0 :         return res;
     618             : }
     619             : EXPORT_SYMBOL(__i2c_smbus_xfer);
     620             : 
     621             : /**
     622             :  * i2c_smbus_read_i2c_block_data_or_emulated - read block or emulate
     623             :  * @client: Handle to slave device
     624             :  * @command: Byte interpreted by slave
     625             :  * @length: Size of data block; SMBus allows at most I2C_SMBUS_BLOCK_MAX bytes
     626             :  * @values: Byte array into which data will be read; big enough to hold
     627             :  *      the data returned by the slave.  SMBus allows at most
     628             :  *      I2C_SMBUS_BLOCK_MAX bytes.
     629             :  *
     630             :  * This executes the SMBus "block read" protocol if supported by the adapter.
     631             :  * If block read is not supported, it emulates it using either word or byte
     632             :  * read protocols depending on availability.
     633             :  *
     634             :  * The addresses of the I2C slave device that are accessed with this function
     635             :  * must be mapped to a linear region, so that a block read will have the same
     636             :  * effect as a byte read. Before using this function you must double-check
     637             :  * if the I2C slave does support exchanging a block transfer with a byte
     638             :  * transfer.
     639             :  */
     640           0 : s32 i2c_smbus_read_i2c_block_data_or_emulated(const struct i2c_client *client,
     641             :                                               u8 command, u8 length, u8 *values)
     642             : {
     643           0 :         u8 i = 0;
     644             :         int status;
     645             : 
     646           0 :         if (length > I2C_SMBUS_BLOCK_MAX)
     647           0 :                 length = I2C_SMBUS_BLOCK_MAX;
     648             : 
     649           0 :         if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_I2C_BLOCK))
     650           0 :                 return i2c_smbus_read_i2c_block_data(client, command, length, values);
     651             : 
     652           0 :         if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_BYTE_DATA))
     653             :                 return -EOPNOTSUPP;
     654             : 
     655           0 :         if (i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_READ_WORD_DATA)) {
     656           0 :                 while ((i + 2) <= length) {
     657           0 :                         status = i2c_smbus_read_word_data(client, command + i);
     658           0 :                         if (status < 0)
     659             :                                 return status;
     660           0 :                         values[i] = status & 0xff;
     661           0 :                         values[i + 1] = status >> 8;
     662           0 :                         i += 2;
     663             :                 }
     664             :         }
     665             : 
     666           0 :         while (i < length) {
     667           0 :                 status = i2c_smbus_read_byte_data(client, command + i);
     668           0 :                 if (status < 0)
     669             :                         return status;
     670           0 :                 values[i] = status;
     671           0 :                 i++;
     672             :         }
     673             : 
     674           0 :         return i;
     675             : }
     676             : EXPORT_SYMBOL(i2c_smbus_read_i2c_block_data_or_emulated);
     677             : 
     678             : /**
     679             :  * i2c_new_smbus_alert_device - get ara client for SMBus alert support
     680             :  * @adapter: the target adapter
     681             :  * @setup: setup data for the SMBus alert handler
     682             :  * Context: can sleep
     683             :  *
     684             :  * Setup handling of the SMBus alert protocol on a given I2C bus segment.
     685             :  *
     686             :  * Handling can be done either through our IRQ handler, or by the
     687             :  * adapter (from its handler, periodic polling, or whatever).
     688             :  *
     689             :  * This returns the ara client, which should be saved for later use with
     690             :  * i2c_handle_smbus_alert() and ultimately i2c_unregister_device(); or an
     691             :  * ERRPTR to indicate an error.
     692             :  */
     693           0 : struct i2c_client *i2c_new_smbus_alert_device(struct i2c_adapter *adapter,
     694             :                                               struct i2c_smbus_alert_setup *setup)
     695             : {
     696           0 :         struct i2c_board_info ara_board_info = {
     697             :                 I2C_BOARD_INFO("smbus_alert", 0x0c),
     698             :                 .platform_data = setup,
     699             :         };
     700             : 
     701           0 :         return i2c_new_client_device(adapter, &ara_board_info);
     702             : }
     703             : EXPORT_SYMBOL_GPL(i2c_new_smbus_alert_device);
     704             : 
     705             : #if IS_ENABLED(CONFIG_I2C_SMBUS)
     706             : int i2c_setup_smbus_alert(struct i2c_adapter *adapter)
     707             : {
     708             :         struct device *parent = adapter->dev.parent;
     709             :         int irq;
     710             : 
     711             :         /* Adapter instantiated without parent, skip the SMBus alert setup */
     712             :         if (!parent)
     713             :                 return 0;
     714             : 
     715             :         irq = device_property_match_string(parent, "interrupt-names", "smbus_alert");
     716             :         if (irq == -EINVAL || irq == -ENODATA)
     717             :                 return 0;
     718             :         else if (irq < 0)
     719             :                 return irq;
     720             : 
     721             :         return PTR_ERR_OR_ZERO(i2c_new_smbus_alert_device(adapter, NULL));
     722             : }
     723             : #endif

Generated by: LCOV version 1.14