public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Vojtech Pavlik <vojtech@ucw.cz>
To: Dmitry Torokhov <dtor_core@ameritech.net>
Cc: Stephen Evanchik <evanchsa@gmail.com>, linux-kernel@vger.kernel.org
Subject: Re: [PATCH 2.6.11-rc3] IBM Trackpoint support
Date: Sat, 5 Feb 2005 13:24:05 +0100	[thread overview]
Message-ID: <20050205122405.GA2331@ucw.cz> (raw)
In-Reply-To: <200502050156.09237.dtor_core@ameritech.net>

On Sat, Feb 05, 2005 at 01:56:07AM -0500, Dmitry Torokhov wrote:
> On Friday 04 February 2005 09:45, Vojtech Pavlik wrote:
> > On Fri, Feb 04, 2005 at 09:17:33AM -0500, Dmitry Torokhov wrote:
> >  
> > > It is still a problem if driver is registered after the port has been
> > > detected wich quite often is the case as many people have psmouse as a
> > > module.
> > > 
> > > I wonder if we should make driver registration asynchronous too.
> > 
> > Probably yes.
> > 
> > > I
> > > don't forsee any issues providing that I bump up module's reference
> > > count while driver structure is "in flight", do you?
> >  
> > No, looks OK to me, too.
> 
> Ok, what about the following patch then?

Applied. ;)

> 
> -- 
> Dmitry
> 
> 
> ===================================================================
> 
> 
> ChangeSet@1.2005, 2005-02-05 01:48:45-05:00, dtor_core@ameritech.net
>   Input: make serio drivers register asynchronously. This should
>          speed up boot process as some drivers take a long time
>          probing for supported devices.
>   
>          Also change __inline__ to inline in serio.h
>   
>   Signed-off-by: Dmitry Torokhov <dtor@mail.ru>
> 
> 
>  drivers/input/serio/serio.c |   65 ++++++++++++++++++++++++--------------------
>  include/linux/serio.h       |   25 ++++++++++------
>  2 files changed, 51 insertions(+), 39 deletions(-)
> 
> 
> ===================================================================
> 
> 
> 
> diff -Nru a/drivers/input/serio/serio.c b/drivers/input/serio/serio.c
> --- a/drivers/input/serio/serio.c	2005-02-05 01:53:56 -05:00
> +++ b/drivers/input/serio/serio.c	2005-02-05 01:53:56 -05:00
> @@ -44,7 +44,7 @@
>  EXPORT_SYMBOL(__serio_register_port);
>  EXPORT_SYMBOL(serio_unregister_port);
>  EXPORT_SYMBOL(__serio_unregister_port_delayed);
> -EXPORT_SYMBOL(serio_register_driver);
> +EXPORT_SYMBOL(__serio_register_driver);
>  EXPORT_SYMBOL(serio_unregister_driver);
>  EXPORT_SYMBOL(serio_open);
>  EXPORT_SYMBOL(serio_close);
> @@ -120,18 +120,19 @@
>   * Serio event processing.
>   */
>  
> -struct serio_event {
> -	int type;
> -	struct serio *serio;
> -	struct module *owner;
> -	struct list_head node;
> -};
> -
>  enum serio_event_type {
>  	SERIO_RESCAN,
>  	SERIO_RECONNECT,
>  	SERIO_REGISTER_PORT,
>  	SERIO_UNREGISTER_PORT,
> +	SERIO_REGISTER_DRIVER,
> +};
> +
> +struct serio_event {
> +	enum serio_event_type type;
> +	void *object;
> +	struct module *owner;
> +	struct list_head node;
>  };
>  
>  static DEFINE_SPINLOCK(serio_event_lock);	/* protects serio_event_list */
> @@ -140,7 +141,7 @@
>  static DECLARE_COMPLETION(serio_exited);
>  static int serio_pid;
>  
> -static void serio_queue_event(struct serio *serio, struct module *owner,
> +static void serio_queue_event(void *object, struct module *owner,
>  			      enum serio_event_type event_type)
>  {
>  	unsigned long flags;
> @@ -156,7 +157,7 @@
>  	 * we need to preseve sequence of distinct events.
>   	 */
>  	list_for_each_entry_reverse(event, &serio_event_list, node) {
> -		if (event->serio == serio) {
> +		if (event->object == object) {
>  			if (event->type == event_type)
>  				goto out;
>  			break;
> @@ -170,7 +171,7 @@
>  		}
>  
>  		event->type = event_type;
> -		event->serio = serio;
> +		event->object = object;
>  		event->owner = owner;
>  
>  		list_add_tail(&event->node, &serio_event_list);
> @@ -198,7 +199,7 @@
>  
>  	list_for_each_safe(node, next, &serio_event_list) {
>  		e = list_entry(node, struct serio_event, node);
> -		if (event->serio == e->serio) {
> +		if (event->object == e->object) {
>  			/*
>  			 * If this event is of different type we should not
>  			 * look further - we only suppress duplicate events
> @@ -241,6 +242,7 @@
>  static void serio_handle_events(void)
>  {
>  	struct serio_event *event;
> +	struct serio_driver *serio_drv;
>  
>  	down(&serio_sem);
>  
> @@ -248,21 +250,26 @@
>  
>  		switch (event->type) {
>  			case SERIO_REGISTER_PORT:
> -				serio_add_port(event->serio);
> +				serio_add_port(event->object);
>  				break;
>  
>  			case SERIO_UNREGISTER_PORT:
> -				serio_disconnect_port(event->serio);
> -				serio_destroy_port(event->serio);
> +				serio_disconnect_port(event->object);
> +				serio_destroy_port(event->object);
>  				break;
>  
>  			case SERIO_RECONNECT:
> -				serio_reconnect_port(event->serio);
> +				serio_reconnect_port(event->object);
>  				break;
>  
>  			case SERIO_RESCAN:
> -				serio_disconnect_port(event->serio);
> -				serio_find_driver(event->serio);
> +				serio_disconnect_port(event->object);
> +				serio_find_driver(event->object);
> +				break;
> +
> +			case SERIO_REGISTER_DRIVER:
> +				serio_drv = event->object;
> +				driver_register(&serio_drv->driver);
>  				break;
>  
>  			default:
> @@ -289,7 +296,7 @@
>  
>  	list_for_each_safe(node, next, &serio_event_list) {
>  		event = list_entry(node, struct serio_event, node);
> -		if (event->serio == serio) {
> +		if (event->object == serio) {
>  			list_del_init(node);
>  			serio_free_event(event);
>  		}
> @@ -309,20 +316,23 @@
>  static struct serio *serio_get_pending_child(struct serio *parent)
>  {
>  	struct serio_event *event;
> -	struct serio *serio = NULL;
> +	struct serio *serio, *child = NULL;
>  	unsigned long flags;
>  
>  	spin_lock_irqsave(&serio_event_lock, flags);
>  
>  	list_for_each_entry(event, &serio_event_list, node) {
> -		if (event->type == SERIO_REGISTER_PORT && event->serio->parent == parent) {
> -			serio = event->serio;
> -			break;
> +		if (event->type == SERIO_REGISTER_PORT) {
> +			serio = event->object;
> +			if (serio->parent == parent) {
> +				child = serio;
> +				break;
> +			}
>  		}
>  	}
>  
>  	spin_unlock_irqrestore(&serio_event_lock, flags);
> -	return serio;
> +	return child;
>  }
>  
>  static int serio_thread(void *nothing)
> @@ -672,16 +682,13 @@
>  	return 0;
>  }
>  
> -void serio_register_driver(struct serio_driver *drv)
> +void __serio_register_driver(struct serio_driver *drv, struct module *owner)
>  {
> -	down(&serio_sem);
> -
>  	drv->driver.bus = &serio_bus;
>  	drv->driver.probe = serio_driver_probe;
>  	drv->driver.remove = serio_driver_remove;
> -	driver_register(&drv->driver);
>  
> -	up(&serio_sem);
> +	serio_queue_event(drv, owner, SERIO_REGISTER_DRIVER);
>  }
>  
>  void serio_unregister_driver(struct serio_driver *drv)
> diff -Nru a/include/linux/serio.h b/include/linux/serio.h
> --- a/include/linux/serio.h	2005-02-05 01:53:56 -05:00
> +++ b/include/linux/serio.h	2005-02-05 01:53:56 -05:00
> @@ -95,10 +95,15 @@
>  	__serio_unregister_port_delayed(serio, THIS_MODULE);
>  }
>  
> -void serio_register_driver(struct serio_driver *drv);
> +void __serio_register_driver(struct serio_driver *drv, struct module *owner);
> +static inline void serio_register_driver(struct serio_driver *drv)
> +{
> +	__serio_register_driver(drv, THIS_MODULE);
> +}
> +
>  void serio_unregister_driver(struct serio_driver *drv);
>  
> -static __inline__ int serio_write(struct serio *serio, unsigned char data)
> +static inline int serio_write(struct serio *serio, unsigned char data)
>  {
>  	if (serio->write)
>  		return serio->write(serio, data);
> @@ -106,13 +111,13 @@
>  		return -1;
>  }
>  
> -static __inline__ void serio_drv_write_wakeup(struct serio *serio)
> +static inline void serio_drv_write_wakeup(struct serio *serio)
>  {
>  	if (serio->drv && serio->drv->write_wakeup)
>  		serio->drv->write_wakeup(serio);
>  }
>  
> -static __inline__ void serio_cleanup(struct serio *serio)
> +static inline void serio_cleanup(struct serio *serio)
>  {
>  	if (serio->drv && serio->drv->cleanup)
>  		serio->drv->cleanup(serio);
> @@ -122,12 +127,12 @@
>   * Use the following fucntions to manipulate serio's per-port
>   * driver-specific data.
>   */
> -static __inline__ void *serio_get_drvdata(struct serio *serio)
> +static inline void *serio_get_drvdata(struct serio *serio)
>  {
>  	return dev_get_drvdata(&serio->dev);
>  }
>  
> -static __inline__ void serio_set_drvdata(struct serio *serio, void *data)
> +static inline void serio_set_drvdata(struct serio *serio, void *data)
>  {
>  	dev_set_drvdata(&serio->dev, data);
>  }
> @@ -136,12 +141,12 @@
>   * Use the following fucntions to protect critical sections in
>   * driver code from port's interrupt handler
>   */
> -static __inline__ void serio_pause_rx(struct serio *serio)
> +static inline void serio_pause_rx(struct serio *serio)
>  {
>  	spin_lock_irq(&serio->lock);
>  }
>  
> -static __inline__ void serio_continue_rx(struct serio *serio)
> +static inline void serio_continue_rx(struct serio *serio)
>  {
>  	spin_unlock_irq(&serio->lock);
>  }
> @@ -149,12 +154,12 @@
>  /*
>   * Use the following fucntions to pin serio's driver in process context
>   */
> -static __inline__ int serio_pin_driver(struct serio *serio)
> +static inline int serio_pin_driver(struct serio *serio)
>  {
>  	return down_interruptible(&serio->drv_sem);
>  }
>  
> -static __inline__ void serio_unpin_driver(struct serio *serio)
> +static inline void serio_unpin_driver(struct serio *serio)
>  {
>  	up(&serio->drv_sem);
>  }
> 

-- 
Vojtech Pavlik
SuSE Labs, SuSE CR

  reply	other threads:[~2005-02-05 12:28 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-02-03 22:43 [PATCH 2.6.11-rc3] IBM Trackpoint support Stephen Evanchik
2005-02-04  0:34 ` Dmitry Torokhov
2005-02-04  3:52   ` Dmitry Torokhov
2005-02-04  4:39     ` Stephen Evanchik
2005-02-13 19:13     ` Stephen Evanchik
2005-02-13 19:31       ` Vojtech Pavlik
2005-02-13 20:31         ` Stephen Evanchik
2005-02-13 23:50       ` Dmitry Torokhov
2005-02-04  6:35   ` Vojtech Pavlik
2005-02-04  6:46     ` Fabio Massimo Di Nitto
2005-02-04  6:52     ` Dmitry Torokhov
2005-02-04  6:54       ` Vojtech Pavlik
2005-02-04 14:17         ` Dmitry Torokhov
2005-02-04 14:45           ` Vojtech Pavlik
2005-02-05  6:56             ` Dmitry Torokhov
2005-02-05 12:24               ` Vojtech Pavlik [this message]
2005-02-04 13:17     ` Stephen Evanchik
2005-02-04 13:45       ` Vojtech Pavlik
2005-02-04 14:12         ` Dmitry Torokhov
2005-02-05 10:44 ` Pavel Machek
2005-02-07 10:14   ` Vojtech Pavlik
2005-02-13 19:07     ` Stephen Evanchik
2005-02-13 19:13       ` Vojtech Pavlik
2005-02-06 20:17 ` Domen Puncer

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20050205122405.GA2331@ucw.cz \
    --to=vojtech@ucw.cz \
    --cc=dtor_core@ameritech.net \
    --cc=evanchsa@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox