patch-2.4.0-prerelease linux/drivers/i2c/i2c-dev.c
Next file: linux/drivers/i2o/Makefile
Previous file: linux/drivers/i2c/i2c-core.c
Back to the patch index
Back to the overall index
- Lines: 207
- Date:
Fri Dec 29 14:35:47 2000
- Orig file:
v2.4.0-test12/linux/drivers/i2c/i2c-dev.c
- Orig date:
Tue Aug 29 14:09:15 2000
diff -u --recursive --new-file v2.4.0-test12/linux/drivers/i2c/i2c-dev.c linux/drivers/i2c/i2c-dev.c
@@ -25,14 +25,24 @@
/* The I2C_RDWR ioctl code is written by Kolja Waschk <waschk@telos.de> */
-/* $Id: i2c-dev.c,v 1.32 2000/07/25 23:52:17 frodo Exp $ */
+/* The devfs code is contributed by Philipp Matthias Hahn
+ <pmhahn@titan.lahn.de> */
+/* $Id: i2c-dev.c,v 1.36 2000/09/22 02:19:35 mds Exp $ */
+
+#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/malloc.h>
#include <linux/version.h>
+#if LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0)
#include <linux/smp_lock.h>
+#endif /* LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0) */
+#ifdef CONFIG_DEVFS_FS
+#include <linux/devfs_fs_kernel.h>
+#endif
+
/* If you want debugging uncomment: */
/* #define DEBUG */
@@ -77,7 +87,9 @@
static int i2cdev_cleanup(void);
static struct file_operations i2cdev_fops = {
+#if LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0)
owner: THIS_MODULE,
+#endif /* LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0) */
llseek: i2cdev_lseek,
read: i2cdev_read,
write: i2cdev_write,
@@ -88,26 +100,30 @@
#define I2CDEV_ADAPS_MAX I2C_ADAP_MAX
static struct i2c_adapter *i2cdev_adaps[I2CDEV_ADAPS_MAX];
+#ifdef CONFIG_DEVFS_FS
+static devfs_handle_t devfs_i2c[I2CDEV_ADAPS_MAX];
+static devfs_handle_t devfs_handle = NULL;
+#endif
static struct i2c_driver i2cdev_driver = {
- /* name */ "i2c-dev dummy driver",
- /* id */ I2C_DRIVERID_I2CDEV,
- /* flags */ I2C_DF_DUMMY,
- /* attach_adapter */ i2cdev_attach_adapter,
- /* detach_client */ i2cdev_detach_client,
- /* command */ i2cdev_command,
- /* inc_use */ NULL,
- /* dec_use */ NULL,
+ name: "i2c-dev dummy driver",
+ id: I2C_DRIVERID_I2CDEV,
+ flags: I2C_DF_DUMMY,
+ attach_adapter: i2cdev_attach_adapter,
+ detach_client: i2cdev_detach_client,
+ command: i2cdev_command,
+/* inc_use: NULL,
+ dec_use: NULL, */
};
static struct i2c_client i2cdev_client_template = {
- /* name */ "I2C /dev entry",
- /* id */ 1,
- /* flags */ 0,
- /* addr */ -1,
- /* adapter */ NULL,
- /* driver */ &i2cdev_driver,
- /* data */ NULL
+ name: "I2C /dev entry",
+ id: 1,
+ flags: 0,
+ addr: -1,
+/* adapter: NULL, */
+ driver: &i2cdev_driver,
+/* data: NULL */
};
static int i2cdev_initialized;
@@ -118,7 +134,7 @@
{
#ifdef DEBUG
struct inode *inode = file->f_dentry->d_inode;
- printk("i2c-dev,o: i2c-%d lseek to %ld bytes relative to %d.\n",
+ printk("i2c-dev.o: i2c-%d lseek to %ld bytes relative to %d.\n",
MINOR(inode->i_rdev),(long) offset,origin);
#endif /* DEBUG */
return -ESPIPE;
@@ -142,7 +158,7 @@
return -ENOMEM;
#ifdef DEBUG
- printk("i2c-dev,o: i2c-%d reading %d bytes.\n",MINOR(inode->i_rdev),
+ printk("i2c-dev.o: i2c-%d reading %d bytes.\n",MINOR(inode->i_rdev),
count);
#endif
@@ -174,7 +190,7 @@
}
#ifdef DEBUG
- printk("i2c-dev,o: i2c-%d writing %d bytes.\n",MINOR(inode->i_rdev),
+ printk("i2c-dev.o: i2c-%d writing %d bytes.\n",MINOR(inode->i_rdev),
count);
#endif
ret = i2c_master_send(client,tmp,count);
@@ -289,7 +305,8 @@
(data_arg.size != I2C_SMBUS_BYTE_DATA) &&
(data_arg.size != I2C_SMBUS_WORD_DATA) &&
(data_arg.size != I2C_SMBUS_PROC_CALL) &&
- (data_arg.size != I2C_SMBUS_BLOCK_DATA)) {
+ (data_arg.size != I2C_SMBUS_BLOCK_DATA) &&
+ (data_arg.size != I2C_SMBUS_I2C_BLOCK_DATA)) {
#ifdef DEBUG
printk("i2c-dev.o: size out of range (%x) in ioctl I2C_SMBUS.\n",
data_arg.size);
@@ -379,6 +396,9 @@
if (i2cdev_adaps[minor]->inc_use)
i2cdev_adaps[minor]->inc_use(i2cdev_adaps[minor]);
+#if LINUX_KERNEL_VERSION < KERNEL_VERSION(2,4,0)
+ MOD_INC_USE_COUNT;
+#endif /* LINUX_KERNEL_VERSION < KERNEL_VERSION(2,4,0) */
#ifdef DEBUG
printk("i2c-dev.o: opened i2c-%d\n",minor);
@@ -394,16 +414,23 @@
#ifdef DEBUG
printk("i2c-dev.o: Closed: i2c-%d\n", minor);
#endif
+#if LINUX_KERNEL_VERSION < KERNEL_VERSION(2,4,0)
+ MOD_DEC_USE_COUNT;
+#else /* LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0) */
lock_kernel();
+#endif /* LINUX_KERNEL_VERSION < KERNEL_VERSION(2,4,0) */
if (i2cdev_adaps[minor]->dec_use)
i2cdev_adaps[minor]->dec_use(i2cdev_adaps[minor]);
+#if LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0)
unlock_kernel();
+#endif /* LINUX_KERNEL_VERSION >= KERNEL_VERSION(2,4,0) */
return 0;
}
int i2cdev_attach_adapter(struct i2c_adapter *adap)
{
int i;
+ char name[8];
if ((i = i2c_adapter_id(adap)) < 0) {
printk("i2c-dev.o: Unknown adapter ?!?\n");
@@ -414,11 +441,21 @@
return -ENODEV;
}
+ sprintf (name, "%d", i);
if (! i2cdev_adaps[i]) {
i2cdev_adaps[i] = adap;
+#ifdef CONFIG_DEVFS_FS
+ devfs_i2c[i] = devfs_register (devfs_handle, name,
+ DEVFS_FL_DEFAULT, I2C_MAJOR, i,
+ S_IFCHR | S_IRUSR | S_IWUSR,
+ &i2cdev_fops, NULL);
+#endif
printk("i2c-dev.o: Registered '%s' as minor %d\n",adap->name,i);
} else {
/* This is actually a detach_adapter call! */
+#ifdef CONFIG_DEVFS_FS
+ devfs_unregister(devfs_i2c[i]);
+#endif
i2cdev_adaps[i] = NULL;
#ifdef DEBUG
printk("i2c-dev.o: Adapter unregistered: %s\n",adap->name);
@@ -446,11 +483,18 @@
printk("i2c-dev.o: i2c /dev entries driver module\n");
i2cdev_initialized = 0;
+#ifdef CONFIG_DEVFS_FS
+ if (devfs_register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops)) {
+#else
if (register_chrdev(I2C_MAJOR,"i2c",&i2cdev_fops)) {
+#endif
printk("i2c-dev.o: unable to get major %d for i2c bus\n",
I2C_MAJOR);
return -EIO;
}
+#ifdef CONFIG_DEVFS_FS
+ devfs_handle = devfs_mk_dir(NULL, "i2c", NULL);
+#endif
i2cdev_initialized ++;
if ((res = i2c_add_driver(&i2cdev_driver))) {
@@ -476,7 +520,12 @@
}
if (i2cdev_initialized >= 1) {
+#ifdef CONFIG_DEVFS_FS
+ devfs_unregister(devfs_handle);
+ if ((res = devfs_unregister_chrdev(I2C_MAJOR, "i2c"))) {
+#else
if ((res = unregister_chrdev(I2C_MAJOR,"i2c"))) {
+#endif
printk("i2c-dev.o: unable to release major %d for i2c bus\n",
I2C_MAJOR);
return res;
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen (who was at: slshen@lbl.gov)