* [PATCH v2 2/4] staging: greybus: replace sprintf with sysfs_emit in sysfs show functions
2025-04-13 7:32 [PATCH v2 0/4] staging: greybus: cleanup, API migration, and refactors Ganesh Kumar Pittala
2025-04-13 7:32 ` [PATCH v2 1/4] staging: greybus: replace deprecated strncpy with strscpy in firmware.c Ganesh Kumar Pittala
@ 2025-04-13 7:32 ` Ganesh Kumar Pittala
2025-04-13 7:32 ` [PATCH v2 3/4] staging: greybus: refactor gb_loopback_fn into smaller helper functions Ganesh Kumar Pittala
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Ganesh Kumar Pittala @ 2025-04-13 7:32 UTC (permalink / raw)
To: johan, elder, gregkh
Cc: greybus-dev, linux-staging, linux-kernel, hvaibhav.linux,
vaibhav.sr, mgreer, rmfrfs, pure.logic, ganeshkpittala
This patch replaces deprecated uses of sprintf() with the safer
sysfs_emit() helper in multiple sysfs show functions across the
Greybus staging drivers.
The sysfs_emit() API is designed specifically for sysfs usage and
ensures proper formatting, length checks, and termination, aligning
with current kernel best practices.
Affected files:
- audio_manager_module.c
- loopback.c (sysfs-related only)
- arche-platform.c
- arche-apb-ctrl.c
- light.c
- gbphy.c
Signed-off-by: Ganesh Kumar Pittala <ganeshkpittala@gmail.com>
---
drivers/staging/greybus/arche-apb-ctrl.c | 11 ++++++-----
drivers/staging/greybus/arche-platform.c | 11 ++++++-----
drivers/staging/greybus/audio_manager_module.c | 13 +++++++------
drivers/staging/greybus/gbphy.c | 3 ++-
drivers/staging/greybus/light.c | 5 +++--
drivers/staging/greybus/loopback.c | 15 ++++++++-------
6 files changed, 32 insertions(+), 26 deletions(-)
diff --git a/drivers/staging/greybus/arche-apb-ctrl.c b/drivers/staging/greybus/arche-apb-ctrl.c
index 90ab32638d3f..9862188e8367 100644
--- a/drivers/staging/greybus/arche-apb-ctrl.c
+++ b/drivers/staging/greybus/arche-apb-ctrl.c
@@ -17,6 +17,7 @@
#include <linux/pm.h>
#include <linux/regulator/consumer.h>
#include <linux/spinlock.h>
+#include <linux/sysfs.h>
#include "arche_platform.h"
static void apb_bootret_deassert(struct device *dev);
@@ -299,16 +300,16 @@ static ssize_t state_show(struct device *dev,
switch (apb->state) {
case ARCHE_PLATFORM_STATE_OFF:
- return sprintf(buf, "off%s\n",
+ return sysfs_emit(buf, "off%s\n",
apb->init_disabled ? ",disabled" : "");
case ARCHE_PLATFORM_STATE_ACTIVE:
- return sprintf(buf, "active\n");
+ return sysfs_emit(buf, "active\n");
case ARCHE_PLATFORM_STATE_STANDBY:
- return sprintf(buf, "standby\n");
+ return sysfs_emit(buf, "standby\n");
case ARCHE_PLATFORM_STATE_FW_FLASHING:
- return sprintf(buf, "fw_flashing\n");
+ return sysfs_emit(buf, "fw_flashing\n");
default:
- return sprintf(buf, "unknown state\n");
+ return sysfs_emit(buf, "unknown state\n");
}
}
diff --git a/drivers/staging/greybus/arche-platform.c b/drivers/staging/greybus/arche-platform.c
index d48464390f58..2e706c1169d5 100644
--- a/drivers/staging/greybus/arche-platform.c
+++ b/drivers/staging/greybus/arche-platform.c
@@ -21,6 +21,7 @@
#include <linux/time.h>
#include <linux/greybus.h>
#include <linux/of.h>
+#include <linux/sysfs.h>
#include "arche_platform.h"
#if IS_ENABLED(CONFIG_USB_HSIC_USB3613)
@@ -374,15 +375,15 @@ static ssize_t state_show(struct device *dev,
switch (arche_pdata->state) {
case ARCHE_PLATFORM_STATE_OFF:
- return sprintf(buf, "off\n");
+ return sysfs_emit(buf, "off\n");
case ARCHE_PLATFORM_STATE_ACTIVE:
- return sprintf(buf, "active\n");
+ return sysfs_emit(buf, "active\n");
case ARCHE_PLATFORM_STATE_STANDBY:
- return sprintf(buf, "standby\n");
+ return sysfs_emit(buf, "standby\n");
case ARCHE_PLATFORM_STATE_FW_FLASHING:
- return sprintf(buf, "fw_flashing\n");
+ return sysfs_emit(buf, "fw_flashing\n");
default:
- return sprintf(buf, "unknown state\n");
+ return sysfs_emit(buf, "unknown state\n");
}
}
diff --git a/drivers/staging/greybus/audio_manager_module.c b/drivers/staging/greybus/audio_manager_module.c
index 4a4dfb42f50f..781144be4eec 100644
--- a/drivers/staging/greybus/audio_manager_module.c
+++ b/drivers/staging/greybus/audio_manager_module.c
@@ -6,6 +6,7 @@
*/
#include <linux/slab.h>
+#include <linux/sysfs.h>
#include "audio_manager.h"
#include "audio_manager_private.h"
@@ -76,7 +77,7 @@ static void gb_audio_module_release(struct kobject *kobj)
static ssize_t gb_audio_module_name_show(struct gb_audio_manager_module *module,
struct gb_audio_manager_module_attribute *attr, char *buf)
{
- return sprintf(buf, "%s", module->desc.name);
+ return sysfs_emit(buf, "%s\n", module->desc.name);
}
static struct gb_audio_manager_module_attribute gb_audio_module_name_attribute =
@@ -85,7 +86,7 @@ static struct gb_audio_manager_module_attribute gb_audio_module_name_attribute =
static ssize_t gb_audio_module_vid_show(struct gb_audio_manager_module *module,
struct gb_audio_manager_module_attribute *attr, char *buf)
{
- return sprintf(buf, "%d", module->desc.vid);
+ return sysfs_emit(buf, "%d\n", module->desc.vid);
}
static struct gb_audio_manager_module_attribute gb_audio_module_vid_attribute =
@@ -94,7 +95,7 @@ static struct gb_audio_manager_module_attribute gb_audio_module_vid_attribute =
static ssize_t gb_audio_module_pid_show(struct gb_audio_manager_module *module,
struct gb_audio_manager_module_attribute *attr, char *buf)
{
- return sprintf(buf, "%d", module->desc.pid);
+ return sysfs_emit(buf, "%d\n", module->desc.pid);
}
static struct gb_audio_manager_module_attribute gb_audio_module_pid_attribute =
@@ -104,7 +105,7 @@ static ssize_t gb_audio_module_intf_id_show(struct gb_audio_manager_module *modu
struct gb_audio_manager_module_attribute *attr,
char *buf)
{
- return sprintf(buf, "%d", module->desc.intf_id);
+ return sysfs_emit(buf, "%d\n", module->desc.intf_id);
}
static struct gb_audio_manager_module_attribute
@@ -115,7 +116,7 @@ static ssize_t gb_audio_module_ip_devices_show(struct gb_audio_manager_module *m
struct gb_audio_manager_module_attribute *attr,
char *buf)
{
- return sprintf(buf, "0x%X", module->desc.ip_devices);
+ return sysfs_emit(buf, "0x%X\n", module->desc.ip_devices);
}
static struct gb_audio_manager_module_attribute
@@ -126,7 +127,7 @@ static ssize_t gb_audio_module_op_devices_show(struct gb_audio_manager_module *m
struct gb_audio_manager_module_attribute *attr,
char *buf)
{
- return sprintf(buf, "0x%X", module->desc.op_devices);
+ return sysfs_emit(buf, "0x%X\n", module->desc.op_devices);
}
static struct gb_audio_manager_module_attribute
diff --git a/drivers/staging/greybus/gbphy.c b/drivers/staging/greybus/gbphy.c
index 6adcad286633..72d72aa7cb0f 100644
--- a/drivers/staging/greybus/gbphy.c
+++ b/drivers/staging/greybus/gbphy.c
@@ -14,6 +14,7 @@
#include <linux/slab.h>
#include <linux/device.h>
#include <linux/greybus.h>
+#include <linux/sysfs.h>
#include "gbphy.h"
@@ -31,7 +32,7 @@ static ssize_t protocol_id_show(struct device *dev,
{
struct gbphy_device *gbphy_dev = to_gbphy_dev(dev);
- return sprintf(buf, "0x%02x\n", gbphy_dev->cport_desc->protocol_id);
+ return sysfs_emit(buf, "0x%02x\n", gbphy_dev->cport_desc->protocol_id);
}
static DEVICE_ATTR_RO(protocol_id);
diff --git a/drivers/staging/greybus/light.c b/drivers/staging/greybus/light.c
index e509fdc715db..db0e98faec08 100644
--- a/drivers/staging/greybus/light.c
+++ b/drivers/staging/greybus/light.c
@@ -12,6 +12,7 @@
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/greybus.h>
+#include <linux/sysfs.h>
#include <media/v4l2-flash-led-class.h>
#define NAMES_MAX 32
@@ -173,7 +174,7 @@ static ssize_t fade_##__dir##_show(struct device *dev, \
struct led_classdev *cdev = dev_get_drvdata(dev); \
struct gb_channel *channel = get_channel_from_cdev(cdev); \
\
- return sprintf(buf, "%u\n", channel->fade_##__dir); \
+ return sysfs_emit(buf, "%u\n", channel->fade_##__dir); \
} \
\
static ssize_t fade_##__dir##_store(struct device *dev, \
@@ -220,7 +221,7 @@ static ssize_t color_show(struct device *dev, struct device_attribute *attr,
struct led_classdev *cdev = dev_get_drvdata(dev);
struct gb_channel *channel = get_channel_from_cdev(cdev);
- return sprintf(buf, "0x%08x\n", channel->color);
+ return sysfs_emit(buf, "0x%08x\n", channel->color);
}
static ssize_t color_store(struct device *dev, struct device_attribute *attr,
diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c
index 1f19323b0e1a..c194afea941a 100644
--- a/drivers/staging/greybus/loopback.c
+++ b/drivers/staging/greybus/loopback.c
@@ -26,6 +26,7 @@
#include <linux/atomic.h>
#include <linux/pm_runtime.h>
#include <linux/greybus.h>
+#include <linux/sysfs.h>
#include <asm/div64.h>
#define NSEC_PER_DAY 86400000000000ULL
@@ -125,7 +126,7 @@ static ssize_t field##_show(struct device *dev, \
char *buf) \
{ \
struct gb_loopback *gb = dev_get_drvdata(dev); \
- return sprintf(buf, "%u\n", gb->field); \
+ return sysfs_emit(buf, "%u\n", gb->field); \
} \
static DEVICE_ATTR_RO(field)
@@ -137,8 +138,8 @@ static ssize_t name##_##field##_show(struct device *dev, \
struct gb_loopback *gb = dev_get_drvdata(dev); \
/* Report 0 for min and max if no transfer succeeded */ \
if (!gb->requests_completed) \
- return sprintf(buf, "0\n"); \
- return sprintf(buf, "%" #type "\n", gb->name.field); \
+ return sysfs_emit(buf, "0\n"); \
+ return sysfs_emit(buf, "%" #type "\n", gb->name.field); \
} \
static DEVICE_ATTR_RO(name##_##field)
@@ -158,7 +159,7 @@ static ssize_t name##_avg_show(struct device *dev, \
rem = do_div(avg, count); \
rem *= 1000000; \
do_div(rem, count); \
- return sprintf(buf, "%llu.%06u\n", avg, (u32)rem); \
+ return sysfs_emit(buf, "%llu.%06u\n", avg, (u32)rem); \
} \
static DEVICE_ATTR_RO(name##_avg)
@@ -173,7 +174,7 @@ static ssize_t field##_show(struct device *dev, \
char *buf) \
{ \
struct gb_loopback *gb = dev_get_drvdata(dev); \
- return sprintf(buf, "%" #type "\n", gb->field); \
+ return sysfs_emit(buf, "%" #type "\n", gb->field); \
} \
static ssize_t field##_store(struct device *dev, \
struct device_attribute *attr, \
@@ -199,7 +200,7 @@ static ssize_t field##_show(struct device *dev, \
char *buf) \
{ \
struct gb_loopback *gb = dev_get_drvdata(dev); \
- return sprintf(buf, "%u\n", gb->field); \
+ return sysfs_emit(buf, "%u\n", gb->field); \
} \
static DEVICE_ATTR_RO(field)
@@ -209,7 +210,7 @@ static ssize_t field##_show(struct device *dev, \
char *buf) \
{ \
struct gb_loopback *gb = dev_get_drvdata(dev); \
- return sprintf(buf, "%" #type "\n", gb->field); \
+ return sysfs_emit(buf, "%" #type "\n", gb->field); \
} \
static ssize_t field##_store(struct device *dev, \
struct device_attribute *attr, \
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v2 3/4] staging: greybus: refactor gb_loopback_fn into smaller helper functions
2025-04-13 7:32 [PATCH v2 0/4] staging: greybus: cleanup, API migration, and refactors Ganesh Kumar Pittala
2025-04-13 7:32 ` [PATCH v2 1/4] staging: greybus: replace deprecated strncpy with strscpy in firmware.c Ganesh Kumar Pittala
2025-04-13 7:32 ` [PATCH v2 2/4] staging: greybus: replace sprintf with sysfs_emit in sysfs show functions Ganesh Kumar Pittala
@ 2025-04-13 7:32 ` Ganesh Kumar Pittala
2025-04-17 9:09 ` Greg KH
2025-04-13 7:32 ` [PATCH v2 4/4] staging: greybus: split gb_audio_gb_get_topology into " Ganesh Kumar Pittala
2025-04-17 9:03 ` [PATCH v2 0/4] staging: greybus: cleanup, API migration, and refactors Greg KH
4 siblings, 1 reply; 8+ messages in thread
From: Ganesh Kumar Pittala @ 2025-04-13 7:32 UTC (permalink / raw)
To: johan, elder, gregkh
Cc: greybus-dev, linux-staging, linux-kernel, hvaibhav.linux,
vaibhav.sr, mgreer, rmfrfs, pure.logic, ganeshkpittala
This patch refactors the gb_loopback_fn() function in loopback.c by
splitting large blocks of logic into well-named static helpers to
improve clarity, readability, and maintainability.
The control flow remains unchanged. No functional modifications
are introduced.
This aligns with kernel coding style guidelines for long functions
and helps future contributors understand and modify loopback behavior
more easily.
Signed-off-by: Ganesh Kumar Pittala <ganeshkpittala@gmail.com>
---
drivers/staging/greybus/loopback.c | 152 ++++++++++++++++-------------
1 file changed, 82 insertions(+), 70 deletions(-)
diff --git a/drivers/staging/greybus/loopback.c b/drivers/staging/greybus/loopback.c
index c194afea941a..1e3644ede1b6 100644
--- a/drivers/staging/greybus/loopback.c
+++ b/drivers/staging/greybus/loopback.c
@@ -832,105 +832,117 @@ static void gb_loopback_async_wait_to_send(struct gb_loopback *gb)
kthread_should_stop());
}
-static int gb_loopback_fn(void *data)
+static bool gb_loopback_should_stop(struct gb_loopback *gb,
+ struct gb_bundle *bundle)
+{
+ if (!gb->type) {
+ gb_pm_runtime_put_autosuspend(bundle);
+ wait_event_interruptible(gb->wq,
+ gb->type || kthread_should_stop());
+ if (kthread_should_stop())
+ return true;
+ gb_pm_runtime_get_sync(bundle);
+ }
+ return kthread_should_stop();
+}
+
+static void gb_loopback_handle_completion(struct gb_loopback *gb,
+ struct gb_bundle *bundle)
+{
+ gb_loopback_async_wait_all(gb);
+
+ mutex_lock(&gb->mutex);
+ if (gb->iteration_count == gb->iteration_max) {
+ gb->type = 0;
+ gb->send_count = 0;
+ sysfs_notify(&gb->dev->kobj, NULL, "iteration_count");
+ dev_dbg(&bundle->dev, "load test complete\n");
+ } else {
+ dev_dbg(&bundle->dev, "continuing on with new test set\n");
+ }
+ mutex_unlock(&gb->mutex);
+}
+
+static void gb_loopback_dispatch_operation(struct gb_loopback *gb, int type,
+ u32 size)
{
int error = 0;
- int us_wait = 0;
- int type;
- int ret;
- u32 size;
+ if (gb->async) {
+ if (type == GB_LOOPBACK_TYPE_PING)
+ error = gb_loopback_async_ping(gb);
+ else if (type == GB_LOOPBACK_TYPE_TRANSFER)
+ error = gb_loopback_async_transfer(gb, size);
+ else if (type == GB_LOOPBACK_TYPE_SINK)
+ error = gb_loopback_async_sink(gb, size);
+
+ if (error) {
+ gb->error++;
+ gb->iteration_count++;
+ }
+ } else {
+ if (type == GB_LOOPBACK_TYPE_PING)
+ error = gb_loopback_sync_ping(gb);
+ else if (type == GB_LOOPBACK_TYPE_TRANSFER)
+ error = gb_loopback_sync_transfer(gb, size);
+ else if (type == GB_LOOPBACK_TYPE_SINK)
+ error = gb_loopback_sync_sink(gb, size);
+
+ if (error)
+ gb->error++;
+ gb->iteration_count++;
+ gb_loopback_calculate_stats(gb, !!error);
+ }
+}
+
+static void gb_loopback_delay_if_needed(int us_wait)
+{
+ if (us_wait) {
+ if (us_wait < 20000)
+ usleep_range(us_wait, us_wait + 100);
+ else
+ msleep(us_wait / 1000);
+ }
+}
+
+static int gb_loopback_fn(void *data)
+{
+ int us_wait = 0, type;
+ u32 size;
struct gb_loopback *gb = data;
struct gb_bundle *bundle = gb->connection->bundle;
- ret = gb_pm_runtime_get_sync(bundle);
- if (ret)
- return ret;
+ if (gb_pm_runtime_get_sync(bundle))
+ return -EIO;
while (1) {
- if (!gb->type) {
- gb_pm_runtime_put_autosuspend(bundle);
- wait_event_interruptible(gb->wq, gb->type ||
- kthread_should_stop());
- ret = gb_pm_runtime_get_sync(bundle);
- if (ret)
- return ret;
- }
-
- if (kthread_should_stop())
+ if (gb_loopback_should_stop(gb, bundle))
break;
- /* Limit the maximum number of in-flight async operations */
gb_loopback_async_wait_to_send(gb);
if (kthread_should_stop())
break;
mutex_lock(&gb->mutex);
- /* Optionally terminate */
if (gb->send_count == gb->iteration_max) {
mutex_unlock(&gb->mutex);
-
- /* Wait for synchronous and asynchronous completion */
- gb_loopback_async_wait_all(gb);
-
- /* Mark complete unless user-space has poked us */
- mutex_lock(&gb->mutex);
- if (gb->iteration_count == gb->iteration_max) {
- gb->type = 0;
- gb->send_count = 0;
- sysfs_notify(&gb->dev->kobj, NULL,
- "iteration_count");
- dev_dbg(&bundle->dev, "load test complete\n");
- } else {
- dev_dbg(&bundle->dev,
- "continuing on with new test set\n");
- }
- mutex_unlock(&gb->mutex);
+ gb_loopback_handle_completion(gb, bundle);
continue;
}
+
size = gb->size;
us_wait = gb->us_wait;
type = gb->type;
if (ktime_to_ns(gb->ts) == 0)
gb->ts = ktime_get();
- /* Else operations to perform */
- if (gb->async) {
- if (type == GB_LOOPBACK_TYPE_PING)
- error = gb_loopback_async_ping(gb);
- else if (type == GB_LOOPBACK_TYPE_TRANSFER)
- error = gb_loopback_async_transfer(gb, size);
- else if (type == GB_LOOPBACK_TYPE_SINK)
- error = gb_loopback_async_sink(gb, size);
-
- if (error) {
- gb->error++;
- gb->iteration_count++;
- }
- } else {
- /* We are effectively single threaded here */
- if (type == GB_LOOPBACK_TYPE_PING)
- error = gb_loopback_sync_ping(gb);
- else if (type == GB_LOOPBACK_TYPE_TRANSFER)
- error = gb_loopback_sync_transfer(gb, size);
- else if (type == GB_LOOPBACK_TYPE_SINK)
- error = gb_loopback_sync_sink(gb, size);
-
- if (error)
- gb->error++;
- gb->iteration_count++;
- gb_loopback_calculate_stats(gb, !!error);
- }
+ gb_loopback_dispatch_operation(gb, type, size);
+
gb->send_count++;
mutex_unlock(&gb->mutex);
- if (us_wait) {
- if (us_wait < 20000)
- usleep_range(us_wait, us_wait + 100);
- else
- msleep(us_wait / 1000);
- }
+ gb_loopback_delay_if_needed(us_wait);
}
gb_pm_runtime_put_autosuspend(bundle);
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread* [PATCH v2 4/4] staging: greybus: split gb_audio_gb_get_topology into helper functions
2025-04-13 7:32 [PATCH v2 0/4] staging: greybus: cleanup, API migration, and refactors Ganesh Kumar Pittala
` (2 preceding siblings ...)
2025-04-13 7:32 ` [PATCH v2 3/4] staging: greybus: refactor gb_loopback_fn into smaller helper functions Ganesh Kumar Pittala
@ 2025-04-13 7:32 ` Ganesh Kumar Pittala
2025-04-17 9:03 ` [PATCH v2 0/4] staging: greybus: cleanup, API migration, and refactors Greg KH
4 siblings, 0 replies; 8+ messages in thread
From: Ganesh Kumar Pittala @ 2025-04-13 7:32 UTC (permalink / raw)
To: johan, elder, gregkh
Cc: greybus-dev, linux-staging, linux-kernel, hvaibhav.linux,
vaibhav.sr, mgreer, rmfrfs, pure.logic, ganeshkpittala
This patch addresses the TODO in gb_audio_gb_get_topology() by
splitting its logic into two smaller internal helper functions:
- gb_audio_get_topology_size()
- gb_audio_read_topology()
This improves modularity and readability while preserving the
original behavior and interface.
Signed-off-by: Ganesh Kumar Pittala <ganeshkpittala@gmail.com>
---
drivers/staging/greybus/audio_gb.c | 36 +++++++++++++++++++++++-------
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/drivers/staging/greybus/audio_gb.c b/drivers/staging/greybus/audio_gb.c
index 9d8994fdb41a..92cfd1a6fc10 100644
--- a/drivers/staging/greybus/audio_gb.c
+++ b/drivers/staging/greybus/audio_gb.c
@@ -8,21 +8,28 @@
#include <linux/greybus.h>
#include "audio_codec.h"
-/* TODO: Split into separate calls */
-int gb_audio_gb_get_topology(struct gb_connection *connection,
- struct gb_audio_topology **topology)
+static int gb_audio_gb_get_topology_size(struct gb_connection *connection,
+ u16 *size)
{
- struct gb_audio_get_topology_size_response size_resp;
- struct gb_audio_topology *topo;
- u16 size;
+ struct gb_audio_get_topology_size_response resp;
int ret;
ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_TOPOLOGY_SIZE,
- NULL, 0, &size_resp, sizeof(size_resp));
+ NULL, 0, &resp, sizeof(resp));
if (ret)
return ret;
- size = le16_to_cpu(size_resp.size);
+ *size = le16_to_cpu(resp.size);
+ return 0;
+}
+
+static int gb_audio_gb_read_topology(struct gb_connection *connection,
+ struct gb_audio_topology **topology,
+ u16 size)
+{
+ struct gb_audio_topology *topo;
+ int ret;
+
if (size < sizeof(*topo))
return -ENODATA;
@@ -41,6 +48,19 @@ int gb_audio_gb_get_topology(struct gb_connection *connection,
return 0;
}
+
+int gb_audio_gb_get_topology(struct gb_connection *connection,
+ struct gb_audio_topology **topology)
+{
+ u16 size;
+ int ret;
+
+ ret = gb_audio_gb_get_topology_size(connection, &size);
+ if (ret)
+ return ret;
+
+ return gb_audio_gb_read_topology(connection, topology, size);
+}
EXPORT_SYMBOL_GPL(gb_audio_gb_get_topology);
int gb_audio_gb_get_control(struct gb_connection *connection,
--
2.43.0
^ permalink raw reply related [flat|nested] 8+ messages in thread