All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Rafael J. Wysocki" <rjw@sisk.pl>
To: Bjorn Helgaas <bjorn.helgaas@hp.com>
Cc: Alan Stern <stern@rowland.harvard.edu>,
	Kernel development list <linux-kernel@vger.kernel.org>,
	linux-acpi@vger.kernel.org
Subject: Re: [PATCH] PNPACPI: add support for remote wakeup
Date: Mon, 8 Mar 2010 23:42:28 +0100	[thread overview]
Message-ID: <201003082342.29031.rjw@sisk.pl> (raw)
In-Reply-To: <201003081521.59985.bjorn.helgaas@hp.com>

On Monday 08 March 2010, Bjorn Helgaas wrote:
> On Monday 08 March 2010 02:50:50 pm 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>
> 
> We usually send PNP patches through the ACPI tree, so I added a CC
> to linux-acpi.
> 
> > --- 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));
> 
> I also added Rafael because he added code in acpi_bind_one() that
> does the same thing.  I think the struct dev there will be the same
> one as &dev->dev here: we build both an acpi_device and a pnp_dev,
> and they refer to the same struct device.
> 
> However, I think we still need your patch because acpi_bind_one()
> is only used for PCI devices, so it looks like there's currently
> no way to use acpi_pm_device_sleep_wake() for non-PCI devices.

That's correct AFAICS.

> Reviewed-by: Bjorn Helgaas <bjorn.helgaas@hp.com>

Acked-by: Rafael J. Wysocki <rjw@sisk.pl>

> >  	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-03-08 22:39 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-08 21:50 [PATCH] PNPACPI: add support for remote wakeup Alan Stern
2010-03-08 22:21 ` Bjorn Helgaas
2010-03-08 22:42   ` Rafael J. Wysocki [this message]
2010-06-07 20:50 Alan Stern
2010-06-12 21:44 ` Rafael J. Wysocki
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

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=201003082342.29031.rjw@sisk.pl \
    --to=rjw@sisk.pl \
    --cc=bjorn.helgaas@hp.com \
    --cc=linux-acpi@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --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.