1 /* i2c-core.c - a device driver for the iic-bus interface		     */
2 /* ------------------------------------------------------------------------- */
3 /*   Copyright (C) 1995-99 Simon G. Vogl
4 
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9 
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.			     */
14 /* ------------------------------------------------------------------------- */
15 
16 /* With some changes from Kyösti Mälkki <kmalkki@cc.hut.fi>.
17    All SMBus-related things are written by Frodo Looijaard <frodol@dds.nl>
18    SMBus 2.0 support by Mark Studebaker <mdsxyz123@yahoo.com> and
19    Jean Delvare <jdelvare@suse.de>
20    Mux support by Rodolfo Giometti <giometti@enneenne.com> and
21    Michael Lawnick <michael.lawnick.ext@nsn.com>
22  */
23 /* NOTE: This code derives from i2c-core.c in Linux */
24 
25 #include <linux/i2c.h>
26 #include <linux/i2c-mux.h>
27 #include <linux/idr.h>
28 
29 static DEFINE_IDR(i2c_adapter_idr);
30 static TAILQ_HEAD(, i2c_driver) i2c_driver_head = TAILQ_HEAD_INITIALIZER(i2c_driver_head);
31 
32 struct device_type i2c_adapter_type;
33 struct device_type i2c_client_type;
34 
35 #define	I2C_ADDR_OFFSET_TEN_BIT	0xa000
36 #define	I2C_ADDR_OFFSET_SLAVE	0x1000
37 
38 int
i2c_transfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)39 i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
40 {
41 	unsigned long end_jiffies;
42 	int ret;
43 	int try;
44 
45 	if (adap->algo->master_xfer == NULL)
46 		return (-EOPNOTSUPP);
47 
48 	i2c_lock_bus(adap, I2C_LOCK_SEGMENT);
49 	end_jiffies = jiffies + adap->timeout;
50 	for (ret = 0, try = 0; try <= adap->retries; try++) {
51 		ret = adap->algo->master_xfer(adap, msgs, num);
52 		if (ret != -EAGAIN)
53 			break;
54 		if (time_after(jiffies, end_jiffies))
55 			break;
56 	}
57 	i2c_unlock_bus(adap, I2C_LOCK_SEGMENT);
58 
59 	return (ret);
60 }
61 
62 int
__i2c_transfer(struct i2c_adapter * adap,struct i2c_msg * msgs,int num)63 __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
64 {
65 	unsigned long end_jiffies;
66 	int ret;
67 	int try;
68 
69 	end_jiffies = jiffies + adap->timeout;
70 	for (ret = 0, try = 0; try <= adap->retries; try++) {
71 		ret = adap->algo->master_xfer(adap, msgs, num);
72 		if (ret != -EAGAIN)
73 			break;
74 		if (time_after(jiffies, end_jiffies))
75 			break;
76 	}
77 	return (ret);
78 }
79 
80 int
i2c_register_driver(struct module * mod,struct i2c_driver * drv)81 i2c_register_driver(struct module *mod, struct i2c_driver *drv)
82 {
83 	TAILQ_INSERT_TAIL(&i2c_driver_head, drv, entry);
84 	return (0);
85 }
86 
87 void
i2c_del_driver(struct i2c_driver * drv)88 i2c_del_driver(struct i2c_driver *drv)
89 {
90 	TAILQ_REMOVE(&i2c_driver_head, drv, entry);
91 }
92 
93 static void
i2c_adapter_lock_bus(struct i2c_adapter * adapter,unsigned int flags)94 i2c_adapter_lock_bus(struct i2c_adapter *adapter,
95     unsigned int flags)
96 {
97 	rt_mutex_lock(&adapter->bus_lock);
98 }
99 
100 static int
i2c_adapter_trylock_bus(struct i2c_adapter * adapter,unsigned int flags)101 i2c_adapter_trylock_bus(struct i2c_adapter *adapter,
102     unsigned int flags)
103 {
104 	return rt_mutex_trylock(&adapter->bus_lock);
105 }
106 
107 static void
i2c_adapter_unlock_bus(struct i2c_adapter * adapter,unsigned int flags)108 i2c_adapter_unlock_bus(struct i2c_adapter *adapter,
109     unsigned int flags)
110 {
111 	rt_mutex_unlock(&adapter->bus_lock);
112 }
113 
114 
115 static int
i2c_register_adapter(struct i2c_adapter * adap)116 i2c_register_adapter(struct i2c_adapter *adap)
117 {
118 	if (!adap->lock_bus) {
119 		adap->lock_bus = i2c_adapter_lock_bus;
120 		adap->trylock_bus = i2c_adapter_trylock_bus;
121 		adap->unlock_bus = i2c_adapter_unlock_bus;
122 	}
123 	rt_mutex_init(&adap->bus_lock);
124 	rt_mutex_init(&adap->mux_lock);
125 
126 	if (adap->timeout == 0)
127 		adap->timeout = HZ;
128 
129 	dev_set_name(&adap->dev, "i2c-%d", adap->nr);
130 	adap->dev.type = &i2c_adapter_type;
131 
132 	return (device_register(&adap->dev));
133 }
134 
135 static int
i2c_add_numbered_adapter_sub(struct i2c_adapter * adap)136 i2c_add_numbered_adapter_sub(struct i2c_adapter *adap)
137 {
138 	int id;
139 
140 	atomic_lock();
141 	id = idr_alloc(&i2c_adapter_idr, adap, adap->nr, adap->nr + 1,
142 	    GFP_KERNEL);
143 	atomic_unlock();
144 	if (id < 0)
145 		return ((id == -ENOSPC) ? -EBUSY : id);
146 
147 	return (i2c_register_adapter(adap));
148 }
149 
150 int
i2c_add_numbered_adapter(struct i2c_adapter * adap)151 i2c_add_numbered_adapter(struct i2c_adapter *adap)
152 {
153 	if (adap->nr == -1)		/* -1 means dynamically assign bus id */
154 		return (i2c_add_adapter(adap));
155 
156 	return (i2c_add_numbered_adapter_sub(adap));
157 }
158 
159 int
i2c_add_adapter(struct i2c_adapter * adapter)160 i2c_add_adapter(struct i2c_adapter *adapter)
161 {
162 	int id;
163 
164 	atomic_lock();
165 	id = idr_alloc(&i2c_adapter_idr, adapter, 128, 0, GFP_KERNEL);
166 	atomic_unlock();
167 
168 	if (id < 0)
169 		return (id);
170 
171 	adapter->nr = id;
172 
173 	return (i2c_register_adapter(adapter));
174 }
175 
176 void
i2c_del_adapter(struct i2c_adapter * adapter)177 i2c_del_adapter(struct i2c_adapter *adapter)
178 {
179 
180 }
181 
182 struct i2c_client *
i2c_new_dummy_device(struct i2c_adapter * adapter,u16 address)183 i2c_new_dummy_device(struct i2c_adapter *adapter, u16 address)
184 {
185 	struct i2c_board_info info = {
186 		I2C_BOARD_INFO("dummy", address),
187 	};
188 	return (i2c_new_device(adapter, &info));
189 }
190 
191 struct i2c_client *
i2c_new_device(struct i2c_adapter * adapt,struct i2c_board_info const * info)192 i2c_new_device(struct i2c_adapter *adapt, struct i2c_board_info const *info)
193 {
194 	struct i2c_client *client;
195 	struct i2c_driver *drv;
196 	int status = -1;
197 
198 	client = kzalloc(sizeof(*client), GFP_KERNEL);
199 	if (client == NULL)
200 		return (NULL);
201 
202 	client->adapter = adapt;
203 
204 	client->dev.platform_data = info->platform_data;
205 
206 	client->flags = info->flags;
207 	client->addr = info->addr;
208 	client->irq = info->irq;
209 
210 	strlcpy(client->name, info->type, sizeof(client->name));
211 
212 	client->dev.parent = &client->adapter->dev;
213 	client->dev.type = &i2c_client_type;
214 
215 	/* For 10-bit clients, add an arbitrary offset to avoid collisions */
216 	dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adapt),
217 	    client->addr | ((client->flags & I2C_CLIENT_TEN)
218 	    ? 0xa000 : 0));
219 
220 	TAILQ_FOREACH(drv, &i2c_driver_head, entry) {
221 		uint32_t i;
222 
223 		for (i = 0; drv->id_table != NULL &&
224 		    drv->id_table[i].name[0] != 0; i++) {
225 			if (strcmp(drv->id_table[i].name, client->name) != 0)
226 				continue;
227 			client->dev.driver = &drv->driver;
228 
229 			if (drv->probe == NULL && drv->probe_new == NULL) {
230 				status = 0;
231 				break;
232 			}
233 			if (drv->probe_new != NULL)
234 				status = drv->probe_new(client);
235 			else
236 				status = drv->probe(client, drv->id_table + i);
237 			if (status == 0)
238 				break;
239 			client->dev.driver = NULL;
240 		}
241 	}
242 	if (status != 0) {
243 		kfree(client);
244 		return (NULL);
245 	}
246 	return (client);
247 }
248 
249 /*
250  * Dummy I2C driver support
251  */
252 
253 static const struct i2c_device_id i2c_dummy_id[] = {
254 	{ "dummy", 0 },
255 	{ },
256 };
257 
258 static int
i2c_dummy_probe(struct i2c_client * client,const struct i2c_device_id * id)259 i2c_dummy_probe(struct i2c_client *client, const struct i2c_device_id *id)
260 {
261 	return (0);
262 }
263 
264 static int
i2c_dummy_remove(struct i2c_client * client)265 i2c_dummy_remove(struct i2c_client *client)
266 {
267 	return (0);
268 }
269 
270 static struct i2c_driver i2c_dummy_driver = {
271 	.driver.name = "dummy",
272 	.probe = i2c_dummy_probe,
273 	.remove = i2c_dummy_remove,
274 	.id_table = i2c_dummy_id,
275 };
276 
277 static void
i2c_dummy_init(void)278 i2c_dummy_init(void)
279 {
280 	i2c_register_driver(NULL, &i2c_dummy_driver);
281 }
282 module_init(i2c_dummy_init);
283 
284 struct i2c_client *
i2c_new_dummy(struct i2c_adapter * adapter,u16 address)285 i2c_new_dummy(struct i2c_adapter *adapter, u16 address)
286 {
287 	struct i2c_board_info info = {
288 		I2C_BOARD_INFO("dummy", address),
289 	};
290 
291 	return (i2c_new_device(adapter, &info));
292 }
293 
294 struct i2c_client *
i2c_new_probed_device(struct i2c_adapter * adapt,struct i2c_board_info * info,unsigned short const * addr_list,int (* probe)(struct i2c_adapter *,unsigned short addr))295 i2c_new_probed_device(struct i2c_adapter *adapt,
296     struct i2c_board_info *info,
297     unsigned short const *addr_list,
298     int (*probe) (struct i2c_adapter *, unsigned short addr))
299 {
300 	unsigned i;
301 
302 	if (probe == NULL)
303 		i = 0;
304 	else
305 		for (i = 0; addr_list[i] != I2C_CLIENT_END; i++) {
306 			if (probe(adapt, addr_list[i]))
307 				break;
308 		}
309 	if (addr_list[i] == I2C_CLIENT_END)
310 		return (NULL);
311 
312 	info->addr = addr_list[i];
313 
314 	return (i2c_new_device(adapt, info));
315 }
316 
317 void
i2c_unregister_device(struct i2c_client * client)318 i2c_unregister_device(struct i2c_client *client)
319 {
320 	struct i2c_driver *driver;
321 
322 	if (client == NULL || client->dev.driver == NULL)
323 		return;
324 
325 	driver = to_i2c_driver(client->dev.driver);
326 	if (driver->remove != NULL)
327 		driver->remove(client);
328 
329 	kfree(client);
330 }
331 
332 int
i2c_master_send(const struct i2c_client * client,const char * buf,int count)333 i2c_master_send(const struct i2c_client *client, const char *buf, int count)
334 {
335 	int ret;
336 	struct i2c_adapter *adap = client->adapter;
337 	struct i2c_msg msg;
338 
339 	msg.addr = client->addr;
340 	msg.flags = client->flags & I2C_M_TEN;
341 	msg.len = count;
342 	msg.buf = (char *)buf;
343 
344 	ret = i2c_transfer(adap, &msg, 1);
345 
346 	return ((ret == 1) ? count : ret);
347 }
348 
349 int
i2c_master_recv(const struct i2c_client * client,char * buf,int count)350 i2c_master_recv(const struct i2c_client *client, char *buf, int count)
351 {
352 	struct i2c_adapter *adap = client->adapter;
353 	struct i2c_msg msg;
354 	int ret;
355 
356 	msg.addr = client->addr;
357 	msg.flags = client->flags & I2C_M_TEN;
358 	msg.flags |= I2C_M_RD;
359 	msg.len = count;
360 	msg.buf = buf;
361 
362 	ret = i2c_transfer(adap, &msg, 1);
363 
364 	return ((ret == 1) ? count : ret);
365 }
366 
367 void
i2c_clients_command(struct i2c_adapter * adap,unsigned int cmd,void * arg)368 i2c_clients_command(struct i2c_adapter *adap, unsigned int cmd, void *arg)
369 {
370 	printf("WARNING: i2c_clients_command() is not implemented\n");
371 }
372 
373 #define	POLY (0x1070U << 3)
374 
375 static	u8
crc8(u16 data)376 crc8(u16 data)
377 {
378 	int i;
379 
380 	for (i = 0; i < 8; i++) {
381 		if (data & 0x8000)
382 			data = data ^ POLY;
383 		data = data << 1;
384 	}
385 	return (u8) (data >> 8);
386 }
387 
388 static	u8
i2c_smbus_pec(u8 crc,u8 * p,size_t count)389 i2c_smbus_pec(u8 crc, u8 * p, size_t count)
390 {
391 	int i;
392 
393 	for (i = 0; i < count; i++)
394 		crc = crc8((crc ^ p[i]) << 8);
395 	return crc;
396 }
397 
398 static	u8
i2c_smbus_msg_pec(u8 pec,struct i2c_msg * msg)399 i2c_smbus_msg_pec(u8 pec, struct i2c_msg *msg)
400 {
401 	u8 addr = i2c_8bit_addr_from_msg(msg);
402 
403 	pec = i2c_smbus_pec(pec, &addr, 1);
404 
405 	return i2c_smbus_pec(pec, msg->buf, msg->len);
406 }
407 
408 static inline void
i2c_smbus_add_pec(struct i2c_msg * msg)409 i2c_smbus_add_pec(struct i2c_msg *msg)
410 {
411 	msg->buf[msg->len] = i2c_smbus_msg_pec(0, msg);
412 	msg->len++;
413 }
414 
415 static int
i2c_smbus_check_pec(u8 cpec,struct i2c_msg * msg)416 i2c_smbus_check_pec(u8 cpec, struct i2c_msg *msg)
417 {
418 	u8 rpec = msg->buf[--msg->len];
419 
420 	cpec = i2c_smbus_msg_pec(cpec, msg);
421 
422 	if (rpec != cpec) {
423 		pr_debug("i2c-core: Bad PEC 0x%02x vs. 0x%02x\n",
424 		    rpec, cpec);
425 		return -EBADMSG;
426 	}
427 	return 0;
428 }
429 
430 int
i2c_smbus_read_byte(const struct i2c_client * client)431 i2c_smbus_read_byte(const struct i2c_client *client)
432 {
433 	union i2c_smbus_data data;
434 	int status;
435 
436 	status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
437 	    I2C_SMBUS_READ, 0,
438 	    I2C_SMBUS_BYTE, &data);
439 	return (status < 0) ? status : data.byte;
440 }
441 
442 int
i2c_smbus_write_byte(const struct i2c_client * client,u8 value)443 i2c_smbus_write_byte(const struct i2c_client *client, u8 value)
444 {
445 	return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
446 	    I2C_SMBUS_WRITE, value, I2C_SMBUS_BYTE, NULL);
447 }
448 
449 int
i2c_smbus_read_byte_data(const struct i2c_client * client,u8 command)450 i2c_smbus_read_byte_data(const struct i2c_client *client, u8 command)
451 {
452 	union i2c_smbus_data data;
453 	int status;
454 
455 	status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
456 	    I2C_SMBUS_READ, command,
457 	    I2C_SMBUS_BYTE_DATA, &data);
458 	return (status < 0) ? status : data.byte;
459 }
460 
461 int
i2c_smbus_write_byte_data(const struct i2c_client * client,u8 command,u8 value)462 i2c_smbus_write_byte_data(const struct i2c_client *client, u8 command,
463     u8 value)
464 {
465 	union i2c_smbus_data data;
466 
467 	data.byte = value;
468 	return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
469 	    I2C_SMBUS_WRITE, command,
470 	    I2C_SMBUS_BYTE_DATA, &data);
471 }
472 
473 int
i2c_smbus_read_word_data(const struct i2c_client * client,u8 command)474 i2c_smbus_read_word_data(const struct i2c_client *client, u8 command)
475 {
476 	union i2c_smbus_data data;
477 	int status;
478 
479 	status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
480 	    I2C_SMBUS_READ, command,
481 	    I2C_SMBUS_WORD_DATA, &data);
482 	return (status < 0) ? status : data.word;
483 }
484 
485 int
i2c_smbus_write_word_data(const struct i2c_client * client,u8 command,u16 value)486 i2c_smbus_write_word_data(const struct i2c_client *client, u8 command,
487     u16 value)
488 {
489 	union i2c_smbus_data data;
490 
491 	data.word = value;
492 	return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
493 	    I2C_SMBUS_WRITE, command,
494 	    I2C_SMBUS_WORD_DATA, &data);
495 }
496 
497 int
i2c_smbus_process_call(const struct i2c_client * client,u8 command,u16 value)498 i2c_smbus_process_call(const struct i2c_client *client, u8 command,
499     u16 value)
500 {
501 	union i2c_smbus_data data;
502 	int status;
503 
504 	data.word = value;
505 
506 	status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
507 	    I2C_SMBUS_WRITE, command,
508 	    I2C_SMBUS_PROC_CALL, &data);
509 	return (status < 0) ? status : data.word;
510 }
511 
512 int
i2c_smbus_read_block_data(const struct i2c_client * client,u8 command,u8 * values)513 i2c_smbus_read_block_data(const struct i2c_client *client, u8 command,
514     u8 * values)
515 {
516 	union i2c_smbus_data data;
517 	int status;
518 
519 	status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
520 	    I2C_SMBUS_READ, command,
521 	    I2C_SMBUS_BLOCK_DATA, &data);
522 	if (status)
523 		return status;
524 
525 	memcpy(values, &data.block[1], data.block[0]);
526 	return data.block[0];
527 }
528 
529 int
i2c_smbus_write_block_data(const struct i2c_client * client,u8 command,u8 length,const u8 * values)530 i2c_smbus_write_block_data(const struct i2c_client *client, u8 command,
531     u8 length, const u8 * values)
532 {
533 	union i2c_smbus_data data;
534 
535 	if (length > I2C_SMBUS_BLOCK_MAX)
536 		length = I2C_SMBUS_BLOCK_MAX;
537 	data.block[0] = length;
538 	memcpy(&data.block[1], values, length);
539 	return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
540 	    I2C_SMBUS_WRITE, command,
541 	    I2C_SMBUS_BLOCK_DATA, &data);
542 }
543 
544 int
i2c_smbus_read_i2c_block_data(const struct i2c_client * client,u8 command,u8 length,u8 * values)545 i2c_smbus_read_i2c_block_data(const struct i2c_client *client, u8 command,
546     u8 length, u8 * values)
547 {
548 	union i2c_smbus_data data;
549 	int status;
550 
551 	if (length > I2C_SMBUS_BLOCK_MAX)
552 		length = I2C_SMBUS_BLOCK_MAX;
553 	data.block[0] = length;
554 	status = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
555 	    I2C_SMBUS_READ, command,
556 	    I2C_SMBUS_I2C_BLOCK_DATA, &data);
557 	if (status < 0)
558 		return status;
559 
560 	memcpy(values, &data.block[1], data.block[0]);
561 	return data.block[0];
562 }
563 
564 int
i2c_smbus_write_i2c_block_data(const struct i2c_client * client,u8 command,u8 length,const u8 * values)565 i2c_smbus_write_i2c_block_data(const struct i2c_client *client, u8 command,
566     u8 length, const u8 * values)
567 {
568 	union i2c_smbus_data data;
569 
570 	if (length > I2C_SMBUS_BLOCK_MAX)
571 		length = I2C_SMBUS_BLOCK_MAX;
572 	data.block[0] = length;
573 	memcpy(data.block + 1, values, length);
574 	return i2c_smbus_xfer(client->adapter, client->addr, client->flags,
575 	    I2C_SMBUS_WRITE, command,
576 	    I2C_SMBUS_I2C_BLOCK_DATA, &data);
577 }
578 
579 static int
i2c_smbus_xfer_emulated(struct i2c_adapter * adapter,u16 addr,unsigned short flags,char read_write,u8 command,int size,union i2c_smbus_data * data)580 i2c_smbus_xfer_emulated(struct i2c_adapter *adapter, u16 addr,
581     unsigned short flags,
582     char read_write, u8 command, int size,
583     union i2c_smbus_data *data)
584 {
585 	unsigned char msgbuf0[I2C_SMBUS_BLOCK_MAX + 3];
586 	unsigned char msgbuf1[I2C_SMBUS_BLOCK_MAX + 2];
587 	int num = read_write == I2C_SMBUS_READ ? 2 : 1;
588 	int i;
589 	u8 partial_pec = 0;
590 	int status;
591 	struct i2c_msg msg[2] = {
592 		{
593 			.addr = addr,
594 			.flags = flags,
595 			.len = 1,
596 			.buf = msgbuf0,
597 		}, {
598 			.addr = addr,
599 			.flags = flags | I2C_M_RD,
600 			.len = 0,
601 			.buf = msgbuf1,
602 		},
603 	};
604 
605 	msgbuf0[0] = command;
606 	switch (size) {
607 	case I2C_SMBUS_QUICK:
608 		msg[0].len = 0;
609 		msg[0].flags = flags | (read_write == I2C_SMBUS_READ ?
610 		    I2C_M_RD : 0);
611 		num = 1;
612 		break;
613 	case I2C_SMBUS_BYTE:
614 		if (read_write == I2C_SMBUS_READ) {
615 			msg[0].flags = I2C_M_RD | flags;
616 			num = 1;
617 		}
618 		break;
619 	case I2C_SMBUS_BYTE_DATA:
620 		if (read_write == I2C_SMBUS_READ)
621 			msg[1].len = 1;
622 		else {
623 			msg[0].len = 2;
624 			msgbuf0[1] = data->byte;
625 		}
626 		break;
627 	case I2C_SMBUS_WORD_DATA:
628 		if (read_write == I2C_SMBUS_READ)
629 			msg[1].len = 2;
630 		else {
631 			msg[0].len = 3;
632 			msgbuf0[1] = data->word & 0xff;
633 			msgbuf0[2] = data->word >> 8;
634 		}
635 		break;
636 	case I2C_SMBUS_PROC_CALL:
637 		num = 2;
638 		read_write = I2C_SMBUS_READ;
639 		msg[0].len = 3;
640 		msg[1].len = 2;
641 		msgbuf0[1] = data->word & 0xff;
642 		msgbuf0[2] = data->word >> 8;
643 		break;
644 	case I2C_SMBUS_BLOCK_DATA:
645 		if (read_write == I2C_SMBUS_READ) {
646 			msg[1].flags |= I2C_M_RECV_LEN;
647 			msg[1].len = 1;
648 		} else {
649 			msg[0].len = data->block[0] + 2;
650 			if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 2) {
651 				dev_err(&adapter->dev,
652 				    "Invalid block write size %d\n",
653 				    data->block[0]);
654 				return -EINVAL;
655 			}
656 			for (i = 1; i < msg[0].len; i++)
657 				msgbuf0[i] = data->block[i - 1];
658 		}
659 		break;
660 	case I2C_SMBUS_BLOCK_PROC_CALL:
661 		num = 2;
662 		read_write = I2C_SMBUS_READ;
663 		if (data->block[0] > I2C_SMBUS_BLOCK_MAX) {
664 			dev_err(&adapter->dev,
665 			    "Invalid block write size %d\n",
666 			    data->block[0]);
667 			return -EINVAL;
668 		}
669 		msg[0].len = data->block[0] + 2;
670 		for (i = 1; i < msg[0].len; i++)
671 			msgbuf0[i] = data->block[i - 1];
672 		msg[1].flags |= I2C_M_RECV_LEN;
673 		msg[1].len = 1;
674 		break;
675 	case I2C_SMBUS_I2C_BLOCK_DATA:
676 		if (read_write == I2C_SMBUS_READ) {
677 			msg[1].len = data->block[0];
678 		} else {
679 			msg[0].len = data->block[0] + 1;
680 			if (msg[0].len > I2C_SMBUS_BLOCK_MAX + 1) {
681 				dev_err(&adapter->dev,
682 				    "Invalid block write size %d\n",
683 				    data->block[0]);
684 				return -EINVAL;
685 			}
686 			for (i = 1; i <= data->block[0]; i++)
687 				msgbuf0[i] = data->block[i];
688 		}
689 		break;
690 	default:
691 		dev_err(&adapter->dev, "Unsupported transaction %d\n", size);
692 		return -EOPNOTSUPP;
693 	}
694 
695 	i = ((flags & I2C_CLIENT_PEC) && size != I2C_SMBUS_QUICK
696 	    && size != I2C_SMBUS_I2C_BLOCK_DATA);
697 	if (i) {
698 		if (!(msg[0].flags & I2C_M_RD)) {
699 			if (num == 1)
700 				i2c_smbus_add_pec(&msg[0]);
701 			else
702 				partial_pec = i2c_smbus_msg_pec(0, &msg[0]);
703 		}
704 		if (msg[num - 1].flags & I2C_M_RD)
705 			msg[num - 1].len++;
706 	}
707 	status = i2c_transfer(adapter, msg, num);
708 	if (status < 0)
709 		return status;
710 
711 	if (i && (msg[num - 1].flags & I2C_M_RD)) {
712 		status = i2c_smbus_check_pec(partial_pec, &msg[num - 1]);
713 		if (status < 0)
714 			return status;
715 	}
716 	if (read_write == I2C_SMBUS_READ)
717 		switch (size) {
718 		case I2C_SMBUS_BYTE:
719 			data->byte = msgbuf0[0];
720 			break;
721 		case I2C_SMBUS_BYTE_DATA:
722 			data->byte = msgbuf1[0];
723 			break;
724 		case I2C_SMBUS_WORD_DATA:
725 		case I2C_SMBUS_PROC_CALL:
726 			data->word = msgbuf1[0] | (msgbuf1[1] << 8);
727 			break;
728 		case I2C_SMBUS_I2C_BLOCK_DATA:
729 			for (i = 0; i < data->block[0]; i++)
730 				data->block[i + 1] = msgbuf1[i];
731 			break;
732 		case I2C_SMBUS_BLOCK_DATA:
733 		case I2C_SMBUS_BLOCK_PROC_CALL:
734 			for (i = 0; i < msgbuf1[0] + 1; i++)
735 				data->block[i] = msgbuf1[i];
736 			break;
737 		}
738 	return 0;
739 }
740 
741 int
i2c_smbus_xfer(struct i2c_adapter * adapter,u16 addr,unsigned short flags,char read_write,u8 command,int protocol,union i2c_smbus_data * data)742 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags,
743     char read_write, u8 command, int protocol,
744     union i2c_smbus_data *data)
745 {
746 	unsigned long orig_jiffies;
747 	int try;
748 	s32 res;
749 
750 	flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB;
751 
752 	if (adapter->algo->smbus_xfer) {
753 		i2c_lock_bus(adapter, I2C_LOCK_SEGMENT);
754 
755 		orig_jiffies = jiffies;
756 		for (res = 0, try = 0; try <= adapter->retries; try++) {
757 			res = adapter->algo->smbus_xfer(adapter, addr, flags,
758 			    read_write, command,
759 			    protocol, data);
760 			if (res != -EAGAIN)
761 				break;
762 			if (time_after(jiffies,
763 			    orig_jiffies + adapter->timeout))
764 				break;
765 		}
766 		i2c_unlock_bus(adapter, I2C_LOCK_SEGMENT);
767 
768 		if (res != -EOPNOTSUPP || !adapter->algo->master_xfer)
769 			goto trace;
770 		/*
771 		 * Fall back to i2c_smbus_xfer_emulated if the adapter doesn't
772 		 * implement native support for the SMBus operation.
773 		 */
774 	}
775 	res = i2c_smbus_xfer_emulated(adapter, addr, flags, read_write,
776 	    command, protocol, data);
777 trace:
778 	return res;
779 }
780 
781 struct i2c_client *
i2c_verify_client(struct device * dev)782 i2c_verify_client(struct device *dev)
783 {
784 	return ((dev->type == &i2c_client_type) ? to_i2c_client(dev) : NULL);
785 }
786 
787 int
i2c_probe_func_quick_read(struct i2c_adapter * adap,unsigned short addr)788 i2c_probe_func_quick_read(struct i2c_adapter *adap, unsigned short addr)
789 {
790 	return i2c_smbus_xfer(adap, addr, 0, I2C_SMBUS_READ, 0,
791 	    I2C_SMBUS_QUICK, NULL) >= 0;
792 }
793