1 /*
2  *	Generic i2c interface for linux
3  *
4  *	(c) 1998 Gerd Knorr <kraxel@cs.tu-berlin.de>
5  *
6  */
7 
8 #include <linux/config.h>
9 #include <linux/module.h>
10 #include <linux/kernel.h>
11 #include <linux/errno.h>
12 #include <linux/types.h>
13 #include <linux/string.h>
14 #include <linux/delay.h>
15 #include <linux/locks.h>
16 #include <linux/sched.h>
17 #include <linux/slab.h>
18 #include <linux/i2c-old.h>
19 
20 #define REGPRINT(x)   if (verbose)   (x)
21 #define I2C_DEBUG(x)  if (i2c_debug) (x)
22 
23 static int scan      = 0;
24 static int verbose   = 0;
25 static int i2c_debug = 0;
26 
27 #if LINUX_VERSION_CODE >= 0x020117
28 MODULE_PARM(scan,"i");
29 MODULE_PARM(verbose,"i");
30 MODULE_PARM(i2c_debug,"i");
31 #endif
32 
33 /* ----------------------------------------------------------------------- */
34 
35 static struct i2c_bus    *busses[I2C_BUS_MAX];
36 static struct i2c_driver *drivers[I2C_DRIVER_MAX];
37 static int bus_count = 0, driver_count = 0;
38 
i2c_init(void)39 int i2c_init(void)
40 {
41 	printk(KERN_INFO "i2c: initialized%s\n",
42 		scan ? " (i2c bus scan enabled)" : "");
43 
44 	return 0;
45 }
46 
47 /* ----------------------------------------------------------------------- */
48 
i2c_attach_device(struct i2c_bus * bus,struct i2c_driver * driver)49 static void i2c_attach_device(struct i2c_bus *bus, struct i2c_driver *driver)
50 {
51 	struct i2c_device *device;
52 	int i,j,ack=1;
53 	unsigned char addr;
54 	LOCK_FLAGS;
55 
56 	/* probe for device */
57 	LOCK_I2C_BUS(bus);
58 	for (addr = driver->addr_l; addr <= driver->addr_h; addr += 2)
59 	{
60 		i2c_start(bus);
61 		ack = i2c_sendbyte(bus,addr,0);
62 		i2c_stop(bus);
63 		if (!ack)
64 			break;
65 	}
66 	UNLOCK_I2C_BUS(bus);
67 	if (ack)
68 		return;
69 
70 	/* got answer */
71 	for (i = 0; i < I2C_DEVICE_MAX; i++)
72 		if (NULL == driver->devices[i])
73 			break;
74 	if (I2C_DEVICE_MAX == i)
75 		return;
76 
77 	for (j = 0; j < I2C_DEVICE_MAX; j++)
78 		if (NULL == bus->devices[j])
79 			break;
80 	if (I2C_DEVICE_MAX == j)
81 		return;
82 
83 	if (NULL == (device = kmalloc(sizeof(struct i2c_device),GFP_KERNEL)))
84 		return;
85 	device->bus = bus;
86 	device->driver = driver;
87 	device->addr = addr;
88 
89 	/* Attach */
90 
91 	if (driver->attach(device)!=0)
92 	{
93 		kfree(device);
94 		return;
95 	}
96 	driver->devices[i] = device;
97 	driver->devcount++;
98 	bus->devices[j] = device;
99 	bus->devcount++;
100 
101 	if (bus->attach_inform)
102 		bus->attach_inform(bus,driver->id);
103 	REGPRINT(printk("i2c: device attached: %s (addr=0x%02x, bus=%s, driver=%s)\n",device->name,addr,bus->name,driver->name));
104 }
105 
i2c_detach_device(struct i2c_device * device)106 static void i2c_detach_device(struct i2c_device *device)
107 {
108 	int i;
109 
110 	if (device->bus->detach_inform)
111 		device->bus->detach_inform(device->bus,device->driver->id);
112 	device->driver->detach(device);
113 
114 	for (i = 0; i < I2C_DEVICE_MAX; i++)
115 		if (device == device->driver->devices[i])
116 			break;
117 	if (I2C_DEVICE_MAX == i)
118 	{
119 		printk(KERN_WARNING "i2c: detach_device #1: device not found: %s\n",
120 			device->name);
121 		return;
122 	}
123 	device->driver->devices[i] = NULL;
124 	device->driver->devcount--;
125 
126 	for (i = 0; i < I2C_DEVICE_MAX; i++)
127 		if (device == device->bus->devices[i])
128 			break;
129 	if (I2C_DEVICE_MAX == i)
130 	{
131 		printk(KERN_WARNING "i2c: detach_device #2: device not found: %s\n",
132 		       device->name);
133 		return;
134 	}
135 	device->bus->devices[i] = NULL;
136 	device->bus->devcount--;
137 
138 	REGPRINT(printk("i2c: device detached: %s (addr=0x%02x, bus=%s, driver=%s)\n",device->name,device->addr,device->bus->name,device->driver->name));
139 	kfree(device);
140 }
141 
142 /* ----------------------------------------------------------------------- */
143 
i2c_register_bus(struct i2c_bus * bus)144 int i2c_register_bus(struct i2c_bus *bus)
145 {
146 	int i,ack;
147 	LOCK_FLAGS;
148 
149 	memset(bus->devices,0,sizeof(bus->devices));
150 	bus->devcount = 0;
151 
152 	for (i = 0; i < I2C_BUS_MAX; i++)
153 		if (NULL == busses[i])
154 			break;
155 	if (I2C_BUS_MAX == i)
156 		return -ENOMEM;
157 
158 	busses[i] = bus;
159 	bus_count++;
160 	REGPRINT(printk("i2c: bus registered: %s\n",bus->name));
161 
162 	MOD_INC_USE_COUNT;
163 
164 	if (scan)
165 	{
166 		/* scan whole i2c bus */
167 		LOCK_I2C_BUS(bus);
168 		for (i = 0; i < 256; i+=2)
169 		{
170 			i2c_start(bus);
171 			ack = i2c_sendbyte(bus,i,0);
172 			i2c_stop(bus);
173 			if (!ack)
174 			{
175 				printk(KERN_INFO "i2c: scanning bus %s: found device at addr=0x%02x\n",
176 					bus->name,i);
177 			}
178 		}
179 		UNLOCK_I2C_BUS(bus);
180 	}
181 
182 	/* probe available drivers */
183 	for (i = 0; i < I2C_DRIVER_MAX; i++)
184 		if (drivers[i])
185 			i2c_attach_device(bus,drivers[i]);
186 	return 0;
187 }
188 
i2c_unregister_bus(struct i2c_bus * bus)189 int i2c_unregister_bus(struct i2c_bus *bus)
190 {
191 	int i;
192 
193 	/* detach devices */
194 	for (i = 0; i < I2C_DEVICE_MAX; i++)
195 		if (bus->devices[i])
196 			i2c_detach_device(bus->devices[i]);
197 
198 	for (i = 0; i < I2C_BUS_MAX; i++)
199 		if (bus == busses[i])
200 			break;
201 	if (I2C_BUS_MAX == i)
202 	{
203 		printk(KERN_WARNING "i2c: unregister_bus #1: bus not found: %s\n",
204 			bus->name);
205 		return -ENODEV;
206 	}
207 
208 	MOD_DEC_USE_COUNT;
209 
210 	busses[i] = NULL;
211 	bus_count--;
212 	REGPRINT(printk("i2c: bus unregistered: %s\n",bus->name));
213 
214 	return 0;
215 }
216 
217 /* ----------------------------------------------------------------------- */
218 
i2c_register_driver(struct i2c_driver * driver)219 int i2c_register_driver(struct i2c_driver *driver)
220 {
221 	int i;
222 
223 	memset(driver->devices,0,sizeof(driver->devices));
224 	driver->devcount = 0;
225 
226 	for (i = 0; i < I2C_DRIVER_MAX; i++)
227 		if (NULL == drivers[i])
228 			break;
229 	if (I2C_DRIVER_MAX == i)
230 		return -ENOMEM;
231 
232 	drivers[i] = driver;
233 	driver_count++;
234 
235 	MOD_INC_USE_COUNT;
236 
237 	REGPRINT(printk("i2c: driver registered: %s\n",driver->name));
238 
239 	/* Probe available busses */
240 	for (i = 0; i < I2C_BUS_MAX; i++)
241 		if (busses[i])
242 			i2c_attach_device(busses[i],driver);
243 
244 	return 0;
245 }
246 
i2c_unregister_driver(struct i2c_driver * driver)247 int i2c_unregister_driver(struct i2c_driver *driver)
248 {
249 	int i;
250 
251 	/* detach devices */
252 	for (i = 0; i < I2C_DEVICE_MAX; i++)
253 		if (driver->devices[i])
254 			i2c_detach_device(driver->devices[i]);
255 
256 	for (i = 0; i < I2C_DRIVER_MAX; i++)
257 		if (driver == drivers[i])
258 			break;
259 	if (I2C_DRIVER_MAX == i)
260 	{
261 		printk(KERN_WARNING "i2c: unregister_driver: driver not found: %s\n",
262 			driver->name);
263 		return -ENODEV;
264 	}
265 
266 	MOD_DEC_USE_COUNT;
267 
268 	drivers[i] = NULL;
269 	driver_count--;
270 	REGPRINT(printk("i2c: driver unregistered: %s\n",driver->name));
271 
272 	return 0;
273 }
274 
275 /* ----------------------------------------------------------------------- */
276 
i2c_control_device(struct i2c_bus * bus,int id,unsigned int cmd,void * arg)277 int i2c_control_device(struct i2c_bus *bus, int id,
278 		       unsigned int cmd, void *arg)
279 {
280 	int i;
281 
282 	for (i = 0; i < I2C_DEVICE_MAX; i++)
283 		if (bus->devices[i] && bus->devices[i]->driver->id == id)
284 			break;
285 	if (i == I2C_DEVICE_MAX)
286 		return -ENODEV;
287 	if (NULL == bus->devices[i]->driver->command)
288 		return -ENODEV;
289 	return bus->devices[i]->driver->command(bus->devices[i],cmd,arg);
290 }
291 
292 /* ----------------------------------------------------------------------- */
293 
294 #define I2C_SET(bus,ctrl,data)  (bus->i2c_setlines(bus,ctrl,data))
295 #define I2C_GET(bus)            (bus->i2c_getdataline(bus))
296 
i2c_start(struct i2c_bus * bus)297 void i2c_start(struct i2c_bus *bus)
298 {
299 	I2C_SET(bus,0,1);
300 	I2C_SET(bus,1,1);
301 	I2C_SET(bus,1,0);
302 	I2C_SET(bus,0,0);
303 	I2C_DEBUG(printk("%s: < ",bus->name));
304 }
305 
i2c_stop(struct i2c_bus * bus)306 void i2c_stop(struct i2c_bus *bus)
307 {
308 	I2C_SET(bus,0,0);
309 	I2C_SET(bus,1,0);
310 	I2C_SET(bus,1,1);
311 	I2C_DEBUG(printk(">\n"));
312 }
313 
i2c_one(struct i2c_bus * bus)314 void i2c_one(struct i2c_bus *bus)
315 {
316 	I2C_SET(bus,0,1);
317 	I2C_SET(bus,1,1);
318 	I2C_SET(bus,0,1);
319 }
320 
i2c_zero(struct i2c_bus * bus)321 void i2c_zero(struct i2c_bus *bus)
322 {
323 	I2C_SET(bus,0,0);
324 	I2C_SET(bus,1,0);
325 	I2C_SET(bus,0,0);
326 }
327 
i2c_ack(struct i2c_bus * bus)328 int i2c_ack(struct i2c_bus *bus)
329 {
330 	int ack;
331 
332 	I2C_SET(bus,0,1);
333 	I2C_SET(bus,1,1);
334 	ack = I2C_GET(bus);
335 	I2C_SET(bus,0,1);
336 	return ack;
337 }
338 
i2c_sendbyte(struct i2c_bus * bus,unsigned char data,int wait_for_ack)339 int i2c_sendbyte(struct i2c_bus *bus,unsigned char data,int wait_for_ack)
340 {
341 	int i, ack;
342 
343 	I2C_SET(bus,0,0);
344 	for (i=7; i>=0; i--)
345 		(data&(1<<i)) ? i2c_one(bus) : i2c_zero(bus);
346 	if (wait_for_ack)
347 		udelay(wait_for_ack);
348 	ack=i2c_ack(bus);
349 	I2C_DEBUG(printk("%02x%c ",(int)data,ack?'-':'+'));
350 	return ack;
351 }
352 
i2c_readbyte(struct i2c_bus * bus,int last)353 unsigned char i2c_readbyte(struct i2c_bus *bus,int last)
354 {
355 	int i;
356 	unsigned char data=0;
357 
358 	I2C_SET(bus,0,1);
359 	for (i=7; i>=0; i--)
360 	{
361 		I2C_SET(bus,1,1);
362 		if (I2C_GET(bus))
363 			data |= (1<<i);
364 		I2C_SET(bus,0,1);
365 	}
366 	last ? i2c_one(bus) : i2c_zero(bus);
367 	I2C_DEBUG(printk("=%02x%c ",(int)data,last?'-':'+'));
368 	return data;
369 }
370 
371 /* ----------------------------------------------------------------------- */
372 
i2c_read(struct i2c_bus * bus,unsigned char addr)373 int i2c_read(struct i2c_bus *bus, unsigned char addr)
374 {
375 	int ret;
376 
377 	if (bus->i2c_read)
378 		return bus->i2c_read(bus, addr);
379 
380 	i2c_start(bus);
381 	i2c_sendbyte(bus,addr,0);
382 	ret = i2c_readbyte(bus,1);
383 	i2c_stop(bus);
384 	return ret;
385 }
386 
i2c_write(struct i2c_bus * bus,unsigned char addr,unsigned char data1,unsigned char data2,int both)387 int i2c_write(struct i2c_bus *bus, unsigned char addr,
388 	      unsigned char data1, unsigned char data2, int both)
389 {
390 	int ack;
391 
392 	if (bus->i2c_write)
393 		return bus->i2c_write(bus, addr, data1, data2, both);
394 
395 	i2c_start(bus);
396 	i2c_sendbyte(bus,addr,0);
397 	ack = i2c_sendbyte(bus,data1,0);
398 	if (both)
399 		ack = i2c_sendbyte(bus,data2,0);
400 	i2c_stop(bus);
401 	return ack ? -1 : 0 ;
402 }
403 
404 /* ----------------------------------------------------------------------- */
405 
406 #ifdef MODULE
407 
408 #if LINUX_VERSION_CODE >= 0x020100
409 EXPORT_SYMBOL(i2c_register_bus);
410 EXPORT_SYMBOL(i2c_unregister_bus);
411 EXPORT_SYMBOL(i2c_register_driver);
412 EXPORT_SYMBOL(i2c_unregister_driver);
413 EXPORT_SYMBOL(i2c_control_device);
414 EXPORT_SYMBOL(i2c_start);
415 EXPORT_SYMBOL(i2c_stop);
416 EXPORT_SYMBOL(i2c_one);
417 EXPORT_SYMBOL(i2c_zero);
418 EXPORT_SYMBOL(i2c_ack);
419 EXPORT_SYMBOL(i2c_sendbyte);
420 EXPORT_SYMBOL(i2c_readbyte);
421 EXPORT_SYMBOL(i2c_read);
422 EXPORT_SYMBOL(i2c_write);
423 #endif
424 
init_module(void)425 int init_module(void)
426 {
427 	return i2c_init();
428 }
429 
cleanup_module(void)430 void cleanup_module(void)
431 {
432 }
433 #endif
434 MODULE_LICENSE("GPL");
435