// SPDX-License-Identifier: GPL-2.0-or-later
/*
 *  Jack abstraction layer
 *
 *  Copyright 2008 Wolfson Microelectronics
 */

#include <linux/input.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/ctype.h>
#include <linux/mm.h>
#include <linux/debugfs.h>
#include <sound/jack.h>
#include <sound/core.h>
#include <sound/control.h>

struct snd_jack_kctl {
	struct snd_kcontrol *kctl;
	struct list_head list;  /* list of controls belong to the same jack */
	unsigned int mask_bits; /* only masked status bits are reported via kctl */
	struct snd_jack *jack;  /* pointer to struct snd_jack */
	bool sw_inject_enable;  /* allow to inject plug event via debugfs */
#ifdef CONFIG_SND_JACK_INJECTION_DEBUG
	struct dentry *jack_debugfs_root; /* jack_kctl debugfs root */
#endif
};

#ifdef CONFIG_SND_JACK_INPUT_DEV
static const int jack_switch_types[SND_JACK_SWITCH_TYPES] = {
	SW_HEADPHONE_INSERT,
	SW_MICROPHONE_INSERT,
	SW_LINEOUT_INSERT,
	SW_JACK_PHYSICAL_INSERT,
	SW_VIDEOOUT_INSERT,
	SW_LINEIN_INSERT,
};
#endif /* CONFIG_SND_JACK_INPUT_DEV */

static void snd_jack_remove_debugfs(struct snd_jack *jack);

static int snd_jack_dev_disconnect(struct snd_device *device)
{
	struct snd_jack *jack = device->device_data;

	snd_jack_remove_debugfs(jack);

#ifdef CONFIG_SND_JACK_INPUT_DEV
	guard(mutex)(&jack->input_dev_lock);
	if (!jack->input_dev)
		return 0;

	/* If the input device is registered with the input subsystem
	 * then we need to use a different deallocator. */
	if (jack->registered)
		input_unregister_device(jack->input_dev);
	else
		input_free_device(jack->input_dev);
	jack->input_dev = NULL;
#endif /* CONFIG_SND_JACK_INPUT_DEV */
	return 0;
}

static int snd_jack_dev_free(struct snd_device *device)
{
	struct snd_jack *jack = device->device_data;
	struct snd_card *card = device->card;
	struct snd_jack_kctl *jack_kctl, *tmp_jack_kctl;

	list_for_each_entry_safe(jack_kctl, tmp_jack_kctl, &jack->kctl_list, list) {
		list_del_init(&jack_kctl->list);
		snd_ctl_remove(card, jack_kctl->kctl);
	}

	if (jack->private_free)
		jack->private_free(jack);

	snd_jack_dev_disconnect(device);

	kfree(jack->id);
	kfree(jack);

	return 0;
}

#ifdef CONFIG_SND_JACK_INPUT_DEV
static int snd_jack_dev_register(struct snd_device *device)
{
	struct snd_jack *jack = device->device_data;
	struct snd_card *card = device->card;
	int err, i;

	snprintf(jack->name, sizeof(jack->name), "%s %s",
		 card->shortname, jack->id);

	guard(mutex)(&jack->input_dev_lock);
	if (!jack->input_dev)
		return 0;

	jack->input_dev->name = jack->name;

	/* Default to the sound card device. */
	if (!jack->input_dev->dev.parent)
		jack->input_dev->dev.parent = snd_card_get_device_link(card);

	/* Add capabilities for any keys that are enabled */
	for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
		int testbit = SND_JACK_BTN_0 >> i;

		if (!(jack->type & testbit))
			continue;

		if (!jack->key[i])
			jack->key[i] = BTN_0 + i;

		input_set_capability(jack->input_dev, EV_KEY, jack->key[i]);
	}

	err = input_register_device(jack->input_dev);
	if (err == 0)
		jack->registered = 1;

	return err;
}
#endif /* CONFIG_SND_JACK_INPUT_DEV */

#ifdef CONFIG_SND_JACK_INJECTION_DEBUG
static void snd_jack_inject_report(struct snd_jack_kctl *jack_kctl, int status)
{
	struct snd_jack *jack;
#ifdef CONFIG_SND_JACK_INPUT_DEV
	int i;
#endif
	if (!jack_kctl)
		return;

	jack = jack_kctl->jack;

	if (jack_kctl->sw_inject_enable)
		snd_kctl_jack_report(jack->card, jack_kctl->kctl,
				     status & jack_kctl->mask_bits);

#ifdef CONFIG_SND_JACK_INPUT_DEV
	if (!jack->input_dev)
		return;

	for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
		int testbit = ((SND_JACK_BTN_0 >> i) & jack_kctl->mask_bits);

		if (jack->type & testbit)
			input_report_key(jack->input_dev, jack->key[i],
					 status & testbit);
	}

	for (i = 0; i < ARRAY_SIZE(jack_switch_types); i++) {
		int testbit = ((1 << i) & jack_kctl->mask_bits);

		if (jack->type & testbit)
			input_report_switch(jack->input_dev,
					    jack_switch_types[i],
					    status & testbit);
	}

	input_sync(jack->input_dev);
#endif /* CONFIG_SND_JACK_INPUT_DEV */
}

static ssize_t sw_inject_enable_read(struct file *file,
				     char __user *to, size_t count, loff_t *ppos)
{
	struct snd_jack_kctl *jack_kctl = file->private_data;
	int len, ret;
	char buf[128];

	len = scnprintf(buf, sizeof(buf), "%s: %s\t\t%s: %i\n", "Jack", jack_kctl->kctl->id.name,
			"Inject Enabled", jack_kctl->sw_inject_enable);
	ret = simple_read_from_buffer(to, count, ppos, buf, len);

	return ret;
}

static ssize_t sw_inject_enable_write(struct file *file,
				      const char __user *from, size_t count, loff_t *ppos)
{
	struct snd_jack_kctl *jack_kctl = file->private_data;
	int ret, err;
	unsigned long enable;
	char buf[8] = { 0 };

	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, from, count);
	err = kstrtoul(buf, 0, &enable);
	if (err)
		return err;

	if (jack_kctl->sw_inject_enable == (!!enable))
		return ret;

	jack_kctl->sw_inject_enable = !!enable;

	if (!jack_kctl->sw_inject_enable)
		snd_jack_report(jack_kctl->jack, jack_kctl->jack->hw_status_cache);

	return ret;
}

static ssize_t jackin_inject_write(struct file *file,
				   const char __user *from, size_t count, loff_t *ppos)
{
	struct snd_jack_kctl *jack_kctl = file->private_data;
	int ret, err;
	unsigned long enable;
	char buf[8] = { 0 };

	if (!jack_kctl->sw_inject_enable)
		return -EINVAL;

	ret = simple_write_to_buffer(buf, sizeof(buf) - 1, ppos, from, count);
	err = kstrtoul(buf, 0, &enable);
	if (err)
		return err;

	snd_jack_inject_report(jack_kctl, !!enable ? jack_kctl->mask_bits : 0);

	return ret;
}

static ssize_t jack_kctl_id_read(struct file *file,
				 char __user *to, size_t count, loff_t *ppos)
{
	struct snd_jack_kctl *jack_kctl = file->private_data;
	char buf[64];
	int len, ret;

	len = scnprintf(buf, sizeof(buf), "%s\n", jack_kctl->kctl->id.name);
	ret = simple_read_from_buffer(to, count, ppos, buf, len);

	return ret;
}

/* the bit definition is aligned with snd_jack_types in jack.h */
static const char * const jack_events_name[] = {
	"HEADPHONE(0x0001)", "MICROPHONE(0x0002)", "LINEOUT(0x0004)",
	"MECHANICAL(0x0008)", "VIDEOOUT(0x0010)", "LINEIN(0x0020)",
	"", "", "", "BTN_5(0x0200)", "BTN_4(0x0400)", "BTN_3(0x0800)",
	"BTN_2(0x1000)", "BTN_1(0x2000)", "BTN_0(0x4000)", "",
};

/* the recommended buffer size is 256 */
static int parse_mask_bits(unsigned int mask_bits, char *buf, size_t buf_size)
{
	int i;

	scnprintf(buf, buf_size, "0x%04x", mask_bits);

	for (i = 0; i < ARRAY_SIZE(jack_events_name); i++)
		if (mask_bits & (1 << i)) {
			strlcat(buf, " ", buf_size);
			strlcat(buf, jack_events_name[i], buf_size);
		}
	strlcat(buf, "\n", buf_size);

	return strlen(buf);
}

static ssize_t jack_kctl_mask_bits_read(struct file *file,
					char __user *to, size_t count, loff_t *ppos)
{
	struct snd_jack_kctl *jack_kctl = file->private_data;
	char buf[256];
	int len, ret;

	len = parse_mask_bits(jack_kctl->mask_bits, buf, sizeof(buf));
	ret = simple_read_from_buffer(to, count, ppos, buf, len);

	return ret;
}

static ssize_t jack_kctl_status_read(struct file *file,
				     char __user *to, size_t count, loff_t *ppos)
{
	struct snd_jack_kctl *jack_kctl = file->private_data;
	char buf[16];
	int len, ret;

	len = scnprintf(buf, sizeof(buf), "%s\n", jack_kctl->kctl->private_value ?
			"Plugged" : "Unplugged");
	ret = simple_read_from_buffer(to, count, ppos, buf, len);

	return ret;
}

#ifdef CONFIG_SND_JACK_INPUT_DEV
static ssize_t jack_type_read(struct file *file,
			      char __user *to, size_t count, loff_t *ppos)
{
	struct snd_jack_kctl *jack_kctl = file->private_data;
	char buf[256];
	int len, ret;

	len = parse_mask_bits(jack_kctl->jack->type, buf, sizeof(buf));
	ret = simple_read_from_buffer(to, count, ppos, buf, len);

	return ret;
}

static const struct file_operations jack_type_fops = {
	.open = simple_open,
	.read = jack_type_read,
	.llseek = default_llseek,
};
#endif

static const struct file_operations sw_inject_enable_fops = {
	.open = simple_open,
	.read = sw_inject_enable_read,
	.write = sw_inject_enable_write,
	.llseek = default_llseek,
};

static const struct file_operations jackin_inject_fops = {
	.open = simple_open,
	.write = jackin_inject_write,
	.llseek = default_llseek,
};

static const struct file_operations jack_kctl_id_fops = {
	.open = simple_open,
	.read = jack_kctl_id_read,
	.llseek = default_llseek,
};

static const struct file_operations jack_kctl_mask_bits_fops = {
	.open = simple_open,
	.read = jack_kctl_mask_bits_read,
	.llseek = default_llseek,
};

static const struct file_operations jack_kctl_status_fops = {
	.open = simple_open,
	.read = jack_kctl_status_read,
	.llseek = default_llseek,
};

static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
					    struct snd_jack_kctl *jack_kctl)
{
	char *tname;
	int i;

	/* Don't create injection interface for Phantom jacks */
	if (strstr(jack_kctl->kctl->id.name, "Phantom"))
		return 0;

	tname = kstrdup(jack_kctl->kctl->id.name, GFP_KERNEL);
	if (!tname)
		return -ENOMEM;

	/* replace the chars which are not suitable for folder's name with _ */
	for (i = 0; tname[i]; i++)
		if (!isalnum(tname[i]))
			tname[i] = '_';

	jack_kctl->jack_debugfs_root = debugfs_create_dir(tname, jack->card->debugfs_root);
	kfree(tname);

	debugfs_create_file("sw_inject_enable", 0644, jack_kctl->jack_debugfs_root, jack_kctl,
			    &sw_inject_enable_fops);

	debugfs_create_file("jackin_inject", 0200, jack_kctl->jack_debugfs_root, jack_kctl,
			    &jackin_inject_fops);

	debugfs_create_file("kctl_id", 0444, jack_kctl->jack_debugfs_root, jack_kctl,
			    &jack_kctl_id_fops);

	debugfs_create_file("mask_bits", 0444, jack_kctl->jack_debugfs_root, jack_kctl,
			    &jack_kctl_mask_bits_fops);

	debugfs_create_file("status", 0444, jack_kctl->jack_debugfs_root, jack_kctl,
			    &jack_kctl_status_fops);

#ifdef CONFIG_SND_JACK_INPUT_DEV
	debugfs_create_file("type", 0444, jack_kctl->jack_debugfs_root, jack_kctl,
			    &jack_type_fops);
#endif
	return 0;
}

static void snd_jack_remove_debugfs(struct snd_jack *jack)
{
	struct snd_jack_kctl *jack_kctl;

	list_for_each_entry(jack_kctl, &jack->kctl_list, list) {
		debugfs_remove(jack_kctl->jack_debugfs_root);
		jack_kctl->jack_debugfs_root = NULL;
	}
}
#else /* CONFIG_SND_JACK_INJECTION_DEBUG */
static int snd_jack_debugfs_add_inject_node(struct snd_jack *jack,
					    struct snd_jack_kctl *jack_kctl)
{
	return 0;
}

static void snd_jack_remove_debugfs(struct snd_jack *jack)
{
}
#endif /* CONFIG_SND_JACK_INJECTION_DEBUG */

static void snd_jack_kctl_private_free(struct snd_kcontrol *kctl)
{
	struct snd_jack_kctl *jack_kctl;

	jack_kctl = kctl->private_data;
	if (jack_kctl) {
		list_del(&jack_kctl->list);
		kfree(jack_kctl);
	}
}

static void snd_jack_kctl_add(struct snd_jack *jack, struct snd_jack_kctl *jack_kctl)
{
	jack_kctl->jack = jack;
	list_add_tail(&jack_kctl->list, &jack->kctl_list);
	snd_jack_debugfs_add_inject_node(jack, jack_kctl);
}

static struct snd_jack_kctl * snd_jack_kctl_new(struct snd_card *card, const char *name, unsigned int mask)
{
	struct snd_kcontrol *kctl;
	struct snd_jack_kctl *jack_kctl;
	int err;

	kctl = snd_kctl_jack_new(name, card);
	if (!kctl)
		return NULL;

	err = snd_ctl_add(card, kctl);
	if (err < 0)
		return NULL;

	jack_kctl = kzalloc(sizeof(*jack_kctl), GFP_KERNEL);

	if (!jack_kctl)
		goto error;

	jack_kctl->kctl = kctl;
	jack_kctl->mask_bits = mask;

	kctl->private_data = jack_kctl;
	kctl->private_free = snd_jack_kctl_private_free;

	return jack_kctl;
error:
	snd_ctl_free_one(kctl);
	return NULL;
}

/**
 * snd_jack_add_new_kctl - Create a new snd_jack_kctl and add it to jack
 * @jack:  the jack instance which the kctl will attaching to
 * @name:  the name for the snd_kcontrol object
 * @mask:  a bitmask of enum snd_jack_type values that can be detected
 *         by this snd_jack_kctl object.
 *
 * Creates a new snd_kcontrol object and adds it to the jack kctl_list.
 *
 * Return: Zero if successful, or a negative error code on failure.
 */
int snd_jack_add_new_kctl(struct snd_jack *jack, const char * name, int mask)
{
	struct snd_jack_kctl *jack_kctl;

	jack_kctl = snd_jack_kctl_new(jack->card, name, mask);
	if (!jack_kctl)
		return -ENOMEM;

	snd_jack_kctl_add(jack, jack_kctl);
	return 0;
}
EXPORT_SYMBOL(snd_jack_add_new_kctl);

/**
 * snd_jack_new - Create a new jack
 * @card:  the card instance
 * @id:    an identifying string for this jack
 * @type:  a bitmask of enum snd_jack_type values that can be detected by
 *         this jack
 * @jjack: Used to provide the allocated jack object to the caller.
 * @initial_kctl: if true, create a kcontrol and add it to the jack list.
 * @phantom_jack: Don't create a input device for phantom jacks.
 *
 * Creates a new jack object.
 *
 * Return: Zero if successful, or a negative error code on failure.
 * On success @jjack will be initialised.
 */
int snd_jack_new(struct snd_card *card, const char *id, int type,
		 struct snd_jack **jjack, bool initial_kctl, bool phantom_jack)
{
	struct snd_jack *jack;
	struct snd_jack_kctl *jack_kctl = NULL;
	int err;
	static const struct snd_device_ops ops = {
		.dev_free = snd_jack_dev_free,
#ifdef CONFIG_SND_JACK_INPUT_DEV
		.dev_register = snd_jack_dev_register,
#endif /* CONFIG_SND_JACK_INPUT_DEV */
		.dev_disconnect = snd_jack_dev_disconnect,
	};

	if (initial_kctl) {
		jack_kctl = snd_jack_kctl_new(card, id, type);
		if (!jack_kctl)
			return -ENOMEM;
	}

	jack = kzalloc(sizeof(struct snd_jack), GFP_KERNEL);
	if (jack == NULL)
		return -ENOMEM;

	jack->id = kstrdup(id, GFP_KERNEL);
	if (jack->id == NULL) {
		kfree(jack);
		return -ENOMEM;
	}

#ifdef CONFIG_SND_JACK_INPUT_DEV
	mutex_init(&jack->input_dev_lock);

	/* don't create input device for phantom jack */
	if (!phantom_jack) {
		int i;

		jack->input_dev = input_allocate_device();
		if (jack->input_dev == NULL) {
			err = -ENOMEM;
			goto fail_input;
		}

		jack->input_dev->phys = "ALSA";

		jack->type = type;

		for (i = 0; i < SND_JACK_SWITCH_TYPES; i++)
			if (type & (1 << i))
				input_set_capability(jack->input_dev, EV_SW,
						     jack_switch_types[i]);

	}
#endif /* CONFIG_SND_JACK_INPUT_DEV */

	err = snd_device_new(card, SNDRV_DEV_JACK, jack, &ops);
	if (err < 0)
		goto fail_input;

	jack->card = card;
	INIT_LIST_HEAD(&jack->kctl_list);

	if (initial_kctl)
		snd_jack_kctl_add(jack, jack_kctl);

	*jjack = jack;

	return 0;

fail_input:
#ifdef CONFIG_SND_JACK_INPUT_DEV
	input_free_device(jack->input_dev);
#endif
	kfree(jack->id);
	kfree(jack);
	return err;
}
EXPORT_SYMBOL(snd_jack_new);

#ifdef CONFIG_SND_JACK_INPUT_DEV
/**
 * snd_jack_set_parent - Set the parent device for a jack
 *
 * @jack:   The jack to configure
 * @parent: The device to set as parent for the jack.
 *
 * Set the parent for the jack devices in the device tree.  This
 * function is only valid prior to registration of the jack.  If no
 * parent is configured then the parent device will be the sound card.
 */
void snd_jack_set_parent(struct snd_jack *jack, struct device *parent)
{
	WARN_ON(jack->registered);
	guard(mutex)(&jack->input_dev_lock);
	if (jack->input_dev)
		jack->input_dev->dev.parent = parent;
}
EXPORT_SYMBOL(snd_jack_set_parent);

/**
 * snd_jack_set_key - Set a key mapping on a jack
 *
 * @jack:    The jack to configure
 * @type:    Jack report type for this key
 * @keytype: Input layer key type to be reported
 *
 * Map a SND_JACK_BTN_* button type to an input layer key, allowing
 * reporting of keys on accessories via the jack abstraction.  If no
 * mapping is provided but keys are enabled in the jack type then
 * BTN_n numeric buttons will be reported.
 *
 * If jacks are not reporting via the input API this call will have no
 * effect.
 *
 * Note that this is intended to be use by simple devices with small
 * numbers of keys that can be reported.  It is also possible to
 * access the input device directly - devices with complex input
 * capabilities on accessories should consider doing this rather than
 * using this abstraction.
 *
 * This function may only be called prior to registration of the jack.
 *
 * Return: Zero if successful, or a negative error code on failure.
 */
int snd_jack_set_key(struct snd_jack *jack, enum snd_jack_types type,
		     int keytype)
{
	int key = fls(SND_JACK_BTN_0) - fls(type);

	WARN_ON(jack->registered);

	if (!keytype || key >= ARRAY_SIZE(jack->key))
		return -EINVAL;

	jack->type |= type;
	jack->key[key] = keytype;
	return 0;
}
EXPORT_SYMBOL(snd_jack_set_key);
#endif /* CONFIG_SND_JACK_INPUT_DEV */

/**
 * snd_jack_report - Report the current status of a jack
 * Note: This function uses mutexes and should be called from a
 * context which can sleep (such as a workqueue).
 *
 * @jack:   The jack to report status for
 * @status: The current status of the jack
 */
void snd_jack_report(struct snd_jack *jack, int status)
{
	struct snd_jack_kctl *jack_kctl;
	unsigned int mask_bits = 0;
#ifdef CONFIG_SND_JACK_INPUT_DEV
	struct input_dev *idev;
	int i;
#endif

	if (!jack)
		return;

	jack->hw_status_cache = status;

	list_for_each_entry(jack_kctl, &jack->kctl_list, list)
		if (jack_kctl->sw_inject_enable)
			mask_bits |= jack_kctl->mask_bits;
		else
			snd_kctl_jack_report(jack->card, jack_kctl->kctl,
					     status & jack_kctl->mask_bits);

#ifdef CONFIG_SND_JACK_INPUT_DEV
	idev = input_get_device(jack->input_dev);
	if (!idev)
		return;

	for (i = 0; i < ARRAY_SIZE(jack->key); i++) {
		int testbit = ((SND_JACK_BTN_0 >> i) & ~mask_bits);

		if (jack->type & testbit)
			input_report_key(idev, jack->key[i],
					 status & testbit);
	}

	for (i = 0; i < ARRAY_SIZE(jack_switch_types); i++) {
		int testbit = ((1 << i) & ~mask_bits);

		if (jack->type & testbit)
			input_report_switch(idev,
					    jack_switch_types[i],
					    status & testbit);
	}

	input_sync(idev);
	input_put_device(idev);
#endif /* CONFIG_SND_JACK_INPUT_DEV */
}
EXPORT_SYMBOL(snd_jack_report);
