Commit 26c1aa9c authored by Yizhen Fan's avatar Yizhen Fan Committed by fanyizhen1995
Browse files

ub: Add register/unregister client api in ubcore



driver inclusion
category: feature
bugzilla: NA
CVE: NA

--------------------------------

Add register/unregister client api in ubcore

This api will be used by client of ubcore,
which call this api to register as a client of ubcore

Signed-off-by: default avatarGuoxin Qian <qianguoxin@huawei.com>
Signed-off-by: default avatarYizhen Fan <fanyizhen@huawei.com>
parent 2d934649
Loading
Loading
Loading
Loading
+73 −0
Original line number Diff line number Diff line
@@ -83,6 +83,79 @@ static void destroy_client_ctx(struct ubcore_device *dev, struct ubcore_client_c
	kfree(ctx);
}

int ubcore_register_client(struct ubcore_client *new_client)
{
	struct ubcore_device *dev;
	struct ubcore_client_ctx *ctx = NULL;

	mutex_lock(&g_device_mutex);

	list_for_each_entry(dev, &g_device_list, list_node) {
		ctx = create_client_ctx(dev, new_client);
		if (ctx == NULL)
			continue;

		if (new_client->add && new_client->add(dev) != 0) {
			destroy_client_ctx(dev, ctx);
			ubcore_log_err("ubcore client: %s register dev:%s failed.\n",
				       new_client->client_name, dev->dev_name);
		}
	}
	down_write(&g_lists_rwsem);
	list_add_tail(&new_client->list_node, &g_client_list);
	up_write(&g_lists_rwsem);

	mutex_unlock(&g_device_mutex);

	ubcore_log_info("ubcore client: %s register success.\n", new_client->client_name);
	return 0;
}
EXPORT_SYMBOL(ubcore_register_client);

void ubcore_unregister_client(struct ubcore_client *rm_client)
{
	struct ubcore_client_ctx *ctx, *tmp;
	struct ubcore_device *dev;
	unsigned long flags;

	mutex_lock(&g_device_mutex);

	down_write(&g_lists_rwsem);
	list_del(&rm_client->list_node);
	up_write(&g_lists_rwsem);

	list_for_each_entry(dev, &g_device_list, list_node) {
		struct ubcore_client_ctx *found_ctx = NULL;

		down_write(&g_lists_rwsem);
		spin_lock_irqsave(&dev->client_ctx_lock, flags);
		list_for_each_entry_safe(ctx, tmp, &dev->client_ctx_list, list_node) {
			if (ctx->client == rm_client) {
				found_ctx = ctx;
				break;
			}
		}
		spin_unlock_irqrestore(&dev->client_ctx_lock, flags);
		up_write(&g_lists_rwsem);

		if (found_ctx == NULL) {
			ubcore_log_warn("no client ctx found, dev_name: %s, client_name: %s.\n",
					dev->dev_name, rm_client->client_name);
			continue;
		}
		if (rm_client->remove)
			rm_client->remove(dev, found_ctx->data);

		destroy_client_ctx(dev, found_ctx);
		ubcore_log_info("dev remove client, dev_name: %s, client_name: %s.\n",
				dev->dev_name, rm_client->client_name);
	}

	mutex_unlock(&g_device_mutex);
	ubcore_log_info("ubcore client: %s unregister success.\n", rm_client->client_name);
}
EXPORT_SYMBOL(ubcore_unregister_client);

struct ubcore_device *ubcore_find_device(union ubcore_eid *eid, enum ubcore_transport_type type)
{
	struct ubcore_device *dev, *target = NULL;
+12 −0
Original line number Diff line number Diff line
@@ -39,6 +39,18 @@ int ubcore_set_eid(struct ubcore_device *dev, union ubcore_eid *eid);
 * @return: 0 on success, other value on error
 */
int ubcore_query_device_attr(struct ubcore_device *dev, struct ubcore_device_attr *attr);
/**
 * Register a new client to ubcore
 * @param[in] dev: the ubcore_device handle;
 * @param[in] new_client: ubcore client to be registered
 * @return: 0 on success, other value on error
 */
int ubcore_register_client(struct ubcore_client *new_client);
/**
 * Unregister a client from ubcore
 * @param[in] rm_client: ubcore client to be unregistered
 */
void ubcore_unregister_client(struct ubcore_client *rm_client);
/**
 * query stats
 * @param[in] dev: the ubcore_device handle;