Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * ddbridge-i2c.h: Digital Devices bridge i2c driver
0004  *
0005  * Copyright (C) 2010-2017 Digital Devices GmbH
0006  *                         Ralph Metzler <rjkm@metzlerbros.de>
0007  *                         Marcus Metzler <mocm@metzlerbros.de>
0008  */
0009 
0010 #ifndef __DDBRIDGE_I2C_H__
0011 #define __DDBRIDGE_I2C_H__
0012 
0013 #include <linux/i2c.h>
0014 
0015 #include "ddbridge.h"
0016 
0017 /******************************************************************************/
0018 
0019 void ddb_i2c_release(struct ddb *dev);
0020 int ddb_i2c_init(struct ddb *dev);
0021 
0022 /******************************************************************************/
0023 
0024 static int __maybe_unused i2c_io(struct i2c_adapter *adapter, u8 adr,
0025                  u8 *wbuf, u32 wlen, u8 *rbuf, u32 rlen)
0026 {
0027     struct i2c_msg msgs[2] = { { .addr = adr,  .flags = 0,
0028                      .buf  = wbuf, .len   = wlen },
0029                    { .addr = adr,  .flags = I2C_M_RD,
0030                      .buf  = rbuf, .len   = rlen } };
0031 
0032     return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1;
0033 }
0034 
0035 static int __maybe_unused i2c_write(struct i2c_adapter *adap, u8 adr,
0036                     u8 *data, int len)
0037 {
0038     struct i2c_msg msg = { .addr = adr, .flags = 0,
0039                    .buf = data, .len = len };
0040 
0041     return (i2c_transfer(adap, &msg, 1) == 1) ? 0 : -1;
0042 }
0043 
0044 static int __maybe_unused i2c_read(struct i2c_adapter *adapter, u8 adr, u8 *val)
0045 {
0046     struct i2c_msg msgs[1] = { { .addr = adr, .flags = I2C_M_RD,
0047                      .buf  = val, .len   = 1 } };
0048 
0049     return (i2c_transfer(adapter, msgs, 1) == 1) ? 0 : -1;
0050 }
0051 
0052 static int __maybe_unused i2c_read_regs(struct i2c_adapter *adapter,
0053                     u8 adr, u8 reg, u8 *val, u8 len)
0054 {
0055     struct i2c_msg msgs[2] = { { .addr = adr,  .flags = 0,
0056                      .buf  = &reg, .len   = 1 },
0057                    { .addr = adr,  .flags = I2C_M_RD,
0058                      .buf  = val,  .len   = len } };
0059 
0060     return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1;
0061 }
0062 
0063 static int __maybe_unused i2c_read_regs16(struct i2c_adapter *adapter,
0064                       u8 adr, u16 reg, u8 *val, u8 len)
0065 {
0066     u8 msg[2] = { reg >> 8, reg & 0xff };
0067     struct i2c_msg msgs[2] = { { .addr = adr, .flags = 0,
0068                      .buf  = msg, .len   = 2 },
0069                    { .addr = adr, .flags = I2C_M_RD,
0070                      .buf  = val, .len   = len } };
0071 
0072     return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1;
0073 }
0074 
0075 static int __maybe_unused i2c_write_reg16(struct i2c_adapter *adap,
0076                       u8 adr, u16 reg, u8 val)
0077 {
0078     u8 msg[3] = { reg >> 8, reg & 0xff, val };
0079 
0080     return i2c_write(adap, adr, msg, 3);
0081 }
0082 
0083 static int __maybe_unused i2c_write_reg(struct i2c_adapter *adap,
0084                     u8 adr, u8 reg, u8 val)
0085 {
0086     u8 msg[2] = { reg, val };
0087 
0088     return i2c_write(adap, adr, msg, 2);
0089 }
0090 
0091 static int __maybe_unused i2c_read_reg16(struct i2c_adapter *adapter,
0092                      u8 adr, u16 reg, u8 *val)
0093 {
0094     return i2c_read_regs16(adapter, adr, reg, val, 1);
0095 }
0096 
0097 static int __maybe_unused i2c_read_reg(struct i2c_adapter *adapter,
0098                        u8 adr, u8 reg, u8 *val)
0099 {
0100     return i2c_read_regs(adapter, adr, reg, val, 1);
0101 }
0102 
0103 #endif /* __DDBRIDGE_I2C_H__ */