xref: /openbmc/linux/drivers/i2c/i2c-dev.c (revision fd589a8f)
1 /*
2     i2c-dev.c - i2c-bus driver, char device interface
3 
4     Copyright (C) 1995-97 Simon G. Vogl
5     Copyright (C) 1998-99 Frodo Looijaard <frodol@dds.nl>
6     Copyright (C) 2003 Greg Kroah-Hartman <greg@kroah.com>
7 
8     This program is free software; you can redistribute it and/or modify
9     it under the terms of the GNU General Public License as published by
10     the Free Software Foundation; either version 2 of the License, or
11     (at your option) any later version.
12 
13     This program is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16     GNU General Public License for more details.
17 
18     You should have received a copy of the GNU General Public License
19     along with this program; if not, write to the Free Software
20     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22 
23 /* Note that this is a complete rewrite of Simon Vogl's i2c-dev module.
24    But I have used so much of his original code and ideas that it seems
25    only fair to recognize him as co-author -- Frodo */
26 
27 /* The I2C_RDWR ioctl code is written by Kolja Waschk <waschk@telos.de> */
28 
29 #include <linux/kernel.h>
30 #include <linux/module.h>
31 #include <linux/fs.h>
32 #include <linux/slab.h>
33 #include <linux/init.h>
34 #include <linux/list.h>
35 #include <linux/i2c.h>
36 #include <linux/i2c-dev.h>
37 #include <linux/smp_lock.h>
38 #include <linux/jiffies.h>
39 #include <asm/uaccess.h>
40 
41 static struct i2c_driver i2cdev_driver;
42 
43 /*
44  * An i2c_dev represents an i2c_adapter ... an I2C or SMBus master, not a
45  * slave (i2c_client) with which messages will be exchanged.  It's coupled
46  * with a character special file which is accessed by user mode drivers.
47  *
48  * The list of i2c_dev structures is parallel to the i2c_adapter lists
49  * maintained by the driver model, and is updated using notifications
50  * delivered to the i2cdev_driver.
51  */
52 struct i2c_dev {
53 	struct list_head list;
54 	struct i2c_adapter *adap;
55 	struct device *dev;
56 };
57 
58 #define I2C_MINORS	256
59 static LIST_HEAD(i2c_dev_list);
60 static DEFINE_SPINLOCK(i2c_dev_list_lock);
61 
62 static struct i2c_dev *i2c_dev_get_by_minor(unsigned index)
63 {
64 	struct i2c_dev *i2c_dev;
65 
66 	spin_lock(&i2c_dev_list_lock);
67 	list_for_each_entry(i2c_dev, &i2c_dev_list, list) {
68 		if (i2c_dev->adap->nr == index)
69 			goto found;
70 	}
71 	i2c_dev = NULL;
72 found:
73 	spin_unlock(&i2c_dev_list_lock);
74 	return i2c_dev;
75 }
76 
77 static struct i2c_dev *get_free_i2c_dev(struct i2c_adapter *adap)
78 {
79 	struct i2c_dev *i2c_dev;
80 
81 	if (adap->nr >= I2C_MINORS) {
82 		printk(KERN_ERR "i2c-dev: Out of device minors (%d)\n",
83 		       adap->nr);
84 		return ERR_PTR(-ENODEV);
85 	}
86 
87 	i2c_dev = kzalloc(sizeof(*i2c_dev), GFP_KERNEL);
88 	if (!i2c_dev)
89 		return ERR_PTR(-ENOMEM);
90 	i2c_dev->adap = adap;
91 
92 	spin_lock(&i2c_dev_list_lock);
93 	list_add_tail(&i2c_dev->list, &i2c_dev_list);
94 	spin_unlock(&i2c_dev_list_lock);
95 	return i2c_dev;
96 }
97 
98 static void return_i2c_dev(struct i2c_dev *i2c_dev)
99 {
100 	spin_lock(&i2c_dev_list_lock);
101 	list_del(&i2c_dev->list);
102 	spin_unlock(&i2c_dev_list_lock);
103 	kfree(i2c_dev);
104 }
105 
106 static ssize_t show_adapter_name(struct device *dev,
107 				 struct device_attribute *attr, char *buf)
108 {
109 	struct i2c_dev *i2c_dev = i2c_dev_get_by_minor(MINOR(dev->devt));
110 
111 	if (!i2c_dev)
112 		return -ENODEV;
113 	return sprintf(buf, "%s\n", i2c_dev->adap->name);
114 }
115 static DEVICE_ATTR(name, S_IRUGO, show_adapter_name, NULL);
116 
117 /* ------------------------------------------------------------------------- */
118 
119 /*
120  * After opening an instance of this character special file, a file
121  * descriptor starts out associated only with an i2c_adapter (and bus).
122  *
123  * Using the I2C_RDWR ioctl(), you can then *immediately* issue i2c_msg
124  * traffic to any devices on the bus used by that adapter.  That's because
125  * the i2c_msg vectors embed all the addressing information they need, and
126  * are submitted directly to an i2c_adapter.  However, SMBus-only adapters
127  * don't support that interface.
128  *
129  * To use read()/write() system calls on that file descriptor, or to use
130  * SMBus interfaces (and work with SMBus-only hosts!), you must first issue
131  * an I2C_SLAVE (or I2C_SLAVE_FORCE) ioctl.  That configures an anonymous
132  * (never registered) i2c_client so it holds the addressing information
133  * needed by those system calls and by this SMBus interface.
134  */
135 
136 static ssize_t i2cdev_read (struct file *file, char __user *buf, size_t count,
137                             loff_t *offset)
138 {
139 	char *tmp;
140 	int ret;
141 
142 	struct i2c_client *client = (struct i2c_client *)file->private_data;
143 
144 	if (count > 8192)
145 		count = 8192;
146 
147 	tmp = kmalloc(count,GFP_KERNEL);
148 	if (tmp==NULL)
149 		return -ENOMEM;
150 
151 	pr_debug("i2c-dev: i2c-%d reading %zu bytes.\n",
152 		iminor(file->f_path.dentry->d_inode), count);
153 
154 	ret = i2c_master_recv(client,tmp,count);
155 	if (ret >= 0)
156 		ret = copy_to_user(buf,tmp,count)?-EFAULT:ret;
157 	kfree(tmp);
158 	return ret;
159 }
160 
161 static ssize_t i2cdev_write (struct file *file, const char __user *buf, size_t count,
162                              loff_t *offset)
163 {
164 	int ret;
165 	char *tmp;
166 	struct i2c_client *client = (struct i2c_client *)file->private_data;
167 
168 	if (count > 8192)
169 		count = 8192;
170 
171 	tmp = kmalloc(count,GFP_KERNEL);
172 	if (tmp==NULL)
173 		return -ENOMEM;
174 	if (copy_from_user(tmp,buf,count)) {
175 		kfree(tmp);
176 		return -EFAULT;
177 	}
178 
179 	pr_debug("i2c-dev: i2c-%d writing %zu bytes.\n",
180 		iminor(file->f_path.dentry->d_inode), count);
181 
182 	ret = i2c_master_send(client,tmp,count);
183 	kfree(tmp);
184 	return ret;
185 }
186 
187 static int i2cdev_check(struct device *dev, void *addrp)
188 {
189 	struct i2c_client *client = i2c_verify_client(dev);
190 
191 	if (!client || client->addr != *(unsigned int *)addrp)
192 		return 0;
193 
194 	return dev->driver ? -EBUSY : 0;
195 }
196 
197 /* This address checking function differs from the one in i2c-core
198    in that it considers an address with a registered device, but no
199    driver bound to it, as NOT busy. */
200 static int i2cdev_check_addr(struct i2c_adapter *adapter, unsigned int addr)
201 {
202 	return device_for_each_child(&adapter->dev, &addr, i2cdev_check);
203 }
204 
205 static noinline int i2cdev_ioctl_rdrw(struct i2c_client *client,
206 		unsigned long arg)
207 {
208 	struct i2c_rdwr_ioctl_data rdwr_arg;
209 	struct i2c_msg *rdwr_pa;
210 	u8 __user **data_ptrs;
211 	int i, res;
212 
213 	if (copy_from_user(&rdwr_arg,
214 			   (struct i2c_rdwr_ioctl_data __user *)arg,
215 			   sizeof(rdwr_arg)))
216 		return -EFAULT;
217 
218 	/* Put an arbitrary limit on the number of messages that can
219 	 * be sent at once */
220 	if (rdwr_arg.nmsgs > I2C_RDRW_IOCTL_MAX_MSGS)
221 		return -EINVAL;
222 
223 	rdwr_pa = (struct i2c_msg *)
224 		kmalloc(rdwr_arg.nmsgs * sizeof(struct i2c_msg),
225 		GFP_KERNEL);
226 	if (!rdwr_pa)
227 		return -ENOMEM;
228 
229 	if (copy_from_user(rdwr_pa, rdwr_arg.msgs,
230 			   rdwr_arg.nmsgs * sizeof(struct i2c_msg))) {
231 		kfree(rdwr_pa);
232 		return -EFAULT;
233 	}
234 
235 	data_ptrs = kmalloc(rdwr_arg.nmsgs * sizeof(u8 __user *), GFP_KERNEL);
236 	if (data_ptrs == NULL) {
237 		kfree(rdwr_pa);
238 		return -ENOMEM;
239 	}
240 
241 	res = 0;
242 	for (i = 0; i < rdwr_arg.nmsgs; i++) {
243 		/* Limit the size of the message to a sane amount;
244 		 * and don't let length change either. */
245 		if ((rdwr_pa[i].len > 8192) ||
246 		    (rdwr_pa[i].flags & I2C_M_RECV_LEN)) {
247 			res = -EINVAL;
248 			break;
249 		}
250 		data_ptrs[i] = (u8 __user *)rdwr_pa[i].buf;
251 		rdwr_pa[i].buf = kmalloc(rdwr_pa[i].len, GFP_KERNEL);
252 		if (rdwr_pa[i].buf == NULL) {
253 			res = -ENOMEM;
254 			break;
255 		}
256 		if (copy_from_user(rdwr_pa[i].buf, data_ptrs[i],
257 				   rdwr_pa[i].len)) {
258 				++i; /* Needs to be kfreed too */
259 				res = -EFAULT;
260 			break;
261 		}
262 	}
263 	if (res < 0) {
264 		int j;
265 		for (j = 0; j < i; ++j)
266 			kfree(rdwr_pa[j].buf);
267 		kfree(data_ptrs);
268 		kfree(rdwr_pa);
269 		return res;
270 	}
271 
272 	res = i2c_transfer(client->adapter, rdwr_pa, rdwr_arg.nmsgs);
273 	while (i-- > 0) {
274 		if (res >= 0 && (rdwr_pa[i].flags & I2C_M_RD)) {
275 			if (copy_to_user(data_ptrs[i], rdwr_pa[i].buf,
276 					 rdwr_pa[i].len))
277 				res = -EFAULT;
278 		}
279 		kfree(rdwr_pa[i].buf);
280 	}
281 	kfree(data_ptrs);
282 	kfree(rdwr_pa);
283 	return res;
284 }
285 
286 static noinline int i2cdev_ioctl_smbus(struct i2c_client *client,
287 		unsigned long arg)
288 {
289 	struct i2c_smbus_ioctl_data data_arg;
290 	union i2c_smbus_data temp;
291 	int datasize, res;
292 
293 	if (copy_from_user(&data_arg,
294 			   (struct i2c_smbus_ioctl_data __user *) arg,
295 			   sizeof(struct i2c_smbus_ioctl_data)))
296 		return -EFAULT;
297 	if ((data_arg.size != I2C_SMBUS_BYTE) &&
298 	    (data_arg.size != I2C_SMBUS_QUICK) &&
299 	    (data_arg.size != I2C_SMBUS_BYTE_DATA) &&
300 	    (data_arg.size != I2C_SMBUS_WORD_DATA) &&
301 	    (data_arg.size != I2C_SMBUS_PROC_CALL) &&
302 	    (data_arg.size != I2C_SMBUS_BLOCK_DATA) &&
303 	    (data_arg.size != I2C_SMBUS_I2C_BLOCK_BROKEN) &&
304 	    (data_arg.size != I2C_SMBUS_I2C_BLOCK_DATA) &&
305 	    (data_arg.size != I2C_SMBUS_BLOCK_PROC_CALL)) {
306 		dev_dbg(&client->adapter->dev,
307 			"size out of range (%x) in ioctl I2C_SMBUS.\n",
308 			data_arg.size);
309 		return -EINVAL;
310 	}
311 	/* Note that I2C_SMBUS_READ and I2C_SMBUS_WRITE are 0 and 1,
312 	   so the check is valid if size==I2C_SMBUS_QUICK too. */
313 	if ((data_arg.read_write != I2C_SMBUS_READ) &&
314 	    (data_arg.read_write != I2C_SMBUS_WRITE)) {
315 		dev_dbg(&client->adapter->dev,
316 			"read_write out of range (%x) in ioctl I2C_SMBUS.\n",
317 			data_arg.read_write);
318 		return -EINVAL;
319 	}
320 
321 	/* Note that command values are always valid! */
322 
323 	if ((data_arg.size == I2C_SMBUS_QUICK) ||
324 	    ((data_arg.size == I2C_SMBUS_BYTE) &&
325 	    (data_arg.read_write == I2C_SMBUS_WRITE)))
326 		/* These are special: we do not use data */
327 		return i2c_smbus_xfer(client->adapter, client->addr,
328 				      client->flags, data_arg.read_write,
329 				      data_arg.command, data_arg.size, NULL);
330 
331 	if (data_arg.data == NULL) {
332 		dev_dbg(&client->adapter->dev,
333 			"data is NULL pointer in ioctl I2C_SMBUS.\n");
334 		return -EINVAL;
335 	}
336 
337 	if ((data_arg.size == I2C_SMBUS_BYTE_DATA) ||
338 	    (data_arg.size == I2C_SMBUS_BYTE))
339 		datasize = sizeof(data_arg.data->byte);
340 	else if ((data_arg.size == I2C_SMBUS_WORD_DATA) ||
341 		 (data_arg.size == I2C_SMBUS_PROC_CALL))
342 		datasize = sizeof(data_arg.data->word);
343 	else /* size == smbus block, i2c block, or block proc. call */
344 		datasize = sizeof(data_arg.data->block);
345 
346 	if ((data_arg.size == I2C_SMBUS_PROC_CALL) ||
347 	    (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) ||
348 	    (data_arg.size == I2C_SMBUS_I2C_BLOCK_DATA) ||
349 	    (data_arg.read_write == I2C_SMBUS_WRITE)) {
350 		if (copy_from_user(&temp, data_arg.data, datasize))
351 			return -EFAULT;
352 	}
353 	if (data_arg.size == I2C_SMBUS_I2C_BLOCK_BROKEN) {
354 		/* Convert old I2C block commands to the new
355 		   convention. This preserves binary compatibility. */
356 		data_arg.size = I2C_SMBUS_I2C_BLOCK_DATA;
357 		if (data_arg.read_write == I2C_SMBUS_READ)
358 			temp.block[0] = I2C_SMBUS_BLOCK_MAX;
359 	}
360 	res = i2c_smbus_xfer(client->adapter, client->addr, client->flags,
361 	      data_arg.read_write, data_arg.command, data_arg.size, &temp);
362 	if (!res && ((data_arg.size == I2C_SMBUS_PROC_CALL) ||
363 		     (data_arg.size == I2C_SMBUS_BLOCK_PROC_CALL) ||
364 		     (data_arg.read_write == I2C_SMBUS_READ))) {
365 		if (copy_to_user(data_arg.data, &temp, datasize))
366 			return -EFAULT;
367 	}
368 	return res;
369 }
370 
371 static long i2cdev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
372 {
373 	struct i2c_client *client = (struct i2c_client *)file->private_data;
374 	unsigned long funcs;
375 
376 	dev_dbg(&client->adapter->dev, "ioctl, cmd=0x%02x, arg=0x%02lx\n",
377 		cmd, arg);
378 
379 	switch ( cmd ) {
380 	case I2C_SLAVE:
381 	case I2C_SLAVE_FORCE:
382 		/* NOTE:  devices set up to work with "new style" drivers
383 		 * can't use I2C_SLAVE, even when the device node is not
384 		 * bound to a driver.  Only I2C_SLAVE_FORCE will work.
385 		 *
386 		 * Setting the PEC flag here won't affect kernel drivers,
387 		 * which will be using the i2c_client node registered with
388 		 * the driver model core.  Likewise, when that client has
389 		 * the PEC flag already set, the i2c-dev driver won't see
390 		 * (or use) this setting.
391 		 */
392 		if ((arg > 0x3ff) ||
393 		    (((client->flags & I2C_M_TEN) == 0) && arg > 0x7f))
394 			return -EINVAL;
395 		if (cmd == I2C_SLAVE && i2cdev_check_addr(client->adapter, arg))
396 			return -EBUSY;
397 		/* REVISIT: address could become busy later */
398 		client->addr = arg;
399 		return 0;
400 	case I2C_TENBIT:
401 		if (arg)
402 			client->flags |= I2C_M_TEN;
403 		else
404 			client->flags &= ~I2C_M_TEN;
405 		return 0;
406 	case I2C_PEC:
407 		if (arg)
408 			client->flags |= I2C_CLIENT_PEC;
409 		else
410 			client->flags &= ~I2C_CLIENT_PEC;
411 		return 0;
412 	case I2C_FUNCS:
413 		funcs = i2c_get_functionality(client->adapter);
414 		return put_user(funcs, (unsigned long __user *)arg);
415 
416 	case I2C_RDWR:
417 		return i2cdev_ioctl_rdrw(client, arg);
418 
419 	case I2C_SMBUS:
420 		return i2cdev_ioctl_smbus(client, arg);
421 
422 	case I2C_RETRIES:
423 		client->adapter->retries = arg;
424 		break;
425 	case I2C_TIMEOUT:
426 		/* For historical reasons, user-space sets the timeout
427 		 * value in units of 10 ms.
428 		 */
429 		client->adapter->timeout = msecs_to_jiffies(arg * 10);
430 		break;
431 	default:
432 		/* NOTE:  returning a fault code here could cause trouble
433 		 * in buggy userspace code.  Some old kernel bugs returned
434 		 * zero in this case, and userspace code might accidentally
435 		 * have depended on that bug.
436 		 */
437 		return -ENOTTY;
438 	}
439 	return 0;
440 }
441 
442 static int i2cdev_open(struct inode *inode, struct file *file)
443 {
444 	unsigned int minor = iminor(inode);
445 	struct i2c_client *client;
446 	struct i2c_adapter *adap;
447 	struct i2c_dev *i2c_dev;
448 	int ret = 0;
449 
450 	lock_kernel();
451 	i2c_dev = i2c_dev_get_by_minor(minor);
452 	if (!i2c_dev) {
453 		ret = -ENODEV;
454 		goto out;
455 	}
456 
457 	adap = i2c_get_adapter(i2c_dev->adap->nr);
458 	if (!adap) {
459 		ret = -ENODEV;
460 		goto out;
461 	}
462 
463 	/* This creates an anonymous i2c_client, which may later be
464 	 * pointed to some address using I2C_SLAVE or I2C_SLAVE_FORCE.
465 	 *
466 	 * This client is ** NEVER REGISTERED ** with the driver model
467 	 * or I2C core code!!  It just holds private copies of addressing
468 	 * information and maybe a PEC flag.
469 	 */
470 	client = kzalloc(sizeof(*client), GFP_KERNEL);
471 	if (!client) {
472 		i2c_put_adapter(adap);
473 		ret = -ENOMEM;
474 		goto out;
475 	}
476 	snprintf(client->name, I2C_NAME_SIZE, "i2c-dev %d", adap->nr);
477 	client->driver = &i2cdev_driver;
478 
479 	client->adapter = adap;
480 	file->private_data = client;
481 
482 out:
483 	unlock_kernel();
484 	return ret;
485 }
486 
487 static int i2cdev_release(struct inode *inode, struct file *file)
488 {
489 	struct i2c_client *client = file->private_data;
490 
491 	i2c_put_adapter(client->adapter);
492 	kfree(client);
493 	file->private_data = NULL;
494 
495 	return 0;
496 }
497 
498 static const struct file_operations i2cdev_fops = {
499 	.owner		= THIS_MODULE,
500 	.llseek		= no_llseek,
501 	.read		= i2cdev_read,
502 	.write		= i2cdev_write,
503 	.unlocked_ioctl	= i2cdev_ioctl,
504 	.open		= i2cdev_open,
505 	.release	= i2cdev_release,
506 };
507 
508 /* ------------------------------------------------------------------------- */
509 
510 /*
511  * The legacy "i2cdev_driver" is used primarily to get notifications when
512  * I2C adapters are added or removed, so that each one gets an i2c_dev
513  * and is thus made available to userspace driver code.
514  */
515 
516 static struct class *i2c_dev_class;
517 
518 static int i2cdev_attach_adapter(struct i2c_adapter *adap)
519 {
520 	struct i2c_dev *i2c_dev;
521 	int res;
522 
523 	i2c_dev = get_free_i2c_dev(adap);
524 	if (IS_ERR(i2c_dev))
525 		return PTR_ERR(i2c_dev);
526 
527 	/* register this i2c device with the driver core */
528 	i2c_dev->dev = device_create(i2c_dev_class, &adap->dev,
529 				     MKDEV(I2C_MAJOR, adap->nr), NULL,
530 				     "i2c-%d", adap->nr);
531 	if (IS_ERR(i2c_dev->dev)) {
532 		res = PTR_ERR(i2c_dev->dev);
533 		goto error;
534 	}
535 	res = device_create_file(i2c_dev->dev, &dev_attr_name);
536 	if (res)
537 		goto error_destroy;
538 
539 	pr_debug("i2c-dev: adapter [%s] registered as minor %d\n",
540 		 adap->name, adap->nr);
541 	return 0;
542 error_destroy:
543 	device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr));
544 error:
545 	return_i2c_dev(i2c_dev);
546 	return res;
547 }
548 
549 static int i2cdev_detach_adapter(struct i2c_adapter *adap)
550 {
551 	struct i2c_dev *i2c_dev;
552 
553 	i2c_dev = i2c_dev_get_by_minor(adap->nr);
554 	if (!i2c_dev) /* attach_adapter must have failed */
555 		return 0;
556 
557 	device_remove_file(i2c_dev->dev, &dev_attr_name);
558 	return_i2c_dev(i2c_dev);
559 	device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr));
560 
561 	pr_debug("i2c-dev: adapter [%s] unregistered\n", adap->name);
562 	return 0;
563 }
564 
565 static struct i2c_driver i2cdev_driver = {
566 	.driver = {
567 		.name	= "dev_driver",
568 	},
569 	.attach_adapter	= i2cdev_attach_adapter,
570 	.detach_adapter	= i2cdev_detach_adapter,
571 };
572 
573 /* ------------------------------------------------------------------------- */
574 
575 /*
576  * module load/unload record keeping
577  */
578 
579 static int __init i2c_dev_init(void)
580 {
581 	int res;
582 
583 	printk(KERN_INFO "i2c /dev entries driver\n");
584 
585 	res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);
586 	if (res)
587 		goto out;
588 
589 	i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");
590 	if (IS_ERR(i2c_dev_class)) {
591 		res = PTR_ERR(i2c_dev_class);
592 		goto out_unreg_chrdev;
593 	}
594 
595 	res = i2c_add_driver(&i2cdev_driver);
596 	if (res)
597 		goto out_unreg_class;
598 
599 	return 0;
600 
601 out_unreg_class:
602 	class_destroy(i2c_dev_class);
603 out_unreg_chrdev:
604 	unregister_chrdev(I2C_MAJOR, "i2c");
605 out:
606 	printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__);
607 	return res;
608 }
609 
610 static void __exit i2c_dev_exit(void)
611 {
612 	i2c_del_driver(&i2cdev_driver);
613 	class_destroy(i2c_dev_class);
614 	unregister_chrdev(I2C_MAJOR,"i2c");
615 }
616 
617 MODULE_AUTHOR("Frodo Looijaard <frodol@dds.nl> and "
618 		"Simon G. Vogl <simon@tk.uni-linz.ac.at>");
619 MODULE_DESCRIPTION("I2C /dev entries driver");
620 MODULE_LICENSE("GPL");
621 
622 module_init(i2c_dev_init);
623 module_exit(i2c_dev_exit);
624