Home Home > GIT Browse > stable
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJiri Slaby <jslaby@suse.cz>2019-02-15 10:23:48 +0100
committerJiri Slaby <jslaby@suse.cz>2019-02-15 10:24:08 +0100
commit0b69ecc2e0c12af1047c3e47ee260d80af744f3d (patch)
tree3296956a3d6f15cbe2d538cd48195587bdf6b066
parent649e3ff9d6c587f1eb1618d1707766836ea47b13 (diff)
firmware: arm_scmi: provide the mandatory device release
callback (bnc#1012628).
-rw-r--r--patches.kernel.org/4.20.9-032-firmware-arm_scmi-provide-the-mandatory-device.patch98
-rw-r--r--series.conf1
2 files changed, 99 insertions, 0 deletions
diff --git a/patches.kernel.org/4.20.9-032-firmware-arm_scmi-provide-the-mandatory-device.patch b/patches.kernel.org/4.20.9-032-firmware-arm_scmi-provide-the-mandatory-device.patch
new file mode 100644
index 0000000000..e9d40ddbbe
--- /dev/null
+++ b/patches.kernel.org/4.20.9-032-firmware-arm_scmi-provide-the-mandatory-device.patch
@@ -0,0 +1,98 @@
+From: Sudeep Holla <sudeep.holla@arm.com>
+Date: Tue, 22 Jan 2019 11:35:25 +0000
+Subject: [PATCH] firmware: arm_scmi: provide the mandatory device release
+ callback
+References: bnc#1012628
+Patch-mainline: 4.20.9
+Git-commit: 46edb8d1322c1763dd04e179992f8e9996085047
+
+commit 46edb8d1322c1763dd04e179992f8e9996085047 upstream.
+
+The device/driver model clearly mandates that bus driver that discover
+and allocate the device must set the release callback. This callback
+will be used to free the device after all references have gone away.
+
+scmi bus driver is missing the obvious callback which will result in
+the following warning if the device is unregistered:
+
+Device 'scmi_dev.1' does not have a release() function, it is broken and
+must be fixed. See Documentation/kobject.txt.
+WARNING at drivers/base/core.c:922 device_release+0x8c/0xa0
+Hardware name: ARM LTD Juno Development Platform BIOS EDK II Jan 21 2019
+Workqueue: events deferred_probe_work_func
+pstate: 60000005 (nZCv daif -PAN -UAO)
+pc : device_release+0x8c/0xa0
+lr : device_release+0x8c/0xa0
+Call trace:
+ device_release+0x8c/0xa0
+ kobject_put+0x8c/0x208
+ device_unregister+0x30/0x78
+ scmi_device_destroy+0x28/0x50
+ scmi_probe+0x354/0x5b0
+ platform_drv_probe+0x58/0xa8
+ really_probe+0x2c4/0x3e8
+ driver_probe_device+0x12c/0x148
+ __device_attach_driver+0xac/0x150
+ bus_for_each_drv+0x78/0xd8
+ __device_attach+0xe0/0x168
+ device_initial_probe+0x24/0x30
+ bus_probe_device+0xa0/0xa8
+ deferred_probe_work_func+0x8c/0xe0
+ process_one_work+0x1f0/0x478
+ worker_thread+0x22c/0x450
+ kthread+0x134/0x138
+ ret_from_fork+0x10/0x1c
+---[ end trace 420bdb7f6af50937 ]---
+
+Fix the issue by providing scmi_device_release callback. We have
+everything required for device release already in scmi_device_destroy,
+so we just need to move freeing of the device to scmi_device_release.
+
+Fixes: 933c504424a2 ("firmware: arm_scmi: add scmi protocol bus to enumerate protocol devices")
+Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>
+Cc: stable@vger.kernel.org # 4.17+
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Jiri Slaby <jslaby@suse.cz>
+---
+ drivers/firmware/arm_scmi/bus.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/firmware/arm_scmi/bus.c b/drivers/firmware/arm_scmi/bus.c
+index 472c88ae1c0f..92f843eaf1e0 100644
+--- a/drivers/firmware/arm_scmi/bus.c
++++ b/drivers/firmware/arm_scmi/bus.c
+@@ -119,6 +119,11 @@ void scmi_driver_unregister(struct scmi_driver *driver)
+ }
+ EXPORT_SYMBOL_GPL(scmi_driver_unregister);
+
++static void scmi_device_release(struct device *dev)
++{
++ kfree(to_scmi_dev(dev));
++}
++
+ struct scmi_device *
+ scmi_device_create(struct device_node *np, struct device *parent, int protocol)
+ {
+@@ -138,6 +143,7 @@ scmi_device_create(struct device_node *np, struct device *parent, int protocol)
+ scmi_dev->dev.parent = parent;
+ scmi_dev->dev.of_node = np;
+ scmi_dev->dev.bus = &scmi_bus_type;
++ scmi_dev->dev.release = scmi_device_release;
+ dev_set_name(&scmi_dev->dev, "scmi_dev.%d", id);
+
+ retval = device_register(&scmi_dev->dev);
+@@ -156,9 +162,8 @@ scmi_device_create(struct device_node *np, struct device *parent, int protocol)
+ void scmi_device_destroy(struct scmi_device *scmi_dev)
+ {
+ scmi_handle_put(scmi_dev->handle);
+- device_unregister(&scmi_dev->dev);
+ ida_simple_remove(&scmi_bus_id, scmi_dev->id);
+- kfree(scmi_dev);
++ device_unregister(&scmi_dev->dev);
+ }
+
+ void scmi_set_handle(struct scmi_device *scmi_dev)
+--
+2.20.1
+
diff --git a/series.conf b/series.conf
index 1142cd656b..2c385d0da4 100644
--- a/series.conf
+++ b/series.conf
@@ -1114,6 +1114,7 @@
patches.kernel.org/4.20.9-029-ARM-iop32x-n2100-fix-PCI-IRQ-mapping.patch
patches.kernel.org/4.20.9-030-ARM-tango-Improve-ARCH_MULTIPLATFORM-compatibi.patch
patches.kernel.org/4.20.9-031-ARM-dts-da850-fix-interrupt-numbers-for-clocks.patch
+ patches.kernel.org/4.20.9-032-firmware-arm_scmi-provide-the-mandatory-device.patch
########################################################
# Build fixes that apply to the vanilla kernel too.