All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Len Brown <lenb@kernel.org>, Matthew Garrett <mjg@redhat.com>
Cc: Alan Stern <stern@rowland.harvard.edu>,
	Bjorn Helgaas <bjorn.helgaas@hp.com>,
	linux-acpi@vger.kernel.org,
	Andrew Morton <akpm@linux-foundation.org>
Subject: Re: [PATCH] PNPACPI: add support for remote wakeup
Date: Sat, 12 Jun 2010 23:44:00 +0200	[thread overview]
Message-ID: <201006122344.00576.rjw@sisk.pl> (raw)
In-Reply-To: <Pine.LNX.4.44L0.1006071645090.18836-100000@iolanthe.rowland.org>

On Monday, June 07, 2010, Alan Stern wrote:
> This patch (as1354) adds remote-wakeup support to the pnpacpi driver.
> The new can_wakeup method also allows other PNP protocol drivers
> (pnpbios or iaspnp) to add wakeup support, but I don't know enough
> about how they work to actually do it.
> 
> Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
> Reviewed-by: Bjorn Helgaas <bjorn.helgaas@hp.com>
> Acked-by: Rafael J. Wysocki <rjw@sisk.pl>

Len, Matthew, is anyone going to merge this patch?  It looks entirely correct
and useful.

Or should I take it?

Rafael


> ---
> 
> Len, this patch seems to have gotten lost in the shuffle, so I'm 
> submitting it again.
> 
> Alan Stern
> 
> 
> 
> Index: usb-2.6/include/linux/pnp.h
> ===================================================================
> --- usb-2.6.orig/include/linux/pnp.h
> +++ usb-2.6/include/linux/pnp.h
> @@ -414,6 +414,7 @@ struct pnp_protocol {
>  	int (*disable) (struct pnp_dev *dev);
>  
>  	/* protocol specific suspend/resume */
> +	bool (*can_wakeup) (struct pnp_dev *dev);
>  	int (*suspend) (struct pnp_dev * dev, pm_message_t state);
>  	int (*resume) (struct pnp_dev * dev);
>  
> Index: usb-2.6/drivers/pnp/core.c
> ===================================================================
> --- usb-2.6.orig/drivers/pnp/core.c
> +++ usb-2.6/drivers/pnp/core.c
> @@ -164,6 +164,9 @@ int __pnp_add_device(struct pnp_dev *dev
>  	list_add_tail(&dev->global_list, &pnp_global);
>  	list_add_tail(&dev->protocol_list, &dev->protocol->devices);
>  	spin_unlock(&pnp_lock);
> +	if (dev->protocol->can_wakeup)
> +		device_set_wakeup_capable(&dev->dev,
> +				dev->protocol->can_wakeup(dev));
>  	return device_register(&dev->dev);
>  }
>  
> Index: usb-2.6/drivers/pnp/pnpacpi/core.c
> ===================================================================
> --- usb-2.6.orig/drivers/pnp/pnpacpi/core.c
> +++ usb-2.6/drivers/pnp/pnpacpi/core.c
> @@ -121,17 +121,37 @@ static int pnpacpi_disable_resources(str
>  }
>  
>  #ifdef CONFIG_ACPI_SLEEP
> +static bool pnpacpi_can_wakeup(struct pnp_dev *dev)
> +{
> +	struct acpi_device *acpi_dev = dev->data;
> +	acpi_handle handle = acpi_dev->handle;
> +
> +	return acpi_bus_can_wakeup(handle);
> +}
> +
>  static int pnpacpi_suspend(struct pnp_dev *dev, pm_message_t state)
>  {
>  	struct acpi_device *acpi_dev = dev->data;
>  	acpi_handle handle = acpi_dev->handle;
>  	int power_state;
>  
> +	if (device_can_wakeup(&dev->dev)) {
> +		int rc = acpi_pm_device_sleep_wake(&dev->dev,
> +				device_may_wakeup(&dev->dev));
> +
> +		if (rc)
> +			return rc;
> +	}
>  	power_state = acpi_pm_device_sleep_state(&dev->dev, NULL);
>  	if (power_state < 0)
>  		power_state = (state.event == PM_EVENT_ON) ?
>  				ACPI_STATE_D0 : ACPI_STATE_D3;
>  
> +	/* acpi_bus_set_power() often fails (keyboard port can't be
> +	 * powered-down?), and in any case, our return value is ignored
> +	 * by pnp_bus_suspend().  Hence we don't revert the wakeup
> +	 * setting if the set_power fails.
> +	 */
>  	return acpi_bus_set_power(handle, power_state);
>  }
>  
> @@ -140,6 +160,8 @@ static int pnpacpi_resume(struct pnp_dev
>  	struct acpi_device *acpi_dev = dev->data;
>  	acpi_handle handle = acpi_dev->handle;
>  
> +	if (device_may_wakeup(&dev->dev))
> +		acpi_pm_device_sleep_wake(&dev->dev, false);
>  	return acpi_bus_set_power(handle, ACPI_STATE_D0);
>  }
>  #endif
> @@ -150,6 +172,7 @@ struct pnp_protocol pnpacpi_protocol = {
>  	.set	 = pnpacpi_set_resources,
>  	.disable = pnpacpi_disable_resources,
>  #ifdef CONFIG_ACPI_SLEEP
> +	.can_wakeup = pnpacpi_can_wakeup,
>  	.suspend = pnpacpi_suspend,
>  	.resume = pnpacpi_resume,
>  #endif

  reply	other threads:[~2010-06-12 21:45 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-07 20:50 [PATCH] PNPACPI: add support for remote wakeup Alan Stern
2010-06-12 21:44 ` Rafael J. Wysocki [this message]
2010-06-14 15:02   ` Matthew Garrett
2010-06-14 15:05     ` Bjorn Helgaas
2010-06-14 19:06       ` Rafael J. Wysocki
2010-06-28 21:28       ` Rafael J. Wysocki
  -- strict thread matches above, loose matches on Subject: below --
2010-03-08 21:50 Alan Stern
2010-03-08 22:21 ` Bjorn Helgaas
2010-03-08 22:42   ` Rafael J. Wysocki

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=201006122344.00576.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=akpm@linux-foundation.org \
    --cc=bjorn.helgaas@hp.com \
    --cc=lenb@kernel.org \
    --cc=linux-acpi@vger.kernel.org \
    --cc=mjg@redhat.com \
    --cc=stern@rowland.harvard.edu \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.