--- 1.6/drivers/i2c/i2c-adap-ite.c	Sun Dec 29 16:43:46 2002
+++ edited/drivers/i2c/i2c-adap-ite.c	Mon Dec 30 11:32:34 2002
@@ -184,35 +184,6 @@
 	release_region(gpi.iic_base , 2);
 }
 
-
-static int iic_ite_reg(struct i2c_client *client)
-{
-	return 0;
-}
-
-
-static int iic_ite_unreg(struct i2c_client *client)
-{
-	return 0;
-}
-
-
-static void iic_ite_inc_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-
-static void iic_ite_dec_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
-
-
 /* ------------------------------------------------------------------------
  * Encapsulate the above functions in the correct operations structure.
  * This is only done when more than one hardware adapter is supported.
@@ -228,14 +199,10 @@
 };
 
 static struct i2c_adapter iic_ite_ops = {
-	"ITE IIC adapter",
-	I2C_HW_I_IIC,
-	NULL,
-	&iic_ite_data,
-	iic_ite_inc_use,
-	iic_ite_dec_use,
-	iic_ite_reg,
-	iic_ite_unreg,
+	.owner		= THIS_MODULE,
+	.name		= "ITE IIC adapter",
+	.id		= I2C_HW_I_IIC,
+	.algo_data	= &iic_ite_data,
 };
 
 /* Called when the module is loaded.  This function starts the
===== drivers/i2c/i2c-algo-bit.c 1.10 vs edited =====
--- 1.10/drivers/i2c/i2c-algo-bit.c	Sun Dec 29 13:28:36 2002
+++ edited/drivers/i2c/i2c-algo-bit.c	Mon Dec 30 12:16:31 2002
@@ -529,14 +529,11 @@
 /* -----exported algorithm data: -------------------------------------	*/
 
 static struct i2c_algorithm i2c_bit_algo = {
-	"Bit-shift algorithm",
-	I2C_ALGO_BIT,
-	bit_xfer,
-	NULL,
-	NULL,				/* slave_xmit		*/
-	NULL,				/* slave_recv		*/
-	algo_control,			/* ioctl		*/
-	bit_func,			/* functionality	*/
+	.name		= "Bit-shift algorithm",
+	.id		= I2C_ALGO_BIT,
+	.master_xfer	= bit_xfer,
+	.algo_control	= algo_control,
+	.functionality	= bit_func,
 };
 
 /* 
@@ -581,11 +578,7 @@
 		printk("\n");
 	}
 
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
 	i2c_add_adapter(adap);
-
 	return 0;
 }
 
@@ -599,9 +592,6 @@
 
 	DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: adapter unregistered: %s\n",adap->name));
 
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
 	return 0;
 }
 
===== drivers/i2c/i2c-algo-pcf.c 1.6 vs edited =====
--- 1.6/drivers/i2c/i2c-algo-pcf.c	Sun Dec 29 13:19:38 2002
+++ edited/drivers/i2c/i2c-algo-pcf.c	Mon Dec 30 12:20:20 2002
@@ -474,10 +474,6 @@
 		return i;
 	}
 
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-
 	i2c_add_adapter(adap);
 
 	/* scan bus */
@@ -509,15 +505,7 @@
 
 int i2c_pcf_del_bus(struct i2c_adapter *adap)
 {
-	int res;
-	if ((res = i2c_del_adapter(adap)) < 0)
-		return res;
-	DEB2(printk(KERN_DEBUG "i2c-algo-pcf.o: adapter unregistered: %s\n",adap->name));
-
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-	return 0;
+	return i2c_del_adapter(adap);
 }
 
 EXPORT_SYMBOL(i2c_pcf_add_bus);
===== drivers/i2c/i2c-core.c 1.13 vs edited =====
--- 1.13/drivers/i2c/i2c-core.c	Sun Dec 29 14:43:44 2002
+++ edited/drivers/i2c/i2c-core.c	Mon Dec 30 11:32:34 2002
@@ -446,24 +446,23 @@
 	return 0;
 }
 
-void i2c_inc_use_client(struct i2c_client *client)
+static int i2c_inc_use_client(struct i2c_client *client)
 {
 
-	if (client->driver->inc_use != NULL)
-		client->driver->inc_use(client);
+	if (!try_module_get(client->driver->owner))
+		return -ENODEV;
+	if (!try_module_get(client->adapter->owner)) {
+		module_put(client->driver->owner);
+		return -ENODEV;
+	}
 
-	if (client->adapter->inc_use != NULL)
-		client->adapter->inc_use(client->adapter);
+	return 0;
 }
 
-void i2c_dec_use_client(struct i2c_client *client)
+static void i2c_dec_use_client(struct i2c_client *client)
 {
-	
-	if (client->driver->dec_use != NULL)
-		client->driver->dec_use(client);
-
-	if (client->adapter->dec_use != NULL)
-		client->adapter->dec_use(client->adapter);
+	module_put(client->driver->owner);
+	module_put(client->adapter->owner);
 }
 
 struct i2c_client *i2c_get_client(int driver_id, int adapter_id, 
@@ -535,20 +534,22 @@
 
 int i2c_use_client(struct i2c_client *client)
 {
-	if(client->flags & I2C_CLIENT_ALLOW_USE) {
-		if (client->flags & I2C_CLIENT_ALLOW_MULTIPLE_USE) 
+	if (!i2c_inc_use_client(client))
+		return -ENODEV;
+
+	if (client->flags & I2C_CLIENT_ALLOW_USE) {
+		if (client->flags & I2C_CLIENT_ALLOW_MULTIPLE_USE)
+			client->usage_count++;
+		else if (client->usage_count > 0) 
+			goto busy;
+		else 
 			client->usage_count++;
-		else {
-			if(client->usage_count > 0) 
-				return -EBUSY;
-			 else 
-				client->usage_count++;
-		}
 	}
 
-	i2c_inc_use_client(client);
-
 	return 0;
+ busy:
+	i2c_dec_use_client(client);
+	return -EBUSY;
 }
 
 int i2c_release_client(struct i2c_client *client)
@@ -1420,8 +1421,6 @@
 EXPORT_SYMBOL(i2c_del_driver);
 EXPORT_SYMBOL(i2c_attach_client);
 EXPORT_SYMBOL(i2c_detach_client);
-EXPORT_SYMBOL(i2c_inc_use_client);
-EXPORT_SYMBOL(i2c_dec_use_client);
 EXPORT_SYMBOL(i2c_get_client);
 EXPORT_SYMBOL(i2c_use_client);
 EXPORT_SYMBOL(i2c_release_client);
===== drivers/i2c/i2c-dev.c 1.19 vs edited =====
--- 1.19/drivers/i2c/i2c-dev.c	Sun Dec 29 13:20:26 2002
+++ edited/drivers/i2c/i2c-dev.c	Mon Dec 30 11:32:34 2002
@@ -364,8 +364,10 @@
 	client->adapter = i2cdev_adaps[minor];
 	file->private_data = client;
 
-	if (i2cdev_adaps[minor]->inc_use)
-		i2cdev_adaps[minor]->inc_use(i2cdev_adaps[minor]);
+	if (!try_module_get(i2cdev_adaps[minor]->owner)) {
+		kfree(client);
+		return -ENODEV;
+	}
 
 #ifdef DEBUG
 	printk(KERN_DEBUG "i2c-dev.o: opened i2c-%d\n",minor);
@@ -381,10 +383,7 @@
 #ifdef DEBUG
 	printk(KERN_DEBUG "i2c-dev.o: Closed: i2c-%d\n", minor);
 #endif
-	lock_kernel();
-	if (i2cdev_adaps[minor]->dec_use)
-		i2cdev_adaps[minor]->dec_use(i2cdev_adaps[minor]);
-	unlock_kernel();
+	module_put(i2cdev_adaps[minor]->owner);
 	return 0;
 }
 
===== drivers/i2c/i2c-elektor.c 1.12 vs edited =====
--- 1.12/drivers/i2c/i2c-elektor.c	Sun Dec 29 19:32:18 2002
+++ edited/drivers/i2c/i2c-elektor.c	Mon Dec 30 12:20:38 2002
@@ -142,7 +142,7 @@
 static int pcf_isa_init(void)
 {
 	if (!mmapped) {
-		if (!request_region(base, 2, "i2c (isa bus adapter)"))
+		if (!request_region(base, 2, "i2c (isa bus adapter)")) {
 			printk(KERN_ERR
 			       "i2c-elektor.o: requested I/O region (0x%X:2) "
 			       "is in use.\n", base);
@@ -159,32 +159,6 @@
 	return 0;
 }
 
-static int pcf_isa_reg(struct i2c_client *client)
-{
-	return 0;
-}
-
-
-static int pcf_isa_unreg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static void pcf_isa_inc_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-static void pcf_isa_dec_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
-
-
 /* ------------------------------------------------------------------------
  * Encapsulate the above functions in the correct operations structure.
  * This is only done when more than one hardware adapter is supported.
@@ -201,13 +175,10 @@
 };
 
 static struct i2c_adapter pcf_isa_ops = {
+	.owner		   = THIS_MODULE,
 	.name		   = "PCF8584 ISA adapter",
 	.id		   = I2C_HW_P_ELEK,
 	.algo_data	   = &pcf_isa_data,
-	.inc_use	   = pcf_isa_inc_use,
-	.dec_use	   = pcf_isa_dec_use,
-	.client_register   = pcf_isa_reg,
-	.client_unregister = pcf_isa_unreg,
 };
 
 static int __init i2c_pcfisa_init(void) 
===== drivers/i2c/i2c-elv.c 1.8 vs edited =====
--- 1.8/drivers/i2c/i2c-elv.c	Sun Dec 29 19:33:51 2002
+++ edited/drivers/i2c/i2c-elv.c	Mon Dec 30 11:32:34 2002
@@ -115,30 +115,6 @@
 	return -ENODEV;
 }
 
-static int bit_elv_reg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static int bit_elv_unreg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static void bit_elv_inc_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-static void bit_elv_dec_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
-
 /* ------------------------------------------------------------------------
  * Encapsulate the above functions in the correct operations structure.
  * This is only done when more than one hardware adapter is supported.
@@ -153,14 +129,10 @@
 };
 
 static struct i2c_adapter bit_elv_ops = {
-	"ELV Parallel port adaptor",
-	I2C_HW_B_ELV,
-	NULL,
-	&bit_elv_data,
-	bit_elv_inc_use,
-	bit_elv_dec_use,
-	bit_elv_reg,
-	bit_elv_unreg,	
+	.owner		= THIS_MODULE,
+	.name		= "ELV Parallel port adaptor",
+	.id		= I2C_HW_B_ELV,
+	.algo_data	= &bit_elv_data,
 };
 
 static int __init i2c_bitelv_init(void)
===== drivers/i2c/i2c-frodo.c 1.4 vs edited =====
--- 1.4/drivers/i2c/i2c-frodo.c	Sun Dec 29 19:32:18 2002
+++ edited/drivers/i2c/i2c-frodo.c	Mon Dec 30 11:32:34 2002
@@ -61,44 +61,21 @@
 	.timeout	= 100
 };
 
-static int frodo_client_register (struct i2c_client *client)
-{
-	return (0);
-}
-
-static int frodo_client_unregister (struct i2c_client *client)
-{
-	return (0);
-}
-
-static void frodo_inc_use (struct i2c_adapter *adapter)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void frodo_dec_use (struct i2c_adapter *adapter)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 static struct i2c_adapter frodo_ops = {
+	.owner			= THIS_MODULE,
 	.name			= "Frodo adapter driver",
 	.id			= I2C_HW_B_FRODO,
 	.algo_data		= &bit_frodo_data,
-	.inc_use		= frodo_inc_use,
-	.dec_use		= frodo_dec_use,
-	.client_register	= frodo_client_register,
-	.client_unregister	= frodo_client_unregister
 };
 
 static int __init i2c_frodo_init (void)
 {
-	return (i2c_bit_add_bus (&frodo_ops));
+	return i2c_bit_add_bus(&frodo_ops);
 }
 
 static void __exit i2c_frodo_exit (void)
 {
-	i2c_bit_del_bus (&frodo_ops);
+	i2c_bit_del_bus(&frodo_ops);
 }
 
 MODULE_AUTHOR ("Abraham van der Merwe <abraham@2d3d.co.za>");
===== drivers/i2c/i2c-philips-par.c 1.7 vs edited =====
--- 1.7/drivers/i2c/i2c-philips-par.c	Sun Dec 29 19:32:18 2002
+++ edited/drivers/i2c/i2c-philips-par.c	Mon Dec 30 11:32:34 2002
@@ -129,26 +129,6 @@
 			             PARPORT_STATUS_BUSY) ? 0 : 1;
 }
 
-static int bit_lp_reg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static int bit_lp_unreg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static void bit_lp_inc_use(struct i2c_adapter *adap)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void bit_lp_dec_use(struct i2c_adapter *adap)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 /* ------------------------------------------------------------------------
  * Encapsulate the above functions in the correct operations structure.
  * This is only done when more than one hardware adapter is supported.
@@ -173,15 +153,9 @@
 }; 
 
 static struct i2c_adapter bit_lp_ops = {
-	"Philips Parallel port adapter",
-	I2C_HW_B_LP,
-	NULL,
-	NULL,
-	bit_lp_inc_use,
-	bit_lp_dec_use,
-	bit_lp_reg,
-
-	bit_lp_unreg,
+	.owner		= THIS_MODULE,
+	.name		= "Philips Parallel port adapter",
+	.id		= I2C_HW_B_LP,
 };
 
 static void i2c_parport_attach (struct parport *port)
===== drivers/i2c/i2c-proc.c 1.10 vs edited =====
--- 1.10/drivers/i2c/i2c-proc.c	Sun Dec 29 19:32:18 2002
+++ edited/drivers/i2c/i2c-proc.c	Mon Dec 30 12:24:24 2002
@@ -210,49 +210,6 @@
 	}
 }
 
-/* Monitor access for /proc/sys/dev/sensors; make unloading i2c-proc.o 
-   impossible if some process still uses it or some file in it */
-void i2c_fill_inode(struct inode *inode, int fill)
-{
-	if (fill)
-		MOD_INC_USE_COUNT;
-	else
-		MOD_DEC_USE_COUNT;
-}
-
-/* Monitor access for /proc/sys/dev/sensors/ directories; make unloading
-   the corresponding module impossible if some process still uses it or
-   some file in it */
-void i2c_dir_fill_inode(struct inode *inode, int fill)
-{
-	int i;
-	struct i2c_client *client;
-
-#ifdef DEBUG
-	if (!inode) {
-		printk(KERN_ERR "i2c-proc.o: Warning: inode NULL in fill_inode()\n");
-		return;
-	}
-#endif				/* def DEBUG */
-
-	for (i = 0; i < SENSORS_ENTRY_MAX; i++)
-		if (i2c_clients[i]
-		    && (i2c_inodes[i] == inode->i_ino)) break;
-#ifdef DEBUG
-	if (i == SENSORS_ENTRY_MAX) {
-		printk
-		    (KERN_ERR "i2c-proc.o: Warning: inode (%ld) not found in fill_inode()\n",
-		     inode->i_ino);
-		return;
-	}
-#endif				/* def DEBUG */
-	client = i2c_clients[i];
-	if (fill)
-		client->driver->inc_use(client);
-	else
-		client->driver->dec_use(client);
-}
-
 int i2c_proc_chips(ctl_table * ctl, int write, struct file *filp,
 		       void *buffer, size_t * lenp)
 {
===== drivers/i2c/i2c-rpx.c 1.3 vs edited =====
--- 1.3/drivers/i2c/i2c-rpx.c	Sun Dec 29 13:27:25 2002
+++ edited/drivers/i2c/i2c-rpx.c	Mon Dec 30 11:32:34 2002
@@ -66,44 +66,15 @@
 	return 0;
 }
 
-static int rpx_reg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static int rpx_unreg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static void rpx_inc_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-static void rpx_dec_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
-
 static struct i2c_algo_8xx_data rpx_data = {
 	.setisr = rpx_install_isr
 };
 
-
 static struct i2c_adapter rpx_ops = {
-	"m8xx",
-	I2C_HW_MPC8XX_EPON,
-	NULL,
-	&rpx_data,
-	rpx_inc_use,
-	rpx_dec_use,
-	rpx_reg,
-	rpx_unreg,
+	.owner		= THIS_MODULE,
+	.name		= "m8xx",
+	.id		= I2C_HW_MPC8XX_EPON,
+	.algo_data	= &rpx_data,
 };
 
 int __init i2c_rpx_init(void)
===== drivers/i2c/i2c-velleman.c 1.6 vs edited =====
--- 1.6/drivers/i2c/i2c-velleman.c	Sun Dec 29 14:46:32 2002
+++ edited/drivers/i2c/i2c-velleman.c	Mon Dec 30 12:19:28 2002
@@ -89,43 +89,15 @@
 
 static int bit_velle_init(void)
 {
-	if (check_region(base,(base == 0x3bc)? 3 : 8) < 0 ) {
-		DEBE(printk(KERN_DEBUG "i2c-velleman.o: Port %#x already in use.\n",
-		     base));
+	if (!request_region(base, (base == 0x3bc) ? 3 : 8, 
+			"i2c (Vellemann adapter)"))
 		return -ENODEV;
-	} else {
-		request_region(base, (base == 0x3bc)? 3 : 8, 
-			"i2c (Vellemann adapter)");
-		bit_velle_setsda((void*)base,1);
-		bit_velle_setscl((void*)base,1);
-	}
-	return 0;
-}
-
-static int bit_velle_reg(struct i2c_client *client)
-{
-	return 0;
-}
 
-static int bit_velle_unreg(struct i2c_client *client)
-{
+	bit_velle_setsda((void*)base,1);
+	bit_velle_setscl((void*)base,1);
 	return 0;
 }
 
-static void bit_velle_inc_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-static void bit_velle_dec_use(struct i2c_adapter *adap)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
-
 /* ------------------------------------------------------------------------
  * Encapsulate the above functions in the correct operations structure.
  * This is only done when more than one hardware adapter is supported.
@@ -141,14 +113,10 @@
 };
 
 static struct i2c_adapter bit_velle_ops = {
-	"Velleman K8000",
-	I2C_HW_B_VELLE,
-	NULL,
-	&bit_velle_data,
-	bit_velle_inc_use,
-	bit_velle_dec_use,
-	bit_velle_reg,
-	bit_velle_unreg,
+	.owner		= THIS_MODULE,
+	.name		= "Velleman K8000",
+	.id		= I2C_HW_B_VELLE,
+	.algo_data	= &bit_velle_data,
 };
 
 static int __init i2c_bitvelle_init(void)
===== drivers/i2c/scx200_acb.c 1.2 vs edited =====
--- 1.2/drivers/i2c/scx200_acb.c	Mon Nov 18 02:09:32 2002
+++ edited/drivers/i2c/scx200_acb.c	Mon Dec 30 11:32:34 2002
@@ -397,26 +397,6 @@
 	       I2C_FUNC_SMBUS_BLOCK_DATA;
 }
 
-static int scx200_acb_reg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static int scx200_acb_unreg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static void scx200_acb_inc_use(struct i2c_adapter *adapter)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void scx200_acb_dec_use(struct i2c_adapter *adapter)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 /* For now, we only handle combined mode (smbus) */
 static struct i2c_algorithm scx200_acb_algorithm = {
 	.name		= "NatSemi SCx200 ACCESS.bus",
@@ -479,12 +459,9 @@
 	adapter = &iface->adapter;
 	adapter->data = iface;
 	sprintf(adapter->name, "SCx200 ACB%d", index);
+	adapter->owner = THIS_MODULE;
 	adapter->id = I2C_ALGO_SMBUS;
 	adapter->algo = &scx200_acb_algorithm;
-	adapter->inc_use = scx200_acb_inc_use;
-	adapter->dec_use = scx200_acb_dec_use;
-	adapter->client_register = scx200_acb_reg;
-	adapter->client_unregister = scx200_acb_unreg;
 
 	init_MUTEX(&iface->sem);
 
===== drivers/i2c/scx200_i2c.c 1.1 vs edited =====
--- 1.1/drivers/i2c/scx200_i2c.c	Sat Oct  5 13:35:20 2002
+++ edited/drivers/i2c/scx200_i2c.c	Mon Dec 30 11:32:34 2002
@@ -66,26 +66,6 @@
 	return scx200_gpio_get(sda);
 }
 
-static int scx200_i2c_reg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static int scx200_i2c_unreg(struct i2c_client *client)
-{
-	return 0;
-}
-
-static void scx200_i2c_inc_use(struct i2c_adapter *adap)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void scx200_i2c_dec_use(struct i2c_adapter *adap)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 /* ------------------------------------------------------------------------
  * Encapsulate the above functions in the correct operations structure.
  * This is only done when more than one hardware adapter is supported.
@@ -101,13 +81,10 @@
 };
 
 static struct i2c_adapter scx200_i2c_ops = {
+	.owner		   = THIS_MODULE,
 	.name              = "NatSemi SCx200 I2C",
 	.id		   = I2C_HW_B_VELLE,
 	.algo_data	   = &scx200_i2c_data,
-	.inc_use	   = scx200_i2c_inc_use,
-	.dec_use	   = scx200_i2c_dec_use,
-	.client_register   = scx200_i2c_reg,
-	.client_unregister = scx200_i2c_unreg,
 };
 
 int scx200_i2c_init(void)
===== drivers/i2c/busses/i2c-amd756.c 1.2 vs edited =====
--- 1.2/drivers/i2c/busses/i2c-amd756.c	Sun Dec 29 15:11:50 2002
+++ edited/drivers/i2c/busses/i2c-amd756.c	Mon Dec 30 11:32:34 2002
@@ -296,17 +296,6 @@
 	return 0;
 }
 
-static void amd756_inc(struct i2c_adapter *adapter)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void amd756_dec(struct i2c_adapter *adapter)
-{
-
-	MOD_DEC_USE_COUNT;
-}
-
 static u32 amd756_func(struct i2c_adapter *adapter)
 {
 	return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
@@ -322,11 +311,10 @@
 };
 
 static struct i2c_adapter amd756_adapter = {
+	.owner		= THIS_MODULE,
 	.name		= "unset",
 	.id		= I2C_ALGO_SMBUS | I2C_HW_SMBUS_AMD756,
 	.algo		= &smbus_algorithm,
-	.inc_use	= amd756_inc,
-	.dec_use	= amd756_dec,
 };
 
 enum chiptype { AMD756, AMD766, AMD768, NFORCE };
===== drivers/i2c/busses/i2c-amd8111.c 1.1 vs edited =====
--- 1.1/drivers/i2c/busses/i2c-amd8111.c	Sun Dec  1 19:42:06 2002
+++ edited/drivers/i2c/busses/i2c-amd8111.c	Mon Dec 30 11:32:34 2002
@@ -320,16 +320,6 @@
 	return 0;
 }
 
-void amd8111_inc(struct i2c_adapter *adapter)
-{
-	MOD_INC_USE_COUNT;
-}
-
-void amd8111_dec(struct i2c_adapter *adapter)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 u32 amd8111_func(struct i2c_adapter *adapter)
 {
 	return	I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE | I2C_FUNC_SMBUS_BYTE_DATA |
@@ -368,12 +358,11 @@
 		return -1;
 	}
 
+	smbus->adapter.owner = THIS_MODULE;
 	sprintf(smbus->adapter.name, "SMBus2 AMD8111 adapter at %04x", smbus->base);
 	smbus->adapter.id = I2C_ALGO_SMBUS | I2C_HW_SMBUS_AMD8111;
 	smbus->adapter.algo = &smbus_algorithm;
 	smbus->adapter.algo_data = smbus;
-	smbus->adapter.inc_use = amd8111_inc;
-	smbus->adapter.dec_use = amd8111_dec;
 
 	if (i2c_add_adapter(&smbus->adapter)) {
 		printk(KERN_WARNING "i2c-amd8111.c: Failed to register adapter.\n");
===== drivers/i2c/chips/adm1021.c 1.2 vs edited =====
--- 1.2/drivers/i2c/chips/adm1021.c	Sun Dec 29 15:13:58 2002
+++ edited/drivers/i2c/chips/adm1021.c	Mon Dec 30 11:32:34 2002
@@ -114,8 +114,6 @@
 static int adm1021_detach_client(struct i2c_client *client);
 static int adm1021_command(struct i2c_client *client, unsigned int cmd,
 			   void *arg);
-static void adm1021_inc_use(struct i2c_client *client);
-static void adm1021_dec_use(struct i2c_client *client);
 static int adm1021_read_value(struct i2c_client *client, u8 reg);
 static int adm1021_write_value(struct i2c_client *client, u8 reg,
 			       u16 value);
@@ -136,14 +134,13 @@
 
 /* This is the driver that will be inserted */
 static struct i2c_driver adm1021_driver = {
-	/* name */ "ADM1021, MAX1617 sensor driver",
-	/* id */ I2C_DRIVERID_ADM1021,
-	/* flags */ I2C_DF_NOTIFY,
-	/* attach_adapter */ &adm1021_attach_adapter,
-	/* detach_client */ &adm1021_detach_client,
-	/* command */ &adm1021_command,
-	/* inc_use */ &adm1021_inc_use,
-	/* dec_use */ &adm1021_dec_use
+	.owner		= THIS_MODULE,
+	.name		= "ADM1021, MAX1617 sensor driver",
+	.id		= I2C_DRIVERID_ADM1021,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter	= adm1021_attach_adapter,
+	.detach_client	= adm1021_detach_client,
+	.command	= adm1021_command,
 };
 
 /* These files are created for each detected adm1021. This is just a template;
@@ -375,16 +372,6 @@
 	return 0;
 }
 
-void adm1021_inc_use(struct i2c_client *client)
-{
-	MOD_INC_USE_COUNT;
-}
-
-void adm1021_dec_use(struct i2c_client *client)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 /* All registers are byte-sized */
 int adm1021_read_value(struct i2c_client *client, u8 reg)
 {
@@ -478,8 +465,9 @@
 void adm1021_remote_temp(struct i2c_client *client, int operation,
 			 int ctl_name, int *nrels_mag, long *results)
 {
-int prec=0;
 	struct adm1021_data *data = client->data;
+	int prec = 0;
+
 	if (operation == SENSORS_PROC_REAL_INFO)
 		if (data->type == adm1023) { *nrels_mag = 3; }
                  else { *nrels_mag = 0; }
===== drivers/i2c/chips/lm75.c 1.2 vs edited =====
--- 1.2/drivers/i2c/chips/lm75.c	Sun Dec 29 15:14:30 2002
+++ edited/drivers/i2c/chips/lm75.c	Mon Dec 30 12:16:10 2002
@@ -72,8 +72,6 @@
 static int lm75_detach_client(struct i2c_client *client);
 static int lm75_command(struct i2c_client *client, unsigned int cmd,
 			void *arg);
-static void lm75_inc_use(struct i2c_client *client);
-static void lm75_dec_use(struct i2c_client *client);
 static u16 swap_bytes(u16 val);
 static int lm75_read_value(struct i2c_client *client, u8 reg);
 static int lm75_write_value(struct i2c_client *client, u8 reg, u16 value);
@@ -84,14 +82,12 @@
 
 /* This is the driver that will be inserted */
 static struct i2c_driver lm75_driver = {
-	/* name */ "LM75 sensor chip driver",
-	/* id */ I2C_DRIVERID_LM75,
-	/* flags */ I2C_DF_NOTIFY,
-	/* attach_adapter */ &lm75_attach_adapter,
-	/* detach_client */ &lm75_detach_client,
-	/* command */ &lm75_command,
-	/* inc_use */ &lm75_inc_use,
-	/* dec_use */ &lm75_dec_use
+	.name		= "LM75 sensor chip driver",
+	.id		= I2C_DRIVERID_LM75,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter	= lm75_attach_adapter,
+	.detach_client	= lm75_detach_client,
+	.command	= lm75_command,
 };
 
 /* These files are created for each detected LM75. This is just a template;
@@ -221,40 +217,17 @@
 
 int lm75_detach_client(struct i2c_client *client)
 {
-	int err;
-
-#ifdef MODULE
-	if (MOD_IN_USE)
-		return -EBUSY;
-#endif
-
-	i2c_deregister_entry(((struct lm75_data *) (client->data))->
-				 sysctl_id);
-
-	if ((err = i2c_detach_client(client))) {
-		printk
-		    ("lm75.o: Client deregistration failed, client not detached.\n");
-		return err;
-	}
+	struct lm75_data *data = client->data;
 
+	i2c_deregister_entry(data->sysctl_id);
+	i2c_detach_client(client);
 	kfree(client);
-
 	return 0;
 }
 
 int lm75_command(struct i2c_client *client, unsigned int cmd, void *arg)
 {
 	return 0;
-}
-
-void lm75_inc_use(struct i2c_client *client)
-{
-	MOD_INC_USE_COUNT;
-}
-
-void lm75_dec_use(struct i2c_client *client)
-{
-	MOD_DEC_USE_COUNT;
 }
 
 u16 swap_bytes(u16 val)
===== drivers/media/video/adv7175.c 1.7 vs edited =====
--- 1.7/drivers/media/video/adv7175.c	Fri Nov 29 11:30:43 2002
+++ edited/drivers/media/video/adv7175.c	Mon Dec 30 11:32:34 2002
@@ -396,39 +396,26 @@
 	return 0;
 }
 
-static void adv717x_inc_use(struct i2c_client *client)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void adv717x_dec_use(struct i2c_client *client)
-{
-	MOD_DEC_USE_COUNT;
-}
-
-
 /* ----------------------------------------------------------------------- */
 
 static struct i2c_driver i2c_driver_adv7175 = {
+	.owner		= THIS_MODULE,
 	.name		= "adv7175",		/* name */
 	.id		= I2C_DRIVERID_ADV717x,	/* ID */
 	.flags		= I2C_DF_NOTIFY, //I2C_ADV7175, I2C_ADV7175 + 3,
 	.attach_adapter	= adv717x_probe,
 	.detach_client	= adv717x_detach,
 	.command	= adv717x_command,
-	.inc_use	= &adv717x_inc_use,
-	.dec_use	= &adv717x_dec_use
 };
 
 static struct i2c_driver i2c_driver_adv7176 = {
+	.owner		= THIS_MODULE,
 	.name		= "adv7176",		/* name */
 	.id		= I2C_DRIVERID_ADV717x,	/* ID */
 	.flags		= I2C_DF_NOTIFY, //I2C_ADV7176, I2C_ADV7176 + 3,
 	.attach_adapter	= adv717x_probe,
 	.detach_client	= adv717x_detach,
 	.command	= adv717x_command,
-	.inc_use	= &adv717x_inc_use,
-	.dec_use	= &adv717x_dec_use
 };
 
 static struct i2c_client client_template = {
===== drivers/media/video/bttv-if.c 1.6 vs edited =====
--- 1.6/drivers/media/video/bttv-if.c	Fri Nov 29 11:30:38 2002
+++ edited/drivers/media/video/bttv-if.c	Mon Dec 30 11:32:34 2002
@@ -194,16 +194,6 @@
 	return state;
 }
 
-static void bttv_inc_use(struct i2c_adapter *adap)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void bttv_dec_use(struct i2c_adapter *adap)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 static int attach_inform(struct i2c_client *client)
 {
         struct bttv *btv = (struct bttv*)client->adapter->data;
@@ -272,10 +262,9 @@
 };
 
 static struct i2c_adapter bttv_i2c_adap_template = {
+	.owner		   = THIS_MODULE,
 	.name              = "bt848",
 	.id                = I2C_HW_B_BT848,
-	.inc_use           = bttv_inc_use,
-	.dec_use           = bttv_dec_use,
 	.client_register   = attach_inform,
 	.client_unregister = detach_inform,
 };
===== drivers/media/video/tvmixer.c 1.9 vs edited =====
--- 1.9/drivers/media/video/tvmixer.c	Sat Nov 30 12:27:46 2002
+++ edited/drivers/media/video/tvmixer.c	Mon Dec 30 11:32:34 2002
@@ -195,8 +195,9 @@
 
 	/* lock bttv in memory while the mixer is in use  */
 	file->private_data = mix;
-	if (client->adapter->inc_use)
-		client->adapter->inc_use(client->adapter);
+
+	if (!try_module_get(client->adapter->owner))
+		return -ENODEV;
         return 0;
 }
 
@@ -210,8 +211,7 @@
 		return -ENODEV;
 	}
 
-	if (client->adapter->dec_use)
-		client->adapter->dec_use(client->adapter);
+	module_put(client->adapter->owner);
 	return 0;
 }
 
===== drivers/media/video/saa7134/saa7134-i2c.c 1.2 vs edited =====
--- 1.2/drivers/media/video/saa7134/saa7134-i2c.c	Thu Dec  5 21:56:40 2002
+++ edited/drivers/media/video/saa7134/saa7134-i2c.c	Mon Dec 30 11:32:34 2002
@@ -318,16 +318,6 @@
 	return I2C_FUNC_SMBUS_EMUL;
 }
 
-static void inc_use(struct i2c_adapter *adap)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void dec_use(struct i2c_adapter *adap)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 static int attach_inform(struct i2c_client *client)
 {
         struct saa7134_dev *dev = client->adapter->algo_data;
@@ -346,11 +336,10 @@
 };
 
 static struct i2c_adapter saa7134_adap_template = {
+	.owner         = THIS_MODULE,
 	.name	       = "saa7134",
 	.id            = I2C_ALGO_SAA7134,
 	.algo          = &saa7134_algo,
-	.inc_use       = inc_use,
-	.dec_use       = dec_use,
 	.client_register = attach_inform,
 };
 
--- 1.5/drivers/video/matrox/i2c-matroxfb.c	Thu Oct 31 15:05:53 2002
+++ edited/drivers/video/matrox/i2c-matroxfb.c	Mon Dec 30 11:32:35 2002
@@ -87,19 +87,10 @@
 	return (matroxfb_read_gpio(b->minfo) & b->mask.clock) ? 1 : 0;
 }
 
-static void matroxfb_dh_inc_use(struct i2c_adapter* dummy) {
-	MOD_INC_USE_COUNT;
-}
-
-static void matroxfb_dh_dec_use(struct i2c_adapter* dummy) {
-	MOD_DEC_USE_COUNT;
-}
-
 static struct i2c_adapter matrox_i2c_adapter_template =
 {
+	.owner =	THIS_MODULE,
 	.id =		I2C_HW_B_G400,
-	.inc_use =	matroxfb_dh_inc_use,
-	.dec_use =	matroxfb_dh_dec_use,
 };
 
 static struct i2c_algo_bit_data matrox_i2c_algo_template =
===== drivers/video/matrox/matroxfb_maven.c 1.11 vs edited =====
--- 1.11/drivers/video/matrox/matroxfb_maven.c	Wed Aug 14 10:37:20 2002
+++ edited/drivers/video/matrox/matroxfb_maven.c	Mon Dec 30 11:37:03 2002
@@ -945,14 +945,6 @@
 static unsigned short normal_i2c_range[] = { MAVEN_I2CID, MAVEN_I2CID, I2C_CLIENT_END };
 I2C_CLIENT_INSMOD;
 
-static void maven_inc_use(struct i2c_client* clnt) {
-	MOD_INC_USE_COUNT;
-}
-
-static void maven_dec_use(struct i2c_client* clnt) {
-	MOD_DEC_USE_COUNT;
-}
-
 static struct i2c_driver maven_driver;
 
 static int maven_detect_client(struct i2c_adapter* adapter, int address, unsigned short flags,
@@ -1016,17 +1008,13 @@
 	return -ENOIOCTLCMD;	/* or -EINVAL, depends on who will call this */
 }
 
-static int maven_driver_registered = 0;
-
 static struct i2c_driver maven_driver={
-	"maven",
-	I2C_DRIVERID_MGATVO,
-	I2C_DF_NOTIFY,
-	maven_attach_adapter,
-	maven_detach_client,
-	maven_command,
-	maven_inc_use,
-	maven_dec_use
+	.owner		= THIS_MODULE,
+	.name		= "maven",
+	.id		= I2C_DRIVERID_MGATVO,
+	.flags		= I2C_DF_NOTIFY,
+	.attach_adapter	= maven_attach_adapter,
+	.detach_client	= maven_detach_client,
 };
 
 /* ************************** */
@@ -1039,13 +1027,11 @@
 		printk(KERN_ERR "maven: Maven driver failed to register (%d).\n", err);
 		return err;
 	}
-	maven_driver_registered = 1;
 	return 0;
 }
 
 static void matroxfb_maven_exit(void) {
-	if (maven_driver_registered)
-		i2c_del_driver(&maven_driver);
+	i2c_del_driver(&maven_driver);
 }
 
 MODULE_AUTHOR("(c) 1999-2002 Petr Vandrovec <vandrove@vc.cvut.cz>");
===== include/linux/i2c.h 1.7 vs edited =====
--- 1.7/include/linux/i2c.h	Mon Dec  2 18:15:07 2002
+++ edited/include/linux/i2c.h	Mon Dec 30 11:32:35 2002
@@ -132,6 +132,7 @@
  */
 
 struct i2c_driver {
+	struct module *owner;
 	char name[32];
 	int id;
 	unsigned int flags;		/* div., see below		*/
@@ -155,18 +156,6 @@
 	 * with the device.
 	 */
 	int (*command)(struct i2c_client *client,unsigned int cmd, void *arg);
-	
-	/* These two are mainly used for bookkeeping & dynamic unloading of 
-	 * kernel modules. inc_use tells the driver that a client is being  
-	 * used by another module & that it should increase its ref. counter.
-	 * dec_use is the inverse operation.
-	 * NB: Make sure you have no circular dependencies, or else you get a 
-	 * deadlock when trying to unload the modules.
-	* You should use the i2c_{inc,dec}_use_client functions instead of
-	* calling this function directly.
-	 */
-	void (*inc_use)(struct i2c_client *client);
-	void (*dec_use)(struct i2c_client *client);
 };
 
 /*
@@ -232,16 +221,13 @@
  * with the access algorithms necessary to access it.
  */
 struct i2c_adapter {
+	struct module *owner;
 	char name[32];	/* some useful name to identify the adapter	*/
 	unsigned int id;/* == is algo->id | hwdep.struct->id, 		*/
 			/* for registered values see below		*/
 	struct i2c_algorithm *algo;/* the algorithm to access the bus	*/
 	void *algo_data;
 
-	/* --- These may be NULL, but should increase the module use count */
-	void (*inc_use)(struct i2c_adapter *);
-	void (*dec_use)(struct i2c_adapter *);
-
 	/* --- administration stuff. */
 	int (*client_register)(struct i2c_client *);
 	int (*client_unregister)(struct i2c_client *);
@@ -318,12 +304,6 @@
 
 extern int i2c_attach_client(struct i2c_client *);
 extern int i2c_detach_client(struct i2c_client *);
-
-/* Only call these if you grab a resource that makes unloading the
-   client and the adapter it is on completely impossible. Like when a
-   /proc directory is entered. */
-extern void i2c_inc_use_client(struct i2c_client *);
-extern void i2c_dec_use_client(struct i2c_client *);
 
 /* New function: This is to get an i2c_client-struct for controlling the 
    client either by using i2c_control-function or having the 
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/