Rev 1125 | Rev 3031 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
1125 | serge | 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 | You should have received a copy of the GNU General Public License |
||
16 | along with this program; if not, write to the Free Software |
||
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ |
||
18 | /* ------------------------------------------------------------------------- */ |
||
19 | |||
20 | /* With some changes from Kyösti Mälkki |
||
21 | All SMBus-related things are written by Frodo Looijaard |
||
22 | SMBus 2.0 support by Mark Studebaker |
||
23 | Jean Delvare |
||
24 | |||
25 | #include |
||
26 | #include |
||
27 | #include |
||
28 | #include |
||
29 | #include |
||
30 | |||
31 | |||
32 | /** |
||
33 | * i2c_transfer - execute a single or combined I2C message |
||
34 | * @adap: Handle to I2C bus |
||
35 | * @msgs: One or more messages to execute before STOP is issued to |
||
36 | * terminate the operation; each message begins with a START. |
||
37 | * @num: Number of messages to be executed. |
||
38 | * |
||
39 | * Returns negative errno, else the number of messages executed. |
||
40 | * |
||
41 | * Note that there is no requirement that each message be sent to |
||
42 | * the same slave address, although that is the most common model. |
||
43 | */ |
||
44 | int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) |
||
45 | { |
||
46 | unsigned long orig_jiffies; |
||
47 | int ret, try; |
||
48 | |||
49 | /* REVISIT the fault reporting model here is weak: |
||
50 | * |
||
51 | * - When we get an error after receiving N bytes from a slave, |
||
52 | * there is no way to report "N". |
||
53 | * |
||
54 | * - When we get a NAK after transmitting N bytes to a slave, |
||
55 | * there is no way to report "N" ... or to let the master |
||
56 | * continue executing the rest of this combined message, if |
||
57 | * that's the appropriate response. |
||
58 | * |
||
59 | * - When for example "num" is two and we successfully complete |
||
60 | * the first message but get an error part way through the |
||
61 | * second, it's unclear whether that should be reported as |
||
62 | * one (discarding status on the second message) or errno |
||
63 | * (discarding status on the first one). |
||
64 | */ |
||
65 | |||
66 | if (adap->algo->master_xfer) { |
||
67 | |||
68 | |||
69 | /* Retry automatically on arbitration loss */ |
||
1963 | serge | 70 | orig_jiffies = 0; |
1125 | serge | 71 | for (ret = 0, try = 0; try <= adap->retries; try++) { |
1963 | serge | 72 | |
1125 | serge | 73 | ret = adap->algo->master_xfer(adap, msgs, num); |
74 | if (ret != -EAGAIN) |
||
75 | break; |
||
76 | // if (time_after(jiffies, orig_jiffies + adap->timeout)) |
||
77 | // break; |
||
78 | delay(1); |
||
79 | } |
||
80 | // mutex_unlock(&adap->bus_lock); |
||
81 | return ret; |
||
82 | } else { |
||
83 | // dev_dbg(&adap->dev, "I2C level transfers not supported\n"); |
||
84 | return -EOPNOTSUPP; |
||
85 | } |
||
86 | } |
||
87 | EXPORT_SYMBOL(i2c_transfer); |
||
88 | |||
89 | |||
1963 | serge | 90 | /** |
91 | * i2c_new_device - instantiate an i2c device |
||
92 | * @adap: the adapter managing the device |
||
93 | * @info: describes one I2C device; bus_num is ignored |
||
94 | * Context: can sleep |
||
95 | * |
||
96 | * Create an i2c device. Binding is handled through driver model |
||
97 | * probe()/remove() methods. A driver may be bound to this device when we |
||
98 | * return from this function, or any later moment (e.g. maybe hotplugging will |
||
99 | * load the driver module). This call is not appropriate for use by mainboard |
||
100 | * initialization logic, which usually runs during an arch_initcall() long |
||
101 | * before any i2c_adapter could exist. |
||
102 | * |
||
103 | * This returns the new i2c client, which may be saved for later use with |
||
104 | * i2c_unregister_device(); or NULL to indicate an error. |
||
105 | */ |
||
106 | struct i2c_client * |
||
107 | i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info) |
||
108 | { |
||
109 | struct i2c_client *client; |
||
110 | int status; |
||
1125 | serge | 111 | |
1963 | serge | 112 | client = kzalloc(sizeof *client, GFP_KERNEL); |
113 | if (!client) |
||
114 | return NULL; |
||
1125 | serge | 115 | |
1963 | serge | 116 | client->adapter = adap; |
1125 | serge | 117 | |
1963 | serge | 118 | client->flags = info->flags; |
119 | client->addr = info->addr; |
||
120 | client->irq = info->irq; |
||
121 | |||
122 | strlcpy(client->name, info->type, sizeof(client->name)); |
||
123 | |||
124 | return client; |
||
125 | }=> |
||
126 |