1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28#ifndef I2C_H
29#define I2C_H
30
31#define I2C_DATE "20010830"
32#define I2C_VERSION "2.6.1"
33
34#include <linux/i2c-id.h>
35#include <linux/types.h>
36
37
38struct i2c_msg;
39
40
41#ifdef __KERNEL__
42
43
44
45#include <asm/semaphore.h>
46#include <linux/config.h>
47
48
49
50#define I2C_ADAP_MAX 16
51#define I2C_DRIVER_MAX 16
52#define I2C_CLIENT_MAX 32
53
54struct i2c_algorithm;
55struct i2c_adapter;
56struct i2c_client;
57struct i2c_driver;
58struct i2c_client_address_data;
59union i2c_smbus_data;
60
61
62
63
64
65
66
67
68extern int i2c_master_send(struct i2c_client *,const char* ,int);
69extern int i2c_master_recv(struct i2c_client *,char* ,int);
70
71
72
73extern int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],int num);
74
75
76
77
78
79extern int i2c_slave_send(struct i2c_client *,char*,int);
80extern int i2c_slave_recv(struct i2c_client *,char*,int);
81
82
83
84
85
86
87
88
89extern s32 i2c_smbus_xfer (struct i2c_adapter * adapter, u16 addr,
90 unsigned short flags,
91 char read_write, u8 command, int size,
92 union i2c_smbus_data * data);
93
94
95
96
97extern s32 i2c_smbus_write_quick(struct i2c_client * client, u8 value);
98extern s32 i2c_smbus_read_byte(struct i2c_client * client);
99extern s32 i2c_smbus_write_byte(struct i2c_client * client, u8 value);
100extern s32 i2c_smbus_read_byte_data(struct i2c_client * client, u8 command);
101extern s32 i2c_smbus_write_byte_data(struct i2c_client * client,
102 u8 command, u8 value);
103extern s32 i2c_smbus_read_word_data(struct i2c_client * client, u8 command);
104extern s32 i2c_smbus_write_word_data(struct i2c_client * client,
105 u8 command, u16 value);
106extern s32 i2c_smbus_process_call(struct i2c_client * client,
107 u8 command, u16 value);
108
109extern s32 i2c_smbus_read_block_data(struct i2c_client * client,
110 u8 command, u8 *values);
111extern s32 i2c_smbus_write_block_data(struct i2c_client * client,
112 u8 command, u8 length,
113 u8 *values);
114extern s32 i2c_smbus_write_i2c_block_data(struct i2c_client * client,
115 u8 command, u8 length,
116 u8 *values);
117
118
119
120
121
122
123
124
125struct i2c_driver {
126 char name[32];
127 int id;
128 unsigned int flags;
129
130
131
132
133
134
135
136 int (*attach_adapter)(struct i2c_adapter *);
137
138
139
140
141
142
143 int (*detach_client)(struct i2c_client *);
144
145
146
147
148 int (*command)(struct i2c_client *client,unsigned int cmd, void *arg);
149
150
151
152
153
154
155
156
157
158
159 void (*inc_use)(struct i2c_client *client);
160 void (*dec_use)(struct i2c_client *client);
161};
162
163
164
165
166
167
168struct i2c_client {
169 char name[32];
170 int id;
171 unsigned int flags;
172 unsigned int addr;
173
174
175
176
177
178 struct i2c_adapter *adapter;
179 struct i2c_driver *driver;
180 void *data;
181 int usage_count;
182
183};
184
185
186
187
188
189
190
191
192struct i2c_algorithm {
193 char name[32];
194 unsigned int id;
195
196
197
198
199
200 int (*master_xfer)(struct i2c_adapter *adap,struct i2c_msg msgs[],
201 int num);
202 int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,
203 unsigned short flags, char read_write,
204 u8 command, int size, union i2c_smbus_data * data);
205
206
207 int (*slave_send)(struct i2c_adapter *,char*,int);
208 int (*slave_recv)(struct i2c_adapter *,char*,int);
209
210
211 int (*algo_control)(struct i2c_adapter *, unsigned int, unsigned long);
212
213
214 u32 (*functionality) (struct i2c_adapter *);
215};
216
217
218
219
220
221struct i2c_adapter {
222 char name[32];
223 unsigned int id;
224
225 struct i2c_algorithm *algo;
226 void *algo_data;
227
228
229 void (*inc_use)(struct i2c_adapter *);
230 void (*dec_use)(struct i2c_adapter *);
231
232
233 int (*client_register)(struct i2c_client *);
234 int (*client_unregister)(struct i2c_client *);
235
236 void *data;
237
238
239
240
241
242 struct semaphore lock;
243 unsigned int flags;
244
245 struct i2c_client *clients[I2C_CLIENT_MAX];
246 int client_count;
247
248 int timeout;
249 int retries;
250
251#ifdef CONFIG_PROC_FS
252
253 int inode;
254#endif
255};
256
257
258#define I2C_DF_NOTIFY 0x01
259#define I2C_DF_DUMMY 0x02
260
261
262#define I2C_CLIENT_ALLOW_USE 0x01
263#define I2C_CLIENT_ALLOW_MULTIPLE_USE 0x02
264
265
266
267
268
269
270struct i2c_client_address_data {
271 unsigned short *normal_i2c;
272 unsigned short *normal_i2c_range;
273 unsigned short *probe;
274 unsigned short *probe_range;
275 unsigned short *ignore;
276 unsigned short *ignore_range;
277 unsigned short *force;
278};
279
280
281#define I2C_CLIENT_END 0xfffe
282
283
284#define ANY_I2C_BUS 0xffff
285
286
287#define I2C_CLIENT_MAX_OPTS 48
288
289
290
291
292
293
294extern int i2c_add_adapter(struct i2c_adapter *);
295extern int i2c_del_adapter(struct i2c_adapter *);
296
297extern int i2c_add_driver(struct i2c_driver *);
298extern int i2c_del_driver(struct i2c_driver *);
299
300extern int i2c_attach_client(struct i2c_client *);
301extern int i2c_detach_client(struct i2c_client *);
302
303
304
305
306extern void i2c_inc_use_client(struct i2c_client *);
307extern void i2c_dec_use_client(struct i2c_client *);
308
309
310
311
312
313extern struct i2c_client *i2c_get_client(int driver_id, int adapter_id,
314 struct i2c_client *prev);
315
316
317
318
319
320
321
322
323extern int i2c_use_client(struct i2c_client *);
324extern int i2c_release_client(struct i2c_client *);
325
326
327
328
329extern int i2c_check_addr (struct i2c_adapter *adapter, int addr);
330
331
332
333
334
335typedef int i2c_client_found_addr_proc (struct i2c_adapter *adapter,
336 int addr, unsigned short flags,int kind);
337
338extern int i2c_probe(struct i2c_adapter *adapter,
339 struct i2c_client_address_data *address_data,
340 i2c_client_found_addr_proc *found_proc);
341
342
343
344extern int i2c_control(struct i2c_client *,unsigned int, unsigned long);
345
346
347
348
349extern int i2c_adapter_id(struct i2c_adapter *adap);
350
351
352
353
354extern u32 i2c_get_functionality (struct i2c_adapter *adap);
355
356
357extern int i2c_check_functionality (struct i2c_adapter *adap, u32 func);
358
359#endif
360
361
362
363
364struct i2c_msg {
365 __u16 addr;
366 __u16 flags;
367#define I2C_M_TEN 0x10
368#define I2C_M_RD 0x01
369#define I2C_M_NOSTART 0x4000
370#define I2C_M_REV_DIR_ADDR 0x2000
371 __u16 len;
372 __u8 *buf;
373};
374
375
376
377#define I2C_FUNC_I2C 0x00000001
378#define I2C_FUNC_10BIT_ADDR 0x00000002
379#define I2C_FUNC_PROTOCOL_MANGLING 0x00000004
380#define I2C_FUNC_SMBUS_QUICK 0x00010000
381#define I2C_FUNC_SMBUS_READ_BYTE 0x00020000
382#define I2C_FUNC_SMBUS_WRITE_BYTE 0x00040000
383#define I2C_FUNC_SMBUS_READ_BYTE_DATA 0x00080000
384#define I2C_FUNC_SMBUS_WRITE_BYTE_DATA 0x00100000
385#define I2C_FUNC_SMBUS_READ_WORD_DATA 0x00200000
386#define I2C_FUNC_SMBUS_WRITE_WORD_DATA 0x00400000
387#define I2C_FUNC_SMBUS_PROC_CALL 0x00800000
388#define I2C_FUNC_SMBUS_READ_BLOCK_DATA 0x01000000
389#define I2C_FUNC_SMBUS_WRITE_BLOCK_DATA 0x02000000
390#define I2C_FUNC_SMBUS_READ_I2C_BLOCK 0x04000000
391#define I2C_FUNC_SMBUS_WRITE_I2C_BLOCK 0x08000000
392
393#define I2C_FUNC_SMBUS_BYTE (I2C_FUNC_SMBUS_READ_BYTE | \
394 I2C_FUNC_SMBUS_WRITE_BYTE)
395#define I2C_FUNC_SMBUS_BYTE_DATA (I2C_FUNC_SMBUS_READ_BYTE_DATA | \
396 I2C_FUNC_SMBUS_WRITE_BYTE_DATA)
397#define I2C_FUNC_SMBUS_WORD_DATA (I2C_FUNC_SMBUS_READ_WORD_DATA | \
398 I2C_FUNC_SMBUS_WRITE_WORD_DATA)
399#define I2C_FUNC_SMBUS_BLOCK_DATA (I2C_FUNC_SMBUS_READ_BLOCK_DATA | \
400 I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)
401#define I2C_FUNC_SMBUS_I2C_BLOCK (I2C_FUNC_SMBUS_READ_I2C_BLOCK | \
402 I2C_FUNC_SMBUS_WRITE_I2C_BLOCK)
403
404#define I2C_FUNC_SMBUS_EMUL (I2C_FUNC_SMBUS_QUICK | \
405 I2C_FUNC_SMBUS_BYTE | \
406 I2C_FUNC_SMBUS_BYTE_DATA | \
407 I2C_FUNC_SMBUS_WORD_DATA | \
408 I2C_FUNC_SMBUS_PROC_CALL | \
409 I2C_FUNC_SMBUS_WRITE_BLOCK_DATA)
410
411
412
413
414#define I2C_SMBUS_BLOCK_MAX 32
415#define I2C_SMBUS_I2C_BLOCK_MAX 32
416union i2c_smbus_data {
417 __u8 byte;
418 __u16 word;
419 __u8 block[I2C_SMBUS_BLOCK_MAX + 2];
420
421};
422
423
424#define I2C_SMBUS_READ 1
425#define I2C_SMBUS_WRITE 0
426
427
428
429#define I2C_SMBUS_QUICK 0
430#define I2C_SMBUS_BYTE 1
431#define I2C_SMBUS_BYTE_DATA 2
432#define I2C_SMBUS_WORD_DATA 3
433#define I2C_SMBUS_PROC_CALL 4
434#define I2C_SMBUS_BLOCK_DATA 5
435#define I2C_SMBUS_I2C_BLOCK_DATA 6
436
437
438
439
440
441
442
443
444#define I2C_RETRIES 0x0701
445
446
447#define I2C_TIMEOUT 0x0702
448
449
450
451#define I2C_SLAVE 0x0703
452
453#define I2C_SLAVE_FORCE 0x0706
454
455
456
457#define I2C_TENBIT 0x0704
458
459#define I2C_FUNCS 0x0705
460#define I2C_RDWR 0x0707
461#if 0
462#define I2C_ACK_TEST 0x0710
463#endif
464
465#define I2C_SMBUS 0x0720
466
467
468#define I2C_UDELAY 0x0705
469
470#define I2C_MDELAY 0x0706
471
472
473
474#define I2C_MAJOR 89
475
476#ifdef __KERNEL__
477
478# ifndef NULL
479# define NULL ( (void *) 0 )
480# endif
481
482# ifndef ENODEV
483# include <asm/errno.h>
484# endif
485
486
487
488#define I2C_CLIENT_DEFAULTS {I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
489 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
490 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
491 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
492 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
493 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
494 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
495 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
496 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
497 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
498 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
499 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
500 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
501 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
502 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END, \
503 I2C_CLIENT_END, I2C_CLIENT_END, I2C_CLIENT_END}
504
505
506
507#define I2C_CLIENT_MODPARM_AUX1(x) "1-" #x "h"
508#define I2C_CLIENT_MODPARM_AUX(x) I2C_CLIENT_MODPARM_AUX1(x)
509#define I2C_CLIENT_MODPARM I2C_CLIENT_MODPARM_AUX(I2C_CLIENT_MAX_OPTS)
510
511
512
513
514#define I2C_CLIENT_MODULE_PARM(var,desc) \
515 static unsigned short var[I2C_CLIENT_MAX_OPTS] = I2C_CLIENT_DEFAULTS; \
516 MODULE_PARM(var,I2C_CLIENT_MODPARM); \
517 MODULE_PARM_DESC(var,desc)
518
519
520#define I2C_CLIENT_INSMOD \
521 I2C_CLIENT_MODULE_PARM(probe, \
522 "List of adapter,address pairs to scan additionally"); \
523 I2C_CLIENT_MODULE_PARM(probe_range, \
524 "List of adapter,start-addr,end-addr triples to scan " \
525 "additionally"); \
526 I2C_CLIENT_MODULE_PARM(ignore, \
527 "List of adapter,address pairs not to scan"); \
528 I2C_CLIENT_MODULE_PARM(ignore_range, \
529 "List of adapter,start-addr,end-addr triples not to " \
530 "scan"); \
531 I2C_CLIENT_MODULE_PARM(force, \
532 "List of adapter,address pairs to boldly assume " \
533 "to be present"); \
534 static struct i2c_client_address_data addr_data = \
535 {normal_i2c, normal_i2c_range, \
536 probe, probe_range, \
537 ignore, ignore_range, \
538 force}
539
540
541
542#define i2c_is_isa_client(clientptr) \
543 ((clientptr)->adapter->algo->id == I2C_ALGO_ISA)
544#define i2c_is_isa_adapter(adapptr) \
545 ((adapptr)->algo->id == I2C_ALGO_ISA)
546
547#endif
548#endif
549