2 * Copyright (c) 2016-2020 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 */
64 __i2c_transfer(struct i2c_adapter
*adapter
, struct i2c_msg
*msgs
, int num
)
71 ret
= adapter
->algo
->master_xfer(adapter
, msgs
, num
);
72 if (ticks
> start_ticks
+ adapter
->timeout
)
77 } while (tries
< adapter
->retries
);
84 * The original Linux implementation does:
85 * 1. return -EOPNOTSUPP if adapter->algo->master_xfer is NULL
86 * 2. try to transfer msgs by calling adapter->algo->master_xfer()
87 * 3. if it took more ticks than adapter->timeout, fail
88 * 4. if the transfer failed, retry up to adapter->retries times
89 * 5. return the result of the last call of adapter->algo->master_xfer()
92 i2c_transfer(struct i2c_adapter
*adapter
, struct i2c_msg
*msgs
, int num
)
96 if (adapter
->algo
->master_xfer
== NULL
)
99 adapter
->lock_ops
->lock_bus(adapter
, I2C_LOCK_SEGMENT
);
100 ret
= __i2c_transfer(adapter
, msgs
, num
);
101 adapter
->lock_ops
->unlock_bus(adapter
, I2C_LOCK_SEGMENT
);
107 bit_xfer(struct i2c_adapter
*i2c_adap
, struct i2c_msg msgs
[], int num
)
109 /* XXX Linux really does try to transfer some data here */
114 bit_func(struct i2c_adapter
*adap
)
116 return (I2C_FUNC_I2C
| I2C_FUNC_NOSTART
| I2C_FUNC_SMBUS_EMUL
|
117 I2C_FUNC_SMBUS_READ_BLOCK_DATA
|
118 I2C_FUNC_SMBUS_BLOCK_PROC_CALL
|
119 I2C_FUNC_10BIT_ADDR
| I2C_FUNC_PROTOCOL_MANGLING
);
122 const struct i2c_algorithm i2c_bit_algo
= {
123 .master_xfer
= bit_xfer
,
124 .functionality
= bit_func
,
128 i2c_bit_add_bus(struct i2c_adapter
*adapter
)
130 adapter
->algo
= &i2c_bit_algo
;
131 adapter
->retries
= 2;
137 i2c_new_device(struct i2c_adapter
*adap
, struct i2c_board_info
const *info
)
139 struct i2c_client
*client
;
141 client
= kzalloc(sizeof(*client
), GFP_KERNEL
);
145 client
->adapter
= adap
;
147 strlcpy(client
->name
, info
->type
, sizeof(client
->name
));
148 client
->addr
= info
->addr
;
154 /* Default locking functions */
157 i2c_default_lock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
159 lockmgr(&i2c_lock
, LK_EXCLUSIVE
);
163 i2c_default_trylock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
165 return mutex_trylock(&i2c_lock
);
169 i2c_default_unlock_bus(struct i2c_adapter
*adapter
, unsigned int flags
)
171 lockmgr(&i2c_lock
, LK_RELEASE
);