mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* PATCH: parallel port
@ 2003-03-23  0:00 Alan Cox
  2003-03-23  3:21 ` [PATCH] " Linus Torvalds
  0 siblings, 1 reply; 6+ messages in thread
From: Alan Cox @ 2003-03-23  0:00 UTC (permalink / raw)
  To: linux-kernel, torvalds


This has been floating around for ages, and in -ac for a while too - is
there some reason it wasnt merged or did it just escape ?

diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/init.c linux-2.5.65-ac3/drivers/parport/init.c
--- linux-2.5.65-bk3/drivers/parport/init.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/init.c	2003-03-06 23:08:36.000000000 +0000
@@ -227,17 +227,3 @@
 EXPORT_SYMBOL(parport_find_device);
 EXPORT_SYMBOL(parport_find_class);
 #endif
-
-void inc_parport_count(void)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-void dec_parport_count(void)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/parport_amiga.c linux-2.5.65-ac3/drivers/parport/parport_amiga.c
--- linux-2.5.65-bk3/drivers/parport/parport_amiga.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/parport_amiga.c	2003-03-06 23:08:46.000000000 +0000
@@ -195,51 +195,40 @@
 	mb();
 }
 
-static void amiga_inc_use_count(void)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void amiga_dec_use_count(void)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 static struct parport_operations pp_amiga_ops = {
-	amiga_write_data,
-	amiga_read_data,
+	.write_data	= amiga_write_data,
+	.read_data	= amiga_read_data,
 
-	amiga_write_control,
-	amiga_read_control,
-	amiga_frob_control,
+	.write_control	= amiga_write_control,
+	.read_control	= amiga_read_control,
+	.frob_control	= amiga_frob_control,
 
-	amiga_read_status,
+	.read_status	= amiga_read_status,
 
-	amiga_enable_irq,
-	amiga_disable_irq,
+	.enable_irq	= amiga_enable_irq,
+	.disable_irq	= amiga_disable_irq,
 
-	amiga_data_forward,
-	amiga_data_reverse,
+	.data_forward	= amiga_data_forward,
+	.data_reverse	= amiga_data_reverse,
 
-	amiga_init_state,
-	amiga_save_state,
-	amiga_restore_state,
+	.init_state	= amiga_init_state,
+	.save_state	= amiga_save_state,
+	.restore_state	= amiga_restore_state,
 
-	amiga_inc_use_count,
-	amiga_dec_use_count,
+	.epp_write_data	= parport_ieee1284_epp_write_data,
+	.epp_read_data	= parport_ieee1284_epp_read_data,
+	.epp_write_addr	= parport_ieee1284_epp_write_addr,
+	.epp_read_addr	= parport_ieee1284_epp_read_addr,
 
-	parport_ieee1284_epp_write_data,
-	parport_ieee1284_epp_read_data,
-	parport_ieee1284_epp_write_addr,
-	parport_ieee1284_epp_read_addr,
+	.ecp_write_data	= parport_ieee1284_ecp_write_data,
+	.ecp_read_data	= parport_ieee1284_ecp_read_data,
+	.ecp_write_addr	= parport_ieee1284_ecp_write_addr,
 
-	parport_ieee1284_ecp_write_data,
-	parport_ieee1284_ecp_read_data,
-	parport_ieee1284_ecp_write_addr,
+	.compat_write_data	= parport_ieee1284_write_compat,
+	.nibble_read_data	= parport_ieee1284_read_nibble,
+	.byte_read_data		= parport_ieee1284_read_byte,
 
-	parport_ieee1284_write_compat,
-	parport_ieee1284_read_nibble,
-	parport_ieee1284_read_byte,
+	.owner		= THIS_MODULE,
 };
 
 /* ----------- Initialisation code --------------------------------- */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/parport_arc.c linux-2.5.65-ac3/drivers/parport/parport_arc.c
--- linux-2.5.65-bk3/drivers/parport/parport_arc.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/parport_arc.c	2003-03-06 23:08:51.000000000 +0000
@@ -65,56 +65,41 @@
 	return data_copy;
 }
 
-static void arc_inc_use_count(void)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-static void arc_dec_use_count(void)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
-
 static struct parport_operations parport_arc_ops = 
 {
-	arc_write_data,
-	arc_read_data,
+	.write_data	= arc_write_data,
+	.read_data	= arc_read_data,
 
-	arc_write_control,
-	arc_read_control,
-	arc_frob_control,
+	.write_control	= arc_write_control,
+	.read_control	= arc_read_control,
+	.frob_control	= arc_frob_control,
 
-	arc_read_status,
+	.read_status	= arc_read_status,
 
-	arc_enable_irq,
-	arc_disable_irq,
+	.enable_irq	= arc_enable_irq,
+	.disable_irq	= arc_disable_irq,
 
-	arc_data_forward,
-	arc_data_reverse,
+	.data_forward	= arc_data_forward,
+	.data_reverse	= arc_data_reverse,
 
-	arc_init_state,
-	arc_save_state,
-	arc_restore_state,
+	.init_state	= arc_init_state,
+	.save_state	= arc_save_state,
+	.restore_state	= arc_restore_state,
 
-	arc_inc_use_count,
-	arc_dec_use_count,
+	.epp_write_data	= parport_ieee1284_epp_write_data,
+	.epp_read_data	= parport_ieee1284_epp_read_data,
+	.epp_write_addr	= parport_ieee1284_epp_write_addr,
+	.epp_read_addr	= parport_ieee1284_epp_read_addr,
 
-	parport_ieee1284_epp_write_data,
-	parport_ieee1284_epp_read_data,
-	parport_ieee1284_epp_write_addr,
-	parport_ieee1284_epp_read_addr,
-
-	parport_ieee1284_ecp_write_data,
-	parport_ieee1284_ecp_read_data,
-	parport_ieee1284_ecp_write_addr,
+	.ecp_write_data	= parport_ieee1284_ecp_write_data,
+	.ecp_read_data	= parport_ieee1284_ecp_read_data,
+	.ecp_write_addr	= parport_ieee1284_ecp_write_addr,
 	
-	parport_ieee1284_write_compat,
-	parport_ieee1284_read_nibble,
-	parport_ieee1284_read_byte,
+	.compat_write_data	= parport_ieee1284_write_compat,
+	.nibble_read_data	= parport_ieee1284_read_nibble,
+	.byte_read_data		= parport_ieee1284_read_byte,
+
+	.owner		= THIS_MODULE,
 };
 
 /* --- Initialisation code -------------------------------- */
@@ -123,18 +108,24 @@
 {
 	/* Archimedes hardware provides only one port, at a fixed address */
 	struct parport *p;
+	struct resource res;
+	char *fake_name = "parport probe");
 
-	if (check_region(PORT_BASE, 1))
+	res = request_region(PORT_BASE, 1, fake_name);
+	if (res == NULL)
 		return 0;
 
 	p = parport_register_port (PORT_BASE, IRQ_PRINTERACK,
 				   PARPORT_DMA_NONE, &parport_arc_ops);
 
-	if (!p)
+	if (!p) {
+		release_region(PORT_BASE, 1);
 		return 0;
+	}
 
 	p->modes = PARPORT_MODE_ARCSPP;
 	p->size = 1;
+	rename_region(res, p->name);
 
 	printk(KERN_INFO "%s: Archimedes on-board port, using irq %d\n",
 	       p->irq);
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/parport_atari.c linux-2.5.65-ac3/drivers/parport/parport_atari.c
--- linux-2.5.65-bk3/drivers/parport/parport_atari.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/parport_atari.c	2003-03-06 23:08:56.000000000 +0000
@@ -147,53 +147,40 @@
 #endif
 }
 
-static void
-parport_atari_inc_use_count(void)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void
-parport_atari_dec_use_count(void)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 static struct parport_operations parport_atari_ops = {
-	parport_atari_write_data,
-	parport_atari_read_data,
+	.write_data	= parport_atari_write_data,
+	.read_data	= parport_atari_read_data,
 
-	parport_atari_write_control,
-	parport_atari_read_control,
-	parport_atari_frob_control,
+	.write_control	= parport_atari_write_control,
+	.read_control	= parport_atari_read_control,
+	.frob_control	= parport_atari_frob_control,
 
-	parport_atari_read_status,
+	.read_status	= parport_atari_read_status,
 
-	parport_atari_enable_irq,
-	parport_atari_disable_irq,
+	.enable_irq	= parport_atari_enable_irq,
+	.disable_irq	= parport_atari_disable_irq,
 
-	parport_atari_data_forward,
-	parport_atari_data_reverse,
+	.data_forward	= parport_atari_data_forward,
+	.data_reverse	= parport_atari_data_reverse,
 
-	parport_atari_init_state,
-	parport_atari_save_state,
-	parport_atari_restore_state,
+	.init_state	= parport_atari_init_state,
+	.save_state	= parport_atari_save_state,
+	.restore_state	= parport_atari_restore_state,
 
-	parport_atari_inc_use_count,
-	parport_atari_dec_use_count,
+	.epp_write_data	= parport_ieee1284_epp_write_data,
+	.epp_read_data	= parport_ieee1284_epp_read_data,
+	.epp_write_addr	= parport_ieee1284_epp_write_addr,
+	.epp_read_addr	= parport_ieee1284_epp_read_addr,
 
-	parport_ieee1284_epp_write_data,
-	parport_ieee1284_epp_read_data,
-	parport_ieee1284_epp_write_addr,
-	parport_ieee1284_epp_read_addr,
+	.ecp_write_data	= parport_ieee1284_ecp_write_data,
+	.ecp_read_data	= parport_ieee1284_ecp_read_data,
+	.ecp_write_addr	= parport_ieee1284_ecp_write_addr,
 
-	parport_ieee1284_ecp_write_data,
-	parport_ieee1284_ecp_read_data,
-	parport_ieee1284_ecp_write_addr,
+	.compat_write_data	= parport_ieee1284_write_compat,
+	.nibble_read_data	= parport_ieee1284_read_nibble,
+	.byte_read_data		= parport_ieee1284_read_byte,
 
-	parport_ieee1284_write_compat,
-	parport_ieee1284_read_nibble,
-	parport_ieee1284_read_byte,
+	.owner		= THIS_MODULE,
 };
 
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/parport_gsc.c linux-2.5.65-ac3/drivers/parport/parport_gsc.c
--- linux-2.5.65-bk3/drivers/parport/parport_gsc.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/parport_gsc.c	2003-03-06 23:09:01.000000000 +0000
@@ -190,17 +190,6 @@
 	parport_writeb (s->u.pc.ctr, CONTROL (p));
 }
 
-void parport_gsc_inc_use_count(void)
-{
-	MOD_INC_USE_COUNT;
-}
-
-void parport_gsc_dec_use_count(void)
-{
-	MOD_DEC_USE_COUNT;
-}
-
-
 struct parport_operations parport_gsc_ops = 
 {
 	.write_data	= parport_gsc_write_data,
@@ -222,9 +211,6 @@
 	.save_state	= parport_gsc_save_state,
 	.restore_state	= parport_gsc_restore_state,
 
-	.inc_use_count	= parport_gsc_inc_use_count,
-	.dec_use_count	= parport_gsc_dec_use_count,
-
 	.epp_write_data	= parport_ieee1284_epp_write_data,
 	.epp_read_data	= parport_ieee1284_epp_read_data,
 	.epp_write_addr	= parport_ieee1284_epp_write_addr,
@@ -237,6 +223,8 @@
 	.compat_write_data 	= parport_ieee1284_write_compat,
 	.nibble_read_data	= parport_ieee1284_read_nibble,
 	.byte_read_data		= parport_ieee1284_read_byte,
+
+	.owner		= THIS_MODULE,
 };
 
 /* --- Mode detection ------------------------------------- */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/parport_mfc3.c linux-2.5.65-ac3/drivers/parport/parport_mfc3.c
--- linux-2.5.65-bk3/drivers/parport/parport_mfc3.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/parport_mfc3.c	2003-03-06 23:09:05.000000000 +0000
@@ -281,51 +281,40 @@
 	pia(p)->cra |= PIA_DDR;
 }
 
-static void mfc3_inc_use_count(void)
-{
-	MOD_INC_USE_COUNT;
-}
-
-static void mfc3_dec_use_count(void)
-{
-	MOD_DEC_USE_COUNT;
-}
-
 static struct parport_operations pp_mfc3_ops = {
-	mfc3_write_data,
-	mfc3_read_data,
+	.write_data	= mfc3_write_data,
+	.read_data	= mfc3_read_data,
 
-	mfc3_write_control,
-	mfc3_read_control,
-	mfc3_frob_control,
+	.write_control	= mfc3_write_control,
+	.read_control	= mfc3_read_control,
+	.frob_control	= mfc3_frob_control,
 
-	mfc3_read_status,
+	.read_status	= mfc3_read_status,
 
-	mfc3_enable_irq,
-	mfc3_disable_irq,
+	.enable_irq	= mfc3_enable_irq,
+	.disable_irq	= mfc3_disable_irq,
 
-	mfc3_data_forward, 
-	mfc3_data_reverse, 
+	.data_forward	= mfc3_data_forward, 
+	.data_reverse	= mfc3_data_reverse, 
 
-	mfc3_init_state,
-	mfc3_save_state,
-	mfc3_restore_state,
+	.init_state	= mfc3_init_state,
+	.save_state	= mfc3_save_state,
+	.restore_state	= mfc3_restore_state,
 
-	mfc3_inc_use_count,
-	mfc3_dec_use_count,
+	.epp_write_data	= parport_ieee1284_epp_write_data,
+	.epp_read_data	= parport_ieee1284_epp_read_data,
+	.epp_write_addr	= parport_ieee1284_epp_write_addr,
+	.epp_read_addr	= parport_ieee1284_epp_read_addr,
 
-	parport_ieee1284_epp_write_data,
-	parport_ieee1284_epp_read_data,
-	parport_ieee1284_epp_write_addr,
-	parport_ieee1284_epp_read_addr,
+	.ecp_write_data	= parport_ieee1284_ecp_write_data,
+	.ecp_read_data	= parport_ieee1284_ecp_read_data,
+	.ecp_write_addr	= parport_ieee1284_ecp_write_addr,
 
-	parport_ieee1284_ecp_write_data,
-	parport_ieee1284_ecp_read_data,
-	parport_ieee1284_ecp_write_addr,
+	.compat_write_data	= parport_ieee1284_write_compat,
+	.nibble_read_data	= parport_ieee1284_read_nibble,
+	.byte_read_data		= parport_ieee1284_read_byte,
 
-	parport_ieee1284_write_compat,
-	parport_ieee1284_read_nibble,
-	parport_ieee1284_read_byte,
+	.owner		= THIS_MODULE,
 };
 
 /* ----------- Initialisation code --------------------------------- */
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/parport_pc.c linux-2.5.65-ac3/drivers/parport/parport_pc.c
--- linux-2.5.65-bk3/drivers/parport/parport_pc.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/parport_pc.c	2003-03-06 23:08:41.000000000 +0000
@@ -1232,57 +1232,41 @@
  *	******************************************
  */
 
-
-void parport_pc_inc_use_count(void)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-void parport_pc_dec_use_count(void)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
-
 struct parport_operations parport_pc_ops = 
 {
-	parport_pc_write_data,
-	parport_pc_read_data,
+	.write_data	= parport_pc_write_data,
+	.read_data	= parport_pc_read_data,
 
-	parport_pc_write_control,
-	parport_pc_read_control,
-	parport_pc_frob_control,
+	.write_control	= parport_pc_write_control,
+	.read_control	= parport_pc_read_control,
+	.frob_control	= parport_pc_frob_control,
 
-	parport_pc_read_status,
+	.read_status	= parport_pc_read_status,
 
-	parport_pc_enable_irq,
-	parport_pc_disable_irq,
+	.enable_irq	= parport_pc_enable_irq,
+	.disable_irq	= parport_pc_disable_irq,
 
-	parport_pc_data_forward,
-	parport_pc_data_reverse,
+	.data_forward	= parport_pc_data_forward,
+	.data_reverse	= parport_pc_data_reverse,
 
-	parport_pc_init_state,
-	parport_pc_save_state,
-	parport_pc_restore_state,
+	.init_state	= parport_pc_init_state,
+	.save_state	= parport_pc_save_state,
+	.restore_state	= parport_pc_restore_state,
 
-	parport_pc_inc_use_count,
-	parport_pc_dec_use_count,
+	.epp_write_data	= parport_ieee1284_epp_write_data,
+	.epp_read_data	= parport_ieee1284_epp_read_data,
+	.epp_write_addr	= parport_ieee1284_epp_write_addr,
+	.epp_read_addr	= parport_ieee1284_epp_read_addr,
 
-	parport_ieee1284_epp_write_data,
-	parport_ieee1284_epp_read_data,
-	parport_ieee1284_epp_write_addr,
-	parport_ieee1284_epp_read_addr,
+	.ecp_write_data	= parport_ieee1284_ecp_write_data,
+	.ecp_read_data	= parport_ieee1284_ecp_read_data,
+	.ecp_write_addr	= parport_ieee1284_ecp_write_addr,
 
-	parport_ieee1284_ecp_write_data,
-	parport_ieee1284_ecp_read_data,
-	parport_ieee1284_ecp_write_addr,
+	.compat_write_data	= parport_ieee1284_write_compat,
+	.nibble_read_data	= parport_ieee1284_read_nibble,
+	.byte_read_data		= parport_ieee1284_read_byte,
 
-	parport_ieee1284_write_compat,
-	parport_ieee1284_read_nibble,
-	parport_ieee1284_read_byte,
+	.owner		= THIS_MODULE,
 };
 
 #ifdef CONFIG_PARPORT_PC_SUPERIO
@@ -2212,16 +2196,32 @@
 	struct parport tmp;
 	struct parport *p = &tmp;
 	int probedirq = PARPORT_IRQ_NONE;
-	if (check_region(base, 3)) return NULL;
+	struct resource *base_res;
+	struct resource	*ECR_res = NULL;
+	struct resource	*EPP_res = NULL;
+	char *fake_name = "parport probe";
+
+	/*
+	 * Chicken and Egg problem.  request_region() wants the name of
+	 * the owner, but this instance will not know that name until
+	 * after the parport_register_port() call.  Give request_region()
+	 * a fake name until after parport_register_port(), then use
+	 * rename_region() to set correct name.
+	 */
+	base_res = request_region(base, 3, fake_name);
+	if (base_res == NULL)
+		return NULL;
 	priv = kmalloc (sizeof (struct parport_pc_private), GFP_KERNEL);
 	if (!priv) {
 		printk (KERN_DEBUG "parport (0x%lx): no memory!\n", base);
+		release_region(base, 3);
 		return NULL;
 	}
 	ops = kmalloc (sizeof (struct parport_operations), GFP_KERNEL);
 	if (!ops) {
 		printk (KERN_DEBUG "parport (0x%lx): no memory for ops!\n",
 			base);
+		release_region(base, 3);
 		kfree (priv);
 		return NULL;
 	}
@@ -2242,32 +2242,39 @@
 	p->private_data = priv;
 	p->physport = p;
 
-	if (base_hi && !check_region(base_hi,3))
-		parport_ECR_present(p);
+	if (base_hi) {
+		ECR_res = request_region(base_hi, 3, fake_name);
+		if (ECR_res)
+			parport_ECR_present(p);
+	}
 
 	if (base != 0x3bc) {
-		if (!check_region(base+0x3, 5)) {
+		EPP_res = request_region(base+0x3, 5, fake_name);
+		if (EPP_res)
 			if (!parport_EPP_supported(p))
 				parport_ECPEPP_supported(p);
-		}
 	}
-	if (!parport_SPP_supported (p)) {
+	if (!parport_SPP_supported (p))
 		/* No port. */
-		kfree (priv);
-		kfree (ops);
-		return NULL;
-	}
+		goto errout;
 	if (priv->ecr)
 		parport_ECPPS2_supported(p);
 	else
 		parport_PS2_supported (p);
 
 	if (!(p = parport_register_port(base, PARPORT_IRQ_NONE,
-					PARPORT_DMA_NONE, ops))) {
-		kfree (priv);
-		kfree (ops);
-		return NULL;
-	}
+					PARPORT_DMA_NONE, ops)))
+		goto errout;
+
+	/*
+	 * Now the real name is known... Replace the fake name
+	 * in the resources with the correct one.
+	 */
+	rename_region(base_res, p->name);
+	if (ECR_res)
+		rename_region(ECR_res, p->name);
+	if (EPP_res)
+		rename_region(EPP_res, p->name);
 
 	p->base_hi = base_hi;
 	p->modes = tmp.modes;
@@ -2343,11 +2350,11 @@
 		printk(KERN_INFO "%s: irq %d detected\n", p->name, probedirq);
 	parport_proc_register(p);
 
-	request_region (p->base, 3, p->name);
-	if (p->size > 3)
-		request_region (p->base + 3, p->size - 3, p->name);
-	if (p->modes & PARPORT_MODE_ECP)
-		request_region (p->base_hi, 3, p->name);
+	/* If No ECP release the ports grabbed above. */
+	if (ECR_res && (p->modes & PARPORT_MODE_ECP) == 0) {
+		release_region(base_hi, 3);
+		ECR_res = NULL;
+	}
 
 	if (p->irq != PARPORT_IRQ_NONE) {
 		if (request_irq (p->irq, parport_pc_interrupt,
@@ -2401,6 +2408,17 @@
 	parport_announce_port (p);
 
 	return p;
+
+errout:
+	release_region(p->base, 3);
+	if (ECR_res)
+		release_region(base_hi, 3);
+	if (EPP_res)
+		release_region(base+0x3, 5);
+
+	kfree (priv);
+	kfree (ops);
+	return NULL;
 }
 
 void parport_pc_unregister_port (struct parport *p)
@@ -2437,9 +2455,11 @@
 					 int autodma)
 {
 	short inta_addr[6] = { 0x2A0, 0x2C0, 0x220, 0x240, 0x1E0 };
+	struct resource *base_res;
 	u32 ite8872set;
 	u32 ite8872_lpt, ite8872_lpthi;
 	u8 ite8872_irq, type;
+	char *fake_name = "parport probe";
 	int irq;
 	int i;
 
@@ -2447,7 +2467,8 @@
 	
 	// make sure which one chip
 	for(i = 0; i < 5; i++) {
-		if (check_region (inta_addr[i], 0x8) >= 0) {
+		base_res = request_region(inta_addr[i], 0x8, fake_name);
+		if (base_res) {
 			int test;
 			pci_write_config_dword (pdev, 0x60,
 						0xe7000000 | inta_addr[i]);
@@ -2455,6 +2476,7 @@
 						0x00000000 | inta_addr[i]);
 			test = inb (inta_addr[i]);
 			if (test != 0xff) break;
+			release_region(inta_addr[i], 0x8);
 		}
 	}
 	if(i >= 5) {
@@ -2515,6 +2537,10 @@
 	if (autoirq != PARPORT_IRQ_AUTO)
 		irq = PARPORT_IRQ_NONE;
 
+	/*
+	 * Release the resource so that parport_pc_probe_port can get it.
+	 */
+	release_resource(base_res);
 	if (parport_pc_probe_port (ite8872_lpt, ite8872_lpthi,
 				   irq, PARPORT_DMA_NONE, NULL)) {
 		printk (KERN_INFO
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/parport_sunbpp.c linux-2.5.65-ac3/drivers/parport/parport_sunbpp.c
--- linux-2.5.65-bk3/drivers/parport/parport_sunbpp.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/parport_sunbpp.c	2003-03-06 23:08:12.000000000 +0000
@@ -249,56 +249,41 @@
 	parport_sunbpp_write_control(p, s->u.pc.ctr);
 }
 
-static void parport_sunbpp_inc_use_count(void)
-{
-#ifdef MODULE
-	MOD_INC_USE_COUNT;
-#endif
-}
-
-static void parport_sunbpp_dec_use_count(void)
-{
-#ifdef MODULE
-	MOD_DEC_USE_COUNT;
-#endif
-}
-
 static struct parport_operations parport_sunbpp_ops = 
 {
-	parport_sunbpp_write_data,
-	parport_sunbpp_read_data,
+	.write_data	= parport_sunbpp_write_data,
+	.read_data	= parport_sunbpp_read_data,
 
-	parport_sunbpp_write_control,
-	parport_sunbpp_read_control,
-	parport_sunbpp_frob_control,
+	.write_control	= parport_sunbpp_write_control,
+	.read_control	= parport_sunbpp_read_control,
+	.frob_control	= parport_sunbpp_frob_control,
 
-	parport_sunbpp_read_status,
+	.read_status	= parport_sunbpp_read_status,
 
-	parport_sunbpp_enable_irq,
-        parport_sunbpp_disable_irq,
+	.enable_irq	= parport_sunbpp_enable_irq,
+	.disable_irq	= parport_sunbpp_disable_irq,
 
-        parport_sunbpp_data_forward,
-        parport_sunbpp_data_reverse,
+	.data_forward	= parport_sunbpp_data_forward,
+	.data_reverse	= parport_sunbpp_data_reverse,
 
-        parport_sunbpp_init_state,
-        parport_sunbpp_save_state,
-        parport_sunbpp_restore_state,
+	.init_state	= parport_sunbpp_init_state,
+	.save_state	= parport_sunbpp_save_state,
+	.restore_state	= parport_sunbpp_restore_state,
 
-        parport_sunbpp_inc_use_count,
-        parport_sunbpp_dec_use_count,
+	.epp_write_data	= parport_ieee1284_epp_write_data,
+	.epp_read_data	= parport_ieee1284_epp_read_data,
+	.epp_write_addr	= parport_ieee1284_epp_write_addr,
+	.epp_read_addr	= parport_ieee1284_epp_read_addr,
 
-        parport_ieee1284_epp_write_data,
-        parport_ieee1284_epp_read_data,
-        parport_ieee1284_epp_write_addr,
-        parport_ieee1284_epp_read_addr,
+	.ecp_write_data	= parport_ieee1284_ecp_write_data,
+	.ecp_read_data	= parport_ieee1284_ecp_read_data,
+	.ecp_write_addr	= parport_ieee1284_ecp_write_addr,
 
-        parport_ieee1284_ecp_write_data,
-        parport_ieee1284_ecp_read_data,
-        parport_ieee1284_ecp_write_addr,
+	.compat_write_data	= parport_ieee1284_write_compat,
+	.nibble_read_data	= parport_ieee1284_read_nibble,
+	.byte_read_data		= parport_ieee1284_read_byte,
 
-        parport_ieee1284_write_compat,
-        parport_ieee1284_read_nibble,
-        parport_ieee1284_read_byte,
+	.owner		= THIS_MODULE,
 };
 
 static int __init init_one_port(struct sbus_dev *sdev)
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/drivers/parport/share.c linux-2.5.65-ac3/drivers/parport/share.c
--- linux-2.5.65-bk3/drivers/parport/share.c	2003-03-22 19:33:50.000000000 +0000
+++ linux-2.5.65-ac3/drivers/parport/share.c	2003-03-06 23:08:36.000000000 +0000
@@ -55,37 +55,44 @@
 static void dead_onearg (struct parport *p){}
 static void dead_initstate (struct pardevice *d, struct parport_state *s) { }
 static void dead_state (struct parport *p, struct parport_state *s) { }
-static void dead_noargs (void) { }
 static size_t dead_write (struct parport *p, const void *b, size_t l, int f)
 { return 0; }
 static size_t dead_read (struct parport *p, void *b, size_t l, int f)
 { return 0; }
 static struct parport_operations dead_ops = {
-	dead_write_lines,	/* data */
-	dead_read_lines,
-	dead_write_lines,	/* control */
-	dead_read_lines,
-	dead_frob_lines,
-	dead_read_lines,	/* status */
-	dead_onearg,		/* enable_irq */
-	dead_onearg,		/* disable_irq */
-	dead_onearg,		/* data_forward */
-	dead_onearg,		/* data_reverse */
-	dead_initstate,		/* init_state */
-	dead_state,
-	dead_state,
-	dead_noargs,		/* xxx_use_count */
-	dead_noargs,
-	dead_write,		/* epp */
-	dead_read,
-	dead_write,
-	dead_read,
-	dead_write,		/* ecp */
-	dead_read,
-	dead_write,
-	dead_write,		/* compat */
-	dead_read,		/* nibble */
-	dead_read		/* byte */
+	.write_data	= dead_write_lines,	/* data */
+	.read_data	= dead_read_lines,
+
+	.write_control	= dead_write_lines,	/* control */
+	.read_control	= dead_read_lines,
+	.frob_control	= dead_frob_lines,
+
+	.read_status	= dead_read_lines,	/* status */
+
+	.enable_irq	= dead_onearg,		/* enable_irq */
+	.disable_irq	= dead_onearg,		/* disable_irq */
+
+	.data_forward	= dead_onearg,		/* data_forward */
+	.data_reverse	= dead_onearg,		/* data_reverse */
+
+	.init_state	= dead_initstate,	/* init_state */
+	.save_state	= dead_state,
+	.restore_state	= dead_state,
+
+	.epp_write_data	= dead_write,		/* epp */
+	.epp_read_data	= dead_read,
+	.epp_write_addr	= dead_write,
+	.epp_read_addr	= dead_read,
+
+	.ecp_write_data	= dead_write,		/* ecp */
+	.ecp_read_data	= dead_read,
+	.ecp_write_addr	= dead_write,
+ 
+	.compat_write_data	= dead_write,	/* compat */
+	.nibble_read_data	= dead_read,	/* nibble */
+	.byte_read_data		= dead_read,	/* byte */
+
+	.owner		= NULL,
 };
 
 /* Call attach(port) for each registered driver. */
@@ -390,25 +397,6 @@
 		return NULL;
 	}
 
-	/* Search for the lowest free parport number. */
-
-	spin_lock_irq (&parportlist_lock);
-	for (portnum = 0; ; portnum++) {
-		struct parport *itr = portlist;
-		while (itr) {
-			if (itr->number == portnum)
-				/* No good, already used. */
-				break;
-			else
-				itr = itr->next;
-		}
-
-		if (itr == NULL)
-			/* Got to the end of the list. */
-			break;
-	}
-	spin_unlock_irq (&parportlist_lock);
-	
 	/* Init our structure */
  	memset(tmp, 0, sizeof(struct parport));
 	tmp->base = base;
@@ -420,7 +408,6 @@
 	tmp->devices = tmp->cad = NULL;
 	tmp->flags = 0;
 	tmp->ops = ops;
-	tmp->portnum = tmp->number = portnum;
 	tmp->physport = tmp;
 	memset (tmp->probe_info, 0, 5 * sizeof (struct parport_device_info));
 	tmp->cad_lock = RW_LOCK_UNLOCKED;
@@ -438,9 +425,32 @@
 		kfree(tmp);
 		return NULL;
 	}
+	/* Search for the lowest free parport number. */
+
+	spin_lock_irq (&parportlist_lock);
+	for (portnum = 0; ; portnum++) {
+		struct parport *itr = portlist;
+		while (itr) {
+			if (itr->number == portnum)
+				/* No good, already used. */
+				break;
+			else
+				itr = itr->next;
+		}
+
+		if (itr == NULL)
+			/* Got to the end of the list. */
+			break;
+	}
+
+	/*
+	 * Now that the portnum is known finish doing the Init.
+	 */
+	tmp->portnum = tmp->number = portnum;
 	sprintf(name, "parport%d", portnum);
 	tmp->name = name;
 
+	
 	/*
 	 * Chain the entry to our list.
 	 *
@@ -448,8 +458,6 @@
 	 * to clear irq on the local CPU. -arca
 	 */
 
-	spin_lock(&parportlist_lock);
-
 	/* We are locked against anyone else performing alterations, but
 	 * because of parport_enumerate people can still _read_ the list
 	 * while we are changing it; so be careful..
@@ -664,8 +672,10 @@
            kmalloc.  To be absolutely safe, we have to require that
            our caller doesn't sleep in between parport_enumerate and
            parport_register_device.. */
-	inc_parport_count();
-	port->ops->inc_use_count();
+	if (!try_module_get(port->ops->owner)) {
+		return NULL;
+	}
+		
 	parport_get_port (port);
 
 	tmp = kmalloc(sizeof(struct pardevice), GFP_KERNEL);
@@ -736,9 +746,9 @@
  out_free_pardevice:
 	kfree (tmp);
  out:
-	dec_parport_count();
-	port->ops->dec_use_count();
 	parport_put_port (port);
+	module_put(port->ops->owner);
+
 	return NULL;
 }
 
@@ -801,8 +811,7 @@
 	kfree(dev->state);
 	kfree(dev);
 
-	dec_parport_count();
-	port->ops->dec_use_count();
+	module_put(port->ops->owner);
 	parport_put_port (port);
 
 	/* Yes, that's right, someone _could_ still have a pointer to
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/include/linux/parport.h linux-2.5.65-ac3/include/linux/parport.h
--- linux-2.5.65-bk3/include/linux/parport.h	2003-03-22 19:34:04.000000000 +0000
+++ linux-2.5.65-ac3/include/linux/parport.h	2003-03-06 23:08:36.000000000 +0000
@@ -166,9 +166,6 @@
 	void (*save_state)(struct parport *, struct parport_state *);
 	void (*restore_state)(struct parport *, struct parport_state *);
 
-	void (*inc_use_count)(void);
-	void (*dec_use_count)(void);
-
 	/* Block read/write */
 	size_t (*epp_write_data) (struct parport *port, const void *buf,
 				  size_t len, int flags);
@@ -192,6 +189,7 @@
 				    size_t len, int flags);
 	size_t (*byte_read_data) (struct parport *port, void *buf,
 				  size_t len, int flags);
+	struct module *owner;
 };
 
 struct parport_device_info {
@@ -541,9 +539,6 @@
 extern int parport_default_proc_register(void);
 extern int parport_default_proc_unregister(void);
 
-extern void dec_parport_count(void);
-extern void inc_parport_count(void);
-
 /* If PC hardware is the only type supported, we can optimise a bit.  */
 #if (defined(CONFIG_PARPORT_PC) || defined(CONFIG_PARPORT_PC_MODULE)) && !(defined(CONFIG_PARPORT_ARC) || defined(CONFIG_PARPORT_ARC_MODULE)) && !(defined(CONFIG_PARPORT_AMIGA) || defined(CONFIG_PARPORT_AMIGA_MODULE)) && !(defined(CONFIG_PARPORT_MFC3) || defined(CONFIG_PARPORT_MFC3_MODULE)) && !(defined(CONFIG_PARPORT_ATARI) || defined(CONFIG_PARPORT_ATARI_MODULE)) && !(defined(CONFIG_USB_USS720) || defined(CONFIG_USB_USS720_MODULE)) && !(defined(CONFIG_PARPORT_SUNBPP) || defined(CONFIG_PARPORT_SUNBPP_MODULE)) && !defined(CONFIG_PARPORT_OTHER)
 
diff -u --new-file --recursive --exclude-from /usr/src/exclude linux-2.5.65-bk3/include/linux/parport_pc.h linux-2.5.65-ac3/include/linux/parport_pc.h
--- linux-2.5.65-bk3/include/linux/parport_pc.h	2003-03-22 19:34:04.000000000 +0000
+++ linux-2.5.65-ac3/include/linux/parport_pc.h	2003-03-06 23:08:41.000000000 +0000
@@ -215,10 +215,6 @@
 
 extern void parport_pc_restore_state(struct parport *p, struct parport_state *s);
 
-extern void parport_pc_inc_use_count(void);
-
-extern void parport_pc_dec_use_count(void);
-
 /* PCMCIA code will want to get us to look at a port.  Provide a mechanism. */
 extern struct parport *parport_pc_probe_port (unsigned long base,
 					      unsigned long base_hi,

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] parallel port
  2003-03-23  0:00 PATCH: parallel port Alan Cox
@ 2003-03-23  3:21 ` Linus Torvalds
  2003-03-23  8:22   ` Adrian Bunk
  2003-03-23 15:43   ` Alan Cox
  0 siblings, 2 replies; 6+ messages in thread
From: Linus Torvalds @ 2003-03-23  3:21 UTC (permalink / raw)
  To: Alan Cox; +Cc: linux-kernel


This one causes 

	drivers/parport/parport_pc.c:2273: warning: implicit declaration of function `rename_region'
	drivers/built-in.o(.text+0x77a8c): In function `parport_pc_probe_port':
	: undefined reference to `rename_region'

for me. I think I complained about that once before already. Tssk, tssk.

		Linus


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] parallel port
  2003-03-23  3:21 ` [PATCH] " Linus Torvalds
@ 2003-03-23  8:22   ` Adrian Bunk
  2003-03-23  8:27     ` Linus Torvalds
  2003-03-23 10:50     ` Arjan van de Ven
  2003-03-23 15:43   ` Alan Cox
  1 sibling, 2 replies; 6+ messages in thread
From: Adrian Bunk @ 2003-03-23  8:22 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Alan Cox, linux-kernel

On Sat, Mar 22, 2003 at 07:21:11PM -0800, Linus Torvalds wrote:

> This one causes 
> 
> 	drivers/parport/parport_pc.c:2273: warning: implicit declaration of function `rename_region'
> 	drivers/built-in.o(.text+0x77a8c): In function `parport_pc_probe_port':
> 	: undefined reference to `rename_region'
> 
> for me. I think I complained about that once before already. Tssk, tssk.

It's perhaps a silly question:
Why did you use a "do ... while  (0)" in your fix?

> 		Linus

cu
Adrian

-- 

       "Is there not promise of rain?" Ling Tan asked suddenly out
        of the darkness. There had been need of rain for many days.
       "Only a promise," Lao Er said.
                                       Pearl S. Buck - Dragon Seed


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] parallel port
  2003-03-23  8:22   ` Adrian Bunk
@ 2003-03-23  8:27     ` Linus Torvalds
  2003-03-23 10:50     ` Arjan van de Ven
  1 sibling, 0 replies; 6+ messages in thread
From: Linus Torvalds @ 2003-03-23  8:27 UTC (permalink / raw)
  To: Adrian Bunk; +Cc: Alan Cox, linux-kernel


On Sun, 23 Mar 2003, Adrian Bunk wrote:
> > 
> > for me. I think I complained about that once before already. Tssk, tssk.
> 
> It's perhaps a silly question:
> Why did you use a "do ... while  (0)" in your fix?

I always do that (well, almost always), just because it protects macros 
from being mis-used.

For example, if you have

	#define macro(x) ((x) = 3)

that _looks_ safe, but it allows people to write

	x++ = macro(x);

or similar nonsense. So if you want a macro that always behaves like a 
statement (and can't be used as an expression), the "do { } while (0)" 
will do that.

[ The real answer is that it's so built in to my spine, that I just can't 
  stop myself. Even if it doesn't really matter. ]

			Linus


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] parallel port
  2003-03-23  8:22   ` Adrian Bunk
  2003-03-23  8:27     ` Linus Torvalds
@ 2003-03-23 10:50     ` Arjan van de Ven
  1 sibling, 0 replies; 6+ messages in thread
From: Arjan van de Ven @ 2003-03-23 10:50 UTC (permalink / raw)
  To: Adrian Bunk; +Cc: Linus Torvalds, Alan Cox, linux-kernel

[-- Attachment #1: Type: text/plain, Size: 625 bytes --]

On Sun, 2003-03-23 at 09:22, Adrian Bunk wrote:
> On Sat, Mar 22, 2003 at 07:21:11PM -0800, Linus Torvalds wrote:
> 
> > This one causes 
> > 
> > 	drivers/parport/parport_pc.c:2273: warning: implicit declaration of function `rename_region'
> > 	drivers/built-in.o(.text+0x77a8c): In function `parport_pc_probe_port':
> > 	: undefined reference to `rename_region'
> > 
> > for me. I think I complained about that once before already. Tssk, tssk.
> 
> It's perhaps a silly question:
> Why did you use a "do ... while  (0)" in your fix?

http://www.kernelnewbies.org/faq/index.php3#dowhile

more details there

[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 189 bytes --]

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] parallel port
  2003-03-23  3:21 ` [PATCH] " Linus Torvalds
  2003-03-23  8:22   ` Adrian Bunk
@ 2003-03-23 15:43   ` Alan Cox
  1 sibling, 0 replies; 6+ messages in thread
From: Alan Cox @ 2003-03-23 15:43 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Linux Kernel Mailing List

On Sun, 2003-03-23 at 03:21, Linus Torvalds wrote:
> This one causes 
> 
> 	drivers/parport/parport_pc.c:2273: warning: implicit declaration of function `rename_region'
> 	drivers/built-in.o(.text+0x77a8c): In function `parport_pc_probe_port':
> 	: undefined reference to `rename_region'
> 
> for me. I think I complained about that once before already. Tssk, tssk.

Argh, my fault. The original patch I merged does indeed have rename_region as well but
I missed the requirement


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2003-03-23 14:20 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-03-23  0:00 PATCH: parallel port Alan Cox
2003-03-23  3:21 ` [PATCH] " Linus Torvalds
2003-03-23  8:22   ` Adrian Bunk
2003-03-23  8:27     ` Linus Torvalds
2003-03-23 10:50     ` Arjan van de Ven
2003-03-23 15:43   ` Alan Cox

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®