2 * Copyright (c) 2016-2019 François Tigeot <ftigeot@wolfpond.org>
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice unmodified, this list of conditions, and the following
11 * 2. Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 #include <linux/i2c.h>
28 #include <linux/i2c-algo-bit.h>
30 #include <linux/slab.h>
32 static struct lock i2c_lock;
33 LOCK_SYSINIT(i2c_lock, &i2c_lock, "i2cl", LK_CANRECURSE);
35 static void i2c_default_lock_bus(struct i2c_adapter *, unsigned int);
36 static int i2c_default_trylock_bus(struct i2c_adapter *, unsigned int);
37 static void i2c_default_unlock_bus(struct i2c_adapter *, unsigned int);
39 static const struct i2c_lock_operations i2c_default_lock_ops = {
40 .lock_bus = i2c_default_lock_bus,
41 .trylock_bus = i2c_default_trylock_bus,
42 .unlock_bus = i2c_default_unlock_bus,
46 i2c_add_adapter(struct i2c_adapter *adapter)
48 /* Linux registers a unique bus number here */
50 /* Setup default locking functions */
51 if (!adapter->lock_ops)
52 adapter->lock_ops = &i2c_default_lock_ops;
58 i2c_del_adapter(struct i2c_adapter *adapter)
60 /* Linux deletes a unique bus number here */
65 * The original Linux implementation does:
66 * 1. return -EOPNOTSUPP if adapter->algo->master_xfer is NULL
67 * 2. try to transfer msgs by calling adapter->algo->master_xfer()
68 * 3. if it took more ticks than adapter->timeout, fail
69 * 4. if the transfer failed, retry up to adapter->retries times
70 * 5. return the result of the last call of adapter->algo->master_xfer()
73 i2c_transfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num)
78 if (adapter->algo->master_xfer == NULL)
81 adapter->lock_ops->lock_bus(adapter, I2C_LOCK_SEGMENT);
84 ret = adapter->algo->master_xfer(adapter, msgs, num);
85 if (ticks > start_ticks + adapter->timeout)
90 } while (tries < adapter->retries);
91 adapter->lock_ops->unlock_bus(adapter, I2C_LOCK_SEGMENT);
97 bit_xfer(struct i2c_adapter *i2c_adap, struct i2c_msg msgs[], int num)
99 /* XXX Linux really does try to transfer some data here */
104 bit_func(struct i2c_adapter *adap)
106 return (I2C_FUNC_I2C | I2C_FUNC_NOSTART | I2C_FUNC_SMBUS_EMUL |
107 I2C_FUNC_SMBUS_READ_BLOCK_DATA |
108 I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
109 I2C_FUNC_10BIT_ADDR | I2C_FUNC_PROTOCOL_MANGLING);
112 const struct i2c_algorithm i2c_bit_algo = {
113 .master_xfer = bit_xfer,
114 .functionality = bit_func,
118 i2c_bit_add_bus(struct i2c_adapter *adapter)
120 adapter->algo = &i2c_bit_algo;
121 adapter->retries = 2;
127 i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
129 struct i2c_client *client;
131 client = kzalloc(sizeof(*client), GFP_KERNEL);
135 client->adapter = adap;
137 strlcpy(client->name, info->type, sizeof(client->name));
138 client->addr = info->addr;
144 /* Default locking functions */
147 i2c_default_lock_bus(struct i2c_adapter *adapter, unsigned int flags)
149 lockmgr(&i2c_lock, LK_EXCLUSIVE);
153 i2c_default_trylock_bus(struct i2c_adapter *adapter, unsigned int flags)
155 return mutex_trylock(&i2c_lock);
159 i2c_default_unlock_bus(struct i2c_adapter *adapter, unsigned int flags)
161 lockmgr(&i2c_lock, LK_RELEASE);