From: khaled khaled.saleh.req@gmail.com
The gb_audio_gb_get_topology() function performs multiple distinct operations: retrieving the topology size, allocating the topology buffer, and fetching the topology data. A TODO comment in the file notes that this logic should be split into separate calls.
Introduce helper functions for each step and update gb_audio_gb_get_topology() to use them.
This improves readability and maintainability without changing behavior.
Signed-off-by: Khaled Saleh khaled.saleh.req@gmail.com --- drivers/staging/greybus/audio_gb.c | 47 +++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 11 deletions(-)
diff --git a/drivers/staging/greybus/audio_gb.c b/drivers/staging/greybus/audio_gb.c index 9d8994fdb41a..0d5109ec14f6 100644 --- a/drivers/staging/greybus/audio_gb.c +++ b/drivers/staging/greybus/audio_gb.c @@ -9,36 +9,61 @@ #include "audio_codec.h"
/* TODO: Split into separate calls */ +static int gb_audio_topology_get_size(struct gb_connection *connection, 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, + &resp, sizeof(resp)); + if (ret) + return ret; + + *size = le16_to_cpu(resp.size); + + return 0; +} + +static struct gb_audio_topology *gb_audio_topology_alloc(u16 size) +{ + if (size < sizeof(struct gb_audio_topology)) + return NULL; + + return kzalloc(size, GFP_KERNEL); +} + +static int gb_audio_topology_fetch(struct gb_connection *connection, + struct gb_audio_topology *topo, u16 size) +{ + return gb_operation_sync(connection, + GB_AUDIO_TYPE_GET_TOPOLOGY, + NULL, 0, + topo, size); +} int gb_audio_gb_get_topology(struct gb_connection *connection, struct gb_audio_topology **topology) { - struct gb_audio_get_topology_size_response size_resp; struct gb_audio_topology *topo; u16 size; int ret;
- ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_TOPOLOGY_SIZE, - NULL, 0, &size_resp, sizeof(size_resp)); + ret = gb_audio_topology_get_size(connection, &size); if (ret) return ret;
- size = le16_to_cpu(size_resp.size); - if (size < sizeof(*topo)) - return -ENODATA; - - topo = kzalloc(size, GFP_KERNEL); + topo = gb_audio_topology_alloc(size); if (!topo) return -ENOMEM;
- ret = gb_operation_sync(connection, GB_AUDIO_TYPE_GET_TOPOLOGY, NULL, 0, - topo, size); + ret = gb_audio_topology_fetch(connection, topo, size); if (ret) { kfree(topo); return ret; }
*topology = topo; - return 0; } EXPORT_SYMBOL_GPL(gb_audio_gb_get_topology);