From: Lan Tianyu <tianyu.lan@intel.com>
To: lenb@kernel.org, gregkh@linuxfoundation.org
Cc: linux-usb@vger.kernel.org, linux-acpi@vger.kernel.org,
stern@rowland.harvard.edu, sarah.a.sharp@linux.intel.com,
mjg59@srcf.ucam.org, mfm@muteddisk.com,
Matthew Garrett <mjg@redhat.com>
Subject: [Resend PATCH V2 2/7] usb: Bind devices to ACPI devices when possible
Date: Fri, 4 May 2012 11:06:38 +0800 [thread overview]
Message-ID: <1336100803-28353-3-git-send-email-tianyu.lan@intel.com> (raw)
In-Reply-To: <1336100803-28353-1-git-send-email-tianyu.lan@intel.com>
From: Matthew Garrett <mjg@redhat.com>
Built-in USB devices will typically have a representation in the system
ACPI tables. Add support for binding the two together so the USB code can
make use of the associated methods.
Signed-off-by: Matthew Garrett <mjg@redhat.com>
---
drivers/usb/core/Makefile | 1 +
drivers/usb/core/usb-acpi.c | 60 +++++++++++++++++++++++++++++++++++++++++++
drivers/usb/core/usb.c | 6 ++++
drivers/usb/core/usb.h | 7 +++++
4 files changed, 74 insertions(+), 0 deletions(-)
create mode 100644 drivers/usb/core/usb-acpi.c
diff --git a/drivers/usb/core/Makefile b/drivers/usb/core/Makefile
index 507a4e1..9268ddb 100644
--- a/drivers/usb/core/Makefile
+++ b/drivers/usb/core/Makefile
@@ -10,5 +10,6 @@ usbcore-y += devio.o notify.o generic.o quirks.o devices.o
usbcore-$(CONFIG_PCI) += hcd-pci.o
usbcore-$(CONFIG_USB_DEVICEFS) += inode.o
+usbcore-$(CONFIG_ACPI) += usb-acpi.o
obj-$(CONFIG_USB) += usbcore.o
diff --git a/drivers/usb/core/usb-acpi.c b/drivers/usb/core/usb-acpi.c
new file mode 100644
index 0000000..cab5cb7
--- /dev/null
+++ b/drivers/usb/core/usb-acpi.c
@@ -0,0 +1,60 @@
+/*
+ * USB-ACPI glue code
+ *
+ * Copyright 2012 Red Hat <mjg@redhat.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation, version 2.
+ *
+ */
+#include <linux/module.h>
+#include <linux/usb.h>
+#include <linux/device.h>
+#include <linux/errno.h>
+#include <linux/kernel.h>
+#include <linux/acpi.h>
+#include <linux/pci.h>
+#include <acpi/acpi_bus.h>
+
+#include "usb.h"
+
+static int usb_acpi_find_device(struct device *dev, acpi_handle *handle)
+{
+ struct usb_device *udev;
+ struct device *parent;
+ acpi_handle *parent_handle;
+
+ if (!is_usb_device(dev))
+ return -ENODEV;
+
+ udev = to_usb_device(dev);
+ parent = dev->parent;
+ parent_handle = DEVICE_ACPI_HANDLE(parent);
+
+ if (!parent_handle)
+ return -ENODEV;
+
+ *handle = acpi_get_child(parent_handle, udev->portnum);
+
+ if (!*handle)
+ return -ENODEV;
+
+ return 0;
+}
+
+static struct acpi_bus_type usb_acpi_bus = {
+ .bus = &usb_bus_type,
+ .find_bridge = NULL,
+ .find_device = usb_acpi_find_device,
+};
+
+int usb_acpi_register(void)
+{
+ return register_acpi_bus_type(&usb_acpi_bus);
+}
+
+void usb_acpi_unregister(void)
+{
+ unregister_acpi_bus_type(&usb_acpi_bus);
+}
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c
index c74ba7b..84e8c20 100644
--- a/drivers/usb/core/usb.c
+++ b/drivers/usb/core/usb.c
@@ -1015,6 +1015,9 @@ static int __init usb_init(void)
if (retval)
goto out;
+ retval = usb_acpi_register();
+ if (retval)
+ goto acpi_register_failed;
retval = bus_register(&usb_bus_type);
if (retval)
goto bus_register_failed;
@@ -1054,6 +1057,8 @@ major_init_failed:
bus_notifier_failed:
bus_unregister(&usb_bus_type);
bus_register_failed:
+ usb_acpi_unregister();
+acpi_register_failed:
usb_debugfs_cleanup();
out:
return retval;
@@ -1076,6 +1081,7 @@ static void __exit usb_exit(void)
usb_hub_cleanup();
bus_unregister_notifier(&usb_bus_type, &usb_bus_nb);
bus_unregister(&usb_bus_type);
+ usb_acpi_unregister();
usb_debugfs_cleanup();
}
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
index 71648dc..5c5c538 100644
--- a/drivers/usb/core/usb.h
+++ b/drivers/usb/core/usb.h
@@ -156,3 +156,10 @@ extern void usb_notify_remove_device(struct usb_device *udev);
extern void usb_notify_add_bus(struct usb_bus *ubus);
extern void usb_notify_remove_bus(struct usb_bus *ubus);
+#ifdef CONFIG_ACPI
+extern int usb_acpi_register(void);
+extern void usb_acpi_unregister(void);
+#else
+static inline int usb_acpi_register(void) { return 0; };
+static inline void usb_acpi_unregister(void) { };
+#endif
--
1.7.6.rc2.8.g28eb
next prev parent reply other threads:[~2012-05-04 3:12 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-04 3:06 [Resend PATCH V2 0/7] usb/acpi: Add binding usb device with acpi Lan Tianyu
2012-05-04 3:06 ` [Resend PATCH V2 1/7] ACPI: Add _PLD support Lan Tianyu
2012-05-04 6:18 ` Oliver Neukum
2012-05-04 3:06 ` Lan Tianyu [this message]
[not found] ` <1336100803-28353-3-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2012-05-05 0:21 ` [Resend PATCH V2 2/7] usb: Bind devices to ACPI devices when possible Greg KH
2012-05-05 5:26 ` Matthew Garrett
2012-05-05 11:14 ` Sergei Shtylyov
2012-05-05 14:47 ` Greg KH
2012-05-05 15:00 ` Matthew Garrett
[not found] ` <1336100803-28353-1-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2012-05-04 3:06 ` [Resend PATCH V2 3/7] usb: Set device removable state based on ACPI USB data Lan Tianyu
2012-05-04 6:24 ` Oliver Neukum
2012-05-07 1:38 ` Lan Tianyu
2012-05-07 16:57 ` Greg KH
[not found] ` <20120507165744.GA28045-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2012-05-08 2:58 ` Matthew Garrett
2012-05-08 8:52 ` Lan Tianyu
2012-05-08 20:23 ` Len Brown
[not found] ` <4FA980C9.4020107-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
2012-05-09 1:00 ` Lan Tianyu
2012-05-08 17:31 ` Greg KH
2012-05-09 2:49 ` Lan Tianyu
2012-05-04 3:06 ` [Resend PATCH V2 4/7] usb: add struct usb_hub_port to store port related members Lan Tianyu
2012-05-04 3:06 ` [Resend PATCH V2 6/7] usb/acpi: add the support of usb hub ports' acpi binding without attached devices Lan Tianyu
2012-05-04 3:06 ` [Resend PATCH V2 7/7] usb/acpi: add usb check for the connect type of usb port Lan Tianyu
2012-05-04 6:37 ` Oliver Neukum
2012-05-07 1:37 ` Lan Tianyu
2012-05-04 3:17 ` [Resend PATCH V2 0/7] usb/acpi: Add binding usb device with acpi Matthew Garrett
[not found] ` <20120504031720.GA6840-1xO5oi07KQx4cg9Nei1l7Q@public.gmane.org>
2012-05-04 3:20 ` Greg KH
2012-05-04 3:06 ` [Resend PATCH V2 5/7] usb: move struct usb_device->children to struct usb_hub_port->child Lan Tianyu
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=1336100803-28353-3-git-send-email-tianyu.lan@intel.com \
--to=tianyu.lan@intel.com \
--cc=gregkh@linuxfoundation.org \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=mfm@muteddisk.com \
--cc=mjg59@srcf.ucam.org \
--cc=mjg@redhat.com \
--cc=sarah.a.sharp@linux.intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).