// SPDX-License-Identifier: GPL-2.0-only
/*
 * The Industrial I/O core, software IIO devices functions
 *
 * Copyright (c) 2016 Intel Corporation
 */

#include <linux/module.h>
#include <linux/init.h>
#include <linux/kmod.h>
#include <linux/list.h>
#include <linux/slab.h>

#include <linux/iio/sw_device.h>
#include <linux/iio/configfs.h>
#include <linux/configfs.h>

static struct config_group *iio_devices_group;
static const struct config_item_type iio_device_type_group_type;

static const struct config_item_type iio_devices_group_type = {
	.ct_owner = THIS_MODULE,
};

static LIST_HEAD(iio_device_types_list);
static DEFINE_MUTEX(iio_device_types_lock);

static
struct iio_sw_device_type *__iio_find_sw_device_type(const char *name,
						     unsigned int len)
{
	struct iio_sw_device_type *d = NULL, *iter;

	list_for_each_entry(iter, &iio_device_types_list, list)
		if (!strcmp(iter->name, name)) {
			d = iter;
			break;
		}

	return d;
}

int iio_register_sw_device_type(struct iio_sw_device_type *d)
{
	struct iio_sw_device_type *iter;
	int ret = 0;

	mutex_lock(&iio_device_types_lock);
	iter = __iio_find_sw_device_type(d->name, strlen(d->name));
	if (iter)
		ret = -EBUSY;
	else
		list_add_tail(&d->list, &iio_device_types_list);
	mutex_unlock(&iio_device_types_lock);

	if (ret)
		return ret;

	d->group = configfs_register_default_group(iio_devices_group, d->name,
						&iio_device_type_group_type);
	if (IS_ERR(d->group))
		ret = PTR_ERR(d->group);

	return ret;
}
EXPORT_SYMBOL(iio_register_sw_device_type);

void iio_unregister_sw_device_type(struct iio_sw_device_type *dt)
{
	struct iio_sw_device_type *iter;

	mutex_lock(&iio_device_types_lock);
	iter = __iio_find_sw_device_type(dt->name, strlen(dt->name));
	if (iter)
		list_del(&dt->list);
	mutex_unlock(&iio_device_types_lock);

	configfs_unregister_default_group(dt->group);
}
EXPORT_SYMBOL(iio_unregister_sw_device_type);

static
struct iio_sw_device_type *iio_get_sw_device_type(const char *name)
{
	struct iio_sw_device_type *dt;

	mutex_lock(&iio_device_types_lock);
	dt = __iio_find_sw_device_type(name, strlen(name));
	if (dt && !try_module_get(dt->owner))
		dt = NULL;
	mutex_unlock(&iio_device_types_lock);

	return dt;
}

struct iio_sw_device *iio_sw_device_create(const char *type, const char *name)
{
	struct iio_sw_device *d;
	struct iio_sw_device_type *dt;

	dt = iio_get_sw_device_type(type);
	if (!dt) {
		pr_err("Invalid device type: %s\n", type);
		return ERR_PTR(-EINVAL);
	}
	d = dt->ops->probe(name);
	if (IS_ERR(d))
		goto out_module_put;

	d->device_type = dt;

	return d;
out_module_put:
	module_put(dt->owner);
	return d;
}
EXPORT_SYMBOL(iio_sw_device_create);

void iio_sw_device_destroy(struct iio_sw_device *d)
{
	struct iio_sw_device_type *dt = d->device_type;

	dt->ops->remove(d);
	module_put(dt->owner);
}
EXPORT_SYMBOL(iio_sw_device_destroy);

static struct config_group *device_make_group(struct config_group *group,
					      const char *name)
{
	struct iio_sw_device *d;

	d = iio_sw_device_create(group->cg_item.ci_name, name);
	if (IS_ERR(d))
		return ERR_CAST(d);

	config_item_set_name(&d->group.cg_item, "%s", name);

	return &d->group;
}

static void device_drop_group(struct config_group *group,
			      struct config_item *item)
{
	struct iio_sw_device *d = to_iio_sw_device(item);

	iio_sw_device_destroy(d);
	config_item_put(item);
}

static struct configfs_group_operations device_ops = {
	.make_group	= &device_make_group,
	.drop_item	= &device_drop_group,
};

static const struct config_item_type iio_device_type_group_type = {
	.ct_group_ops = &device_ops,
	.ct_owner       = THIS_MODULE,
};

static int __init iio_sw_device_init(void)
{
	iio_devices_group =
		configfs_register_default_group(&iio_configfs_subsys.su_group,
						"devices",
						&iio_devices_group_type);
	return PTR_ERR_OR_ZERO(iio_devices_group);
}
module_init(iio_sw_device_init);

static void __exit iio_sw_device_exit(void)
{
	configfs_unregister_default_group(iio_devices_group);
}
module_exit(iio_sw_device_exit);

MODULE_AUTHOR("Daniel Baluta <daniel.baluta@intel.com>");
MODULE_DESCRIPTION("Industrial I/O software devices support");
MODULE_LICENSE("GPL v2");
