Message ID | 3790210.BPELRzTIaN@vostro.rjw.lan (mailing list archive) |
---|---|
State | RFC, archived |
Headers | show |
On Sat, Nov 17, 2012 at 12:24:45PM +0100, Rafael J. Wysocki wrote: > Well, maybe there is one. Perhaps we can make acpi_platform_notify() > call acpi_bind_one() upfront and only if that fails, do the whole > type->find_device() dance? Of course, acpi_bind_one() would need to > be modified slightly too, like in the patch below. > > If we did that, acpi_i2c_add_device() would only need to assign acpi_handle > as appropriate before calling i2c_new_device() (and analogously for SPI). > > What do you think? This is certainly better than the thing we use currently. It makes adding I2C and SPI support much shorter and simpler. If others don't object I would suggest that we switch to use this method. -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Sunday, November 18, 2012 05:55:39 PM Mika Westerberg wrote: > On Sat, Nov 17, 2012 at 12:24:45PM +0100, Rafael J. Wysocki wrote: > > Well, maybe there is one. Perhaps we can make acpi_platform_notify() > > call acpi_bind_one() upfront and only if that fails, do the whole > > type->find_device() dance? Of course, acpi_bind_one() would need to > > be modified slightly too, like in the patch below. > > > > If we did that, acpi_i2c_add_device() would only need to assign acpi_handle > > as appropriate before calling i2c_new_device() (and analogously for SPI). > > > > What do you think? > > This is certainly better than the thing we use currently. It makes adding > I2C and SPI support much shorter and simpler. If others don't object I > would suggest that we switch to use this method. OK, thanks. The first of the following two patches is a slightly modified version of the one that you commented. Patch [2/2] implements the idea for platform devices and since it modifies struct platform_device_info, I'm adding a CC to Greg. The patches are on top of current linux-pm.git/linux-next. It looks like we may be able to use this approach for PCI too, in which case the whole .find_device() stuff won't be necessary any more. Thanks, Rafael
On Sunday, November 18, 2012 10:10:33 PM Rafael J. Wysocki wrote: > On Sunday, November 18, 2012 05:55:39 PM Mika Westerberg wrote: > > On Sat, Nov 17, 2012 at 12:24:45PM +0100, Rafael J. Wysocki wrote: > > > Well, maybe there is one. Perhaps we can make acpi_platform_notify() > > > call acpi_bind_one() upfront and only if that fails, do the whole > > > type->find_device() dance? Of course, acpi_bind_one() would need to > > > be modified slightly too, like in the patch below. > > > > > > If we did that, acpi_i2c_add_device() would only need to assign acpi_handle > > > as appropriate before calling i2c_new_device() (and analogously for SPI). > > > > > > What do you think? > > > > This is certainly better than the thing we use currently. It makes adding > > I2C and SPI support much shorter and simpler. If others don't object I > > would suggest that we switch to use this method. > > OK, thanks. > > The first of the following two patches is a slightly modified version of the > one that you commented. Patch [2/2] implements the idea for platform devices > and since it modifies struct platform_device_info, I'm adding a CC to Greg. > > The patches are on top of current linux-pm.git/linux-next. > > It looks like we may be able to use this approach for PCI too, in which case > the whole .find_device() stuff won't be necessary any more. Following is the series with the Greg's feedback taken into account. Patch [1/3] is the same as before with the bug found by Mika fixed, [2/3] is an additional patch adding struct acpi_dev_node to compile out unused stuff if CONFIG_ACPI is not set and [3/3] is the previous [2/2] rebased on top of it. Thanks, Rafael
On Tue, Nov 20, 2012 at 01:55:46AM +0100, Rafael J. Wysocki wrote: > > Following is the series with the Greg's feedback taken into account. > Patch [1/3] is the same as before with the bug found by Mika fixed, [2/3] is > an additional patch adding struct acpi_dev_node to compile out unused stuff if > CONFIG_ACPI is not set and [3/3] is the previous [2/2] rebased on top of it. I've tested this on my ACPI 5 test machine and it works as expected. I also adapted the I2C, GPIO and SPI patches on top of this series and planning to post them shortly. Thanks. -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tuesday, November 20, 2012 11:11:41 AM Mika Westerberg wrote: > On Tue, Nov 20, 2012 at 01:55:46AM +0100, Rafael J. Wysocki wrote: > > > > Following is the series with the Greg's feedback taken into account. > > Patch [1/3] is the same as before with the bug found by Mika fixed, [2/3] is > > an additional patch adding struct acpi_dev_node to compile out unused stuff if > > CONFIG_ACPI is not set and [3/3] is the previous [2/2] rebased on top of it. > > I've tested this on my ACPI 5 test machine and it works as expected. I also > adapted the I2C, GPIO and SPI patches on top of this series and planning to > post them shortly. Great, thanks a lot! Rafael
On Tue, Nov 20, 2012 at 01:55:46AM +0100, Rafael J. Wysocki wrote: > On Sunday, November 18, 2012 10:10:33 PM Rafael J. Wysocki wrote: > > On Sunday, November 18, 2012 05:55:39 PM Mika Westerberg wrote: > > > On Sat, Nov 17, 2012 at 12:24:45PM +0100, Rafael J. Wysocki wrote: > > > > Well, maybe there is one. Perhaps we can make acpi_platform_notify() > > > > call acpi_bind_one() upfront and only if that fails, do the whole > > > > type->find_device() dance? Of course, acpi_bind_one() would need to > > > > be modified slightly too, like in the patch below. > > > > > > > > If we did that, acpi_i2c_add_device() would only need to assign acpi_handle > > > > as appropriate before calling i2c_new_device() (and analogously for SPI). > > > > > > > > What do you think? > > > > > > This is certainly better than the thing we use currently. It makes adding > > > I2C and SPI support much shorter and simpler. If others don't object I > > > would suggest that we switch to use this method. > > > > OK, thanks. > > > > The first of the following two patches is a slightly modified version of the > > one that you commented. Patch [2/2] implements the idea for platform devices > > and since it modifies struct platform_device_info, I'm adding a CC to Greg. > > > > The patches are on top of current linux-pm.git/linux-next. > > > > It looks like we may be able to use this approach for PCI too, in which case > > the whole .find_device() stuff won't be necessary any more. > > Following is the series with the Greg's feedback taken into account. > Patch [1/3] is the same as before with the bug found by Mika fixed, [2/3] is > an additional patch adding struct acpi_dev_node to compile out unused stuff if > CONFIG_ACPI is not set and [3/3] is the previous [2/2] rebased on top of it. Looks great, thanks for the changes. I'm assuming this will go through your tree, right? greg k-h -- To unsubscribe from this list: send the line "unsubscribe linux-acpi" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Tuesday, November 20, 2012 10:09:05 AM Greg Kroah-Hartman wrote: > On Tue, Nov 20, 2012 at 01:55:46AM +0100, Rafael J. Wysocki wrote: > > On Sunday, November 18, 2012 10:10:33 PM Rafael J. Wysocki wrote: > > > On Sunday, November 18, 2012 05:55:39 PM Mika Westerberg wrote: > > > > On Sat, Nov 17, 2012 at 12:24:45PM +0100, Rafael J. Wysocki wrote: > > > > > Well, maybe there is one. Perhaps we can make acpi_platform_notify() > > > > > call acpi_bind_one() upfront and only if that fails, do the whole > > > > > type->find_device() dance? Of course, acpi_bind_one() would need to > > > > > be modified slightly too, like in the patch below. > > > > > > > > > > If we did that, acpi_i2c_add_device() would only need to assign acpi_handle > > > > > as appropriate before calling i2c_new_device() (and analogously for SPI). > > > > > > > > > > What do you think? > > > > > > > > This is certainly better than the thing we use currently. It makes adding > > > > I2C and SPI support much shorter and simpler. If others don't object I > > > > would suggest that we switch to use this method. > > > > > > OK, thanks. > > > > > > The first of the following two patches is a slightly modified version of the > > > one that you commented. Patch [2/2] implements the idea for platform devices > > > and since it modifies struct platform_device_info, I'm adding a CC to Greg. > > > > > > The patches are on top of current linux-pm.git/linux-next. > > > > > > It looks like we may be able to use this approach for PCI too, in which case > > > the whole .find_device() stuff won't be necessary any more. > > > > Following is the series with the Greg's feedback taken into account. > > Patch [1/3] is the same as before with the bug found by Mika fixed, [2/3] is > > an additional patch adding struct acpi_dev_node to compile out unused stuff if > > CONFIG_ACPI is not set and [3/3] is the previous [2/2] rebased on top of it. > > Looks great, thanks for the changes. Thanks and no problem. > I'm assuming this will go through your tree, right? Yes, it depends some previous changes already there. Thanks, Rafael
Index: linux/drivers/acpi/glue.c =================================================================== --- linux.orig/drivers/acpi/glue.c +++ linux/drivers/acpi/glue.c @@ -135,8 +135,12 @@ static int acpi_bind_one(struct device * int retval = -EINVAL; if (dev->acpi_handle) { - dev_warn(dev, "Drivers changed 'acpi_handle'\n"); - return -EINVAL; + if (handle) { + dev_warn(dev, "ACPI handle is already set\n"); + return -EINVAL; + } else { + handle = dev->acpi_handle; + } } get_device(dev); @@ -144,32 +148,40 @@ static int acpi_bind_one(struct device * if (ACPI_FAILURE(status)) goto err; - physical_node = kzalloc(sizeof(struct acpi_device_physical_node), - GFP_KERNEL); + physical_node = kzalloc(sizeof(*physical_node), GFP_KERNEL); if (!physical_node) { retval = -ENOMEM; goto err; } mutex_lock(&acpi_dev->physical_node_lock); + + /* Sanity check. */ + list_for_each_entry(physical_node, &acpi_dev->physical_node_list, node) + if (physical_node->dev == dev) { + dev_warn(dev, "Already associated with ACPI node\n"); + retval = -EINVAL; + goto err_free; + } + /* allocate physical node id according to physical_node_id_bitmap */ physical_node->node_id = find_first_zero_bit(acpi_dev->physical_node_id_bitmap, ACPI_MAX_PHYSICAL_NODE); if (physical_node->node_id >= ACPI_MAX_PHYSICAL_NODE) { retval = -ENOSPC; - mutex_unlock(&acpi_dev->physical_node_lock); - kfree(physical_node); - goto err; + goto err_free; } set_bit(physical_node->node_id, acpi_dev->physical_node_id_bitmap); physical_node->dev = dev; list_add_tail(&physical_node->node, &acpi_dev->physical_node_list); acpi_dev->physical_node_count++; + mutex_unlock(&acpi_dev->physical_node_lock); - dev->acpi_handle = handle; + if (!dev->acpi_handle) + dev->acpi_handle = handle; if (!physical_node->node_id) strcpy(physical_node_name, PHYSICAL_NODE_STRING); @@ -189,6 +201,11 @@ static int acpi_bind_one(struct device * err: put_device(dev); return retval; + + err_free: + mutex_unlock(&acpi_dev->physical_node_lock); + kfree(physical_node); + goto err; } static int acpi_unbind_one(struct device *dev) @@ -247,6 +264,10 @@ static int acpi_platform_notify(struct d acpi_handle handle; int ret = -EINVAL; + ret = acpi_bind_one(dev, NULL); + if (!ret) + goto out; + if (!dev->bus || !dev->parent) { /* bridge devices genernally haven't bus or parent */ ret = acpi_find_bridge_device(dev, &handle); @@ -260,10 +281,11 @@ static int acpi_platform_notify(struct d } if ((ret = type->find_device(dev, &handle)) != 0) DBG("Can't get handler for %s\n", dev_name(dev)); - end: + end: if (!ret) acpi_bind_one(dev, handle); + out: #if ACPI_GLUE_DEBUG if (!ret) { struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };