]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
soundwire: amd: implement function to extract slave information
authorVijendar Mukunda <Vijendar.Mukunda@amd.com>
Mon, 29 Jan 2024 05:51:38 +0000 (11:21 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 30 Jan 2024 16:06:35 +0000 (16:06 +0000)
Implement function to extract slaves information connected on the bus.
This information is required during machine select logic.
This function will be called from machine select logic code.

Signed-off-by: Vijendar Mukunda <Vijendar.Mukunda@amd.com>
Acked-by: Vinod Koul <vkoul@kernel.org>
Link: https://msgid.link/r/20240129055147.1493853-5-Vijendar.Mukunda@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
drivers/soundwire/amd_init.c
include/linux/soundwire/sdw_amd.h

index 699391d9acba97f5f96765035c6329e8ff621ce6..46a0538d7fc7f226c443cacb2e4cb1309d678a7a 100644 (file)
@@ -142,6 +142,49 @@ void sdw_amd_exit(struct sdw_amd_ctx *ctx)
 }
 EXPORT_SYMBOL_NS(sdw_amd_exit, SOUNDWIRE_AMD_INIT);
 
+int sdw_amd_get_slave_info(struct sdw_amd_ctx *ctx)
+{
+       struct amd_sdw_manager *amd_manager;
+       struct sdw_bus *bus;
+       struct sdw_slave *slave;
+       struct list_head *node;
+       int index;
+       int i = 0;
+       int num_slaves = 0;
+
+       for (index = 0; index < ctx->count; index++) {
+               if (!(ctx->link_mask & BIT(index)))
+                       continue;
+               amd_manager = dev_get_drvdata(&ctx->pdev[index]->dev);
+               if (!amd_manager)
+                       return -ENODEV;
+               bus = &amd_manager->bus;
+               /* Calculate number of slaves */
+               list_for_each(node, &bus->slaves)
+                       num_slaves++;
+       }
+
+       ctx->ids = kcalloc(num_slaves, sizeof(*ctx->ids), GFP_KERNEL);
+       if (!ctx->ids)
+               return -ENOMEM;
+       ctx->num_slaves = num_slaves;
+       for (index = 0; index < ctx->count; index++) {
+               if (!(ctx->link_mask & BIT(index)))
+                       continue;
+               amd_manager = dev_get_drvdata(&ctx->pdev[index]->dev);
+               if (amd_manager) {
+                       bus = &amd_manager->bus;
+                       list_for_each_entry(slave, &bus->slaves, node) {
+                               ctx->ids[i].id = slave->id;
+                               ctx->ids[i].link_id = bus->link_id;
+                               i++;
+                       }
+               }
+       }
+       return 0;
+}
+EXPORT_SYMBOL_NS(sdw_amd_get_slave_info, SOUNDWIRE_AMD_INIT);
+
 MODULE_AUTHOR("Vijendar.Mukunda@amd.com");
 MODULE_DESCRIPTION("AMD SoundWire Init Library");
 MODULE_LICENSE("Dual BSD/GPL");
index 54735fa49759cc52ed5e9a38a75343ba1b838043..9103772c2497d6d4c911300a5801530349edfa75 100644 (file)
@@ -170,5 +170,7 @@ int sdw_amd_probe(struct sdw_amd_res *res, struct sdw_amd_ctx **ctx);
 
 void sdw_amd_exit(struct sdw_amd_ctx *ctx);
 
+int sdw_amd_get_slave_info(struct sdw_amd_ctx *ctx);
+
 int amd_sdw_scan_controller(struct sdw_amd_acpi_info *info);
 #endif