162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * ddbridge-i2c.h: Digital Devices bridge i2c driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2010-2017 Digital Devices GmbH 662306a36Sopenharmony_ci * Ralph Metzler <rjkm@metzlerbros.de> 762306a36Sopenharmony_ci * Marcus Metzler <mocm@metzlerbros.de> 862306a36Sopenharmony_ci */ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#ifndef __DDBRIDGE_I2C_H__ 1162306a36Sopenharmony_ci#define __DDBRIDGE_I2C_H__ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#include <linux/i2c.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#include "ddbridge.h" 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci/******************************************************************************/ 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_civoid ddb_i2c_release(struct ddb *dev); 2062306a36Sopenharmony_ciint ddb_i2c_init(struct ddb *dev); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci/******************************************************************************/ 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cistatic int __maybe_unused i2c_io(struct i2c_adapter *adapter, u8 adr, 2562306a36Sopenharmony_ci u8 *wbuf, u32 wlen, u8 *rbuf, u32 rlen) 2662306a36Sopenharmony_ci{ 2762306a36Sopenharmony_ci struct i2c_msg msgs[2] = { { .addr = adr, .flags = 0, 2862306a36Sopenharmony_ci .buf = wbuf, .len = wlen }, 2962306a36Sopenharmony_ci { .addr = adr, .flags = I2C_M_RD, 3062306a36Sopenharmony_ci .buf = rbuf, .len = rlen } }; 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1; 3362306a36Sopenharmony_ci} 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_cistatic int __maybe_unused i2c_write(struct i2c_adapter *adap, u8 adr, 3662306a36Sopenharmony_ci u8 *data, int len) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci struct i2c_msg msg = { .addr = adr, .flags = 0, 3962306a36Sopenharmony_ci .buf = data, .len = len }; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci return (i2c_transfer(adap, &msg, 1) == 1) ? 0 : -1; 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_cistatic int __maybe_unused i2c_read(struct i2c_adapter *adapter, u8 adr, u8 *val) 4562306a36Sopenharmony_ci{ 4662306a36Sopenharmony_ci struct i2c_msg msgs[1] = { { .addr = adr, .flags = I2C_M_RD, 4762306a36Sopenharmony_ci .buf = val, .len = 1 } }; 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci return (i2c_transfer(adapter, msgs, 1) == 1) ? 0 : -1; 5062306a36Sopenharmony_ci} 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistatic int __maybe_unused i2c_read_regs(struct i2c_adapter *adapter, 5362306a36Sopenharmony_ci u8 adr, u8 reg, u8 *val, u8 len) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci struct i2c_msg msgs[2] = { { .addr = adr, .flags = 0, 5662306a36Sopenharmony_ci .buf = ®, .len = 1 }, 5762306a36Sopenharmony_ci { .addr = adr, .flags = I2C_M_RD, 5862306a36Sopenharmony_ci .buf = val, .len = len } }; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ci return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1; 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic int __maybe_unused i2c_read_regs16(struct i2c_adapter *adapter, 6462306a36Sopenharmony_ci u8 adr, u16 reg, u8 *val, u8 len) 6562306a36Sopenharmony_ci{ 6662306a36Sopenharmony_ci u8 msg[2] = { reg >> 8, reg & 0xff }; 6762306a36Sopenharmony_ci struct i2c_msg msgs[2] = { { .addr = adr, .flags = 0, 6862306a36Sopenharmony_ci .buf = msg, .len = 2 }, 6962306a36Sopenharmony_ci { .addr = adr, .flags = I2C_M_RD, 7062306a36Sopenharmony_ci .buf = val, .len = len } }; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1; 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic int __maybe_unused i2c_write_reg16(struct i2c_adapter *adap, 7662306a36Sopenharmony_ci u8 adr, u16 reg, u8 val) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci u8 msg[3] = { reg >> 8, reg & 0xff, val }; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci return i2c_write(adap, adr, msg, 3); 8162306a36Sopenharmony_ci} 8262306a36Sopenharmony_ci 8362306a36Sopenharmony_cistatic int __maybe_unused i2c_write_reg(struct i2c_adapter *adap, 8462306a36Sopenharmony_ci u8 adr, u8 reg, u8 val) 8562306a36Sopenharmony_ci{ 8662306a36Sopenharmony_ci u8 msg[2] = { reg, val }; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci return i2c_write(adap, adr, msg, 2); 8962306a36Sopenharmony_ci} 9062306a36Sopenharmony_ci 9162306a36Sopenharmony_cistatic int __maybe_unused i2c_read_reg16(struct i2c_adapter *adapter, 9262306a36Sopenharmony_ci u8 adr, u16 reg, u8 *val) 9362306a36Sopenharmony_ci{ 9462306a36Sopenharmony_ci return i2c_read_regs16(adapter, adr, reg, val, 1); 9562306a36Sopenharmony_ci} 9662306a36Sopenharmony_ci 9762306a36Sopenharmony_cistatic int __maybe_unused i2c_read_reg(struct i2c_adapter *adapter, 9862306a36Sopenharmony_ci u8 adr, u8 reg, u8 *val) 9962306a36Sopenharmony_ci{ 10062306a36Sopenharmony_ci return i2c_read_regs(adapter, adr, reg, val, 1); 10162306a36Sopenharmony_ci} 10262306a36Sopenharmony_ci 10362306a36Sopenharmony_ci#endif /* __DDBRIDGE_I2C_H__ */ 104