aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/drivers/soundwire
diff options
context:
space:
mode:
authorBard Liao <yung-chuan.liao@linux.intel.com>2020-05-19 01:43:20 +0800
committerVinod Koul <vkoul@kernel.org>2020-05-19 12:44:34 +0530
commitdbb50c7a9949506f750d59d9ba4d58f0ce8ccd42 (patch)
treebb90832d6b45d9f2bbafd40e8cbf7ee11f529eef /drivers/soundwire
parentsoundwire: bus_type: introduce sdw_slave_type and sdw_master_type (diff)
downloadwireguard-linux-dbb50c7a9949506f750d59d9ba4d58f0ce8ccd42.tar.xz
wireguard-linux-dbb50c7a9949506f750d59d9ba4d58f0ce8ccd42.zip
soundwire: bus: add unique bus id
Adding an unique id for each bus. Suggested-by: Vinod Koul <vkoul@kernel.org> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> Acked-by: Jaroslav Kysela <perex@perex.cz> Link: https://lore.kernel.org/r/20200518174322.31561-4-yung-chuan.liao@linux.intel.com Signed-off-by: Vinod Koul <vkoul@kernel.org>
Diffstat (limited to 'drivers/soundwire')
-rw-r--r--drivers/soundwire/bus.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/drivers/soundwire/bus.c b/drivers/soundwire/bus.c
index a8072791d6b8..03d72fa3c190 100644
--- a/drivers/soundwire/bus.c
+++ b/drivers/soundwire/bus.c
@@ -9,6 +9,19 @@
#include <linux/soundwire/sdw.h>
#include "bus.h"
+static DEFINE_IDA(sdw_ida);
+
+static int sdw_get_id(struct sdw_bus *bus)
+{
+ int rc = ida_alloc(&sdw_ida, GFP_KERNEL);
+
+ if (rc < 0)
+ return rc;
+
+ bus->id = rc;
+ return 0;
+}
+
/**
* sdw_bus_master_add() - add a bus Master instance
* @bus: bus instance
@@ -29,6 +42,12 @@ int sdw_bus_master_add(struct sdw_bus *bus, struct device *parent,
return -ENODEV;
}
+ ret = sdw_get_id(bus);
+ if (ret) {
+ dev_err(bus->dev, "Failed to get bus id\n");
+ return ret;
+ }
+
if (!bus->ops) {
dev_err(bus->dev, "SoundWire Bus ops are not set\n");
return -EINVAL;
@@ -144,6 +163,7 @@ void sdw_bus_master_delete(struct sdw_bus *bus)
device_for_each_child(bus->dev, NULL, sdw_delete_slave);
sdw_bus_debugfs_exit(bus);
+ ida_free(&sdw_ida, bus->id);
}
EXPORT_SYMBOL(sdw_bus_master_delete);