All of lore.kernel.org
 help / color / mirror / Atom feed
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


  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 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.