From: Aaron Lu <aaron.lu@intel.com>
To: "Rafael J. Wysocki" <rjw@sisk.pl>
Cc: ACPI Devel Maling List <linux-acpi@vger.kernel.org>,
LKML <linux-kernel@vger.kernel.org>
Subject: Re: [Update][PATCH] ACPI / scan: Simplify ACPI driver probing
Date: Thu, 13 Jun 2013 16:27:00 +0800 [thread overview]
Message-ID: <51B98254.1060504@intel.com> (raw)
In-Reply-To: <9524864.uKH8yPZA91@vostro.rjw.lan>
On 06/10/2013 06:18 AM, Rafael J. Wysocki wrote:
> From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> Subject: ACPI / scan: Simplify ACPI driver probing
>
> There is no particular reason why acpi_bus_driver_init() needs to be
> a separate function and its location with respect to its only caller,
> acpi_device_probe(), makes the code a bit difficult to follow.
>
> Besides, it doesn't really make sense to check if 'device' is not
> NULL in acpi_bus_driver_init(), because we've already dereferenced
> dev->driver in acpi_device_probe() at that point and, moreover,
> 'device' cannot be NULL then, because acpi_device_probe() is called
> via really_probe() (which also sets dev->driver for that matter).
>
> For these reasons, drop acpi_bus_driver_init() altogether and move
> the remaining code from it directly into acpi_device_probe().
Tested on one desktop and two laptops, no problems found.
Thanks,
Aaron
>
> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
> ---
>
> It's in the bleeding-edge branch of the linux-pm.git tree already.
>
> Thanks,
> Rafael
>
> ---
> drivers/acpi/scan.c | 81 +++++++++++++++++-----------------------------------
> 1 file changed, 27 insertions(+), 54 deletions(-)
>
> Index: linux-pm/drivers/acpi/scan.c
> ===================================================================
> --- linux-pm.orig/drivers/acpi/scan.c
> +++ linux-pm/drivers/acpi/scan.c
> @@ -933,32 +933,40 @@ static void acpi_device_remove_notify_ha
> acpi_device_notify);
> }
>
> -static int acpi_bus_driver_init(struct acpi_device *, struct acpi_driver *);
> -static int acpi_device_probe(struct device * dev)
> +static int acpi_device_probe(struct device *dev)
> {
> struct acpi_device *acpi_dev = to_acpi_device(dev);
> struct acpi_driver *acpi_drv = to_acpi_driver(dev->driver);
> int ret;
>
> - ret = acpi_bus_driver_init(acpi_dev, acpi_drv);
> - if (!ret) {
> - if (acpi_drv->ops.notify) {
> - ret = acpi_device_install_notify_handler(acpi_dev);
> - if (ret) {
> - if (acpi_drv->ops.remove)
> - acpi_drv->ops.remove(acpi_dev);
> - acpi_dev->driver = NULL;
> - acpi_dev->driver_data = NULL;
> - return ret;
> - }
> - }
> + if (!acpi_drv->ops.add)
> + return -ENOSYS;
> +
> + ret = acpi_drv->ops.add(acpi_dev);
> + if (ret)
> + return ret;
>
> - ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> - "Found driver [%s] for device [%s]\n",
> - acpi_drv->name, acpi_dev->pnp.bus_id));
> - get_device(dev);
> + acpi_dev->driver = acpi_drv;
> + ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> + "Driver [%s] successfully bound to device [%s]\n",
> + acpi_drv->name, acpi_dev->pnp.bus_id));
> +
> + if (acpi_drv->ops.notify) {
> + ret = acpi_device_install_notify_handler(acpi_dev);
> + if (ret) {
> + if (acpi_drv->ops.remove)
> + acpi_drv->ops.remove(acpi_dev);
> +
> + acpi_dev->driver = NULL;
> + acpi_dev->driver_data = NULL;
> + return ret;
> + }
> }
> - return ret;
> +
> + ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Found driver [%s] for device [%s]\n",
> + acpi_drv->name, acpi_dev->pnp.bus_id));
> + get_device(dev);
> + return 0;
> }
>
> static int acpi_device_remove(struct device * dev)
> @@ -1114,41 +1122,6 @@ static void acpi_device_unregister(struc
> Driver Management
> -------------------------------------------------------------------------- */
> /**
> - * acpi_bus_driver_init - add a device to a driver
> - * @device: the device to add and initialize
> - * @driver: driver for the device
> - *
> - * Used to initialize a device via its device driver. Called whenever a
> - * driver is bound to a device. Invokes the driver's add() ops.
> - */
> -static int
> -acpi_bus_driver_init(struct acpi_device *device, struct acpi_driver *driver)
> -{
> - int result = 0;
> -
> - if (!device || !driver)
> - return -EINVAL;
> -
> - if (!driver->ops.add)
> - return -ENOSYS;
> -
> - result = driver->ops.add(device);
> - if (result)
> - return result;
> -
> - device->driver = driver;
> -
> - /*
> - * TBD - Configuration Management: Assign resources to device based
> - * upon possible configuration and currently allocated resources.
> - */
> -
> - ACPI_DEBUG_PRINT((ACPI_DB_INFO,
> - "Driver successfully bound to device\n"));
> - return 0;
> -}
> -
> -/**
> * acpi_bus_register_driver - register a driver with the ACPI bus
> * @driver: driver being registered
> *
>
prev parent reply other threads:[~2013-06-13 8:26 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-06-08 22:28 [PATCH] ACPI / scan: Simplify ACPI driver probing Rafael J. Wysocki
2013-06-09 1:19 ` Aaron Lu
2013-06-09 1:54 ` Aaron Lu
2013-06-09 22:16 ` Rafael J. Wysocki
2013-06-10 13:28 ` Aaron Lu
2013-06-10 20:01 ` Rafael J. Wysocki
2013-06-09 22:18 ` [Update][PATCH] " Rafael J. Wysocki
2013-06-13 8:27 ` Aaron Lu [this message]
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=51B98254.1060504@intel.com \
--to=aaron.lu@intel.com \
--cc=linux-acpi@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=rjw@sisk.pl \
/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.