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>,
Lan Tianyu <tianyu.lan@intel.com>
Subject: [Resend PATCH V3 3/8] usb: Bind devices to ACPI devices when possible
Date: Fri, 11 May 2012 16:08:27 +0800 [thread overview]
Message-ID: <1336723712-7686-4-git-send-email-tianyu.lan@intel.com> (raw)
In-Reply-To: <1336723712-7686-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>
Signed-off-by: Lan Tianyu <tianyu.lan@intel.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 c4ea846..26059b9 100644
--- a/drivers/usb/core/Makefile
+++ b/drivers/usb/core/Makefile
@@ -9,5 +9,6 @@ usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
usbcore-y += devio.o notify.o generic.o quirks.o devices.o
usbcore-$(CONFIG_PCI) += hcd-pci.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 0ce862b..7998a67 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;
@@ -1049,6 +1052,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;
@@ -1070,6 +1075,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-11 8:14 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-05-11 8:08 [Resend PATCH V3 0/8] usb/acpi: Add binding usb device with acpi Lan Tianyu
[not found] ` <1336723712-7686-1-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2012-05-11 8:08 ` [Resend PATCH V3 1/8] ACPI: Add stubs for (un)register_acpi_bus_type Lan Tianyu
2012-05-11 8:08 ` [Resend PATCH V3 2/8] ACPI: Add _PLD support Lan Tianyu
2012-05-11 8:08 ` [Resend PATCH V3 6/8] usb: move struct usb_device->children to struct usb_hub_port->child Lan Tianyu
2012-05-12 0:10 ` Greg KH
[not found] ` <20120512001027.GA25600-U8xfFu+wG4EAvxtiuMwx3w@public.gmane.org>
2012-05-12 15:31 ` Lan Tianyu
2012-05-11 8:08 ` [Resend PATCH V3 8/8] usb/acpi: add usb check for the connect type of usb port Lan Tianyu
2012-05-11 8:08 ` Lan Tianyu [this message]
2012-05-11 8:08 ` [Resend PATCH V3 4/8] usb: Set device removable state based on ACPI USB data Lan Tianyu
2012-05-11 8:08 ` [Resend PATCH V3 5/8] usb: add struct usb_hub_port to store port related members Lan Tianyu
2012-05-11 8:08 ` [Resend PATCH V3 7/8] usb/acpi: add the support of usb hub ports' acpi binding without attached devices Lan Tianyu
[not found] ` <1336723712-7686-8-git-send-email-tianyu.lan-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2012-05-12 0:15 ` Greg KH
2012-05-12 16:00 ` Lan Tianyu
2012-05-12 16:26 ` Greg KH
2012-05-12 0:26 ` [Resend PATCH V3 0/8] usb/acpi: Add binding usb device with acpi 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=1336723712-7686-4-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).