1 // SPDX-License-Identifier: GPL-2.0
3 * I2C bridge driver for the Greybus "generic" I2C module.
5 * Copyright 2014 Google Inc.
6 * Copyright 2014 Linaro Ltd.
9 #include <linux/kernel.h>
10 #include <linux/module.h>
11 #include <linux/slab.h>
12 #include <linux/i2c.h>
13 #include <linux/greybus.h>
17 struct gb_i2c_device
{
18 struct gb_connection
*connection
;
19 struct gbphy_device
*gbphy_dev
;
23 struct i2c_adapter adapter
;
27 * Map Greybus i2c functionality bits into Linux ones
29 static u32
gb_i2c_functionality_map(u32 gb_i2c_functionality
)
31 return gb_i2c_functionality
; /* All bits the same for now */
35 * Do initial setup of the i2c device. This includes verifying we
36 * can support it (based on the protocol version it advertises).
37 * If that's OK, we get and cached its functionality bits.
39 * Note: gb_i2c_dev->connection is assumed to have been valid.
41 static int gb_i2c_device_setup(struct gb_i2c_device
*gb_i2c_dev
)
43 struct gb_i2c_functionality_response response
;
47 ret
= gb_operation_sync(gb_i2c_dev
->connection
,
48 GB_I2C_TYPE_FUNCTIONALITY
,
49 NULL
, 0, &response
, sizeof(response
));
53 functionality
= le32_to_cpu(response
.functionality
);
54 gb_i2c_dev
->functionality
= gb_i2c_functionality_map(functionality
);
60 * Map Linux i2c_msg flags into Greybus i2c transfer op flags.
62 static u16
gb_i2c_transfer_op_flags_map(u16 flags
)
64 return flags
; /* All flags the same for now */
68 gb_i2c_fill_transfer_op(struct gb_i2c_transfer_op
*op
, struct i2c_msg
*msg
)
70 u16 flags
= gb_i2c_transfer_op_flags_map(msg
->flags
);
72 op
->addr
= cpu_to_le16(msg
->addr
);
73 op
->flags
= cpu_to_le16(flags
);
74 op
->size
= cpu_to_le16(msg
->len
);
77 static struct gb_operation
*
78 gb_i2c_operation_create(struct gb_connection
*connection
,
79 struct i2c_msg
*msgs
, u32 msg_count
)
81 struct gb_i2c_device
*gb_i2c_dev
= gb_connection_get_data(connection
);
82 struct gb_i2c_transfer_request
*request
;
83 struct gb_operation
*operation
;
84 struct gb_i2c_transfer_op
*op
;
86 u32 data_out_size
= 0;
93 if (msg_count
> (u32
)U16_MAX
) {
94 dev_err(&gb_i2c_dev
->gbphy_dev
->dev
, "msg_count (%u) too big\n",
98 op_count
= (u16
)msg_count
;
101 * In addition to space for all message descriptors we need
102 * to have enough to hold all outbound message data.
105 for (i
= 0; i
< msg_count
; i
++, msg
++)
106 if (msg
->flags
& I2C_M_RD
)
107 data_in_size
+= (u32
)msg
->len
;
109 data_out_size
+= (u32
)msg
->len
;
111 request_size
= sizeof(*request
);
112 request_size
+= msg_count
* sizeof(*op
);
113 request_size
+= data_out_size
;
115 /* Response consists only of incoming data */
116 operation
= gb_operation_create(connection
, GB_I2C_TYPE_TRANSFER
,
117 request_size
, data_in_size
, GFP_KERNEL
);
121 request
= operation
->request
->payload
;
122 request
->op_count
= cpu_to_le16(op_count
);
123 /* Fill in the ops array */
124 op
= &request
->ops
[0];
126 for (i
= 0; i
< msg_count
; i
++)
127 gb_i2c_fill_transfer_op(op
++, msg
++);
132 /* Copy over the outgoing data; it starts after the last op */
135 for (i
= 0; i
< msg_count
; i
++) {
136 if (!(msg
->flags
& I2C_M_RD
)) {
137 memcpy(data
, msg
->buf
, msg
->len
);
146 static void gb_i2c_decode_response(struct i2c_msg
*msgs
, u32 msg_count
,
147 struct gb_i2c_transfer_response
*response
)
149 struct i2c_msg
*msg
= msgs
;
155 data
= response
->data
;
156 for (i
= 0; i
< msg_count
; i
++) {
157 if (msg
->flags
& I2C_M_RD
) {
158 memcpy(msg
->buf
, data
, msg
->len
);
166 * Some i2c transfer operations return results that are expected.
168 static bool gb_i2c_expected_transfer_error(int errno
)
170 return errno
== -EAGAIN
|| errno
== -ENODEV
;
173 static int gb_i2c_transfer_operation(struct gb_i2c_device
*gb_i2c_dev
,
174 struct i2c_msg
*msgs
, u32 msg_count
)
176 struct gb_connection
*connection
= gb_i2c_dev
->connection
;
177 struct device
*dev
= &gb_i2c_dev
->gbphy_dev
->dev
;
178 struct gb_operation
*operation
;
181 operation
= gb_i2c_operation_create(connection
, msgs
, msg_count
);
185 ret
= gbphy_runtime_get_sync(gb_i2c_dev
->gbphy_dev
);
187 goto exit_operation_put
;
189 ret
= gb_operation_request_send_sync(operation
);
191 struct gb_i2c_transfer_response
*response
;
193 response
= operation
->response
->payload
;
194 gb_i2c_decode_response(msgs
, msg_count
, response
);
196 } else if (!gb_i2c_expected_transfer_error(ret
)) {
197 dev_err(dev
, "transfer operation failed (%d)\n", ret
);
200 gbphy_runtime_put_autosuspend(gb_i2c_dev
->gbphy_dev
);
203 gb_operation_put(operation
);
208 static int gb_i2c_master_xfer(struct i2c_adapter
*adap
, struct i2c_msg
*msgs
,
211 struct gb_i2c_device
*gb_i2c_dev
;
213 gb_i2c_dev
= i2c_get_adapdata(adap
);
215 return gb_i2c_transfer_operation(gb_i2c_dev
, msgs
, msg_count
);
218 static u32
gb_i2c_functionality(struct i2c_adapter
*adap
)
220 struct gb_i2c_device
*gb_i2c_dev
= i2c_get_adapdata(adap
);
222 return gb_i2c_dev
->functionality
;
225 static const struct i2c_algorithm gb_i2c_algorithm
= {
226 .master_xfer
= gb_i2c_master_xfer
,
227 .functionality
= gb_i2c_functionality
,
230 static int gb_i2c_probe(struct gbphy_device
*gbphy_dev
,
231 const struct gbphy_device_id
*id
)
233 struct gb_connection
*connection
;
234 struct gb_i2c_device
*gb_i2c_dev
;
235 struct i2c_adapter
*adapter
;
238 gb_i2c_dev
= kzalloc(sizeof(*gb_i2c_dev
), GFP_KERNEL
);
243 gb_connection_create(gbphy_dev
->bundle
,
244 le16_to_cpu(gbphy_dev
->cport_desc
->id
),
246 if (IS_ERR(connection
)) {
247 ret
= PTR_ERR(connection
);
248 goto exit_i2cdev_free
;
251 gb_i2c_dev
->connection
= connection
;
252 gb_connection_set_data(connection
, gb_i2c_dev
);
253 gb_i2c_dev
->gbphy_dev
= gbphy_dev
;
254 gb_gbphy_set_data(gbphy_dev
, gb_i2c_dev
);
256 ret
= gb_connection_enable(connection
);
258 goto exit_connection_destroy
;
260 ret
= gb_i2c_device_setup(gb_i2c_dev
);
262 goto exit_connection_disable
;
264 /* Looks good; up our i2c adapter */
265 adapter
= &gb_i2c_dev
->adapter
;
266 adapter
->owner
= THIS_MODULE
;
267 adapter
->class = I2C_CLASS_HWMON
| I2C_CLASS_SPD
;
268 adapter
->algo
= &gb_i2c_algorithm
;
270 adapter
->dev
.parent
= &gbphy_dev
->dev
;
271 snprintf(adapter
->name
, sizeof(adapter
->name
), "Greybus i2c adapter");
272 i2c_set_adapdata(adapter
, gb_i2c_dev
);
274 ret
= i2c_add_adapter(adapter
);
276 goto exit_connection_disable
;
278 gbphy_runtime_put_autosuspend(gbphy_dev
);
281 exit_connection_disable
:
282 gb_connection_disable(connection
);
283 exit_connection_destroy
:
284 gb_connection_destroy(connection
);
291 static void gb_i2c_remove(struct gbphy_device
*gbphy_dev
)
293 struct gb_i2c_device
*gb_i2c_dev
= gb_gbphy_get_data(gbphy_dev
);
294 struct gb_connection
*connection
= gb_i2c_dev
->connection
;
297 ret
= gbphy_runtime_get_sync(gbphy_dev
);
299 gbphy_runtime_get_noresume(gbphy_dev
);
301 i2c_del_adapter(&gb_i2c_dev
->adapter
);
302 gb_connection_disable(connection
);
303 gb_connection_destroy(connection
);
307 static const struct gbphy_device_id gb_i2c_id_table
[] = {
308 { GBPHY_PROTOCOL(GREYBUS_PROTOCOL_I2C
) },
311 MODULE_DEVICE_TABLE(gbphy
, gb_i2c_id_table
);
313 static struct gbphy_driver i2c_driver
= {
315 .probe
= gb_i2c_probe
,
316 .remove
= gb_i2c_remove
,
317 .id_table
= gb_i2c_id_table
,
320 module_gbphy_driver(i2c_driver
);
321 MODULE_LICENSE("GPL v2");