From: Lan Tianyu <tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
To: Greg KH <gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org>
Cc: lenb-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
sarah.a.sharp-VuQAYsv1563Yd54FQh9/CA@public.gmane.org,
linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-acpi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.org
Subject: Re: [PATCH 2/3] USB/ACPI: Add usb port's acpi power control in the xhci PORT_POWER feature request process.
Date: Thu, 14 Jun 2012 15:22:42 +0800 [thread overview]
Message-ID: <4FD99142.4010403@intel.com> (raw)
In-Reply-To: <20120613193038.GA6312-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
On 2012年06月14日 03:30, Greg KH wrote:
> On Mon, Jun 11, 2012 at 10:24:33AM +0800, Lan Tianyu wrote:
>> On our developping machine, bios can provide usb port's power control via
>> acpi. This patch is to provide usb port's power control way through setting
>> or clearing PORT_POWER feature requests. Add two functions usb_acpi_power_manageable()
>> and usb_acpi_set_power_state(). The first one is used to find whether the
>> usb port has acpi power resource and the second is to set the power state.
>> They are invoked in the xhci_hub_control() where clearing or setting PORT_POWER
>> feature requests are processed.
>>
>> Signed-off-by: Lan Tianyu<tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
>> ---
>> drivers/usb/core/usb-acpi.c | 28 ++++++++++++++++++++++++++++
>> drivers/usb/host/xhci-hub.c | 10 ++++++++++
>> include/linux/usb.h | 10 ++++++++++
>> 3 files changed, 48 insertions(+), 0 deletions(-)
>>
>> diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c
>> index 82c90d0..e95f26f 100644
>> --- a/drivers/usb/core/usb-acpi.c
>> +++ b/drivers/usb/core/usb-acpi.c
>> @@ -19,6 +19,34 @@
>>
>> #include "usb.h"
>>
>> +bool usb_acpi_power_manageable(struct usb_device *hdev, int port1)
>> +{
>> + acpi_handle port_handle;
>> +
>> + port_handle = usb_get_hub_port_acpi_handle(hdev,
>> + port1);
>> + return port_handle ? acpi_bus_power_manageable(port_handle) : false;
>
> Ick, I _really_ hate the ? : usage in C, please use real if statements
> so that everyone can read and understand them easier. You do that a lot
> here, please fix them all.
>
Ok. But in some places, for example
dev_dbg(&hdev->dev, "The power of hub port %d was set to %s\n",
port1, enable ? "enable" : "disable");
try to print two result. ?: is more convenient. If I use "if" statement,
that will be
if (enable)
result = "enable";
else
result = "disable";
dev_dbg(&hdev->dev, "The power of hub port %d was set to %s\n",
port1, result);
This just looks a little complex.
>> +}
>> +EXPORT_SYMBOL_GPL(usb_acpi_power_manageable);
>> +
>> +int usb_acpi_set_power_state(struct usb_device *hdev, int port1, bool enable)
>> +{
>> + acpi_handle port_handle;
>> + unsigned char state;
>> + int error = -EINVAL;
>> +
>> + port_handle = (acpi_handle)usb_get_hub_port_acpi_handle(hdev,
>> + port1);
>> + state = enable ? ACPI_STATE_D0 : ACPI_STATE_D3_COLD;
>> + error = acpi_bus_set_power(port_handle, state);
>
> You forgot to check port_handle here.
>
> Why not call usb_acpi_power_manageable() to ensure that you can do this?
In my code, usb_acpi_power_manageable() is invoked before
usb_acpi_set_power_state().
Do you mean I should call usb_acpi_power_manageable() in the
usb_acpi_set_power_state()?
>
>> + if (!error)
>> + dev_dbg(&hdev->dev, "The power of hub port %d was set to %s\n",
>> + port1, enable ? "enable" : "disabe");
>
> Why not report the error if debugging as well?
Ok.
>
>
>> +
>> + return error;
>> +}
>> +EXPORT_SYMBOL_GPL(usb_acpi_set_power_state);
>> +
>> static int usb_acpi_check_port_connect_type(struct usb_device *hdev,
>> acpi_handle handle, int port1)
>> {
>> diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c
>> index 2c55fcf..0ce48b3 100644
>> --- a/drivers/usb/host/xhci-hub.c
>> +++ b/drivers/usb/host/xhci-hub.c
>> @@ -728,6 +728,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
>>
>> temp = xhci_readl(xhci, port_array[wIndex]);
>> xhci_dbg(xhci, "set port power, actual port %d status = 0x%x\n", wIndex, temp);
>> +
>> + if (usb_acpi_power_manageable(hcd->self.root_hub,
>> + wIndex + 1))
>
> Why +1? If you have to do this everywhere, then do it only in the
> function, so you can be 0 based properly.
>
> Also, minor coding style nit, please rewrite as:
> if (usb_acpi_power_manageable(hcd->self.root_hub,
> wIndex + 1))
> Or even better yet, use a temp variable for the value returned and then
> check that, it's clearer and easier to read, right?
>
Yeah. Thanks for you suggestion. I will do it.
>> + usb_acpi_set_power_state(hcd->self.root_hub,
>> + wIndex + 1, true);
>
> Same question about +1 here.
>
>> break;
>> case USB_PORT_FEAT_RESET:
>> temp = (temp | PORT_RESET);
>> @@ -830,6 +835,11 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue,
>> case USB_PORT_FEAT_POWER:
>> xhci_writel(xhci, temp& ~PORT_POWER,
>> port_array[wIndex]);
>> +
>> + if (usb_acpi_power_manageable(hcd->self.root_hub,
>> + wIndex + 1))
>> + usb_acpi_set_power_state(hcd->self.root_hub,
>> + wIndex + 1, false);
>> break;
>> default:
>> goto error;
>> diff --git a/include/linux/usb.h b/include/linux/usb.h
>> index feb0a04..92f8898 100644
>> --- a/include/linux/usb.h
>> +++ b/include/linux/usb.h
>> @@ -599,6 +599,16 @@ extern int usb_lock_device_for_reset(struct usb_device *udev,
>> extern int usb_reset_device(struct usb_device *dev);
>> extern void usb_queue_reset_device(struct usb_interface *dev);
>>
>> +#ifdef CONFIG_ACPI
>> +extern int usb_acpi_set_power_state(struct usb_device *hdev, int port,
>> + bool enable);
>> +extern bool usb_acpi_power_manageable(struct usb_device *hdev, int port);
>> +#else
>> +static inline int usb_acpi_set_power_state(struct usb_device *hdev, int port,
>> + bool enable) { return 0; }
>> +static inline bool usb_acpi_power_manageable(struct usb_device *hdev, int port)
>> + { return 0; }
>
> is 0 a bool? :)
>
> Please get the types right.
So careless. Thanks for reminder.
>
> greg k-h
--
Best Regards
Tianyu Lan
linux kernel enabling team
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2012-06-14 7:22 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-11 2:24 [PATCH 0/3] USB/ACPI: Add usb port power off mechanism Lan Tianyu
[not found] ` <1339381474-17413-1-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2012-06-11 2:24 ` [PATCH 1/3] xhci: Add clear PORT_POWER feature process in the xhci_hub_control() Lan Tianyu
2012-06-11 2:24 ` [PATCH 2/3] USB/ACPI: Add usb port's acpi power control in the xhci PORT_POWER feature request process Lan Tianyu
2012-06-13 19:30 ` Greg KH
2012-06-13 20:53 ` Sarah Sharp
2012-06-13 21:00 ` Greg KH
[not found] ` <20120613193038.GA6312-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2012-06-13 21:10 ` Alan Stern
2012-06-13 21:35 ` Sarah Sharp
2012-06-14 7:22 ` Lan Tianyu [this message]
2012-06-14 15:44 ` Greg KH
2012-06-15 7:05 ` Lan Tianyu
2012-06-11 2:24 ` [PATCH 3/3] usb : Add sysfs files to control usb port's power Lan Tianyu
2012-06-11 14:12 ` Alan Stern
[not found] ` <1339381474-17413-4-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2012-06-13 19:33 ` Greg KH
[not found] ` <20120613193323.GB6312-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2012-06-13 21:15 ` Alan Stern
2012-06-13 21:46 ` Greg KH
2012-06-14 13:57 ` Alan Stern
2012-06-14 14:35 ` Greg KH
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=4FD99142.4010403@intel.com \
--to=tianyu.lan-ral2jqcrhueavxtiumwx3w@public.gmane.org \
--cc=gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r@public.gmane.org \
--cc=lenb-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=linux-acpi-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=sarah.a.sharp-VuQAYsv1563Yd54FQh9/CA@public.gmane.org \
--cc=stern-nwvwT67g6+6dFdvTe/nMLpVzexx5G7lz@public.gmane.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 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.