1a96e5ab8SDaniel Scheller /* 222e74389SDaniel Scheller * ddbridge-i2c.c: Digital Devices bridge i2c driver 3a96e5ab8SDaniel Scheller * 422e74389SDaniel Scheller * Copyright (C) 2010-2017 Digital Devices GmbH 522e74389SDaniel Scheller * Ralph Metzler <rjkm@metzlerbros.de> 622e74389SDaniel Scheller * Marcus Metzler <mocm@metzlerbros.de> 7a96e5ab8SDaniel Scheller * 8a96e5ab8SDaniel Scheller * This program is free software; you can redistribute it and/or 9a96e5ab8SDaniel Scheller * modify it under the terms of the GNU General Public License 10a96e5ab8SDaniel Scheller * version 2 only, as published by the Free Software Foundation. 11a96e5ab8SDaniel Scheller * 12a96e5ab8SDaniel Scheller * This program is distributed in the hope that it will be useful, 13a96e5ab8SDaniel Scheller * but WITHOUT ANY WARRANTY; without even the implied warranty of 14a96e5ab8SDaniel Scheller * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15a96e5ab8SDaniel Scheller * GNU General Public License for more details. 16a96e5ab8SDaniel Scheller * 17a96e5ab8SDaniel Scheller */ 18a96e5ab8SDaniel Scheller 19a96e5ab8SDaniel Scheller #ifndef __DDBRIDGE_I2C_H__ 20a96e5ab8SDaniel Scheller #define __DDBRIDGE_I2C_H__ 21a96e5ab8SDaniel Scheller 22a96e5ab8SDaniel Scheller #include <linux/i2c.h> 23a96e5ab8SDaniel Scheller 24a96e5ab8SDaniel Scheller #include "ddbridge.h" 25a96e5ab8SDaniel Scheller 26a96e5ab8SDaniel Scheller /******************************************************************************/ 27a96e5ab8SDaniel Scheller 28a96e5ab8SDaniel Scheller void ddb_i2c_release(struct ddb *dev); 29a96e5ab8SDaniel Scheller int ddb_i2c_init(struct ddb *dev); 30a96e5ab8SDaniel Scheller 31a96e5ab8SDaniel Scheller /******************************************************************************/ 32a96e5ab8SDaniel Scheller 33a96e5ab8SDaniel Scheller static int __maybe_unused i2c_io(struct i2c_adapter *adapter, u8 adr, 34a96e5ab8SDaniel Scheller u8 *wbuf, u32 wlen, u8 *rbuf, u32 rlen) 35a96e5ab8SDaniel Scheller { 36a96e5ab8SDaniel Scheller struct i2c_msg msgs[2] = { { .addr = adr, .flags = 0, 37a96e5ab8SDaniel Scheller .buf = wbuf, .len = wlen }, 38a96e5ab8SDaniel Scheller { .addr = adr, .flags = I2C_M_RD, 39a96e5ab8SDaniel Scheller .buf = rbuf, .len = rlen } }; 40a96e5ab8SDaniel Scheller 41a96e5ab8SDaniel Scheller return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1; 42a96e5ab8SDaniel Scheller } 43a96e5ab8SDaniel Scheller 44a96e5ab8SDaniel Scheller static int __maybe_unused i2c_write(struct i2c_adapter *adap, u8 adr, 45a96e5ab8SDaniel Scheller u8 *data, int len) 46a96e5ab8SDaniel Scheller { 47a96e5ab8SDaniel Scheller struct i2c_msg msg = { .addr = adr, .flags = 0, 48a96e5ab8SDaniel Scheller .buf = data, .len = len }; 49a96e5ab8SDaniel Scheller 50a96e5ab8SDaniel Scheller return (i2c_transfer(adap, &msg, 1) == 1) ? 0 : -1; 51a96e5ab8SDaniel Scheller } 52a96e5ab8SDaniel Scheller 53a96e5ab8SDaniel Scheller static int __maybe_unused i2c_read(struct i2c_adapter *adapter, u8 adr, u8 *val) 54a96e5ab8SDaniel Scheller { 55a96e5ab8SDaniel Scheller struct i2c_msg msgs[1] = { { .addr = adr, .flags = I2C_M_RD, 56a96e5ab8SDaniel Scheller .buf = val, .len = 1 } }; 57a96e5ab8SDaniel Scheller 58a96e5ab8SDaniel Scheller return (i2c_transfer(adapter, msgs, 1) == 1) ? 0 : -1; 59a96e5ab8SDaniel Scheller } 60a96e5ab8SDaniel Scheller 61a96e5ab8SDaniel Scheller static int __maybe_unused i2c_read_regs(struct i2c_adapter *adapter, 62a96e5ab8SDaniel Scheller u8 adr, u8 reg, u8 *val, u8 len) 63a96e5ab8SDaniel Scheller { 64a96e5ab8SDaniel Scheller struct i2c_msg msgs[2] = { { .addr = adr, .flags = 0, 65a96e5ab8SDaniel Scheller .buf = ®, .len = 1 }, 66a96e5ab8SDaniel Scheller { .addr = adr, .flags = I2C_M_RD, 67a96e5ab8SDaniel Scheller .buf = val, .len = len } }; 68a96e5ab8SDaniel Scheller 69a96e5ab8SDaniel Scheller return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1; 70a96e5ab8SDaniel Scheller } 71a96e5ab8SDaniel Scheller 7222e74389SDaniel Scheller static int __maybe_unused i2c_read_regs16(struct i2c_adapter *adapter, 7322e74389SDaniel Scheller u8 adr, u16 reg, u8 *val, u8 len) 74a96e5ab8SDaniel Scheller { 75a96e5ab8SDaniel Scheller u8 msg[2] = { reg >> 8, reg & 0xff }; 76a96e5ab8SDaniel Scheller struct i2c_msg msgs[2] = { { .addr = adr, .flags = 0, 77a96e5ab8SDaniel Scheller .buf = msg, .len = 2 }, 78a96e5ab8SDaniel Scheller { .addr = adr, .flags = I2C_M_RD, 7922e74389SDaniel Scheller .buf = val, .len = len } }; 80a96e5ab8SDaniel Scheller 81a96e5ab8SDaniel Scheller return (i2c_transfer(adapter, msgs, 2) == 2) ? 0 : -1; 82a96e5ab8SDaniel Scheller } 83a96e5ab8SDaniel Scheller 8422e74389SDaniel Scheller static int __maybe_unused i2c_write_reg16(struct i2c_adapter *adap, 8522e74389SDaniel Scheller u8 adr, u16 reg, u8 val) 8622e74389SDaniel Scheller { 8722e74389SDaniel Scheller u8 msg[3] = { reg >> 8, reg & 0xff, val }; 8822e74389SDaniel Scheller 8922e74389SDaniel Scheller return i2c_write(adap, adr, msg, 3); 9022e74389SDaniel Scheller } 9122e74389SDaniel Scheller 92a96e5ab8SDaniel Scheller static int __maybe_unused i2c_write_reg(struct i2c_adapter *adap, 93a96e5ab8SDaniel Scheller u8 adr, u8 reg, u8 val) 94a96e5ab8SDaniel Scheller { 95a96e5ab8SDaniel Scheller u8 msg[2] = { reg, val }; 96a96e5ab8SDaniel Scheller 97a96e5ab8SDaniel Scheller return i2c_write(adap, adr, msg, 2); 98a96e5ab8SDaniel Scheller } 99a96e5ab8SDaniel Scheller 10022e74389SDaniel Scheller static int __maybe_unused i2c_read_reg16(struct i2c_adapter *adapter, 10122e74389SDaniel Scheller u8 adr, u16 reg, u8 *val) 10222e74389SDaniel Scheller { 10322e74389SDaniel Scheller return i2c_read_regs16(adapter, adr, reg, val, 1); 10422e74389SDaniel Scheller } 10522e74389SDaniel Scheller 10622e74389SDaniel Scheller static int __maybe_unused i2c_read_reg(struct i2c_adapter *adapter, 10722e74389SDaniel Scheller u8 adr, u8 reg, u8 *val) 10822e74389SDaniel Scheller { 10922e74389SDaniel Scheller return i2c_read_regs(adapter, adr, reg, val, 1); 11022e74389SDaniel Scheller } 11122e74389SDaniel Scheller 112a96e5ab8SDaniel Scheller #endif /* __DDBRIDGE_I2C_H__ */ 113