162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * The input core
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (c) 1999-2002 Vojtech Pavlik
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#define pr_fmt(fmt) KBUILD_BASENAME ": " fmt
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include <linux/init.h>
1262306a36Sopenharmony_ci#include <linux/types.h>
1362306a36Sopenharmony_ci#include <linux/idr.h>
1462306a36Sopenharmony_ci#include <linux/input/mt.h>
1562306a36Sopenharmony_ci#include <linux/module.h>
1662306a36Sopenharmony_ci#include <linux/slab.h>
1762306a36Sopenharmony_ci#include <linux/random.h>
1862306a36Sopenharmony_ci#include <linux/major.h>
1962306a36Sopenharmony_ci#include <linux/proc_fs.h>
2062306a36Sopenharmony_ci#include <linux/sched.h>
2162306a36Sopenharmony_ci#include <linux/seq_file.h>
2262306a36Sopenharmony_ci#include <linux/pm.h>
2362306a36Sopenharmony_ci#include <linux/poll.h>
2462306a36Sopenharmony_ci#include <linux/device.h>
2562306a36Sopenharmony_ci#include <linux/kstrtox.h>
2662306a36Sopenharmony_ci#include <linux/mutex.h>
2762306a36Sopenharmony_ci#include <linux/rcupdate.h>
2862306a36Sopenharmony_ci#include "input-compat.h"
2962306a36Sopenharmony_ci#include "input-core-private.h"
3062306a36Sopenharmony_ci#include "input-poller.h"
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ciMODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
3362306a36Sopenharmony_ciMODULE_DESCRIPTION("Input core");
3462306a36Sopenharmony_ciMODULE_LICENSE("GPL");
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define INPUT_MAX_CHAR_DEVICES		1024
3762306a36Sopenharmony_ci#define INPUT_FIRST_DYNAMIC_DEV		256
3862306a36Sopenharmony_cistatic DEFINE_IDA(input_ida);
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistatic LIST_HEAD(input_dev_list);
4162306a36Sopenharmony_cistatic LIST_HEAD(input_handler_list);
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci/*
4462306a36Sopenharmony_ci * input_mutex protects access to both input_dev_list and input_handler_list.
4562306a36Sopenharmony_ci * This also causes input_[un]register_device and input_[un]register_handler
4662306a36Sopenharmony_ci * be mutually exclusive which simplifies locking in drivers implementing
4762306a36Sopenharmony_ci * input handlers.
4862306a36Sopenharmony_ci */
4962306a36Sopenharmony_cistatic DEFINE_MUTEX(input_mutex);
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_cistatic const struct input_value input_value_sync = { EV_SYN, SYN_REPORT, 1 };
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic const unsigned int input_max_code[EV_CNT] = {
5462306a36Sopenharmony_ci	[EV_KEY] = KEY_MAX,
5562306a36Sopenharmony_ci	[EV_REL] = REL_MAX,
5662306a36Sopenharmony_ci	[EV_ABS] = ABS_MAX,
5762306a36Sopenharmony_ci	[EV_MSC] = MSC_MAX,
5862306a36Sopenharmony_ci	[EV_SW] = SW_MAX,
5962306a36Sopenharmony_ci	[EV_LED] = LED_MAX,
6062306a36Sopenharmony_ci	[EV_SND] = SND_MAX,
6162306a36Sopenharmony_ci	[EV_FF] = FF_MAX,
6262306a36Sopenharmony_ci};
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_cistatic inline int is_event_supported(unsigned int code,
6562306a36Sopenharmony_ci				     unsigned long *bm, unsigned int max)
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	return code <= max && test_bit(code, bm);
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_cistatic int input_defuzz_abs_event(int value, int old_val, int fuzz)
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	if (fuzz) {
7362306a36Sopenharmony_ci		if (value > old_val - fuzz / 2 && value < old_val + fuzz / 2)
7462306a36Sopenharmony_ci			return old_val;
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci		if (value > old_val - fuzz && value < old_val + fuzz)
7762306a36Sopenharmony_ci			return (old_val * 3 + value) / 4;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci		if (value > old_val - fuzz * 2 && value < old_val + fuzz * 2)
8062306a36Sopenharmony_ci			return (old_val + value) / 2;
8162306a36Sopenharmony_ci	}
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci	return value;
8462306a36Sopenharmony_ci}
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cistatic void input_start_autorepeat(struct input_dev *dev, int code)
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	if (test_bit(EV_REP, dev->evbit) &&
8962306a36Sopenharmony_ci	    dev->rep[REP_PERIOD] && dev->rep[REP_DELAY] &&
9062306a36Sopenharmony_ci	    dev->timer.function) {
9162306a36Sopenharmony_ci		dev->repeat_key = code;
9262306a36Sopenharmony_ci		mod_timer(&dev->timer,
9362306a36Sopenharmony_ci			  jiffies + msecs_to_jiffies(dev->rep[REP_DELAY]));
9462306a36Sopenharmony_ci	}
9562306a36Sopenharmony_ci}
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_cistatic void input_stop_autorepeat(struct input_dev *dev)
9862306a36Sopenharmony_ci{
9962306a36Sopenharmony_ci	del_timer(&dev->timer);
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_ci/*
10362306a36Sopenharmony_ci * Pass event first through all filters and then, if event has not been
10462306a36Sopenharmony_ci * filtered out, through all open handles. This function is called with
10562306a36Sopenharmony_ci * dev->event_lock held and interrupts disabled.
10662306a36Sopenharmony_ci */
10762306a36Sopenharmony_cistatic unsigned int input_to_handler(struct input_handle *handle,
10862306a36Sopenharmony_ci			struct input_value *vals, unsigned int count)
10962306a36Sopenharmony_ci{
11062306a36Sopenharmony_ci	struct input_handler *handler = handle->handler;
11162306a36Sopenharmony_ci	struct input_value *end = vals;
11262306a36Sopenharmony_ci	struct input_value *v;
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	if (handler->filter) {
11562306a36Sopenharmony_ci		for (v = vals; v != vals + count; v++) {
11662306a36Sopenharmony_ci			if (handler->filter(handle, v->type, v->code, v->value))
11762306a36Sopenharmony_ci				continue;
11862306a36Sopenharmony_ci			if (end != v)
11962306a36Sopenharmony_ci				*end = *v;
12062306a36Sopenharmony_ci			end++;
12162306a36Sopenharmony_ci		}
12262306a36Sopenharmony_ci		count = end - vals;
12362306a36Sopenharmony_ci	}
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci	if (!count)
12662306a36Sopenharmony_ci		return 0;
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	if (handler->events)
12962306a36Sopenharmony_ci		handler->events(handle, vals, count);
13062306a36Sopenharmony_ci	else if (handler->event)
13162306a36Sopenharmony_ci		for (v = vals; v != vals + count; v++)
13262306a36Sopenharmony_ci			handler->event(handle, v->type, v->code, v->value);
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci	return count;
13562306a36Sopenharmony_ci}
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/*
13862306a36Sopenharmony_ci * Pass values first through all filters and then, if event has not been
13962306a36Sopenharmony_ci * filtered out, through all open handles. This function is called with
14062306a36Sopenharmony_ci * dev->event_lock held and interrupts disabled.
14162306a36Sopenharmony_ci */
14262306a36Sopenharmony_cistatic void input_pass_values(struct input_dev *dev,
14362306a36Sopenharmony_ci			      struct input_value *vals, unsigned int count)
14462306a36Sopenharmony_ci{
14562306a36Sopenharmony_ci	struct input_handle *handle;
14662306a36Sopenharmony_ci	struct input_value *v;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci	lockdep_assert_held(&dev->event_lock);
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	if (!count)
15162306a36Sopenharmony_ci		return;
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	rcu_read_lock();
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci	handle = rcu_dereference(dev->grab);
15662306a36Sopenharmony_ci	if (handle) {
15762306a36Sopenharmony_ci		count = input_to_handler(handle, vals, count);
15862306a36Sopenharmony_ci	} else {
15962306a36Sopenharmony_ci		list_for_each_entry_rcu(handle, &dev->h_list, d_node)
16062306a36Sopenharmony_ci			if (handle->open) {
16162306a36Sopenharmony_ci				count = input_to_handler(handle, vals, count);
16262306a36Sopenharmony_ci				if (!count)
16362306a36Sopenharmony_ci					break;
16462306a36Sopenharmony_ci			}
16562306a36Sopenharmony_ci	}
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	rcu_read_unlock();
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	/* trigger auto repeat for key events */
17062306a36Sopenharmony_ci	if (test_bit(EV_REP, dev->evbit) && test_bit(EV_KEY, dev->evbit)) {
17162306a36Sopenharmony_ci		for (v = vals; v != vals + count; v++) {
17262306a36Sopenharmony_ci			if (v->type == EV_KEY && v->value != 2) {
17362306a36Sopenharmony_ci				if (v->value)
17462306a36Sopenharmony_ci					input_start_autorepeat(dev, v->code);
17562306a36Sopenharmony_ci				else
17662306a36Sopenharmony_ci					input_stop_autorepeat(dev);
17762306a36Sopenharmony_ci			}
17862306a36Sopenharmony_ci		}
17962306a36Sopenharmony_ci	}
18062306a36Sopenharmony_ci}
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci#define INPUT_IGNORE_EVENT	0
18362306a36Sopenharmony_ci#define INPUT_PASS_TO_HANDLERS	1
18462306a36Sopenharmony_ci#define INPUT_PASS_TO_DEVICE	2
18562306a36Sopenharmony_ci#define INPUT_SLOT		4
18662306a36Sopenharmony_ci#define INPUT_FLUSH		8
18762306a36Sopenharmony_ci#define INPUT_PASS_TO_ALL	(INPUT_PASS_TO_HANDLERS | INPUT_PASS_TO_DEVICE)
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_cistatic int input_handle_abs_event(struct input_dev *dev,
19062306a36Sopenharmony_ci				  unsigned int code, int *pval)
19162306a36Sopenharmony_ci{
19262306a36Sopenharmony_ci	struct input_mt *mt = dev->mt;
19362306a36Sopenharmony_ci	bool is_new_slot = false;
19462306a36Sopenharmony_ci	bool is_mt_event;
19562306a36Sopenharmony_ci	int *pold;
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	if (code == ABS_MT_SLOT) {
19862306a36Sopenharmony_ci		/*
19962306a36Sopenharmony_ci		 * "Stage" the event; we'll flush it later, when we
20062306a36Sopenharmony_ci		 * get actual touch data.
20162306a36Sopenharmony_ci		 */
20262306a36Sopenharmony_ci		if (mt && *pval >= 0 && *pval < mt->num_slots)
20362306a36Sopenharmony_ci			mt->slot = *pval;
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci		return INPUT_IGNORE_EVENT;
20662306a36Sopenharmony_ci	}
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_ci	is_mt_event = input_is_mt_value(code);
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	if (!is_mt_event) {
21162306a36Sopenharmony_ci		pold = &dev->absinfo[code].value;
21262306a36Sopenharmony_ci	} else if (mt) {
21362306a36Sopenharmony_ci		pold = &mt->slots[mt->slot].abs[code - ABS_MT_FIRST];
21462306a36Sopenharmony_ci		is_new_slot = mt->slot != dev->absinfo[ABS_MT_SLOT].value;
21562306a36Sopenharmony_ci	} else {
21662306a36Sopenharmony_ci		/*
21762306a36Sopenharmony_ci		 * Bypass filtering for multi-touch events when
21862306a36Sopenharmony_ci		 * not employing slots.
21962306a36Sopenharmony_ci		 */
22062306a36Sopenharmony_ci		pold = NULL;
22162306a36Sopenharmony_ci	}
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci	if (pold) {
22462306a36Sopenharmony_ci		*pval = input_defuzz_abs_event(*pval, *pold,
22562306a36Sopenharmony_ci						dev->absinfo[code].fuzz);
22662306a36Sopenharmony_ci		if (*pold == *pval)
22762306a36Sopenharmony_ci			return INPUT_IGNORE_EVENT;
22862306a36Sopenharmony_ci
22962306a36Sopenharmony_ci		*pold = *pval;
23062306a36Sopenharmony_ci	}
23162306a36Sopenharmony_ci
23262306a36Sopenharmony_ci	/* Flush pending "slot" event */
23362306a36Sopenharmony_ci	if (is_new_slot) {
23462306a36Sopenharmony_ci		dev->absinfo[ABS_MT_SLOT].value = mt->slot;
23562306a36Sopenharmony_ci		return INPUT_PASS_TO_HANDLERS | INPUT_SLOT;
23662306a36Sopenharmony_ci	}
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	return INPUT_PASS_TO_HANDLERS;
23962306a36Sopenharmony_ci}
24062306a36Sopenharmony_ci
24162306a36Sopenharmony_cistatic int input_get_disposition(struct input_dev *dev,
24262306a36Sopenharmony_ci			  unsigned int type, unsigned int code, int *pval)
24362306a36Sopenharmony_ci{
24462306a36Sopenharmony_ci	int disposition = INPUT_IGNORE_EVENT;
24562306a36Sopenharmony_ci	int value = *pval;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	/* filter-out events from inhibited devices */
24862306a36Sopenharmony_ci	if (dev->inhibited)
24962306a36Sopenharmony_ci		return INPUT_IGNORE_EVENT;
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_ci	switch (type) {
25262306a36Sopenharmony_ci
25362306a36Sopenharmony_ci	case EV_SYN:
25462306a36Sopenharmony_ci		switch (code) {
25562306a36Sopenharmony_ci		case SYN_CONFIG:
25662306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_ALL;
25762306a36Sopenharmony_ci			break;
25862306a36Sopenharmony_ci
25962306a36Sopenharmony_ci		case SYN_REPORT:
26062306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_HANDLERS | INPUT_FLUSH;
26162306a36Sopenharmony_ci			break;
26262306a36Sopenharmony_ci		case SYN_MT_REPORT:
26362306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_HANDLERS;
26462306a36Sopenharmony_ci			break;
26562306a36Sopenharmony_ci		}
26662306a36Sopenharmony_ci		break;
26762306a36Sopenharmony_ci
26862306a36Sopenharmony_ci	case EV_KEY:
26962306a36Sopenharmony_ci		if (is_event_supported(code, dev->keybit, KEY_MAX)) {
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci			/* auto-repeat bypasses state updates */
27262306a36Sopenharmony_ci			if (value == 2) {
27362306a36Sopenharmony_ci				disposition = INPUT_PASS_TO_HANDLERS;
27462306a36Sopenharmony_ci				break;
27562306a36Sopenharmony_ci			}
27662306a36Sopenharmony_ci
27762306a36Sopenharmony_ci			if (!!test_bit(code, dev->key) != !!value) {
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci				__change_bit(code, dev->key);
28062306a36Sopenharmony_ci				disposition = INPUT_PASS_TO_HANDLERS;
28162306a36Sopenharmony_ci			}
28262306a36Sopenharmony_ci		}
28362306a36Sopenharmony_ci		break;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	case EV_SW:
28662306a36Sopenharmony_ci		if (is_event_supported(code, dev->swbit, SW_MAX) &&
28762306a36Sopenharmony_ci		    !!test_bit(code, dev->sw) != !!value) {
28862306a36Sopenharmony_ci
28962306a36Sopenharmony_ci			__change_bit(code, dev->sw);
29062306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_HANDLERS;
29162306a36Sopenharmony_ci		}
29262306a36Sopenharmony_ci		break;
29362306a36Sopenharmony_ci
29462306a36Sopenharmony_ci	case EV_ABS:
29562306a36Sopenharmony_ci		if (is_event_supported(code, dev->absbit, ABS_MAX))
29662306a36Sopenharmony_ci			disposition = input_handle_abs_event(dev, code, &value);
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_ci		break;
29962306a36Sopenharmony_ci
30062306a36Sopenharmony_ci	case EV_REL:
30162306a36Sopenharmony_ci		if (is_event_supported(code, dev->relbit, REL_MAX) && value)
30262306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_HANDLERS;
30362306a36Sopenharmony_ci
30462306a36Sopenharmony_ci		break;
30562306a36Sopenharmony_ci
30662306a36Sopenharmony_ci	case EV_MSC:
30762306a36Sopenharmony_ci		if (is_event_supported(code, dev->mscbit, MSC_MAX))
30862306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_ALL;
30962306a36Sopenharmony_ci
31062306a36Sopenharmony_ci		break;
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci	case EV_LED:
31362306a36Sopenharmony_ci		if (is_event_supported(code, dev->ledbit, LED_MAX) &&
31462306a36Sopenharmony_ci		    !!test_bit(code, dev->led) != !!value) {
31562306a36Sopenharmony_ci
31662306a36Sopenharmony_ci			__change_bit(code, dev->led);
31762306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_ALL;
31862306a36Sopenharmony_ci		}
31962306a36Sopenharmony_ci		break;
32062306a36Sopenharmony_ci
32162306a36Sopenharmony_ci	case EV_SND:
32262306a36Sopenharmony_ci		if (is_event_supported(code, dev->sndbit, SND_MAX)) {
32362306a36Sopenharmony_ci
32462306a36Sopenharmony_ci			if (!!test_bit(code, dev->snd) != !!value)
32562306a36Sopenharmony_ci				__change_bit(code, dev->snd);
32662306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_ALL;
32762306a36Sopenharmony_ci		}
32862306a36Sopenharmony_ci		break;
32962306a36Sopenharmony_ci
33062306a36Sopenharmony_ci	case EV_REP:
33162306a36Sopenharmony_ci		if (code <= REP_MAX && value >= 0 && dev->rep[code] != value) {
33262306a36Sopenharmony_ci			dev->rep[code] = value;
33362306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_ALL;
33462306a36Sopenharmony_ci		}
33562306a36Sopenharmony_ci		break;
33662306a36Sopenharmony_ci
33762306a36Sopenharmony_ci	case EV_FF:
33862306a36Sopenharmony_ci		if (value >= 0)
33962306a36Sopenharmony_ci			disposition = INPUT_PASS_TO_ALL;
34062306a36Sopenharmony_ci		break;
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci	case EV_PWR:
34362306a36Sopenharmony_ci		disposition = INPUT_PASS_TO_ALL;
34462306a36Sopenharmony_ci		break;
34562306a36Sopenharmony_ci	}
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci	*pval = value;
34862306a36Sopenharmony_ci	return disposition;
34962306a36Sopenharmony_ci}
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_cistatic void input_event_dispose(struct input_dev *dev, int disposition,
35262306a36Sopenharmony_ci				unsigned int type, unsigned int code, int value)
35362306a36Sopenharmony_ci{
35462306a36Sopenharmony_ci	if ((disposition & INPUT_PASS_TO_DEVICE) && dev->event)
35562306a36Sopenharmony_ci		dev->event(dev, type, code, value);
35662306a36Sopenharmony_ci
35762306a36Sopenharmony_ci	if (!dev->vals)
35862306a36Sopenharmony_ci		return;
35962306a36Sopenharmony_ci
36062306a36Sopenharmony_ci	if (disposition & INPUT_PASS_TO_HANDLERS) {
36162306a36Sopenharmony_ci		struct input_value *v;
36262306a36Sopenharmony_ci
36362306a36Sopenharmony_ci		if (disposition & INPUT_SLOT) {
36462306a36Sopenharmony_ci			v = &dev->vals[dev->num_vals++];
36562306a36Sopenharmony_ci			v->type = EV_ABS;
36662306a36Sopenharmony_ci			v->code = ABS_MT_SLOT;
36762306a36Sopenharmony_ci			v->value = dev->mt->slot;
36862306a36Sopenharmony_ci		}
36962306a36Sopenharmony_ci
37062306a36Sopenharmony_ci		v = &dev->vals[dev->num_vals++];
37162306a36Sopenharmony_ci		v->type = type;
37262306a36Sopenharmony_ci		v->code = code;
37362306a36Sopenharmony_ci		v->value = value;
37462306a36Sopenharmony_ci	}
37562306a36Sopenharmony_ci
37662306a36Sopenharmony_ci	if (disposition & INPUT_FLUSH) {
37762306a36Sopenharmony_ci		if (dev->num_vals >= 2)
37862306a36Sopenharmony_ci			input_pass_values(dev, dev->vals, dev->num_vals);
37962306a36Sopenharmony_ci		dev->num_vals = 0;
38062306a36Sopenharmony_ci		/*
38162306a36Sopenharmony_ci		 * Reset the timestamp on flush so we won't end up
38262306a36Sopenharmony_ci		 * with a stale one. Note we only need to reset the
38362306a36Sopenharmony_ci		 * monolithic one as we use its presence when deciding
38462306a36Sopenharmony_ci		 * whether to generate a synthetic timestamp.
38562306a36Sopenharmony_ci		 */
38662306a36Sopenharmony_ci		dev->timestamp[INPUT_CLK_MONO] = ktime_set(0, 0);
38762306a36Sopenharmony_ci	} else if (dev->num_vals >= dev->max_vals - 2) {
38862306a36Sopenharmony_ci		dev->vals[dev->num_vals++] = input_value_sync;
38962306a36Sopenharmony_ci		input_pass_values(dev, dev->vals, dev->num_vals);
39062306a36Sopenharmony_ci		dev->num_vals = 0;
39162306a36Sopenharmony_ci	}
39262306a36Sopenharmony_ci}
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_civoid input_handle_event(struct input_dev *dev,
39562306a36Sopenharmony_ci			unsigned int type, unsigned int code, int value)
39662306a36Sopenharmony_ci{
39762306a36Sopenharmony_ci	int disposition;
39862306a36Sopenharmony_ci
39962306a36Sopenharmony_ci	lockdep_assert_held(&dev->event_lock);
40062306a36Sopenharmony_ci
40162306a36Sopenharmony_ci	disposition = input_get_disposition(dev, type, code, &value);
40262306a36Sopenharmony_ci	if (disposition != INPUT_IGNORE_EVENT) {
40362306a36Sopenharmony_ci		if (type != EV_SYN)
40462306a36Sopenharmony_ci			add_input_randomness(type, code, value);
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci		input_event_dispose(dev, disposition, type, code, value);
40762306a36Sopenharmony_ci	}
40862306a36Sopenharmony_ci}
40962306a36Sopenharmony_ci
41062306a36Sopenharmony_ci/**
41162306a36Sopenharmony_ci * input_event() - report new input event
41262306a36Sopenharmony_ci * @dev: device that generated the event
41362306a36Sopenharmony_ci * @type: type of the event
41462306a36Sopenharmony_ci * @code: event code
41562306a36Sopenharmony_ci * @value: value of the event
41662306a36Sopenharmony_ci *
41762306a36Sopenharmony_ci * This function should be used by drivers implementing various input
41862306a36Sopenharmony_ci * devices to report input events. See also input_inject_event().
41962306a36Sopenharmony_ci *
42062306a36Sopenharmony_ci * NOTE: input_event() may be safely used right after input device was
42162306a36Sopenharmony_ci * allocated with input_allocate_device(), even before it is registered
42262306a36Sopenharmony_ci * with input_register_device(), but the event will not reach any of the
42362306a36Sopenharmony_ci * input handlers. Such early invocation of input_event() may be used
42462306a36Sopenharmony_ci * to 'seed' initial state of a switch or initial position of absolute
42562306a36Sopenharmony_ci * axis, etc.
42662306a36Sopenharmony_ci */
42762306a36Sopenharmony_civoid input_event(struct input_dev *dev,
42862306a36Sopenharmony_ci		 unsigned int type, unsigned int code, int value)
42962306a36Sopenharmony_ci{
43062306a36Sopenharmony_ci	unsigned long flags;
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_ci	if (is_event_supported(type, dev->evbit, EV_MAX)) {
43362306a36Sopenharmony_ci
43462306a36Sopenharmony_ci		spin_lock_irqsave(&dev->event_lock, flags);
43562306a36Sopenharmony_ci		input_handle_event(dev, type, code, value);
43662306a36Sopenharmony_ci		spin_unlock_irqrestore(&dev->event_lock, flags);
43762306a36Sopenharmony_ci	}
43862306a36Sopenharmony_ci}
43962306a36Sopenharmony_ciEXPORT_SYMBOL(input_event);
44062306a36Sopenharmony_ci
44162306a36Sopenharmony_ci/**
44262306a36Sopenharmony_ci * input_inject_event() - send input event from input handler
44362306a36Sopenharmony_ci * @handle: input handle to send event through
44462306a36Sopenharmony_ci * @type: type of the event
44562306a36Sopenharmony_ci * @code: event code
44662306a36Sopenharmony_ci * @value: value of the event
44762306a36Sopenharmony_ci *
44862306a36Sopenharmony_ci * Similar to input_event() but will ignore event if device is
44962306a36Sopenharmony_ci * "grabbed" and handle injecting event is not the one that owns
45062306a36Sopenharmony_ci * the device.
45162306a36Sopenharmony_ci */
45262306a36Sopenharmony_civoid input_inject_event(struct input_handle *handle,
45362306a36Sopenharmony_ci			unsigned int type, unsigned int code, int value)
45462306a36Sopenharmony_ci{
45562306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
45662306a36Sopenharmony_ci	struct input_handle *grab;
45762306a36Sopenharmony_ci	unsigned long flags;
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci	if (is_event_supported(type, dev->evbit, EV_MAX)) {
46062306a36Sopenharmony_ci		spin_lock_irqsave(&dev->event_lock, flags);
46162306a36Sopenharmony_ci
46262306a36Sopenharmony_ci		rcu_read_lock();
46362306a36Sopenharmony_ci		grab = rcu_dereference(dev->grab);
46462306a36Sopenharmony_ci		if (!grab || grab == handle)
46562306a36Sopenharmony_ci			input_handle_event(dev, type, code, value);
46662306a36Sopenharmony_ci		rcu_read_unlock();
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci		spin_unlock_irqrestore(&dev->event_lock, flags);
46962306a36Sopenharmony_ci	}
47062306a36Sopenharmony_ci}
47162306a36Sopenharmony_ciEXPORT_SYMBOL(input_inject_event);
47262306a36Sopenharmony_ci
47362306a36Sopenharmony_ci/**
47462306a36Sopenharmony_ci * input_alloc_absinfo - allocates array of input_absinfo structs
47562306a36Sopenharmony_ci * @dev: the input device emitting absolute events
47662306a36Sopenharmony_ci *
47762306a36Sopenharmony_ci * If the absinfo struct the caller asked for is already allocated, this
47862306a36Sopenharmony_ci * functions will not do anything.
47962306a36Sopenharmony_ci */
48062306a36Sopenharmony_civoid input_alloc_absinfo(struct input_dev *dev)
48162306a36Sopenharmony_ci{
48262306a36Sopenharmony_ci	if (dev->absinfo)
48362306a36Sopenharmony_ci		return;
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_ci	dev->absinfo = kcalloc(ABS_CNT, sizeof(*dev->absinfo), GFP_KERNEL);
48662306a36Sopenharmony_ci	if (!dev->absinfo) {
48762306a36Sopenharmony_ci		dev_err(dev->dev.parent ?: &dev->dev,
48862306a36Sopenharmony_ci			"%s: unable to allocate memory\n", __func__);
48962306a36Sopenharmony_ci		/*
49062306a36Sopenharmony_ci		 * We will handle this allocation failure in
49162306a36Sopenharmony_ci		 * input_register_device() when we refuse to register input
49262306a36Sopenharmony_ci		 * device with ABS bits but without absinfo.
49362306a36Sopenharmony_ci		 */
49462306a36Sopenharmony_ci	}
49562306a36Sopenharmony_ci}
49662306a36Sopenharmony_ciEXPORT_SYMBOL(input_alloc_absinfo);
49762306a36Sopenharmony_ci
49862306a36Sopenharmony_civoid input_set_abs_params(struct input_dev *dev, unsigned int axis,
49962306a36Sopenharmony_ci			  int min, int max, int fuzz, int flat)
50062306a36Sopenharmony_ci{
50162306a36Sopenharmony_ci	struct input_absinfo *absinfo;
50262306a36Sopenharmony_ci
50362306a36Sopenharmony_ci	__set_bit(EV_ABS, dev->evbit);
50462306a36Sopenharmony_ci	__set_bit(axis, dev->absbit);
50562306a36Sopenharmony_ci
50662306a36Sopenharmony_ci	input_alloc_absinfo(dev);
50762306a36Sopenharmony_ci	if (!dev->absinfo)
50862306a36Sopenharmony_ci		return;
50962306a36Sopenharmony_ci
51062306a36Sopenharmony_ci	absinfo = &dev->absinfo[axis];
51162306a36Sopenharmony_ci	absinfo->minimum = min;
51262306a36Sopenharmony_ci	absinfo->maximum = max;
51362306a36Sopenharmony_ci	absinfo->fuzz = fuzz;
51462306a36Sopenharmony_ci	absinfo->flat = flat;
51562306a36Sopenharmony_ci}
51662306a36Sopenharmony_ciEXPORT_SYMBOL(input_set_abs_params);
51762306a36Sopenharmony_ci
51862306a36Sopenharmony_ci/**
51962306a36Sopenharmony_ci * input_copy_abs - Copy absinfo from one input_dev to another
52062306a36Sopenharmony_ci * @dst: Destination input device to copy the abs settings to
52162306a36Sopenharmony_ci * @dst_axis: ABS_* value selecting the destination axis
52262306a36Sopenharmony_ci * @src: Source input device to copy the abs settings from
52362306a36Sopenharmony_ci * @src_axis: ABS_* value selecting the source axis
52462306a36Sopenharmony_ci *
52562306a36Sopenharmony_ci * Set absinfo for the selected destination axis by copying it from
52662306a36Sopenharmony_ci * the specified source input device's source axis.
52762306a36Sopenharmony_ci * This is useful to e.g. setup a pen/stylus input-device for combined
52862306a36Sopenharmony_ci * touchscreen/pen hardware where the pen uses the same coordinates as
52962306a36Sopenharmony_ci * the touchscreen.
53062306a36Sopenharmony_ci */
53162306a36Sopenharmony_civoid input_copy_abs(struct input_dev *dst, unsigned int dst_axis,
53262306a36Sopenharmony_ci		    const struct input_dev *src, unsigned int src_axis)
53362306a36Sopenharmony_ci{
53462306a36Sopenharmony_ci	/* src must have EV_ABS and src_axis set */
53562306a36Sopenharmony_ci	if (WARN_ON(!(test_bit(EV_ABS, src->evbit) &&
53662306a36Sopenharmony_ci		      test_bit(src_axis, src->absbit))))
53762306a36Sopenharmony_ci		return;
53862306a36Sopenharmony_ci
53962306a36Sopenharmony_ci	/*
54062306a36Sopenharmony_ci	 * input_alloc_absinfo() may have failed for the source. Our caller is
54162306a36Sopenharmony_ci	 * expected to catch this when registering the input devices, which may
54262306a36Sopenharmony_ci	 * happen after the input_copy_abs() call.
54362306a36Sopenharmony_ci	 */
54462306a36Sopenharmony_ci	if (!src->absinfo)
54562306a36Sopenharmony_ci		return;
54662306a36Sopenharmony_ci
54762306a36Sopenharmony_ci	input_set_capability(dst, EV_ABS, dst_axis);
54862306a36Sopenharmony_ci	if (!dst->absinfo)
54962306a36Sopenharmony_ci		return;
55062306a36Sopenharmony_ci
55162306a36Sopenharmony_ci	dst->absinfo[dst_axis] = src->absinfo[src_axis];
55262306a36Sopenharmony_ci}
55362306a36Sopenharmony_ciEXPORT_SYMBOL(input_copy_abs);
55462306a36Sopenharmony_ci
55562306a36Sopenharmony_ci/**
55662306a36Sopenharmony_ci * input_grab_device - grabs device for exclusive use
55762306a36Sopenharmony_ci * @handle: input handle that wants to own the device
55862306a36Sopenharmony_ci *
55962306a36Sopenharmony_ci * When a device is grabbed by an input handle all events generated by
56062306a36Sopenharmony_ci * the device are delivered only to this handle. Also events injected
56162306a36Sopenharmony_ci * by other input handles are ignored while device is grabbed.
56262306a36Sopenharmony_ci */
56362306a36Sopenharmony_ciint input_grab_device(struct input_handle *handle)
56462306a36Sopenharmony_ci{
56562306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
56662306a36Sopenharmony_ci	int retval;
56762306a36Sopenharmony_ci
56862306a36Sopenharmony_ci	retval = mutex_lock_interruptible(&dev->mutex);
56962306a36Sopenharmony_ci	if (retval)
57062306a36Sopenharmony_ci		return retval;
57162306a36Sopenharmony_ci
57262306a36Sopenharmony_ci	if (dev->grab) {
57362306a36Sopenharmony_ci		retval = -EBUSY;
57462306a36Sopenharmony_ci		goto out;
57562306a36Sopenharmony_ci	}
57662306a36Sopenharmony_ci
57762306a36Sopenharmony_ci	rcu_assign_pointer(dev->grab, handle);
57862306a36Sopenharmony_ci
57962306a36Sopenharmony_ci out:
58062306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
58162306a36Sopenharmony_ci	return retval;
58262306a36Sopenharmony_ci}
58362306a36Sopenharmony_ciEXPORT_SYMBOL(input_grab_device);
58462306a36Sopenharmony_ci
58562306a36Sopenharmony_cistatic void __input_release_device(struct input_handle *handle)
58662306a36Sopenharmony_ci{
58762306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
58862306a36Sopenharmony_ci	struct input_handle *grabber;
58962306a36Sopenharmony_ci
59062306a36Sopenharmony_ci	grabber = rcu_dereference_protected(dev->grab,
59162306a36Sopenharmony_ci					    lockdep_is_held(&dev->mutex));
59262306a36Sopenharmony_ci	if (grabber == handle) {
59362306a36Sopenharmony_ci		rcu_assign_pointer(dev->grab, NULL);
59462306a36Sopenharmony_ci		/* Make sure input_pass_values() notices that grab is gone */
59562306a36Sopenharmony_ci		synchronize_rcu();
59662306a36Sopenharmony_ci
59762306a36Sopenharmony_ci		list_for_each_entry(handle, &dev->h_list, d_node)
59862306a36Sopenharmony_ci			if (handle->open && handle->handler->start)
59962306a36Sopenharmony_ci				handle->handler->start(handle);
60062306a36Sopenharmony_ci	}
60162306a36Sopenharmony_ci}
60262306a36Sopenharmony_ci
60362306a36Sopenharmony_ci/**
60462306a36Sopenharmony_ci * input_release_device - release previously grabbed device
60562306a36Sopenharmony_ci * @handle: input handle that owns the device
60662306a36Sopenharmony_ci *
60762306a36Sopenharmony_ci * Releases previously grabbed device so that other input handles can
60862306a36Sopenharmony_ci * start receiving input events. Upon release all handlers attached
60962306a36Sopenharmony_ci * to the device have their start() method called so they have a change
61062306a36Sopenharmony_ci * to synchronize device state with the rest of the system.
61162306a36Sopenharmony_ci */
61262306a36Sopenharmony_civoid input_release_device(struct input_handle *handle)
61362306a36Sopenharmony_ci{
61462306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
61562306a36Sopenharmony_ci
61662306a36Sopenharmony_ci	mutex_lock(&dev->mutex);
61762306a36Sopenharmony_ci	__input_release_device(handle);
61862306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
61962306a36Sopenharmony_ci}
62062306a36Sopenharmony_ciEXPORT_SYMBOL(input_release_device);
62162306a36Sopenharmony_ci
62262306a36Sopenharmony_ci/**
62362306a36Sopenharmony_ci * input_open_device - open input device
62462306a36Sopenharmony_ci * @handle: handle through which device is being accessed
62562306a36Sopenharmony_ci *
62662306a36Sopenharmony_ci * This function should be called by input handlers when they
62762306a36Sopenharmony_ci * want to start receive events from given input device.
62862306a36Sopenharmony_ci */
62962306a36Sopenharmony_ciint input_open_device(struct input_handle *handle)
63062306a36Sopenharmony_ci{
63162306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
63262306a36Sopenharmony_ci	int retval;
63362306a36Sopenharmony_ci
63462306a36Sopenharmony_ci	retval = mutex_lock_interruptible(&dev->mutex);
63562306a36Sopenharmony_ci	if (retval)
63662306a36Sopenharmony_ci		return retval;
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ci	if (dev->going_away) {
63962306a36Sopenharmony_ci		retval = -ENODEV;
64062306a36Sopenharmony_ci		goto out;
64162306a36Sopenharmony_ci	}
64262306a36Sopenharmony_ci
64362306a36Sopenharmony_ci	handle->open++;
64462306a36Sopenharmony_ci
64562306a36Sopenharmony_ci	if (dev->users++ || dev->inhibited) {
64662306a36Sopenharmony_ci		/*
64762306a36Sopenharmony_ci		 * Device is already opened and/or inhibited,
64862306a36Sopenharmony_ci		 * so we can exit immediately and report success.
64962306a36Sopenharmony_ci		 */
65062306a36Sopenharmony_ci		goto out;
65162306a36Sopenharmony_ci	}
65262306a36Sopenharmony_ci
65362306a36Sopenharmony_ci	if (dev->open) {
65462306a36Sopenharmony_ci		retval = dev->open(dev);
65562306a36Sopenharmony_ci		if (retval) {
65662306a36Sopenharmony_ci			dev->users--;
65762306a36Sopenharmony_ci			handle->open--;
65862306a36Sopenharmony_ci			/*
65962306a36Sopenharmony_ci			 * Make sure we are not delivering any more events
66062306a36Sopenharmony_ci			 * through this handle
66162306a36Sopenharmony_ci			 */
66262306a36Sopenharmony_ci			synchronize_rcu();
66362306a36Sopenharmony_ci			goto out;
66462306a36Sopenharmony_ci		}
66562306a36Sopenharmony_ci	}
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci	if (dev->poller)
66862306a36Sopenharmony_ci		input_dev_poller_start(dev->poller);
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ci out:
67162306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
67262306a36Sopenharmony_ci	return retval;
67362306a36Sopenharmony_ci}
67462306a36Sopenharmony_ciEXPORT_SYMBOL(input_open_device);
67562306a36Sopenharmony_ci
67662306a36Sopenharmony_ciint input_flush_device(struct input_handle *handle, struct file *file)
67762306a36Sopenharmony_ci{
67862306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
67962306a36Sopenharmony_ci	int retval;
68062306a36Sopenharmony_ci
68162306a36Sopenharmony_ci	retval = mutex_lock_interruptible(&dev->mutex);
68262306a36Sopenharmony_ci	if (retval)
68362306a36Sopenharmony_ci		return retval;
68462306a36Sopenharmony_ci
68562306a36Sopenharmony_ci	if (dev->flush)
68662306a36Sopenharmony_ci		retval = dev->flush(dev, file);
68762306a36Sopenharmony_ci
68862306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
68962306a36Sopenharmony_ci	return retval;
69062306a36Sopenharmony_ci}
69162306a36Sopenharmony_ciEXPORT_SYMBOL(input_flush_device);
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci/**
69462306a36Sopenharmony_ci * input_close_device - close input device
69562306a36Sopenharmony_ci * @handle: handle through which device is being accessed
69662306a36Sopenharmony_ci *
69762306a36Sopenharmony_ci * This function should be called by input handlers when they
69862306a36Sopenharmony_ci * want to stop receive events from given input device.
69962306a36Sopenharmony_ci */
70062306a36Sopenharmony_civoid input_close_device(struct input_handle *handle)
70162306a36Sopenharmony_ci{
70262306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci	mutex_lock(&dev->mutex);
70562306a36Sopenharmony_ci
70662306a36Sopenharmony_ci	__input_release_device(handle);
70762306a36Sopenharmony_ci
70862306a36Sopenharmony_ci	if (!--dev->users && !dev->inhibited) {
70962306a36Sopenharmony_ci		if (dev->poller)
71062306a36Sopenharmony_ci			input_dev_poller_stop(dev->poller);
71162306a36Sopenharmony_ci		if (dev->close)
71262306a36Sopenharmony_ci			dev->close(dev);
71362306a36Sopenharmony_ci	}
71462306a36Sopenharmony_ci
71562306a36Sopenharmony_ci	if (!--handle->open) {
71662306a36Sopenharmony_ci		/*
71762306a36Sopenharmony_ci		 * synchronize_rcu() makes sure that input_pass_values()
71862306a36Sopenharmony_ci		 * completed and that no more input events are delivered
71962306a36Sopenharmony_ci		 * through this handle
72062306a36Sopenharmony_ci		 */
72162306a36Sopenharmony_ci		synchronize_rcu();
72262306a36Sopenharmony_ci	}
72362306a36Sopenharmony_ci
72462306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
72562306a36Sopenharmony_ci}
72662306a36Sopenharmony_ciEXPORT_SYMBOL(input_close_device);
72762306a36Sopenharmony_ci
72862306a36Sopenharmony_ci/*
72962306a36Sopenharmony_ci * Simulate keyup events for all keys that are marked as pressed.
73062306a36Sopenharmony_ci * The function must be called with dev->event_lock held.
73162306a36Sopenharmony_ci */
73262306a36Sopenharmony_cistatic bool input_dev_release_keys(struct input_dev *dev)
73362306a36Sopenharmony_ci{
73462306a36Sopenharmony_ci	bool need_sync = false;
73562306a36Sopenharmony_ci	int code;
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_ci	lockdep_assert_held(&dev->event_lock);
73862306a36Sopenharmony_ci
73962306a36Sopenharmony_ci	if (is_event_supported(EV_KEY, dev->evbit, EV_MAX)) {
74062306a36Sopenharmony_ci		for_each_set_bit(code, dev->key, KEY_CNT) {
74162306a36Sopenharmony_ci			input_handle_event(dev, EV_KEY, code, 0);
74262306a36Sopenharmony_ci			need_sync = true;
74362306a36Sopenharmony_ci		}
74462306a36Sopenharmony_ci	}
74562306a36Sopenharmony_ci
74662306a36Sopenharmony_ci	return need_sync;
74762306a36Sopenharmony_ci}
74862306a36Sopenharmony_ci
74962306a36Sopenharmony_ci/*
75062306a36Sopenharmony_ci * Prepare device for unregistering
75162306a36Sopenharmony_ci */
75262306a36Sopenharmony_cistatic void input_disconnect_device(struct input_dev *dev)
75362306a36Sopenharmony_ci{
75462306a36Sopenharmony_ci	struct input_handle *handle;
75562306a36Sopenharmony_ci
75662306a36Sopenharmony_ci	/*
75762306a36Sopenharmony_ci	 * Mark device as going away. Note that we take dev->mutex here
75862306a36Sopenharmony_ci	 * not to protect access to dev->going_away but rather to ensure
75962306a36Sopenharmony_ci	 * that there are no threads in the middle of input_open_device()
76062306a36Sopenharmony_ci	 */
76162306a36Sopenharmony_ci	mutex_lock(&dev->mutex);
76262306a36Sopenharmony_ci	dev->going_away = true;
76362306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
76462306a36Sopenharmony_ci
76562306a36Sopenharmony_ci	spin_lock_irq(&dev->event_lock);
76662306a36Sopenharmony_ci
76762306a36Sopenharmony_ci	/*
76862306a36Sopenharmony_ci	 * Simulate keyup events for all pressed keys so that handlers
76962306a36Sopenharmony_ci	 * are not left with "stuck" keys. The driver may continue
77062306a36Sopenharmony_ci	 * generate events even after we done here but they will not
77162306a36Sopenharmony_ci	 * reach any handlers.
77262306a36Sopenharmony_ci	 */
77362306a36Sopenharmony_ci	if (input_dev_release_keys(dev))
77462306a36Sopenharmony_ci		input_handle_event(dev, EV_SYN, SYN_REPORT, 1);
77562306a36Sopenharmony_ci
77662306a36Sopenharmony_ci	list_for_each_entry(handle, &dev->h_list, d_node)
77762306a36Sopenharmony_ci		handle->open = 0;
77862306a36Sopenharmony_ci
77962306a36Sopenharmony_ci	spin_unlock_irq(&dev->event_lock);
78062306a36Sopenharmony_ci}
78162306a36Sopenharmony_ci
78262306a36Sopenharmony_ci/**
78362306a36Sopenharmony_ci * input_scancode_to_scalar() - converts scancode in &struct input_keymap_entry
78462306a36Sopenharmony_ci * @ke: keymap entry containing scancode to be converted.
78562306a36Sopenharmony_ci * @scancode: pointer to the location where converted scancode should
78662306a36Sopenharmony_ci *	be stored.
78762306a36Sopenharmony_ci *
78862306a36Sopenharmony_ci * This function is used to convert scancode stored in &struct keymap_entry
78962306a36Sopenharmony_ci * into scalar form understood by legacy keymap handling methods. These
79062306a36Sopenharmony_ci * methods expect scancodes to be represented as 'unsigned int'.
79162306a36Sopenharmony_ci */
79262306a36Sopenharmony_ciint input_scancode_to_scalar(const struct input_keymap_entry *ke,
79362306a36Sopenharmony_ci			     unsigned int *scancode)
79462306a36Sopenharmony_ci{
79562306a36Sopenharmony_ci	switch (ke->len) {
79662306a36Sopenharmony_ci	case 1:
79762306a36Sopenharmony_ci		*scancode = *((u8 *)ke->scancode);
79862306a36Sopenharmony_ci		break;
79962306a36Sopenharmony_ci
80062306a36Sopenharmony_ci	case 2:
80162306a36Sopenharmony_ci		*scancode = *((u16 *)ke->scancode);
80262306a36Sopenharmony_ci		break;
80362306a36Sopenharmony_ci
80462306a36Sopenharmony_ci	case 4:
80562306a36Sopenharmony_ci		*scancode = *((u32 *)ke->scancode);
80662306a36Sopenharmony_ci		break;
80762306a36Sopenharmony_ci
80862306a36Sopenharmony_ci	default:
80962306a36Sopenharmony_ci		return -EINVAL;
81062306a36Sopenharmony_ci	}
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_ci	return 0;
81362306a36Sopenharmony_ci}
81462306a36Sopenharmony_ciEXPORT_SYMBOL(input_scancode_to_scalar);
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci/*
81762306a36Sopenharmony_ci * Those routines handle the default case where no [gs]etkeycode() is
81862306a36Sopenharmony_ci * defined. In this case, an array indexed by the scancode is used.
81962306a36Sopenharmony_ci */
82062306a36Sopenharmony_ci
82162306a36Sopenharmony_cistatic unsigned int input_fetch_keycode(struct input_dev *dev,
82262306a36Sopenharmony_ci					unsigned int index)
82362306a36Sopenharmony_ci{
82462306a36Sopenharmony_ci	switch (dev->keycodesize) {
82562306a36Sopenharmony_ci	case 1:
82662306a36Sopenharmony_ci		return ((u8 *)dev->keycode)[index];
82762306a36Sopenharmony_ci
82862306a36Sopenharmony_ci	case 2:
82962306a36Sopenharmony_ci		return ((u16 *)dev->keycode)[index];
83062306a36Sopenharmony_ci
83162306a36Sopenharmony_ci	default:
83262306a36Sopenharmony_ci		return ((u32 *)dev->keycode)[index];
83362306a36Sopenharmony_ci	}
83462306a36Sopenharmony_ci}
83562306a36Sopenharmony_ci
83662306a36Sopenharmony_cistatic int input_default_getkeycode(struct input_dev *dev,
83762306a36Sopenharmony_ci				    struct input_keymap_entry *ke)
83862306a36Sopenharmony_ci{
83962306a36Sopenharmony_ci	unsigned int index;
84062306a36Sopenharmony_ci	int error;
84162306a36Sopenharmony_ci
84262306a36Sopenharmony_ci	if (!dev->keycodesize)
84362306a36Sopenharmony_ci		return -EINVAL;
84462306a36Sopenharmony_ci
84562306a36Sopenharmony_ci	if (ke->flags & INPUT_KEYMAP_BY_INDEX)
84662306a36Sopenharmony_ci		index = ke->index;
84762306a36Sopenharmony_ci	else {
84862306a36Sopenharmony_ci		error = input_scancode_to_scalar(ke, &index);
84962306a36Sopenharmony_ci		if (error)
85062306a36Sopenharmony_ci			return error;
85162306a36Sopenharmony_ci	}
85262306a36Sopenharmony_ci
85362306a36Sopenharmony_ci	if (index >= dev->keycodemax)
85462306a36Sopenharmony_ci		return -EINVAL;
85562306a36Sopenharmony_ci
85662306a36Sopenharmony_ci	ke->keycode = input_fetch_keycode(dev, index);
85762306a36Sopenharmony_ci	ke->index = index;
85862306a36Sopenharmony_ci	ke->len = sizeof(index);
85962306a36Sopenharmony_ci	memcpy(ke->scancode, &index, sizeof(index));
86062306a36Sopenharmony_ci
86162306a36Sopenharmony_ci	return 0;
86262306a36Sopenharmony_ci}
86362306a36Sopenharmony_ci
86462306a36Sopenharmony_cistatic int input_default_setkeycode(struct input_dev *dev,
86562306a36Sopenharmony_ci				    const struct input_keymap_entry *ke,
86662306a36Sopenharmony_ci				    unsigned int *old_keycode)
86762306a36Sopenharmony_ci{
86862306a36Sopenharmony_ci	unsigned int index;
86962306a36Sopenharmony_ci	int error;
87062306a36Sopenharmony_ci	int i;
87162306a36Sopenharmony_ci
87262306a36Sopenharmony_ci	if (!dev->keycodesize)
87362306a36Sopenharmony_ci		return -EINVAL;
87462306a36Sopenharmony_ci
87562306a36Sopenharmony_ci	if (ke->flags & INPUT_KEYMAP_BY_INDEX) {
87662306a36Sopenharmony_ci		index = ke->index;
87762306a36Sopenharmony_ci	} else {
87862306a36Sopenharmony_ci		error = input_scancode_to_scalar(ke, &index);
87962306a36Sopenharmony_ci		if (error)
88062306a36Sopenharmony_ci			return error;
88162306a36Sopenharmony_ci	}
88262306a36Sopenharmony_ci
88362306a36Sopenharmony_ci	if (index >= dev->keycodemax)
88462306a36Sopenharmony_ci		return -EINVAL;
88562306a36Sopenharmony_ci
88662306a36Sopenharmony_ci	if (dev->keycodesize < sizeof(ke->keycode) &&
88762306a36Sopenharmony_ci			(ke->keycode >> (dev->keycodesize * 8)))
88862306a36Sopenharmony_ci		return -EINVAL;
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_ci	switch (dev->keycodesize) {
89162306a36Sopenharmony_ci		case 1: {
89262306a36Sopenharmony_ci			u8 *k = (u8 *)dev->keycode;
89362306a36Sopenharmony_ci			*old_keycode = k[index];
89462306a36Sopenharmony_ci			k[index] = ke->keycode;
89562306a36Sopenharmony_ci			break;
89662306a36Sopenharmony_ci		}
89762306a36Sopenharmony_ci		case 2: {
89862306a36Sopenharmony_ci			u16 *k = (u16 *)dev->keycode;
89962306a36Sopenharmony_ci			*old_keycode = k[index];
90062306a36Sopenharmony_ci			k[index] = ke->keycode;
90162306a36Sopenharmony_ci			break;
90262306a36Sopenharmony_ci		}
90362306a36Sopenharmony_ci		default: {
90462306a36Sopenharmony_ci			u32 *k = (u32 *)dev->keycode;
90562306a36Sopenharmony_ci			*old_keycode = k[index];
90662306a36Sopenharmony_ci			k[index] = ke->keycode;
90762306a36Sopenharmony_ci			break;
90862306a36Sopenharmony_ci		}
90962306a36Sopenharmony_ci	}
91062306a36Sopenharmony_ci
91162306a36Sopenharmony_ci	if (*old_keycode <= KEY_MAX) {
91262306a36Sopenharmony_ci		__clear_bit(*old_keycode, dev->keybit);
91362306a36Sopenharmony_ci		for (i = 0; i < dev->keycodemax; i++) {
91462306a36Sopenharmony_ci			if (input_fetch_keycode(dev, i) == *old_keycode) {
91562306a36Sopenharmony_ci				__set_bit(*old_keycode, dev->keybit);
91662306a36Sopenharmony_ci				/* Setting the bit twice is useless, so break */
91762306a36Sopenharmony_ci				break;
91862306a36Sopenharmony_ci			}
91962306a36Sopenharmony_ci		}
92062306a36Sopenharmony_ci	}
92162306a36Sopenharmony_ci
92262306a36Sopenharmony_ci	__set_bit(ke->keycode, dev->keybit);
92362306a36Sopenharmony_ci	return 0;
92462306a36Sopenharmony_ci}
92562306a36Sopenharmony_ci
92662306a36Sopenharmony_ci/**
92762306a36Sopenharmony_ci * input_get_keycode - retrieve keycode currently mapped to a given scancode
92862306a36Sopenharmony_ci * @dev: input device which keymap is being queried
92962306a36Sopenharmony_ci * @ke: keymap entry
93062306a36Sopenharmony_ci *
93162306a36Sopenharmony_ci * This function should be called by anyone interested in retrieving current
93262306a36Sopenharmony_ci * keymap. Presently evdev handlers use it.
93362306a36Sopenharmony_ci */
93462306a36Sopenharmony_ciint input_get_keycode(struct input_dev *dev, struct input_keymap_entry *ke)
93562306a36Sopenharmony_ci{
93662306a36Sopenharmony_ci	unsigned long flags;
93762306a36Sopenharmony_ci	int retval;
93862306a36Sopenharmony_ci
93962306a36Sopenharmony_ci	spin_lock_irqsave(&dev->event_lock, flags);
94062306a36Sopenharmony_ci	retval = dev->getkeycode(dev, ke);
94162306a36Sopenharmony_ci	spin_unlock_irqrestore(&dev->event_lock, flags);
94262306a36Sopenharmony_ci
94362306a36Sopenharmony_ci	return retval;
94462306a36Sopenharmony_ci}
94562306a36Sopenharmony_ciEXPORT_SYMBOL(input_get_keycode);
94662306a36Sopenharmony_ci
94762306a36Sopenharmony_ci/**
94862306a36Sopenharmony_ci * input_set_keycode - attribute a keycode to a given scancode
94962306a36Sopenharmony_ci * @dev: input device which keymap is being updated
95062306a36Sopenharmony_ci * @ke: new keymap entry
95162306a36Sopenharmony_ci *
95262306a36Sopenharmony_ci * This function should be called by anyone needing to update current
95362306a36Sopenharmony_ci * keymap. Presently keyboard and evdev handlers use it.
95462306a36Sopenharmony_ci */
95562306a36Sopenharmony_ciint input_set_keycode(struct input_dev *dev,
95662306a36Sopenharmony_ci		      const struct input_keymap_entry *ke)
95762306a36Sopenharmony_ci{
95862306a36Sopenharmony_ci	unsigned long flags;
95962306a36Sopenharmony_ci	unsigned int old_keycode;
96062306a36Sopenharmony_ci	int retval;
96162306a36Sopenharmony_ci
96262306a36Sopenharmony_ci	if (ke->keycode > KEY_MAX)
96362306a36Sopenharmony_ci		return -EINVAL;
96462306a36Sopenharmony_ci
96562306a36Sopenharmony_ci	spin_lock_irqsave(&dev->event_lock, flags);
96662306a36Sopenharmony_ci
96762306a36Sopenharmony_ci	retval = dev->setkeycode(dev, ke, &old_keycode);
96862306a36Sopenharmony_ci	if (retval)
96962306a36Sopenharmony_ci		goto out;
97062306a36Sopenharmony_ci
97162306a36Sopenharmony_ci	/* Make sure KEY_RESERVED did not get enabled. */
97262306a36Sopenharmony_ci	__clear_bit(KEY_RESERVED, dev->keybit);
97362306a36Sopenharmony_ci
97462306a36Sopenharmony_ci	/*
97562306a36Sopenharmony_ci	 * Simulate keyup event if keycode is not present
97662306a36Sopenharmony_ci	 * in the keymap anymore
97762306a36Sopenharmony_ci	 */
97862306a36Sopenharmony_ci	if (old_keycode > KEY_MAX) {
97962306a36Sopenharmony_ci		dev_warn(dev->dev.parent ?: &dev->dev,
98062306a36Sopenharmony_ci			 "%s: got too big old keycode %#x\n",
98162306a36Sopenharmony_ci			 __func__, old_keycode);
98262306a36Sopenharmony_ci	} else if (test_bit(EV_KEY, dev->evbit) &&
98362306a36Sopenharmony_ci		   !is_event_supported(old_keycode, dev->keybit, KEY_MAX) &&
98462306a36Sopenharmony_ci		   __test_and_clear_bit(old_keycode, dev->key)) {
98562306a36Sopenharmony_ci		/*
98662306a36Sopenharmony_ci		 * We have to use input_event_dispose() here directly instead
98762306a36Sopenharmony_ci		 * of input_handle_event() because the key we want to release
98862306a36Sopenharmony_ci		 * here is considered no longer supported by the device and
98962306a36Sopenharmony_ci		 * input_handle_event() will ignore it.
99062306a36Sopenharmony_ci		 */
99162306a36Sopenharmony_ci		input_event_dispose(dev, INPUT_PASS_TO_HANDLERS,
99262306a36Sopenharmony_ci				    EV_KEY, old_keycode, 0);
99362306a36Sopenharmony_ci		input_event_dispose(dev, INPUT_PASS_TO_HANDLERS | INPUT_FLUSH,
99462306a36Sopenharmony_ci				    EV_SYN, SYN_REPORT, 1);
99562306a36Sopenharmony_ci	}
99662306a36Sopenharmony_ci
99762306a36Sopenharmony_ci out:
99862306a36Sopenharmony_ci	spin_unlock_irqrestore(&dev->event_lock, flags);
99962306a36Sopenharmony_ci
100062306a36Sopenharmony_ci	return retval;
100162306a36Sopenharmony_ci}
100262306a36Sopenharmony_ciEXPORT_SYMBOL(input_set_keycode);
100362306a36Sopenharmony_ci
100462306a36Sopenharmony_cibool input_match_device_id(const struct input_dev *dev,
100562306a36Sopenharmony_ci			   const struct input_device_id *id)
100662306a36Sopenharmony_ci{
100762306a36Sopenharmony_ci	if (id->flags & INPUT_DEVICE_ID_MATCH_BUS)
100862306a36Sopenharmony_ci		if (id->bustype != dev->id.bustype)
100962306a36Sopenharmony_ci			return false;
101062306a36Sopenharmony_ci
101162306a36Sopenharmony_ci	if (id->flags & INPUT_DEVICE_ID_MATCH_VENDOR)
101262306a36Sopenharmony_ci		if (id->vendor != dev->id.vendor)
101362306a36Sopenharmony_ci			return false;
101462306a36Sopenharmony_ci
101562306a36Sopenharmony_ci	if (id->flags & INPUT_DEVICE_ID_MATCH_PRODUCT)
101662306a36Sopenharmony_ci		if (id->product != dev->id.product)
101762306a36Sopenharmony_ci			return false;
101862306a36Sopenharmony_ci
101962306a36Sopenharmony_ci	if (id->flags & INPUT_DEVICE_ID_MATCH_VERSION)
102062306a36Sopenharmony_ci		if (id->version != dev->id.version)
102162306a36Sopenharmony_ci			return false;
102262306a36Sopenharmony_ci
102362306a36Sopenharmony_ci	if (!bitmap_subset(id->evbit, dev->evbit, EV_MAX) ||
102462306a36Sopenharmony_ci	    !bitmap_subset(id->keybit, dev->keybit, KEY_MAX) ||
102562306a36Sopenharmony_ci	    !bitmap_subset(id->relbit, dev->relbit, REL_MAX) ||
102662306a36Sopenharmony_ci	    !bitmap_subset(id->absbit, dev->absbit, ABS_MAX) ||
102762306a36Sopenharmony_ci	    !bitmap_subset(id->mscbit, dev->mscbit, MSC_MAX) ||
102862306a36Sopenharmony_ci	    !bitmap_subset(id->ledbit, dev->ledbit, LED_MAX) ||
102962306a36Sopenharmony_ci	    !bitmap_subset(id->sndbit, dev->sndbit, SND_MAX) ||
103062306a36Sopenharmony_ci	    !bitmap_subset(id->ffbit, dev->ffbit, FF_MAX) ||
103162306a36Sopenharmony_ci	    !bitmap_subset(id->swbit, dev->swbit, SW_MAX) ||
103262306a36Sopenharmony_ci	    !bitmap_subset(id->propbit, dev->propbit, INPUT_PROP_MAX)) {
103362306a36Sopenharmony_ci		return false;
103462306a36Sopenharmony_ci	}
103562306a36Sopenharmony_ci
103662306a36Sopenharmony_ci	return true;
103762306a36Sopenharmony_ci}
103862306a36Sopenharmony_ciEXPORT_SYMBOL(input_match_device_id);
103962306a36Sopenharmony_ci
104062306a36Sopenharmony_cistatic const struct input_device_id *input_match_device(struct input_handler *handler,
104162306a36Sopenharmony_ci							struct input_dev *dev)
104262306a36Sopenharmony_ci{
104362306a36Sopenharmony_ci	const struct input_device_id *id;
104462306a36Sopenharmony_ci
104562306a36Sopenharmony_ci	for (id = handler->id_table; id->flags || id->driver_info; id++) {
104662306a36Sopenharmony_ci		if (input_match_device_id(dev, id) &&
104762306a36Sopenharmony_ci		    (!handler->match || handler->match(handler, dev))) {
104862306a36Sopenharmony_ci			return id;
104962306a36Sopenharmony_ci		}
105062306a36Sopenharmony_ci	}
105162306a36Sopenharmony_ci
105262306a36Sopenharmony_ci	return NULL;
105362306a36Sopenharmony_ci}
105462306a36Sopenharmony_ci
105562306a36Sopenharmony_cistatic int input_attach_handler(struct input_dev *dev, struct input_handler *handler)
105662306a36Sopenharmony_ci{
105762306a36Sopenharmony_ci	const struct input_device_id *id;
105862306a36Sopenharmony_ci	int error;
105962306a36Sopenharmony_ci
106062306a36Sopenharmony_ci	id = input_match_device(handler, dev);
106162306a36Sopenharmony_ci	if (!id)
106262306a36Sopenharmony_ci		return -ENODEV;
106362306a36Sopenharmony_ci
106462306a36Sopenharmony_ci	error = handler->connect(handler, dev, id);
106562306a36Sopenharmony_ci	if (error && error != -ENODEV)
106662306a36Sopenharmony_ci		pr_err("failed to attach handler %s to device %s, error: %d\n",
106762306a36Sopenharmony_ci		       handler->name, kobject_name(&dev->dev.kobj), error);
106862306a36Sopenharmony_ci
106962306a36Sopenharmony_ci	return error;
107062306a36Sopenharmony_ci}
107162306a36Sopenharmony_ci
107262306a36Sopenharmony_ci#ifdef CONFIG_COMPAT
107362306a36Sopenharmony_ci
107462306a36Sopenharmony_cistatic int input_bits_to_string(char *buf, int buf_size,
107562306a36Sopenharmony_ci				unsigned long bits, bool skip_empty)
107662306a36Sopenharmony_ci{
107762306a36Sopenharmony_ci	int len = 0;
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci	if (in_compat_syscall()) {
108062306a36Sopenharmony_ci		u32 dword = bits >> 32;
108162306a36Sopenharmony_ci		if (dword || !skip_empty)
108262306a36Sopenharmony_ci			len += snprintf(buf, buf_size, "%x ", dword);
108362306a36Sopenharmony_ci
108462306a36Sopenharmony_ci		dword = bits & 0xffffffffUL;
108562306a36Sopenharmony_ci		if (dword || !skip_empty || len)
108662306a36Sopenharmony_ci			len += snprintf(buf + len, max(buf_size - len, 0),
108762306a36Sopenharmony_ci					"%x", dword);
108862306a36Sopenharmony_ci	} else {
108962306a36Sopenharmony_ci		if (bits || !skip_empty)
109062306a36Sopenharmony_ci			len += snprintf(buf, buf_size, "%lx", bits);
109162306a36Sopenharmony_ci	}
109262306a36Sopenharmony_ci
109362306a36Sopenharmony_ci	return len;
109462306a36Sopenharmony_ci}
109562306a36Sopenharmony_ci
109662306a36Sopenharmony_ci#else /* !CONFIG_COMPAT */
109762306a36Sopenharmony_ci
109862306a36Sopenharmony_cistatic int input_bits_to_string(char *buf, int buf_size,
109962306a36Sopenharmony_ci				unsigned long bits, bool skip_empty)
110062306a36Sopenharmony_ci{
110162306a36Sopenharmony_ci	return bits || !skip_empty ?
110262306a36Sopenharmony_ci		snprintf(buf, buf_size, "%lx", bits) : 0;
110362306a36Sopenharmony_ci}
110462306a36Sopenharmony_ci
110562306a36Sopenharmony_ci#endif
110662306a36Sopenharmony_ci
110762306a36Sopenharmony_ci#ifdef CONFIG_PROC_FS
110862306a36Sopenharmony_ci
110962306a36Sopenharmony_cistatic struct proc_dir_entry *proc_bus_input_dir;
111062306a36Sopenharmony_cistatic DECLARE_WAIT_QUEUE_HEAD(input_devices_poll_wait);
111162306a36Sopenharmony_cistatic int input_devices_state;
111262306a36Sopenharmony_ci
111362306a36Sopenharmony_cistatic inline void input_wakeup_procfs_readers(void)
111462306a36Sopenharmony_ci{
111562306a36Sopenharmony_ci	input_devices_state++;
111662306a36Sopenharmony_ci	wake_up(&input_devices_poll_wait);
111762306a36Sopenharmony_ci}
111862306a36Sopenharmony_ci
111962306a36Sopenharmony_cistatic __poll_t input_proc_devices_poll(struct file *file, poll_table *wait)
112062306a36Sopenharmony_ci{
112162306a36Sopenharmony_ci	poll_wait(file, &input_devices_poll_wait, wait);
112262306a36Sopenharmony_ci	if (file->f_version != input_devices_state) {
112362306a36Sopenharmony_ci		file->f_version = input_devices_state;
112462306a36Sopenharmony_ci		return EPOLLIN | EPOLLRDNORM;
112562306a36Sopenharmony_ci	}
112662306a36Sopenharmony_ci
112762306a36Sopenharmony_ci	return 0;
112862306a36Sopenharmony_ci}
112962306a36Sopenharmony_ci
113062306a36Sopenharmony_ciunion input_seq_state {
113162306a36Sopenharmony_ci	struct {
113262306a36Sopenharmony_ci		unsigned short pos;
113362306a36Sopenharmony_ci		bool mutex_acquired;
113462306a36Sopenharmony_ci	};
113562306a36Sopenharmony_ci	void *p;
113662306a36Sopenharmony_ci};
113762306a36Sopenharmony_ci
113862306a36Sopenharmony_cistatic void *input_devices_seq_start(struct seq_file *seq, loff_t *pos)
113962306a36Sopenharmony_ci{
114062306a36Sopenharmony_ci	union input_seq_state *state = (union input_seq_state *)&seq->private;
114162306a36Sopenharmony_ci	int error;
114262306a36Sopenharmony_ci
114362306a36Sopenharmony_ci	/* We need to fit into seq->private pointer */
114462306a36Sopenharmony_ci	BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private));
114562306a36Sopenharmony_ci
114662306a36Sopenharmony_ci	error = mutex_lock_interruptible(&input_mutex);
114762306a36Sopenharmony_ci	if (error) {
114862306a36Sopenharmony_ci		state->mutex_acquired = false;
114962306a36Sopenharmony_ci		return ERR_PTR(error);
115062306a36Sopenharmony_ci	}
115162306a36Sopenharmony_ci
115262306a36Sopenharmony_ci	state->mutex_acquired = true;
115362306a36Sopenharmony_ci
115462306a36Sopenharmony_ci	return seq_list_start(&input_dev_list, *pos);
115562306a36Sopenharmony_ci}
115662306a36Sopenharmony_ci
115762306a36Sopenharmony_cistatic void *input_devices_seq_next(struct seq_file *seq, void *v, loff_t *pos)
115862306a36Sopenharmony_ci{
115962306a36Sopenharmony_ci	return seq_list_next(v, &input_dev_list, pos);
116062306a36Sopenharmony_ci}
116162306a36Sopenharmony_ci
116262306a36Sopenharmony_cistatic void input_seq_stop(struct seq_file *seq, void *v)
116362306a36Sopenharmony_ci{
116462306a36Sopenharmony_ci	union input_seq_state *state = (union input_seq_state *)&seq->private;
116562306a36Sopenharmony_ci
116662306a36Sopenharmony_ci	if (state->mutex_acquired)
116762306a36Sopenharmony_ci		mutex_unlock(&input_mutex);
116862306a36Sopenharmony_ci}
116962306a36Sopenharmony_ci
117062306a36Sopenharmony_cistatic void input_seq_print_bitmap(struct seq_file *seq, const char *name,
117162306a36Sopenharmony_ci				   unsigned long *bitmap, int max)
117262306a36Sopenharmony_ci{
117362306a36Sopenharmony_ci	int i;
117462306a36Sopenharmony_ci	bool skip_empty = true;
117562306a36Sopenharmony_ci	char buf[18];
117662306a36Sopenharmony_ci
117762306a36Sopenharmony_ci	seq_printf(seq, "B: %s=", name);
117862306a36Sopenharmony_ci
117962306a36Sopenharmony_ci	for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) {
118062306a36Sopenharmony_ci		if (input_bits_to_string(buf, sizeof(buf),
118162306a36Sopenharmony_ci					 bitmap[i], skip_empty)) {
118262306a36Sopenharmony_ci			skip_empty = false;
118362306a36Sopenharmony_ci			seq_printf(seq, "%s%s", buf, i > 0 ? " " : "");
118462306a36Sopenharmony_ci		}
118562306a36Sopenharmony_ci	}
118662306a36Sopenharmony_ci
118762306a36Sopenharmony_ci	/*
118862306a36Sopenharmony_ci	 * If no output was produced print a single 0.
118962306a36Sopenharmony_ci	 */
119062306a36Sopenharmony_ci	if (skip_empty)
119162306a36Sopenharmony_ci		seq_putc(seq, '0');
119262306a36Sopenharmony_ci
119362306a36Sopenharmony_ci	seq_putc(seq, '\n');
119462306a36Sopenharmony_ci}
119562306a36Sopenharmony_ci
119662306a36Sopenharmony_cistatic int input_devices_seq_show(struct seq_file *seq, void *v)
119762306a36Sopenharmony_ci{
119862306a36Sopenharmony_ci	struct input_dev *dev = container_of(v, struct input_dev, node);
119962306a36Sopenharmony_ci	const char *path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
120062306a36Sopenharmony_ci	struct input_handle *handle;
120162306a36Sopenharmony_ci
120262306a36Sopenharmony_ci	seq_printf(seq, "I: Bus=%04x Vendor=%04x Product=%04x Version=%04x\n",
120362306a36Sopenharmony_ci		   dev->id.bustype, dev->id.vendor, dev->id.product, dev->id.version);
120462306a36Sopenharmony_ci
120562306a36Sopenharmony_ci	seq_printf(seq, "N: Name=\"%s\"\n", dev->name ? dev->name : "");
120662306a36Sopenharmony_ci	seq_printf(seq, "P: Phys=%s\n", dev->phys ? dev->phys : "");
120762306a36Sopenharmony_ci	seq_printf(seq, "S: Sysfs=%s\n", path ? path : "");
120862306a36Sopenharmony_ci	seq_printf(seq, "U: Uniq=%s\n", dev->uniq ? dev->uniq : "");
120962306a36Sopenharmony_ci	seq_puts(seq, "H: Handlers=");
121062306a36Sopenharmony_ci
121162306a36Sopenharmony_ci	list_for_each_entry(handle, &dev->h_list, d_node)
121262306a36Sopenharmony_ci		seq_printf(seq, "%s ", handle->name);
121362306a36Sopenharmony_ci	seq_putc(seq, '\n');
121462306a36Sopenharmony_ci
121562306a36Sopenharmony_ci	input_seq_print_bitmap(seq, "PROP", dev->propbit, INPUT_PROP_MAX);
121662306a36Sopenharmony_ci
121762306a36Sopenharmony_ci	input_seq_print_bitmap(seq, "EV", dev->evbit, EV_MAX);
121862306a36Sopenharmony_ci	if (test_bit(EV_KEY, dev->evbit))
121962306a36Sopenharmony_ci		input_seq_print_bitmap(seq, "KEY", dev->keybit, KEY_MAX);
122062306a36Sopenharmony_ci	if (test_bit(EV_REL, dev->evbit))
122162306a36Sopenharmony_ci		input_seq_print_bitmap(seq, "REL", dev->relbit, REL_MAX);
122262306a36Sopenharmony_ci	if (test_bit(EV_ABS, dev->evbit))
122362306a36Sopenharmony_ci		input_seq_print_bitmap(seq, "ABS", dev->absbit, ABS_MAX);
122462306a36Sopenharmony_ci	if (test_bit(EV_MSC, dev->evbit))
122562306a36Sopenharmony_ci		input_seq_print_bitmap(seq, "MSC", dev->mscbit, MSC_MAX);
122662306a36Sopenharmony_ci	if (test_bit(EV_LED, dev->evbit))
122762306a36Sopenharmony_ci		input_seq_print_bitmap(seq, "LED", dev->ledbit, LED_MAX);
122862306a36Sopenharmony_ci	if (test_bit(EV_SND, dev->evbit))
122962306a36Sopenharmony_ci		input_seq_print_bitmap(seq, "SND", dev->sndbit, SND_MAX);
123062306a36Sopenharmony_ci	if (test_bit(EV_FF, dev->evbit))
123162306a36Sopenharmony_ci		input_seq_print_bitmap(seq, "FF", dev->ffbit, FF_MAX);
123262306a36Sopenharmony_ci	if (test_bit(EV_SW, dev->evbit))
123362306a36Sopenharmony_ci		input_seq_print_bitmap(seq, "SW", dev->swbit, SW_MAX);
123462306a36Sopenharmony_ci
123562306a36Sopenharmony_ci	seq_putc(seq, '\n');
123662306a36Sopenharmony_ci
123762306a36Sopenharmony_ci	kfree(path);
123862306a36Sopenharmony_ci	return 0;
123962306a36Sopenharmony_ci}
124062306a36Sopenharmony_ci
124162306a36Sopenharmony_cistatic const struct seq_operations input_devices_seq_ops = {
124262306a36Sopenharmony_ci	.start	= input_devices_seq_start,
124362306a36Sopenharmony_ci	.next	= input_devices_seq_next,
124462306a36Sopenharmony_ci	.stop	= input_seq_stop,
124562306a36Sopenharmony_ci	.show	= input_devices_seq_show,
124662306a36Sopenharmony_ci};
124762306a36Sopenharmony_ci
124862306a36Sopenharmony_cistatic int input_proc_devices_open(struct inode *inode, struct file *file)
124962306a36Sopenharmony_ci{
125062306a36Sopenharmony_ci	return seq_open(file, &input_devices_seq_ops);
125162306a36Sopenharmony_ci}
125262306a36Sopenharmony_ci
125362306a36Sopenharmony_cistatic const struct proc_ops input_devices_proc_ops = {
125462306a36Sopenharmony_ci	.proc_open	= input_proc_devices_open,
125562306a36Sopenharmony_ci	.proc_poll	= input_proc_devices_poll,
125662306a36Sopenharmony_ci	.proc_read	= seq_read,
125762306a36Sopenharmony_ci	.proc_lseek	= seq_lseek,
125862306a36Sopenharmony_ci	.proc_release	= seq_release,
125962306a36Sopenharmony_ci};
126062306a36Sopenharmony_ci
126162306a36Sopenharmony_cistatic void *input_handlers_seq_start(struct seq_file *seq, loff_t *pos)
126262306a36Sopenharmony_ci{
126362306a36Sopenharmony_ci	union input_seq_state *state = (union input_seq_state *)&seq->private;
126462306a36Sopenharmony_ci	int error;
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_ci	/* We need to fit into seq->private pointer */
126762306a36Sopenharmony_ci	BUILD_BUG_ON(sizeof(union input_seq_state) != sizeof(seq->private));
126862306a36Sopenharmony_ci
126962306a36Sopenharmony_ci	error = mutex_lock_interruptible(&input_mutex);
127062306a36Sopenharmony_ci	if (error) {
127162306a36Sopenharmony_ci		state->mutex_acquired = false;
127262306a36Sopenharmony_ci		return ERR_PTR(error);
127362306a36Sopenharmony_ci	}
127462306a36Sopenharmony_ci
127562306a36Sopenharmony_ci	state->mutex_acquired = true;
127662306a36Sopenharmony_ci	state->pos = *pos;
127762306a36Sopenharmony_ci
127862306a36Sopenharmony_ci	return seq_list_start(&input_handler_list, *pos);
127962306a36Sopenharmony_ci}
128062306a36Sopenharmony_ci
128162306a36Sopenharmony_cistatic void *input_handlers_seq_next(struct seq_file *seq, void *v, loff_t *pos)
128262306a36Sopenharmony_ci{
128362306a36Sopenharmony_ci	union input_seq_state *state = (union input_seq_state *)&seq->private;
128462306a36Sopenharmony_ci
128562306a36Sopenharmony_ci	state->pos = *pos + 1;
128662306a36Sopenharmony_ci	return seq_list_next(v, &input_handler_list, pos);
128762306a36Sopenharmony_ci}
128862306a36Sopenharmony_ci
128962306a36Sopenharmony_cistatic int input_handlers_seq_show(struct seq_file *seq, void *v)
129062306a36Sopenharmony_ci{
129162306a36Sopenharmony_ci	struct input_handler *handler = container_of(v, struct input_handler, node);
129262306a36Sopenharmony_ci	union input_seq_state *state = (union input_seq_state *)&seq->private;
129362306a36Sopenharmony_ci
129462306a36Sopenharmony_ci	seq_printf(seq, "N: Number=%u Name=%s", state->pos, handler->name);
129562306a36Sopenharmony_ci	if (handler->filter)
129662306a36Sopenharmony_ci		seq_puts(seq, " (filter)");
129762306a36Sopenharmony_ci	if (handler->legacy_minors)
129862306a36Sopenharmony_ci		seq_printf(seq, " Minor=%d", handler->minor);
129962306a36Sopenharmony_ci	seq_putc(seq, '\n');
130062306a36Sopenharmony_ci
130162306a36Sopenharmony_ci	return 0;
130262306a36Sopenharmony_ci}
130362306a36Sopenharmony_ci
130462306a36Sopenharmony_cistatic const struct seq_operations input_handlers_seq_ops = {
130562306a36Sopenharmony_ci	.start	= input_handlers_seq_start,
130662306a36Sopenharmony_ci	.next	= input_handlers_seq_next,
130762306a36Sopenharmony_ci	.stop	= input_seq_stop,
130862306a36Sopenharmony_ci	.show	= input_handlers_seq_show,
130962306a36Sopenharmony_ci};
131062306a36Sopenharmony_ci
131162306a36Sopenharmony_cistatic int input_proc_handlers_open(struct inode *inode, struct file *file)
131262306a36Sopenharmony_ci{
131362306a36Sopenharmony_ci	return seq_open(file, &input_handlers_seq_ops);
131462306a36Sopenharmony_ci}
131562306a36Sopenharmony_ci
131662306a36Sopenharmony_cistatic const struct proc_ops input_handlers_proc_ops = {
131762306a36Sopenharmony_ci	.proc_open	= input_proc_handlers_open,
131862306a36Sopenharmony_ci	.proc_read	= seq_read,
131962306a36Sopenharmony_ci	.proc_lseek	= seq_lseek,
132062306a36Sopenharmony_ci	.proc_release	= seq_release,
132162306a36Sopenharmony_ci};
132262306a36Sopenharmony_ci
132362306a36Sopenharmony_cistatic int __init input_proc_init(void)
132462306a36Sopenharmony_ci{
132562306a36Sopenharmony_ci	struct proc_dir_entry *entry;
132662306a36Sopenharmony_ci
132762306a36Sopenharmony_ci	proc_bus_input_dir = proc_mkdir("bus/input", NULL);
132862306a36Sopenharmony_ci	if (!proc_bus_input_dir)
132962306a36Sopenharmony_ci		return -ENOMEM;
133062306a36Sopenharmony_ci
133162306a36Sopenharmony_ci	entry = proc_create("devices", 0, proc_bus_input_dir,
133262306a36Sopenharmony_ci			    &input_devices_proc_ops);
133362306a36Sopenharmony_ci	if (!entry)
133462306a36Sopenharmony_ci		goto fail1;
133562306a36Sopenharmony_ci
133662306a36Sopenharmony_ci	entry = proc_create("handlers", 0, proc_bus_input_dir,
133762306a36Sopenharmony_ci			    &input_handlers_proc_ops);
133862306a36Sopenharmony_ci	if (!entry)
133962306a36Sopenharmony_ci		goto fail2;
134062306a36Sopenharmony_ci
134162306a36Sopenharmony_ci	return 0;
134262306a36Sopenharmony_ci
134362306a36Sopenharmony_ci fail2:	remove_proc_entry("devices", proc_bus_input_dir);
134462306a36Sopenharmony_ci fail1: remove_proc_entry("bus/input", NULL);
134562306a36Sopenharmony_ci	return -ENOMEM;
134662306a36Sopenharmony_ci}
134762306a36Sopenharmony_ci
134862306a36Sopenharmony_cistatic void input_proc_exit(void)
134962306a36Sopenharmony_ci{
135062306a36Sopenharmony_ci	remove_proc_entry("devices", proc_bus_input_dir);
135162306a36Sopenharmony_ci	remove_proc_entry("handlers", proc_bus_input_dir);
135262306a36Sopenharmony_ci	remove_proc_entry("bus/input", NULL);
135362306a36Sopenharmony_ci}
135462306a36Sopenharmony_ci
135562306a36Sopenharmony_ci#else /* !CONFIG_PROC_FS */
135662306a36Sopenharmony_cistatic inline void input_wakeup_procfs_readers(void) { }
135762306a36Sopenharmony_cistatic inline int input_proc_init(void) { return 0; }
135862306a36Sopenharmony_cistatic inline void input_proc_exit(void) { }
135962306a36Sopenharmony_ci#endif
136062306a36Sopenharmony_ci
136162306a36Sopenharmony_ci#define INPUT_DEV_STRING_ATTR_SHOW(name)				\
136262306a36Sopenharmony_cistatic ssize_t input_dev_show_##name(struct device *dev,		\
136362306a36Sopenharmony_ci				     struct device_attribute *attr,	\
136462306a36Sopenharmony_ci				     char *buf)				\
136562306a36Sopenharmony_ci{									\
136662306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);		\
136762306a36Sopenharmony_ci									\
136862306a36Sopenharmony_ci	return scnprintf(buf, PAGE_SIZE, "%s\n",			\
136962306a36Sopenharmony_ci			 input_dev->name ? input_dev->name : "");	\
137062306a36Sopenharmony_ci}									\
137162306a36Sopenharmony_cistatic DEVICE_ATTR(name, S_IRUGO, input_dev_show_##name, NULL)
137262306a36Sopenharmony_ci
137362306a36Sopenharmony_ciINPUT_DEV_STRING_ATTR_SHOW(name);
137462306a36Sopenharmony_ciINPUT_DEV_STRING_ATTR_SHOW(phys);
137562306a36Sopenharmony_ciINPUT_DEV_STRING_ATTR_SHOW(uniq);
137662306a36Sopenharmony_ci
137762306a36Sopenharmony_cistatic int input_print_modalias_bits(char *buf, int size,
137862306a36Sopenharmony_ci				     char name, const unsigned long *bm,
137962306a36Sopenharmony_ci				     unsigned int min_bit, unsigned int max_bit)
138062306a36Sopenharmony_ci{
138162306a36Sopenharmony_ci	int len = 0, i;
138262306a36Sopenharmony_ci
138362306a36Sopenharmony_ci	len += snprintf(buf, max(size, 0), "%c", name);
138462306a36Sopenharmony_ci	for (i = min_bit; i < max_bit; i++)
138562306a36Sopenharmony_ci		if (bm[BIT_WORD(i)] & BIT_MASK(i))
138662306a36Sopenharmony_ci			len += snprintf(buf + len, max(size - len, 0), "%X,", i);
138762306a36Sopenharmony_ci	return len;
138862306a36Sopenharmony_ci}
138962306a36Sopenharmony_ci
139062306a36Sopenharmony_cistatic int input_print_modalias(char *buf, int size, const struct input_dev *id,
139162306a36Sopenharmony_ci				int add_cr)
139262306a36Sopenharmony_ci{
139362306a36Sopenharmony_ci	int len;
139462306a36Sopenharmony_ci
139562306a36Sopenharmony_ci	len = snprintf(buf, max(size, 0),
139662306a36Sopenharmony_ci		       "input:b%04Xv%04Xp%04Xe%04X-",
139762306a36Sopenharmony_ci		       id->id.bustype, id->id.vendor,
139862306a36Sopenharmony_ci		       id->id.product, id->id.version);
139962306a36Sopenharmony_ci
140062306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
140162306a36Sopenharmony_ci				'e', id->evbit, 0, EV_MAX);
140262306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
140362306a36Sopenharmony_ci				'k', id->keybit, KEY_MIN_INTERESTING, KEY_MAX);
140462306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
140562306a36Sopenharmony_ci				'r', id->relbit, 0, REL_MAX);
140662306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
140762306a36Sopenharmony_ci				'a', id->absbit, 0, ABS_MAX);
140862306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
140962306a36Sopenharmony_ci				'm', id->mscbit, 0, MSC_MAX);
141062306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
141162306a36Sopenharmony_ci				'l', id->ledbit, 0, LED_MAX);
141262306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
141362306a36Sopenharmony_ci				's', id->sndbit, 0, SND_MAX);
141462306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
141562306a36Sopenharmony_ci				'f', id->ffbit, 0, FF_MAX);
141662306a36Sopenharmony_ci	len += input_print_modalias_bits(buf + len, size - len,
141762306a36Sopenharmony_ci				'w', id->swbit, 0, SW_MAX);
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci	if (add_cr)
142062306a36Sopenharmony_ci		len += snprintf(buf + len, max(size - len, 0), "\n");
142162306a36Sopenharmony_ci
142262306a36Sopenharmony_ci	return len;
142362306a36Sopenharmony_ci}
142462306a36Sopenharmony_ci
142562306a36Sopenharmony_cistatic ssize_t input_dev_show_modalias(struct device *dev,
142662306a36Sopenharmony_ci				       struct device_attribute *attr,
142762306a36Sopenharmony_ci				       char *buf)
142862306a36Sopenharmony_ci{
142962306a36Sopenharmony_ci	struct input_dev *id = to_input_dev(dev);
143062306a36Sopenharmony_ci	ssize_t len;
143162306a36Sopenharmony_ci
143262306a36Sopenharmony_ci	len = input_print_modalias(buf, PAGE_SIZE, id, 1);
143362306a36Sopenharmony_ci
143462306a36Sopenharmony_ci	return min_t(int, len, PAGE_SIZE);
143562306a36Sopenharmony_ci}
143662306a36Sopenharmony_cistatic DEVICE_ATTR(modalias, S_IRUGO, input_dev_show_modalias, NULL);
143762306a36Sopenharmony_ci
143862306a36Sopenharmony_cistatic int input_print_bitmap(char *buf, int buf_size, const unsigned long *bitmap,
143962306a36Sopenharmony_ci			      int max, int add_cr);
144062306a36Sopenharmony_ci
144162306a36Sopenharmony_cistatic ssize_t input_dev_show_properties(struct device *dev,
144262306a36Sopenharmony_ci					 struct device_attribute *attr,
144362306a36Sopenharmony_ci					 char *buf)
144462306a36Sopenharmony_ci{
144562306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);
144662306a36Sopenharmony_ci	int len = input_print_bitmap(buf, PAGE_SIZE, input_dev->propbit,
144762306a36Sopenharmony_ci				     INPUT_PROP_MAX, true);
144862306a36Sopenharmony_ci	return min_t(int, len, PAGE_SIZE);
144962306a36Sopenharmony_ci}
145062306a36Sopenharmony_cistatic DEVICE_ATTR(properties, S_IRUGO, input_dev_show_properties, NULL);
145162306a36Sopenharmony_ci
145262306a36Sopenharmony_cistatic int input_inhibit_device(struct input_dev *dev);
145362306a36Sopenharmony_cistatic int input_uninhibit_device(struct input_dev *dev);
145462306a36Sopenharmony_ci
145562306a36Sopenharmony_cistatic ssize_t inhibited_show(struct device *dev,
145662306a36Sopenharmony_ci			      struct device_attribute *attr,
145762306a36Sopenharmony_ci			      char *buf)
145862306a36Sopenharmony_ci{
145962306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);
146062306a36Sopenharmony_ci
146162306a36Sopenharmony_ci	return scnprintf(buf, PAGE_SIZE, "%d\n", input_dev->inhibited);
146262306a36Sopenharmony_ci}
146362306a36Sopenharmony_ci
146462306a36Sopenharmony_cistatic ssize_t inhibited_store(struct device *dev,
146562306a36Sopenharmony_ci			       struct device_attribute *attr, const char *buf,
146662306a36Sopenharmony_ci			       size_t len)
146762306a36Sopenharmony_ci{
146862306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);
146962306a36Sopenharmony_ci	ssize_t rv;
147062306a36Sopenharmony_ci	bool inhibited;
147162306a36Sopenharmony_ci
147262306a36Sopenharmony_ci	if (kstrtobool(buf, &inhibited))
147362306a36Sopenharmony_ci		return -EINVAL;
147462306a36Sopenharmony_ci
147562306a36Sopenharmony_ci	if (inhibited)
147662306a36Sopenharmony_ci		rv = input_inhibit_device(input_dev);
147762306a36Sopenharmony_ci	else
147862306a36Sopenharmony_ci		rv = input_uninhibit_device(input_dev);
147962306a36Sopenharmony_ci
148062306a36Sopenharmony_ci	if (rv != 0)
148162306a36Sopenharmony_ci		return rv;
148262306a36Sopenharmony_ci
148362306a36Sopenharmony_ci	return len;
148462306a36Sopenharmony_ci}
148562306a36Sopenharmony_ci
148662306a36Sopenharmony_cistatic DEVICE_ATTR_RW(inhibited);
148762306a36Sopenharmony_ci
148862306a36Sopenharmony_cistatic struct attribute *input_dev_attrs[] = {
148962306a36Sopenharmony_ci	&dev_attr_name.attr,
149062306a36Sopenharmony_ci	&dev_attr_phys.attr,
149162306a36Sopenharmony_ci	&dev_attr_uniq.attr,
149262306a36Sopenharmony_ci	&dev_attr_modalias.attr,
149362306a36Sopenharmony_ci	&dev_attr_properties.attr,
149462306a36Sopenharmony_ci	&dev_attr_inhibited.attr,
149562306a36Sopenharmony_ci	NULL
149662306a36Sopenharmony_ci};
149762306a36Sopenharmony_ci
149862306a36Sopenharmony_cistatic const struct attribute_group input_dev_attr_group = {
149962306a36Sopenharmony_ci	.attrs	= input_dev_attrs,
150062306a36Sopenharmony_ci};
150162306a36Sopenharmony_ci
150262306a36Sopenharmony_ci#define INPUT_DEV_ID_ATTR(name)						\
150362306a36Sopenharmony_cistatic ssize_t input_dev_show_id_##name(struct device *dev,		\
150462306a36Sopenharmony_ci					struct device_attribute *attr,	\
150562306a36Sopenharmony_ci					char *buf)			\
150662306a36Sopenharmony_ci{									\
150762306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);		\
150862306a36Sopenharmony_ci	return scnprintf(buf, PAGE_SIZE, "%04x\n", input_dev->id.name);	\
150962306a36Sopenharmony_ci}									\
151062306a36Sopenharmony_cistatic DEVICE_ATTR(name, S_IRUGO, input_dev_show_id_##name, NULL)
151162306a36Sopenharmony_ci
151262306a36Sopenharmony_ciINPUT_DEV_ID_ATTR(bustype);
151362306a36Sopenharmony_ciINPUT_DEV_ID_ATTR(vendor);
151462306a36Sopenharmony_ciINPUT_DEV_ID_ATTR(product);
151562306a36Sopenharmony_ciINPUT_DEV_ID_ATTR(version);
151662306a36Sopenharmony_ci
151762306a36Sopenharmony_cistatic struct attribute *input_dev_id_attrs[] = {
151862306a36Sopenharmony_ci	&dev_attr_bustype.attr,
151962306a36Sopenharmony_ci	&dev_attr_vendor.attr,
152062306a36Sopenharmony_ci	&dev_attr_product.attr,
152162306a36Sopenharmony_ci	&dev_attr_version.attr,
152262306a36Sopenharmony_ci	NULL
152362306a36Sopenharmony_ci};
152462306a36Sopenharmony_ci
152562306a36Sopenharmony_cistatic const struct attribute_group input_dev_id_attr_group = {
152662306a36Sopenharmony_ci	.name	= "id",
152762306a36Sopenharmony_ci	.attrs	= input_dev_id_attrs,
152862306a36Sopenharmony_ci};
152962306a36Sopenharmony_ci
153062306a36Sopenharmony_cistatic int input_print_bitmap(char *buf, int buf_size, const unsigned long *bitmap,
153162306a36Sopenharmony_ci			      int max, int add_cr)
153262306a36Sopenharmony_ci{
153362306a36Sopenharmony_ci	int i;
153462306a36Sopenharmony_ci	int len = 0;
153562306a36Sopenharmony_ci	bool skip_empty = true;
153662306a36Sopenharmony_ci
153762306a36Sopenharmony_ci	for (i = BITS_TO_LONGS(max) - 1; i >= 0; i--) {
153862306a36Sopenharmony_ci		len += input_bits_to_string(buf + len, max(buf_size - len, 0),
153962306a36Sopenharmony_ci					    bitmap[i], skip_empty);
154062306a36Sopenharmony_ci		if (len) {
154162306a36Sopenharmony_ci			skip_empty = false;
154262306a36Sopenharmony_ci			if (i > 0)
154362306a36Sopenharmony_ci				len += snprintf(buf + len, max(buf_size - len, 0), " ");
154462306a36Sopenharmony_ci		}
154562306a36Sopenharmony_ci	}
154662306a36Sopenharmony_ci
154762306a36Sopenharmony_ci	/*
154862306a36Sopenharmony_ci	 * If no output was produced print a single 0.
154962306a36Sopenharmony_ci	 */
155062306a36Sopenharmony_ci	if (len == 0)
155162306a36Sopenharmony_ci		len = snprintf(buf, buf_size, "%d", 0);
155262306a36Sopenharmony_ci
155362306a36Sopenharmony_ci	if (add_cr)
155462306a36Sopenharmony_ci		len += snprintf(buf + len, max(buf_size - len, 0), "\n");
155562306a36Sopenharmony_ci
155662306a36Sopenharmony_ci	return len;
155762306a36Sopenharmony_ci}
155862306a36Sopenharmony_ci
155962306a36Sopenharmony_ci#define INPUT_DEV_CAP_ATTR(ev, bm)					\
156062306a36Sopenharmony_cistatic ssize_t input_dev_show_cap_##bm(struct device *dev,		\
156162306a36Sopenharmony_ci				       struct device_attribute *attr,	\
156262306a36Sopenharmony_ci				       char *buf)			\
156362306a36Sopenharmony_ci{									\
156462306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);		\
156562306a36Sopenharmony_ci	int len = input_print_bitmap(buf, PAGE_SIZE,			\
156662306a36Sopenharmony_ci				     input_dev->bm##bit, ev##_MAX,	\
156762306a36Sopenharmony_ci				     true);				\
156862306a36Sopenharmony_ci	return min_t(int, len, PAGE_SIZE);				\
156962306a36Sopenharmony_ci}									\
157062306a36Sopenharmony_cistatic DEVICE_ATTR(bm, S_IRUGO, input_dev_show_cap_##bm, NULL)
157162306a36Sopenharmony_ci
157262306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(EV, ev);
157362306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(KEY, key);
157462306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(REL, rel);
157562306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(ABS, abs);
157662306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(MSC, msc);
157762306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(LED, led);
157862306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(SND, snd);
157962306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(FF, ff);
158062306a36Sopenharmony_ciINPUT_DEV_CAP_ATTR(SW, sw);
158162306a36Sopenharmony_ci
158262306a36Sopenharmony_cistatic struct attribute *input_dev_caps_attrs[] = {
158362306a36Sopenharmony_ci	&dev_attr_ev.attr,
158462306a36Sopenharmony_ci	&dev_attr_key.attr,
158562306a36Sopenharmony_ci	&dev_attr_rel.attr,
158662306a36Sopenharmony_ci	&dev_attr_abs.attr,
158762306a36Sopenharmony_ci	&dev_attr_msc.attr,
158862306a36Sopenharmony_ci	&dev_attr_led.attr,
158962306a36Sopenharmony_ci	&dev_attr_snd.attr,
159062306a36Sopenharmony_ci	&dev_attr_ff.attr,
159162306a36Sopenharmony_ci	&dev_attr_sw.attr,
159262306a36Sopenharmony_ci	NULL
159362306a36Sopenharmony_ci};
159462306a36Sopenharmony_ci
159562306a36Sopenharmony_cistatic const struct attribute_group input_dev_caps_attr_group = {
159662306a36Sopenharmony_ci	.name	= "capabilities",
159762306a36Sopenharmony_ci	.attrs	= input_dev_caps_attrs,
159862306a36Sopenharmony_ci};
159962306a36Sopenharmony_ci
160062306a36Sopenharmony_cistatic const struct attribute_group *input_dev_attr_groups[] = {
160162306a36Sopenharmony_ci	&input_dev_attr_group,
160262306a36Sopenharmony_ci	&input_dev_id_attr_group,
160362306a36Sopenharmony_ci	&input_dev_caps_attr_group,
160462306a36Sopenharmony_ci	&input_poller_attribute_group,
160562306a36Sopenharmony_ci	NULL
160662306a36Sopenharmony_ci};
160762306a36Sopenharmony_ci
160862306a36Sopenharmony_cistatic void input_dev_release(struct device *device)
160962306a36Sopenharmony_ci{
161062306a36Sopenharmony_ci	struct input_dev *dev = to_input_dev(device);
161162306a36Sopenharmony_ci
161262306a36Sopenharmony_ci	input_ff_destroy(dev);
161362306a36Sopenharmony_ci	input_mt_destroy_slots(dev);
161462306a36Sopenharmony_ci	kfree(dev->poller);
161562306a36Sopenharmony_ci	kfree(dev->absinfo);
161662306a36Sopenharmony_ci	kfree(dev->vals);
161762306a36Sopenharmony_ci	kfree(dev);
161862306a36Sopenharmony_ci
161962306a36Sopenharmony_ci	module_put(THIS_MODULE);
162062306a36Sopenharmony_ci}
162162306a36Sopenharmony_ci
162262306a36Sopenharmony_ci/*
162362306a36Sopenharmony_ci * Input uevent interface - loading event handlers based on
162462306a36Sopenharmony_ci * device bitfields.
162562306a36Sopenharmony_ci */
162662306a36Sopenharmony_cistatic int input_add_uevent_bm_var(struct kobj_uevent_env *env,
162762306a36Sopenharmony_ci				   const char *name, const unsigned long *bitmap, int max)
162862306a36Sopenharmony_ci{
162962306a36Sopenharmony_ci	int len;
163062306a36Sopenharmony_ci
163162306a36Sopenharmony_ci	if (add_uevent_var(env, "%s", name))
163262306a36Sopenharmony_ci		return -ENOMEM;
163362306a36Sopenharmony_ci
163462306a36Sopenharmony_ci	len = input_print_bitmap(&env->buf[env->buflen - 1],
163562306a36Sopenharmony_ci				 sizeof(env->buf) - env->buflen,
163662306a36Sopenharmony_ci				 bitmap, max, false);
163762306a36Sopenharmony_ci	if (len >= (sizeof(env->buf) - env->buflen))
163862306a36Sopenharmony_ci		return -ENOMEM;
163962306a36Sopenharmony_ci
164062306a36Sopenharmony_ci	env->buflen += len;
164162306a36Sopenharmony_ci	return 0;
164262306a36Sopenharmony_ci}
164362306a36Sopenharmony_ci
164462306a36Sopenharmony_cistatic int input_add_uevent_modalias_var(struct kobj_uevent_env *env,
164562306a36Sopenharmony_ci					 const struct input_dev *dev)
164662306a36Sopenharmony_ci{
164762306a36Sopenharmony_ci	int len;
164862306a36Sopenharmony_ci
164962306a36Sopenharmony_ci	if (add_uevent_var(env, "MODALIAS="))
165062306a36Sopenharmony_ci		return -ENOMEM;
165162306a36Sopenharmony_ci
165262306a36Sopenharmony_ci	len = input_print_modalias(&env->buf[env->buflen - 1],
165362306a36Sopenharmony_ci				   sizeof(env->buf) - env->buflen,
165462306a36Sopenharmony_ci				   dev, 0);
165562306a36Sopenharmony_ci	if (len >= (sizeof(env->buf) - env->buflen))
165662306a36Sopenharmony_ci		return -ENOMEM;
165762306a36Sopenharmony_ci
165862306a36Sopenharmony_ci	env->buflen += len;
165962306a36Sopenharmony_ci	return 0;
166062306a36Sopenharmony_ci}
166162306a36Sopenharmony_ci
166262306a36Sopenharmony_ci#define INPUT_ADD_HOTPLUG_VAR(fmt, val...)				\
166362306a36Sopenharmony_ci	do {								\
166462306a36Sopenharmony_ci		int err = add_uevent_var(env, fmt, val);		\
166562306a36Sopenharmony_ci		if (err)						\
166662306a36Sopenharmony_ci			return err;					\
166762306a36Sopenharmony_ci	} while (0)
166862306a36Sopenharmony_ci
166962306a36Sopenharmony_ci#define INPUT_ADD_HOTPLUG_BM_VAR(name, bm, max)				\
167062306a36Sopenharmony_ci	do {								\
167162306a36Sopenharmony_ci		int err = input_add_uevent_bm_var(env, name, bm, max);	\
167262306a36Sopenharmony_ci		if (err)						\
167362306a36Sopenharmony_ci			return err;					\
167462306a36Sopenharmony_ci	} while (0)
167562306a36Sopenharmony_ci
167662306a36Sopenharmony_ci#define INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev)				\
167762306a36Sopenharmony_ci	do {								\
167862306a36Sopenharmony_ci		int err = input_add_uevent_modalias_var(env, dev);	\
167962306a36Sopenharmony_ci		if (err)						\
168062306a36Sopenharmony_ci			return err;					\
168162306a36Sopenharmony_ci	} while (0)
168262306a36Sopenharmony_ci
168362306a36Sopenharmony_cistatic int input_dev_uevent(const struct device *device, struct kobj_uevent_env *env)
168462306a36Sopenharmony_ci{
168562306a36Sopenharmony_ci	const struct input_dev *dev = to_input_dev(device);
168662306a36Sopenharmony_ci
168762306a36Sopenharmony_ci	INPUT_ADD_HOTPLUG_VAR("PRODUCT=%x/%x/%x/%x",
168862306a36Sopenharmony_ci				dev->id.bustype, dev->id.vendor,
168962306a36Sopenharmony_ci				dev->id.product, dev->id.version);
169062306a36Sopenharmony_ci	if (dev->name)
169162306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_VAR("NAME=\"%s\"", dev->name);
169262306a36Sopenharmony_ci	if (dev->phys)
169362306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_VAR("PHYS=\"%s\"", dev->phys);
169462306a36Sopenharmony_ci	if (dev->uniq)
169562306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_VAR("UNIQ=\"%s\"", dev->uniq);
169662306a36Sopenharmony_ci
169762306a36Sopenharmony_ci	INPUT_ADD_HOTPLUG_BM_VAR("PROP=", dev->propbit, INPUT_PROP_MAX);
169862306a36Sopenharmony_ci
169962306a36Sopenharmony_ci	INPUT_ADD_HOTPLUG_BM_VAR("EV=", dev->evbit, EV_MAX);
170062306a36Sopenharmony_ci	if (test_bit(EV_KEY, dev->evbit))
170162306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_BM_VAR("KEY=", dev->keybit, KEY_MAX);
170262306a36Sopenharmony_ci	if (test_bit(EV_REL, dev->evbit))
170362306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_BM_VAR("REL=", dev->relbit, REL_MAX);
170462306a36Sopenharmony_ci	if (test_bit(EV_ABS, dev->evbit))
170562306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_BM_VAR("ABS=", dev->absbit, ABS_MAX);
170662306a36Sopenharmony_ci	if (test_bit(EV_MSC, dev->evbit))
170762306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_BM_VAR("MSC=", dev->mscbit, MSC_MAX);
170862306a36Sopenharmony_ci	if (test_bit(EV_LED, dev->evbit))
170962306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_BM_VAR("LED=", dev->ledbit, LED_MAX);
171062306a36Sopenharmony_ci	if (test_bit(EV_SND, dev->evbit))
171162306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_BM_VAR("SND=", dev->sndbit, SND_MAX);
171262306a36Sopenharmony_ci	if (test_bit(EV_FF, dev->evbit))
171362306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_BM_VAR("FF=", dev->ffbit, FF_MAX);
171462306a36Sopenharmony_ci	if (test_bit(EV_SW, dev->evbit))
171562306a36Sopenharmony_ci		INPUT_ADD_HOTPLUG_BM_VAR("SW=", dev->swbit, SW_MAX);
171662306a36Sopenharmony_ci
171762306a36Sopenharmony_ci	INPUT_ADD_HOTPLUG_MODALIAS_VAR(dev);
171862306a36Sopenharmony_ci
171962306a36Sopenharmony_ci	return 0;
172062306a36Sopenharmony_ci}
172162306a36Sopenharmony_ci
172262306a36Sopenharmony_ci#define INPUT_DO_TOGGLE(dev, type, bits, on)				\
172362306a36Sopenharmony_ci	do {								\
172462306a36Sopenharmony_ci		int i;							\
172562306a36Sopenharmony_ci		bool active;						\
172662306a36Sopenharmony_ci									\
172762306a36Sopenharmony_ci		if (!test_bit(EV_##type, dev->evbit))			\
172862306a36Sopenharmony_ci			break;						\
172962306a36Sopenharmony_ci									\
173062306a36Sopenharmony_ci		for_each_set_bit(i, dev->bits##bit, type##_CNT) {	\
173162306a36Sopenharmony_ci			active = test_bit(i, dev->bits);		\
173262306a36Sopenharmony_ci			if (!active && !on)				\
173362306a36Sopenharmony_ci				continue;				\
173462306a36Sopenharmony_ci									\
173562306a36Sopenharmony_ci			dev->event(dev, EV_##type, i, on ? active : 0);	\
173662306a36Sopenharmony_ci		}							\
173762306a36Sopenharmony_ci	} while (0)
173862306a36Sopenharmony_ci
173962306a36Sopenharmony_cistatic void input_dev_toggle(struct input_dev *dev, bool activate)
174062306a36Sopenharmony_ci{
174162306a36Sopenharmony_ci	if (!dev->event)
174262306a36Sopenharmony_ci		return;
174362306a36Sopenharmony_ci
174462306a36Sopenharmony_ci	INPUT_DO_TOGGLE(dev, LED, led, activate);
174562306a36Sopenharmony_ci	INPUT_DO_TOGGLE(dev, SND, snd, activate);
174662306a36Sopenharmony_ci
174762306a36Sopenharmony_ci	if (activate && test_bit(EV_REP, dev->evbit)) {
174862306a36Sopenharmony_ci		dev->event(dev, EV_REP, REP_PERIOD, dev->rep[REP_PERIOD]);
174962306a36Sopenharmony_ci		dev->event(dev, EV_REP, REP_DELAY, dev->rep[REP_DELAY]);
175062306a36Sopenharmony_ci	}
175162306a36Sopenharmony_ci}
175262306a36Sopenharmony_ci
175362306a36Sopenharmony_ci/**
175462306a36Sopenharmony_ci * input_reset_device() - reset/restore the state of input device
175562306a36Sopenharmony_ci * @dev: input device whose state needs to be reset
175662306a36Sopenharmony_ci *
175762306a36Sopenharmony_ci * This function tries to reset the state of an opened input device and
175862306a36Sopenharmony_ci * bring internal state and state if the hardware in sync with each other.
175962306a36Sopenharmony_ci * We mark all keys as released, restore LED state, repeat rate, etc.
176062306a36Sopenharmony_ci */
176162306a36Sopenharmony_civoid input_reset_device(struct input_dev *dev)
176262306a36Sopenharmony_ci{
176362306a36Sopenharmony_ci	unsigned long flags;
176462306a36Sopenharmony_ci
176562306a36Sopenharmony_ci	mutex_lock(&dev->mutex);
176662306a36Sopenharmony_ci	spin_lock_irqsave(&dev->event_lock, flags);
176762306a36Sopenharmony_ci
176862306a36Sopenharmony_ci	input_dev_toggle(dev, true);
176962306a36Sopenharmony_ci	if (input_dev_release_keys(dev))
177062306a36Sopenharmony_ci		input_handle_event(dev, EV_SYN, SYN_REPORT, 1);
177162306a36Sopenharmony_ci
177262306a36Sopenharmony_ci	spin_unlock_irqrestore(&dev->event_lock, flags);
177362306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
177462306a36Sopenharmony_ci}
177562306a36Sopenharmony_ciEXPORT_SYMBOL(input_reset_device);
177662306a36Sopenharmony_ci
177762306a36Sopenharmony_cistatic int input_inhibit_device(struct input_dev *dev)
177862306a36Sopenharmony_ci{
177962306a36Sopenharmony_ci	mutex_lock(&dev->mutex);
178062306a36Sopenharmony_ci
178162306a36Sopenharmony_ci	if (dev->inhibited)
178262306a36Sopenharmony_ci		goto out;
178362306a36Sopenharmony_ci
178462306a36Sopenharmony_ci	if (dev->users) {
178562306a36Sopenharmony_ci		if (dev->close)
178662306a36Sopenharmony_ci			dev->close(dev);
178762306a36Sopenharmony_ci		if (dev->poller)
178862306a36Sopenharmony_ci			input_dev_poller_stop(dev->poller);
178962306a36Sopenharmony_ci	}
179062306a36Sopenharmony_ci
179162306a36Sopenharmony_ci	spin_lock_irq(&dev->event_lock);
179262306a36Sopenharmony_ci	input_mt_release_slots(dev);
179362306a36Sopenharmony_ci	input_dev_release_keys(dev);
179462306a36Sopenharmony_ci	input_handle_event(dev, EV_SYN, SYN_REPORT, 1);
179562306a36Sopenharmony_ci	input_dev_toggle(dev, false);
179662306a36Sopenharmony_ci	spin_unlock_irq(&dev->event_lock);
179762306a36Sopenharmony_ci
179862306a36Sopenharmony_ci	dev->inhibited = true;
179962306a36Sopenharmony_ci
180062306a36Sopenharmony_ciout:
180162306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
180262306a36Sopenharmony_ci	return 0;
180362306a36Sopenharmony_ci}
180462306a36Sopenharmony_ci
180562306a36Sopenharmony_cistatic int input_uninhibit_device(struct input_dev *dev)
180662306a36Sopenharmony_ci{
180762306a36Sopenharmony_ci	int ret = 0;
180862306a36Sopenharmony_ci
180962306a36Sopenharmony_ci	mutex_lock(&dev->mutex);
181062306a36Sopenharmony_ci
181162306a36Sopenharmony_ci	if (!dev->inhibited)
181262306a36Sopenharmony_ci		goto out;
181362306a36Sopenharmony_ci
181462306a36Sopenharmony_ci	if (dev->users) {
181562306a36Sopenharmony_ci		if (dev->open) {
181662306a36Sopenharmony_ci			ret = dev->open(dev);
181762306a36Sopenharmony_ci			if (ret)
181862306a36Sopenharmony_ci				goto out;
181962306a36Sopenharmony_ci		}
182062306a36Sopenharmony_ci		if (dev->poller)
182162306a36Sopenharmony_ci			input_dev_poller_start(dev->poller);
182262306a36Sopenharmony_ci	}
182362306a36Sopenharmony_ci
182462306a36Sopenharmony_ci	dev->inhibited = false;
182562306a36Sopenharmony_ci	spin_lock_irq(&dev->event_lock);
182662306a36Sopenharmony_ci	input_dev_toggle(dev, true);
182762306a36Sopenharmony_ci	spin_unlock_irq(&dev->event_lock);
182862306a36Sopenharmony_ci
182962306a36Sopenharmony_ciout:
183062306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
183162306a36Sopenharmony_ci	return ret;
183262306a36Sopenharmony_ci}
183362306a36Sopenharmony_ci
183462306a36Sopenharmony_cistatic int input_dev_suspend(struct device *dev)
183562306a36Sopenharmony_ci{
183662306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);
183762306a36Sopenharmony_ci
183862306a36Sopenharmony_ci	spin_lock_irq(&input_dev->event_lock);
183962306a36Sopenharmony_ci
184062306a36Sopenharmony_ci	/*
184162306a36Sopenharmony_ci	 * Keys that are pressed now are unlikely to be
184262306a36Sopenharmony_ci	 * still pressed when we resume.
184362306a36Sopenharmony_ci	 */
184462306a36Sopenharmony_ci	if (input_dev_release_keys(input_dev))
184562306a36Sopenharmony_ci		input_handle_event(input_dev, EV_SYN, SYN_REPORT, 1);
184662306a36Sopenharmony_ci
184762306a36Sopenharmony_ci	/* Turn off LEDs and sounds, if any are active. */
184862306a36Sopenharmony_ci	input_dev_toggle(input_dev, false);
184962306a36Sopenharmony_ci
185062306a36Sopenharmony_ci	spin_unlock_irq(&input_dev->event_lock);
185162306a36Sopenharmony_ci
185262306a36Sopenharmony_ci	return 0;
185362306a36Sopenharmony_ci}
185462306a36Sopenharmony_ci
185562306a36Sopenharmony_cistatic int input_dev_resume(struct device *dev)
185662306a36Sopenharmony_ci{
185762306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);
185862306a36Sopenharmony_ci
185962306a36Sopenharmony_ci	spin_lock_irq(&input_dev->event_lock);
186062306a36Sopenharmony_ci
186162306a36Sopenharmony_ci	/* Restore state of LEDs and sounds, if any were active. */
186262306a36Sopenharmony_ci	input_dev_toggle(input_dev, true);
186362306a36Sopenharmony_ci
186462306a36Sopenharmony_ci	spin_unlock_irq(&input_dev->event_lock);
186562306a36Sopenharmony_ci
186662306a36Sopenharmony_ci	return 0;
186762306a36Sopenharmony_ci}
186862306a36Sopenharmony_ci
186962306a36Sopenharmony_cistatic int input_dev_freeze(struct device *dev)
187062306a36Sopenharmony_ci{
187162306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);
187262306a36Sopenharmony_ci
187362306a36Sopenharmony_ci	spin_lock_irq(&input_dev->event_lock);
187462306a36Sopenharmony_ci
187562306a36Sopenharmony_ci	/*
187662306a36Sopenharmony_ci	 * Keys that are pressed now are unlikely to be
187762306a36Sopenharmony_ci	 * still pressed when we resume.
187862306a36Sopenharmony_ci	 */
187962306a36Sopenharmony_ci	if (input_dev_release_keys(input_dev))
188062306a36Sopenharmony_ci		input_handle_event(input_dev, EV_SYN, SYN_REPORT, 1);
188162306a36Sopenharmony_ci
188262306a36Sopenharmony_ci	spin_unlock_irq(&input_dev->event_lock);
188362306a36Sopenharmony_ci
188462306a36Sopenharmony_ci	return 0;
188562306a36Sopenharmony_ci}
188662306a36Sopenharmony_ci
188762306a36Sopenharmony_cistatic int input_dev_poweroff(struct device *dev)
188862306a36Sopenharmony_ci{
188962306a36Sopenharmony_ci	struct input_dev *input_dev = to_input_dev(dev);
189062306a36Sopenharmony_ci
189162306a36Sopenharmony_ci	spin_lock_irq(&input_dev->event_lock);
189262306a36Sopenharmony_ci
189362306a36Sopenharmony_ci	/* Turn off LEDs and sounds, if any are active. */
189462306a36Sopenharmony_ci	input_dev_toggle(input_dev, false);
189562306a36Sopenharmony_ci
189662306a36Sopenharmony_ci	spin_unlock_irq(&input_dev->event_lock);
189762306a36Sopenharmony_ci
189862306a36Sopenharmony_ci	return 0;
189962306a36Sopenharmony_ci}
190062306a36Sopenharmony_ci
190162306a36Sopenharmony_cistatic const struct dev_pm_ops input_dev_pm_ops = {
190262306a36Sopenharmony_ci	.suspend	= input_dev_suspend,
190362306a36Sopenharmony_ci	.resume		= input_dev_resume,
190462306a36Sopenharmony_ci	.freeze		= input_dev_freeze,
190562306a36Sopenharmony_ci	.poweroff	= input_dev_poweroff,
190662306a36Sopenharmony_ci	.restore	= input_dev_resume,
190762306a36Sopenharmony_ci};
190862306a36Sopenharmony_ci
190962306a36Sopenharmony_cistatic const struct device_type input_dev_type = {
191062306a36Sopenharmony_ci	.groups		= input_dev_attr_groups,
191162306a36Sopenharmony_ci	.release	= input_dev_release,
191262306a36Sopenharmony_ci	.uevent		= input_dev_uevent,
191362306a36Sopenharmony_ci	.pm		= pm_sleep_ptr(&input_dev_pm_ops),
191462306a36Sopenharmony_ci};
191562306a36Sopenharmony_ci
191662306a36Sopenharmony_cistatic char *input_devnode(const struct device *dev, umode_t *mode)
191762306a36Sopenharmony_ci{
191862306a36Sopenharmony_ci	return kasprintf(GFP_KERNEL, "input/%s", dev_name(dev));
191962306a36Sopenharmony_ci}
192062306a36Sopenharmony_ci
192162306a36Sopenharmony_cistruct class input_class = {
192262306a36Sopenharmony_ci	.name		= "input",
192362306a36Sopenharmony_ci	.devnode	= input_devnode,
192462306a36Sopenharmony_ci};
192562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(input_class);
192662306a36Sopenharmony_ci
192762306a36Sopenharmony_ci/**
192862306a36Sopenharmony_ci * input_allocate_device - allocate memory for new input device
192962306a36Sopenharmony_ci *
193062306a36Sopenharmony_ci * Returns prepared struct input_dev or %NULL.
193162306a36Sopenharmony_ci *
193262306a36Sopenharmony_ci * NOTE: Use input_free_device() to free devices that have not been
193362306a36Sopenharmony_ci * registered; input_unregister_device() should be used for already
193462306a36Sopenharmony_ci * registered devices.
193562306a36Sopenharmony_ci */
193662306a36Sopenharmony_cistruct input_dev *input_allocate_device(void)
193762306a36Sopenharmony_ci{
193862306a36Sopenharmony_ci	static atomic_t input_no = ATOMIC_INIT(-1);
193962306a36Sopenharmony_ci	struct input_dev *dev;
194062306a36Sopenharmony_ci
194162306a36Sopenharmony_ci	dev = kzalloc(sizeof(*dev), GFP_KERNEL);
194262306a36Sopenharmony_ci	if (dev) {
194362306a36Sopenharmony_ci		dev->dev.type = &input_dev_type;
194462306a36Sopenharmony_ci		dev->dev.class = &input_class;
194562306a36Sopenharmony_ci		device_initialize(&dev->dev);
194662306a36Sopenharmony_ci		mutex_init(&dev->mutex);
194762306a36Sopenharmony_ci		spin_lock_init(&dev->event_lock);
194862306a36Sopenharmony_ci		timer_setup(&dev->timer, NULL, 0);
194962306a36Sopenharmony_ci		INIT_LIST_HEAD(&dev->h_list);
195062306a36Sopenharmony_ci		INIT_LIST_HEAD(&dev->node);
195162306a36Sopenharmony_ci
195262306a36Sopenharmony_ci		dev_set_name(&dev->dev, "input%lu",
195362306a36Sopenharmony_ci			     (unsigned long)atomic_inc_return(&input_no));
195462306a36Sopenharmony_ci
195562306a36Sopenharmony_ci		__module_get(THIS_MODULE);
195662306a36Sopenharmony_ci	}
195762306a36Sopenharmony_ci
195862306a36Sopenharmony_ci	return dev;
195962306a36Sopenharmony_ci}
196062306a36Sopenharmony_ciEXPORT_SYMBOL(input_allocate_device);
196162306a36Sopenharmony_ci
196262306a36Sopenharmony_cistruct input_devres {
196362306a36Sopenharmony_ci	struct input_dev *input;
196462306a36Sopenharmony_ci};
196562306a36Sopenharmony_ci
196662306a36Sopenharmony_cistatic int devm_input_device_match(struct device *dev, void *res, void *data)
196762306a36Sopenharmony_ci{
196862306a36Sopenharmony_ci	struct input_devres *devres = res;
196962306a36Sopenharmony_ci
197062306a36Sopenharmony_ci	return devres->input == data;
197162306a36Sopenharmony_ci}
197262306a36Sopenharmony_ci
197362306a36Sopenharmony_cistatic void devm_input_device_release(struct device *dev, void *res)
197462306a36Sopenharmony_ci{
197562306a36Sopenharmony_ci	struct input_devres *devres = res;
197662306a36Sopenharmony_ci	struct input_dev *input = devres->input;
197762306a36Sopenharmony_ci
197862306a36Sopenharmony_ci	dev_dbg(dev, "%s: dropping reference to %s\n",
197962306a36Sopenharmony_ci		__func__, dev_name(&input->dev));
198062306a36Sopenharmony_ci	input_put_device(input);
198162306a36Sopenharmony_ci}
198262306a36Sopenharmony_ci
198362306a36Sopenharmony_ci/**
198462306a36Sopenharmony_ci * devm_input_allocate_device - allocate managed input device
198562306a36Sopenharmony_ci * @dev: device owning the input device being created
198662306a36Sopenharmony_ci *
198762306a36Sopenharmony_ci * Returns prepared struct input_dev or %NULL.
198862306a36Sopenharmony_ci *
198962306a36Sopenharmony_ci * Managed input devices do not need to be explicitly unregistered or
199062306a36Sopenharmony_ci * freed as it will be done automatically when owner device unbinds from
199162306a36Sopenharmony_ci * its driver (or binding fails). Once managed input device is allocated,
199262306a36Sopenharmony_ci * it is ready to be set up and registered in the same fashion as regular
199362306a36Sopenharmony_ci * input device. There are no special devm_input_device_[un]register()
199462306a36Sopenharmony_ci * variants, regular ones work with both managed and unmanaged devices,
199562306a36Sopenharmony_ci * should you need them. In most cases however, managed input device need
199662306a36Sopenharmony_ci * not be explicitly unregistered or freed.
199762306a36Sopenharmony_ci *
199862306a36Sopenharmony_ci * NOTE: the owner device is set up as parent of input device and users
199962306a36Sopenharmony_ci * should not override it.
200062306a36Sopenharmony_ci */
200162306a36Sopenharmony_cistruct input_dev *devm_input_allocate_device(struct device *dev)
200262306a36Sopenharmony_ci{
200362306a36Sopenharmony_ci	struct input_dev *input;
200462306a36Sopenharmony_ci	struct input_devres *devres;
200562306a36Sopenharmony_ci
200662306a36Sopenharmony_ci	devres = devres_alloc(devm_input_device_release,
200762306a36Sopenharmony_ci			      sizeof(*devres), GFP_KERNEL);
200862306a36Sopenharmony_ci	if (!devres)
200962306a36Sopenharmony_ci		return NULL;
201062306a36Sopenharmony_ci
201162306a36Sopenharmony_ci	input = input_allocate_device();
201262306a36Sopenharmony_ci	if (!input) {
201362306a36Sopenharmony_ci		devres_free(devres);
201462306a36Sopenharmony_ci		return NULL;
201562306a36Sopenharmony_ci	}
201662306a36Sopenharmony_ci
201762306a36Sopenharmony_ci	input->dev.parent = dev;
201862306a36Sopenharmony_ci	input->devres_managed = true;
201962306a36Sopenharmony_ci
202062306a36Sopenharmony_ci	devres->input = input;
202162306a36Sopenharmony_ci	devres_add(dev, devres);
202262306a36Sopenharmony_ci
202362306a36Sopenharmony_ci	return input;
202462306a36Sopenharmony_ci}
202562306a36Sopenharmony_ciEXPORT_SYMBOL(devm_input_allocate_device);
202662306a36Sopenharmony_ci
202762306a36Sopenharmony_ci/**
202862306a36Sopenharmony_ci * input_free_device - free memory occupied by input_dev structure
202962306a36Sopenharmony_ci * @dev: input device to free
203062306a36Sopenharmony_ci *
203162306a36Sopenharmony_ci * This function should only be used if input_register_device()
203262306a36Sopenharmony_ci * was not called yet or if it failed. Once device was registered
203362306a36Sopenharmony_ci * use input_unregister_device() and memory will be freed once last
203462306a36Sopenharmony_ci * reference to the device is dropped.
203562306a36Sopenharmony_ci *
203662306a36Sopenharmony_ci * Device should be allocated by input_allocate_device().
203762306a36Sopenharmony_ci *
203862306a36Sopenharmony_ci * NOTE: If there are references to the input device then memory
203962306a36Sopenharmony_ci * will not be freed until last reference is dropped.
204062306a36Sopenharmony_ci */
204162306a36Sopenharmony_civoid input_free_device(struct input_dev *dev)
204262306a36Sopenharmony_ci{
204362306a36Sopenharmony_ci	if (dev) {
204462306a36Sopenharmony_ci		if (dev->devres_managed)
204562306a36Sopenharmony_ci			WARN_ON(devres_destroy(dev->dev.parent,
204662306a36Sopenharmony_ci						devm_input_device_release,
204762306a36Sopenharmony_ci						devm_input_device_match,
204862306a36Sopenharmony_ci						dev));
204962306a36Sopenharmony_ci		input_put_device(dev);
205062306a36Sopenharmony_ci	}
205162306a36Sopenharmony_ci}
205262306a36Sopenharmony_ciEXPORT_SYMBOL(input_free_device);
205362306a36Sopenharmony_ci
205462306a36Sopenharmony_ci/**
205562306a36Sopenharmony_ci * input_set_timestamp - set timestamp for input events
205662306a36Sopenharmony_ci * @dev: input device to set timestamp for
205762306a36Sopenharmony_ci * @timestamp: the time at which the event has occurred
205862306a36Sopenharmony_ci *   in CLOCK_MONOTONIC
205962306a36Sopenharmony_ci *
206062306a36Sopenharmony_ci * This function is intended to provide to the input system a more
206162306a36Sopenharmony_ci * accurate time of when an event actually occurred. The driver should
206262306a36Sopenharmony_ci * call this function as soon as a timestamp is acquired ensuring
206362306a36Sopenharmony_ci * clock conversions in input_set_timestamp are done correctly.
206462306a36Sopenharmony_ci *
206562306a36Sopenharmony_ci * The system entering suspend state between timestamp acquisition and
206662306a36Sopenharmony_ci * calling input_set_timestamp can result in inaccurate conversions.
206762306a36Sopenharmony_ci */
206862306a36Sopenharmony_civoid input_set_timestamp(struct input_dev *dev, ktime_t timestamp)
206962306a36Sopenharmony_ci{
207062306a36Sopenharmony_ci	dev->timestamp[INPUT_CLK_MONO] = timestamp;
207162306a36Sopenharmony_ci	dev->timestamp[INPUT_CLK_REAL] = ktime_mono_to_real(timestamp);
207262306a36Sopenharmony_ci	dev->timestamp[INPUT_CLK_BOOT] = ktime_mono_to_any(timestamp,
207362306a36Sopenharmony_ci							   TK_OFFS_BOOT);
207462306a36Sopenharmony_ci}
207562306a36Sopenharmony_ciEXPORT_SYMBOL(input_set_timestamp);
207662306a36Sopenharmony_ci
207762306a36Sopenharmony_ci/**
207862306a36Sopenharmony_ci * input_get_timestamp - get timestamp for input events
207962306a36Sopenharmony_ci * @dev: input device to get timestamp from
208062306a36Sopenharmony_ci *
208162306a36Sopenharmony_ci * A valid timestamp is a timestamp of non-zero value.
208262306a36Sopenharmony_ci */
208362306a36Sopenharmony_ciktime_t *input_get_timestamp(struct input_dev *dev)
208462306a36Sopenharmony_ci{
208562306a36Sopenharmony_ci	const ktime_t invalid_timestamp = ktime_set(0, 0);
208662306a36Sopenharmony_ci
208762306a36Sopenharmony_ci	if (!ktime_compare(dev->timestamp[INPUT_CLK_MONO], invalid_timestamp))
208862306a36Sopenharmony_ci		input_set_timestamp(dev, ktime_get());
208962306a36Sopenharmony_ci
209062306a36Sopenharmony_ci	return dev->timestamp;
209162306a36Sopenharmony_ci}
209262306a36Sopenharmony_ciEXPORT_SYMBOL(input_get_timestamp);
209362306a36Sopenharmony_ci
209462306a36Sopenharmony_ci/**
209562306a36Sopenharmony_ci * input_set_capability - mark device as capable of a certain event
209662306a36Sopenharmony_ci * @dev: device that is capable of emitting or accepting event
209762306a36Sopenharmony_ci * @type: type of the event (EV_KEY, EV_REL, etc...)
209862306a36Sopenharmony_ci * @code: event code
209962306a36Sopenharmony_ci *
210062306a36Sopenharmony_ci * In addition to setting up corresponding bit in appropriate capability
210162306a36Sopenharmony_ci * bitmap the function also adjusts dev->evbit.
210262306a36Sopenharmony_ci */
210362306a36Sopenharmony_civoid input_set_capability(struct input_dev *dev, unsigned int type, unsigned int code)
210462306a36Sopenharmony_ci{
210562306a36Sopenharmony_ci	if (type < EV_CNT && input_max_code[type] &&
210662306a36Sopenharmony_ci	    code > input_max_code[type]) {
210762306a36Sopenharmony_ci		pr_err("%s: invalid code %u for type %u\n", __func__, code,
210862306a36Sopenharmony_ci		       type);
210962306a36Sopenharmony_ci		dump_stack();
211062306a36Sopenharmony_ci		return;
211162306a36Sopenharmony_ci	}
211262306a36Sopenharmony_ci
211362306a36Sopenharmony_ci	switch (type) {
211462306a36Sopenharmony_ci	case EV_KEY:
211562306a36Sopenharmony_ci		__set_bit(code, dev->keybit);
211662306a36Sopenharmony_ci		break;
211762306a36Sopenharmony_ci
211862306a36Sopenharmony_ci	case EV_REL:
211962306a36Sopenharmony_ci		__set_bit(code, dev->relbit);
212062306a36Sopenharmony_ci		break;
212162306a36Sopenharmony_ci
212262306a36Sopenharmony_ci	case EV_ABS:
212362306a36Sopenharmony_ci		input_alloc_absinfo(dev);
212462306a36Sopenharmony_ci		__set_bit(code, dev->absbit);
212562306a36Sopenharmony_ci		break;
212662306a36Sopenharmony_ci
212762306a36Sopenharmony_ci	case EV_MSC:
212862306a36Sopenharmony_ci		__set_bit(code, dev->mscbit);
212962306a36Sopenharmony_ci		break;
213062306a36Sopenharmony_ci
213162306a36Sopenharmony_ci	case EV_SW:
213262306a36Sopenharmony_ci		__set_bit(code, dev->swbit);
213362306a36Sopenharmony_ci		break;
213462306a36Sopenharmony_ci
213562306a36Sopenharmony_ci	case EV_LED:
213662306a36Sopenharmony_ci		__set_bit(code, dev->ledbit);
213762306a36Sopenharmony_ci		break;
213862306a36Sopenharmony_ci
213962306a36Sopenharmony_ci	case EV_SND:
214062306a36Sopenharmony_ci		__set_bit(code, dev->sndbit);
214162306a36Sopenharmony_ci		break;
214262306a36Sopenharmony_ci
214362306a36Sopenharmony_ci	case EV_FF:
214462306a36Sopenharmony_ci		__set_bit(code, dev->ffbit);
214562306a36Sopenharmony_ci		break;
214662306a36Sopenharmony_ci
214762306a36Sopenharmony_ci	case EV_PWR:
214862306a36Sopenharmony_ci		/* do nothing */
214962306a36Sopenharmony_ci		break;
215062306a36Sopenharmony_ci
215162306a36Sopenharmony_ci	default:
215262306a36Sopenharmony_ci		pr_err("%s: unknown type %u (code %u)\n", __func__, type, code);
215362306a36Sopenharmony_ci		dump_stack();
215462306a36Sopenharmony_ci		return;
215562306a36Sopenharmony_ci	}
215662306a36Sopenharmony_ci
215762306a36Sopenharmony_ci	__set_bit(type, dev->evbit);
215862306a36Sopenharmony_ci}
215962306a36Sopenharmony_ciEXPORT_SYMBOL(input_set_capability);
216062306a36Sopenharmony_ci
216162306a36Sopenharmony_cistatic unsigned int input_estimate_events_per_packet(struct input_dev *dev)
216262306a36Sopenharmony_ci{
216362306a36Sopenharmony_ci	int mt_slots;
216462306a36Sopenharmony_ci	int i;
216562306a36Sopenharmony_ci	unsigned int events;
216662306a36Sopenharmony_ci
216762306a36Sopenharmony_ci	if (dev->mt) {
216862306a36Sopenharmony_ci		mt_slots = dev->mt->num_slots;
216962306a36Sopenharmony_ci	} else if (test_bit(ABS_MT_TRACKING_ID, dev->absbit)) {
217062306a36Sopenharmony_ci		mt_slots = dev->absinfo[ABS_MT_TRACKING_ID].maximum -
217162306a36Sopenharmony_ci			   dev->absinfo[ABS_MT_TRACKING_ID].minimum + 1,
217262306a36Sopenharmony_ci		mt_slots = clamp(mt_slots, 2, 32);
217362306a36Sopenharmony_ci	} else if (test_bit(ABS_MT_POSITION_X, dev->absbit)) {
217462306a36Sopenharmony_ci		mt_slots = 2;
217562306a36Sopenharmony_ci	} else {
217662306a36Sopenharmony_ci		mt_slots = 0;
217762306a36Sopenharmony_ci	}
217862306a36Sopenharmony_ci
217962306a36Sopenharmony_ci	events = mt_slots + 1; /* count SYN_MT_REPORT and SYN_REPORT */
218062306a36Sopenharmony_ci
218162306a36Sopenharmony_ci	if (test_bit(EV_ABS, dev->evbit))
218262306a36Sopenharmony_ci		for_each_set_bit(i, dev->absbit, ABS_CNT)
218362306a36Sopenharmony_ci			events += input_is_mt_axis(i) ? mt_slots : 1;
218462306a36Sopenharmony_ci
218562306a36Sopenharmony_ci	if (test_bit(EV_REL, dev->evbit))
218662306a36Sopenharmony_ci		events += bitmap_weight(dev->relbit, REL_CNT);
218762306a36Sopenharmony_ci
218862306a36Sopenharmony_ci	/* Make room for KEY and MSC events */
218962306a36Sopenharmony_ci	events += 7;
219062306a36Sopenharmony_ci
219162306a36Sopenharmony_ci	return events;
219262306a36Sopenharmony_ci}
219362306a36Sopenharmony_ci
219462306a36Sopenharmony_ci#define INPUT_CLEANSE_BITMASK(dev, type, bits)				\
219562306a36Sopenharmony_ci	do {								\
219662306a36Sopenharmony_ci		if (!test_bit(EV_##type, dev->evbit))			\
219762306a36Sopenharmony_ci			memset(dev->bits##bit, 0,			\
219862306a36Sopenharmony_ci				sizeof(dev->bits##bit));		\
219962306a36Sopenharmony_ci	} while (0)
220062306a36Sopenharmony_ci
220162306a36Sopenharmony_cistatic void input_cleanse_bitmasks(struct input_dev *dev)
220262306a36Sopenharmony_ci{
220362306a36Sopenharmony_ci	INPUT_CLEANSE_BITMASK(dev, KEY, key);
220462306a36Sopenharmony_ci	INPUT_CLEANSE_BITMASK(dev, REL, rel);
220562306a36Sopenharmony_ci	INPUT_CLEANSE_BITMASK(dev, ABS, abs);
220662306a36Sopenharmony_ci	INPUT_CLEANSE_BITMASK(dev, MSC, msc);
220762306a36Sopenharmony_ci	INPUT_CLEANSE_BITMASK(dev, LED, led);
220862306a36Sopenharmony_ci	INPUT_CLEANSE_BITMASK(dev, SND, snd);
220962306a36Sopenharmony_ci	INPUT_CLEANSE_BITMASK(dev, FF, ff);
221062306a36Sopenharmony_ci	INPUT_CLEANSE_BITMASK(dev, SW, sw);
221162306a36Sopenharmony_ci}
221262306a36Sopenharmony_ci
221362306a36Sopenharmony_cistatic void __input_unregister_device(struct input_dev *dev)
221462306a36Sopenharmony_ci{
221562306a36Sopenharmony_ci	struct input_handle *handle, *next;
221662306a36Sopenharmony_ci
221762306a36Sopenharmony_ci	input_disconnect_device(dev);
221862306a36Sopenharmony_ci
221962306a36Sopenharmony_ci	mutex_lock(&input_mutex);
222062306a36Sopenharmony_ci
222162306a36Sopenharmony_ci	list_for_each_entry_safe(handle, next, &dev->h_list, d_node)
222262306a36Sopenharmony_ci		handle->handler->disconnect(handle);
222362306a36Sopenharmony_ci	WARN_ON(!list_empty(&dev->h_list));
222462306a36Sopenharmony_ci
222562306a36Sopenharmony_ci	del_timer_sync(&dev->timer);
222662306a36Sopenharmony_ci	list_del_init(&dev->node);
222762306a36Sopenharmony_ci
222862306a36Sopenharmony_ci	input_wakeup_procfs_readers();
222962306a36Sopenharmony_ci
223062306a36Sopenharmony_ci	mutex_unlock(&input_mutex);
223162306a36Sopenharmony_ci
223262306a36Sopenharmony_ci	device_del(&dev->dev);
223362306a36Sopenharmony_ci}
223462306a36Sopenharmony_ci
223562306a36Sopenharmony_cistatic void devm_input_device_unregister(struct device *dev, void *res)
223662306a36Sopenharmony_ci{
223762306a36Sopenharmony_ci	struct input_devres *devres = res;
223862306a36Sopenharmony_ci	struct input_dev *input = devres->input;
223962306a36Sopenharmony_ci
224062306a36Sopenharmony_ci	dev_dbg(dev, "%s: unregistering device %s\n",
224162306a36Sopenharmony_ci		__func__, dev_name(&input->dev));
224262306a36Sopenharmony_ci	__input_unregister_device(input);
224362306a36Sopenharmony_ci}
224462306a36Sopenharmony_ci
224562306a36Sopenharmony_ci/*
224662306a36Sopenharmony_ci * Generate software autorepeat event. Note that we take
224762306a36Sopenharmony_ci * dev->event_lock here to avoid racing with input_event
224862306a36Sopenharmony_ci * which may cause keys get "stuck".
224962306a36Sopenharmony_ci */
225062306a36Sopenharmony_cistatic void input_repeat_key(struct timer_list *t)
225162306a36Sopenharmony_ci{
225262306a36Sopenharmony_ci	struct input_dev *dev = from_timer(dev, t, timer);
225362306a36Sopenharmony_ci	unsigned long flags;
225462306a36Sopenharmony_ci
225562306a36Sopenharmony_ci	spin_lock_irqsave(&dev->event_lock, flags);
225662306a36Sopenharmony_ci
225762306a36Sopenharmony_ci	if (!dev->inhibited &&
225862306a36Sopenharmony_ci	    test_bit(dev->repeat_key, dev->key) &&
225962306a36Sopenharmony_ci	    is_event_supported(dev->repeat_key, dev->keybit, KEY_MAX)) {
226062306a36Sopenharmony_ci
226162306a36Sopenharmony_ci		input_set_timestamp(dev, ktime_get());
226262306a36Sopenharmony_ci		input_handle_event(dev, EV_KEY, dev->repeat_key, 2);
226362306a36Sopenharmony_ci		input_handle_event(dev, EV_SYN, SYN_REPORT, 1);
226462306a36Sopenharmony_ci
226562306a36Sopenharmony_ci		if (dev->rep[REP_PERIOD])
226662306a36Sopenharmony_ci			mod_timer(&dev->timer, jiffies +
226762306a36Sopenharmony_ci					msecs_to_jiffies(dev->rep[REP_PERIOD]));
226862306a36Sopenharmony_ci	}
226962306a36Sopenharmony_ci
227062306a36Sopenharmony_ci	spin_unlock_irqrestore(&dev->event_lock, flags);
227162306a36Sopenharmony_ci}
227262306a36Sopenharmony_ci
227362306a36Sopenharmony_ci/**
227462306a36Sopenharmony_ci * input_enable_softrepeat - enable software autorepeat
227562306a36Sopenharmony_ci * @dev: input device
227662306a36Sopenharmony_ci * @delay: repeat delay
227762306a36Sopenharmony_ci * @period: repeat period
227862306a36Sopenharmony_ci *
227962306a36Sopenharmony_ci * Enable software autorepeat on the input device.
228062306a36Sopenharmony_ci */
228162306a36Sopenharmony_civoid input_enable_softrepeat(struct input_dev *dev, int delay, int period)
228262306a36Sopenharmony_ci{
228362306a36Sopenharmony_ci	dev->timer.function = input_repeat_key;
228462306a36Sopenharmony_ci	dev->rep[REP_DELAY] = delay;
228562306a36Sopenharmony_ci	dev->rep[REP_PERIOD] = period;
228662306a36Sopenharmony_ci}
228762306a36Sopenharmony_ciEXPORT_SYMBOL(input_enable_softrepeat);
228862306a36Sopenharmony_ci
228962306a36Sopenharmony_cibool input_device_enabled(struct input_dev *dev)
229062306a36Sopenharmony_ci{
229162306a36Sopenharmony_ci	lockdep_assert_held(&dev->mutex);
229262306a36Sopenharmony_ci
229362306a36Sopenharmony_ci	return !dev->inhibited && dev->users > 0;
229462306a36Sopenharmony_ci}
229562306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(input_device_enabled);
229662306a36Sopenharmony_ci
229762306a36Sopenharmony_ci/**
229862306a36Sopenharmony_ci * input_register_device - register device with input core
229962306a36Sopenharmony_ci * @dev: device to be registered
230062306a36Sopenharmony_ci *
230162306a36Sopenharmony_ci * This function registers device with input core. The device must be
230262306a36Sopenharmony_ci * allocated with input_allocate_device() and all it's capabilities
230362306a36Sopenharmony_ci * set up before registering.
230462306a36Sopenharmony_ci * If function fails the device must be freed with input_free_device().
230562306a36Sopenharmony_ci * Once device has been successfully registered it can be unregistered
230662306a36Sopenharmony_ci * with input_unregister_device(); input_free_device() should not be
230762306a36Sopenharmony_ci * called in this case.
230862306a36Sopenharmony_ci *
230962306a36Sopenharmony_ci * Note that this function is also used to register managed input devices
231062306a36Sopenharmony_ci * (ones allocated with devm_input_allocate_device()). Such managed input
231162306a36Sopenharmony_ci * devices need not be explicitly unregistered or freed, their tear down
231262306a36Sopenharmony_ci * is controlled by the devres infrastructure. It is also worth noting
231362306a36Sopenharmony_ci * that tear down of managed input devices is internally a 2-step process:
231462306a36Sopenharmony_ci * registered managed input device is first unregistered, but stays in
231562306a36Sopenharmony_ci * memory and can still handle input_event() calls (although events will
231662306a36Sopenharmony_ci * not be delivered anywhere). The freeing of managed input device will
231762306a36Sopenharmony_ci * happen later, when devres stack is unwound to the point where device
231862306a36Sopenharmony_ci * allocation was made.
231962306a36Sopenharmony_ci */
232062306a36Sopenharmony_ciint input_register_device(struct input_dev *dev)
232162306a36Sopenharmony_ci{
232262306a36Sopenharmony_ci	struct input_devres *devres = NULL;
232362306a36Sopenharmony_ci	struct input_handler *handler;
232462306a36Sopenharmony_ci	unsigned int packet_size;
232562306a36Sopenharmony_ci	const char *path;
232662306a36Sopenharmony_ci	int error;
232762306a36Sopenharmony_ci
232862306a36Sopenharmony_ci	if (test_bit(EV_ABS, dev->evbit) && !dev->absinfo) {
232962306a36Sopenharmony_ci		dev_err(&dev->dev,
233062306a36Sopenharmony_ci			"Absolute device without dev->absinfo, refusing to register\n");
233162306a36Sopenharmony_ci		return -EINVAL;
233262306a36Sopenharmony_ci	}
233362306a36Sopenharmony_ci
233462306a36Sopenharmony_ci	if (dev->devres_managed) {
233562306a36Sopenharmony_ci		devres = devres_alloc(devm_input_device_unregister,
233662306a36Sopenharmony_ci				      sizeof(*devres), GFP_KERNEL);
233762306a36Sopenharmony_ci		if (!devres)
233862306a36Sopenharmony_ci			return -ENOMEM;
233962306a36Sopenharmony_ci
234062306a36Sopenharmony_ci		devres->input = dev;
234162306a36Sopenharmony_ci	}
234262306a36Sopenharmony_ci
234362306a36Sopenharmony_ci	/* Every input device generates EV_SYN/SYN_REPORT events. */
234462306a36Sopenharmony_ci	__set_bit(EV_SYN, dev->evbit);
234562306a36Sopenharmony_ci
234662306a36Sopenharmony_ci	/* KEY_RESERVED is not supposed to be transmitted to userspace. */
234762306a36Sopenharmony_ci	__clear_bit(KEY_RESERVED, dev->keybit);
234862306a36Sopenharmony_ci
234962306a36Sopenharmony_ci	/* Make sure that bitmasks not mentioned in dev->evbit are clean. */
235062306a36Sopenharmony_ci	input_cleanse_bitmasks(dev);
235162306a36Sopenharmony_ci
235262306a36Sopenharmony_ci	packet_size = input_estimate_events_per_packet(dev);
235362306a36Sopenharmony_ci	if (dev->hint_events_per_packet < packet_size)
235462306a36Sopenharmony_ci		dev->hint_events_per_packet = packet_size;
235562306a36Sopenharmony_ci
235662306a36Sopenharmony_ci	dev->max_vals = dev->hint_events_per_packet + 2;
235762306a36Sopenharmony_ci	dev->vals = kcalloc(dev->max_vals, sizeof(*dev->vals), GFP_KERNEL);
235862306a36Sopenharmony_ci	if (!dev->vals) {
235962306a36Sopenharmony_ci		error = -ENOMEM;
236062306a36Sopenharmony_ci		goto err_devres_free;
236162306a36Sopenharmony_ci	}
236262306a36Sopenharmony_ci
236362306a36Sopenharmony_ci	/*
236462306a36Sopenharmony_ci	 * If delay and period are pre-set by the driver, then autorepeating
236562306a36Sopenharmony_ci	 * is handled by the driver itself and we don't do it in input.c.
236662306a36Sopenharmony_ci	 */
236762306a36Sopenharmony_ci	if (!dev->rep[REP_DELAY] && !dev->rep[REP_PERIOD])
236862306a36Sopenharmony_ci		input_enable_softrepeat(dev, 250, 33);
236962306a36Sopenharmony_ci
237062306a36Sopenharmony_ci	if (!dev->getkeycode)
237162306a36Sopenharmony_ci		dev->getkeycode = input_default_getkeycode;
237262306a36Sopenharmony_ci
237362306a36Sopenharmony_ci	if (!dev->setkeycode)
237462306a36Sopenharmony_ci		dev->setkeycode = input_default_setkeycode;
237562306a36Sopenharmony_ci
237662306a36Sopenharmony_ci	if (dev->poller)
237762306a36Sopenharmony_ci		input_dev_poller_finalize(dev->poller);
237862306a36Sopenharmony_ci
237962306a36Sopenharmony_ci	error = device_add(&dev->dev);
238062306a36Sopenharmony_ci	if (error)
238162306a36Sopenharmony_ci		goto err_free_vals;
238262306a36Sopenharmony_ci
238362306a36Sopenharmony_ci	path = kobject_get_path(&dev->dev.kobj, GFP_KERNEL);
238462306a36Sopenharmony_ci	pr_info("%s as %s\n",
238562306a36Sopenharmony_ci		dev->name ? dev->name : "Unspecified device",
238662306a36Sopenharmony_ci		path ? path : "N/A");
238762306a36Sopenharmony_ci	kfree(path);
238862306a36Sopenharmony_ci
238962306a36Sopenharmony_ci	error = mutex_lock_interruptible(&input_mutex);
239062306a36Sopenharmony_ci	if (error)
239162306a36Sopenharmony_ci		goto err_device_del;
239262306a36Sopenharmony_ci
239362306a36Sopenharmony_ci	list_add_tail(&dev->node, &input_dev_list);
239462306a36Sopenharmony_ci
239562306a36Sopenharmony_ci	list_for_each_entry(handler, &input_handler_list, node)
239662306a36Sopenharmony_ci		input_attach_handler(dev, handler);
239762306a36Sopenharmony_ci
239862306a36Sopenharmony_ci	input_wakeup_procfs_readers();
239962306a36Sopenharmony_ci
240062306a36Sopenharmony_ci	mutex_unlock(&input_mutex);
240162306a36Sopenharmony_ci
240262306a36Sopenharmony_ci	if (dev->devres_managed) {
240362306a36Sopenharmony_ci		dev_dbg(dev->dev.parent, "%s: registering %s with devres.\n",
240462306a36Sopenharmony_ci			__func__, dev_name(&dev->dev));
240562306a36Sopenharmony_ci		devres_add(dev->dev.parent, devres);
240662306a36Sopenharmony_ci	}
240762306a36Sopenharmony_ci	return 0;
240862306a36Sopenharmony_ci
240962306a36Sopenharmony_cierr_device_del:
241062306a36Sopenharmony_ci	device_del(&dev->dev);
241162306a36Sopenharmony_cierr_free_vals:
241262306a36Sopenharmony_ci	kfree(dev->vals);
241362306a36Sopenharmony_ci	dev->vals = NULL;
241462306a36Sopenharmony_cierr_devres_free:
241562306a36Sopenharmony_ci	devres_free(devres);
241662306a36Sopenharmony_ci	return error;
241762306a36Sopenharmony_ci}
241862306a36Sopenharmony_ciEXPORT_SYMBOL(input_register_device);
241962306a36Sopenharmony_ci
242062306a36Sopenharmony_ci/**
242162306a36Sopenharmony_ci * input_unregister_device - unregister previously registered device
242262306a36Sopenharmony_ci * @dev: device to be unregistered
242362306a36Sopenharmony_ci *
242462306a36Sopenharmony_ci * This function unregisters an input device. Once device is unregistered
242562306a36Sopenharmony_ci * the caller should not try to access it as it may get freed at any moment.
242662306a36Sopenharmony_ci */
242762306a36Sopenharmony_civoid input_unregister_device(struct input_dev *dev)
242862306a36Sopenharmony_ci{
242962306a36Sopenharmony_ci	if (dev->devres_managed) {
243062306a36Sopenharmony_ci		WARN_ON(devres_destroy(dev->dev.parent,
243162306a36Sopenharmony_ci					devm_input_device_unregister,
243262306a36Sopenharmony_ci					devm_input_device_match,
243362306a36Sopenharmony_ci					dev));
243462306a36Sopenharmony_ci		__input_unregister_device(dev);
243562306a36Sopenharmony_ci		/*
243662306a36Sopenharmony_ci		 * We do not do input_put_device() here because it will be done
243762306a36Sopenharmony_ci		 * when 2nd devres fires up.
243862306a36Sopenharmony_ci		 */
243962306a36Sopenharmony_ci	} else {
244062306a36Sopenharmony_ci		__input_unregister_device(dev);
244162306a36Sopenharmony_ci		input_put_device(dev);
244262306a36Sopenharmony_ci	}
244362306a36Sopenharmony_ci}
244462306a36Sopenharmony_ciEXPORT_SYMBOL(input_unregister_device);
244562306a36Sopenharmony_ci
244662306a36Sopenharmony_ci/**
244762306a36Sopenharmony_ci * input_register_handler - register a new input handler
244862306a36Sopenharmony_ci * @handler: handler to be registered
244962306a36Sopenharmony_ci *
245062306a36Sopenharmony_ci * This function registers a new input handler (interface) for input
245162306a36Sopenharmony_ci * devices in the system and attaches it to all input devices that
245262306a36Sopenharmony_ci * are compatible with the handler.
245362306a36Sopenharmony_ci */
245462306a36Sopenharmony_ciint input_register_handler(struct input_handler *handler)
245562306a36Sopenharmony_ci{
245662306a36Sopenharmony_ci	struct input_dev *dev;
245762306a36Sopenharmony_ci	int error;
245862306a36Sopenharmony_ci
245962306a36Sopenharmony_ci	error = mutex_lock_interruptible(&input_mutex);
246062306a36Sopenharmony_ci	if (error)
246162306a36Sopenharmony_ci		return error;
246262306a36Sopenharmony_ci
246362306a36Sopenharmony_ci	INIT_LIST_HEAD(&handler->h_list);
246462306a36Sopenharmony_ci
246562306a36Sopenharmony_ci	list_add_tail(&handler->node, &input_handler_list);
246662306a36Sopenharmony_ci
246762306a36Sopenharmony_ci	list_for_each_entry(dev, &input_dev_list, node)
246862306a36Sopenharmony_ci		input_attach_handler(dev, handler);
246962306a36Sopenharmony_ci
247062306a36Sopenharmony_ci	input_wakeup_procfs_readers();
247162306a36Sopenharmony_ci
247262306a36Sopenharmony_ci	mutex_unlock(&input_mutex);
247362306a36Sopenharmony_ci	return 0;
247462306a36Sopenharmony_ci}
247562306a36Sopenharmony_ciEXPORT_SYMBOL(input_register_handler);
247662306a36Sopenharmony_ci
247762306a36Sopenharmony_ci/**
247862306a36Sopenharmony_ci * input_unregister_handler - unregisters an input handler
247962306a36Sopenharmony_ci * @handler: handler to be unregistered
248062306a36Sopenharmony_ci *
248162306a36Sopenharmony_ci * This function disconnects a handler from its input devices and
248262306a36Sopenharmony_ci * removes it from lists of known handlers.
248362306a36Sopenharmony_ci */
248462306a36Sopenharmony_civoid input_unregister_handler(struct input_handler *handler)
248562306a36Sopenharmony_ci{
248662306a36Sopenharmony_ci	struct input_handle *handle, *next;
248762306a36Sopenharmony_ci
248862306a36Sopenharmony_ci	mutex_lock(&input_mutex);
248962306a36Sopenharmony_ci
249062306a36Sopenharmony_ci	list_for_each_entry_safe(handle, next, &handler->h_list, h_node)
249162306a36Sopenharmony_ci		handler->disconnect(handle);
249262306a36Sopenharmony_ci	WARN_ON(!list_empty(&handler->h_list));
249362306a36Sopenharmony_ci
249462306a36Sopenharmony_ci	list_del_init(&handler->node);
249562306a36Sopenharmony_ci
249662306a36Sopenharmony_ci	input_wakeup_procfs_readers();
249762306a36Sopenharmony_ci
249862306a36Sopenharmony_ci	mutex_unlock(&input_mutex);
249962306a36Sopenharmony_ci}
250062306a36Sopenharmony_ciEXPORT_SYMBOL(input_unregister_handler);
250162306a36Sopenharmony_ci
250262306a36Sopenharmony_ci/**
250362306a36Sopenharmony_ci * input_handler_for_each_handle - handle iterator
250462306a36Sopenharmony_ci * @handler: input handler to iterate
250562306a36Sopenharmony_ci * @data: data for the callback
250662306a36Sopenharmony_ci * @fn: function to be called for each handle
250762306a36Sopenharmony_ci *
250862306a36Sopenharmony_ci * Iterate over @bus's list of devices, and call @fn for each, passing
250962306a36Sopenharmony_ci * it @data and stop when @fn returns a non-zero value. The function is
251062306a36Sopenharmony_ci * using RCU to traverse the list and therefore may be using in atomic
251162306a36Sopenharmony_ci * contexts. The @fn callback is invoked from RCU critical section and
251262306a36Sopenharmony_ci * thus must not sleep.
251362306a36Sopenharmony_ci */
251462306a36Sopenharmony_ciint input_handler_for_each_handle(struct input_handler *handler, void *data,
251562306a36Sopenharmony_ci				  int (*fn)(struct input_handle *, void *))
251662306a36Sopenharmony_ci{
251762306a36Sopenharmony_ci	struct input_handle *handle;
251862306a36Sopenharmony_ci	int retval = 0;
251962306a36Sopenharmony_ci
252062306a36Sopenharmony_ci	rcu_read_lock();
252162306a36Sopenharmony_ci
252262306a36Sopenharmony_ci	list_for_each_entry_rcu(handle, &handler->h_list, h_node) {
252362306a36Sopenharmony_ci		retval = fn(handle, data);
252462306a36Sopenharmony_ci		if (retval)
252562306a36Sopenharmony_ci			break;
252662306a36Sopenharmony_ci	}
252762306a36Sopenharmony_ci
252862306a36Sopenharmony_ci	rcu_read_unlock();
252962306a36Sopenharmony_ci
253062306a36Sopenharmony_ci	return retval;
253162306a36Sopenharmony_ci}
253262306a36Sopenharmony_ciEXPORT_SYMBOL(input_handler_for_each_handle);
253362306a36Sopenharmony_ci
253462306a36Sopenharmony_ci/**
253562306a36Sopenharmony_ci * input_register_handle - register a new input handle
253662306a36Sopenharmony_ci * @handle: handle to register
253762306a36Sopenharmony_ci *
253862306a36Sopenharmony_ci * This function puts a new input handle onto device's
253962306a36Sopenharmony_ci * and handler's lists so that events can flow through
254062306a36Sopenharmony_ci * it once it is opened using input_open_device().
254162306a36Sopenharmony_ci *
254262306a36Sopenharmony_ci * This function is supposed to be called from handler's
254362306a36Sopenharmony_ci * connect() method.
254462306a36Sopenharmony_ci */
254562306a36Sopenharmony_ciint input_register_handle(struct input_handle *handle)
254662306a36Sopenharmony_ci{
254762306a36Sopenharmony_ci	struct input_handler *handler = handle->handler;
254862306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
254962306a36Sopenharmony_ci	int error;
255062306a36Sopenharmony_ci
255162306a36Sopenharmony_ci	/*
255262306a36Sopenharmony_ci	 * We take dev->mutex here to prevent race with
255362306a36Sopenharmony_ci	 * input_release_device().
255462306a36Sopenharmony_ci	 */
255562306a36Sopenharmony_ci	error = mutex_lock_interruptible(&dev->mutex);
255662306a36Sopenharmony_ci	if (error)
255762306a36Sopenharmony_ci		return error;
255862306a36Sopenharmony_ci
255962306a36Sopenharmony_ci	/*
256062306a36Sopenharmony_ci	 * Filters go to the head of the list, normal handlers
256162306a36Sopenharmony_ci	 * to the tail.
256262306a36Sopenharmony_ci	 */
256362306a36Sopenharmony_ci	if (handler->filter)
256462306a36Sopenharmony_ci		list_add_rcu(&handle->d_node, &dev->h_list);
256562306a36Sopenharmony_ci	else
256662306a36Sopenharmony_ci		list_add_tail_rcu(&handle->d_node, &dev->h_list);
256762306a36Sopenharmony_ci
256862306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
256962306a36Sopenharmony_ci
257062306a36Sopenharmony_ci	/*
257162306a36Sopenharmony_ci	 * Since we are supposed to be called from ->connect()
257262306a36Sopenharmony_ci	 * which is mutually exclusive with ->disconnect()
257362306a36Sopenharmony_ci	 * we can't be racing with input_unregister_handle()
257462306a36Sopenharmony_ci	 * and so separate lock is not needed here.
257562306a36Sopenharmony_ci	 */
257662306a36Sopenharmony_ci	list_add_tail_rcu(&handle->h_node, &handler->h_list);
257762306a36Sopenharmony_ci
257862306a36Sopenharmony_ci	if (handler->start)
257962306a36Sopenharmony_ci		handler->start(handle);
258062306a36Sopenharmony_ci
258162306a36Sopenharmony_ci	return 0;
258262306a36Sopenharmony_ci}
258362306a36Sopenharmony_ciEXPORT_SYMBOL(input_register_handle);
258462306a36Sopenharmony_ci
258562306a36Sopenharmony_ci/**
258662306a36Sopenharmony_ci * input_unregister_handle - unregister an input handle
258762306a36Sopenharmony_ci * @handle: handle to unregister
258862306a36Sopenharmony_ci *
258962306a36Sopenharmony_ci * This function removes input handle from device's
259062306a36Sopenharmony_ci * and handler's lists.
259162306a36Sopenharmony_ci *
259262306a36Sopenharmony_ci * This function is supposed to be called from handler's
259362306a36Sopenharmony_ci * disconnect() method.
259462306a36Sopenharmony_ci */
259562306a36Sopenharmony_civoid input_unregister_handle(struct input_handle *handle)
259662306a36Sopenharmony_ci{
259762306a36Sopenharmony_ci	struct input_dev *dev = handle->dev;
259862306a36Sopenharmony_ci
259962306a36Sopenharmony_ci	list_del_rcu(&handle->h_node);
260062306a36Sopenharmony_ci
260162306a36Sopenharmony_ci	/*
260262306a36Sopenharmony_ci	 * Take dev->mutex to prevent race with input_release_device().
260362306a36Sopenharmony_ci	 */
260462306a36Sopenharmony_ci	mutex_lock(&dev->mutex);
260562306a36Sopenharmony_ci	list_del_rcu(&handle->d_node);
260662306a36Sopenharmony_ci	mutex_unlock(&dev->mutex);
260762306a36Sopenharmony_ci
260862306a36Sopenharmony_ci	synchronize_rcu();
260962306a36Sopenharmony_ci}
261062306a36Sopenharmony_ciEXPORT_SYMBOL(input_unregister_handle);
261162306a36Sopenharmony_ci
261262306a36Sopenharmony_ci/**
261362306a36Sopenharmony_ci * input_get_new_minor - allocates a new input minor number
261462306a36Sopenharmony_ci * @legacy_base: beginning or the legacy range to be searched
261562306a36Sopenharmony_ci * @legacy_num: size of legacy range
261662306a36Sopenharmony_ci * @allow_dynamic: whether we can also take ID from the dynamic range
261762306a36Sopenharmony_ci *
261862306a36Sopenharmony_ci * This function allocates a new device minor for from input major namespace.
261962306a36Sopenharmony_ci * Caller can request legacy minor by specifying @legacy_base and @legacy_num
262062306a36Sopenharmony_ci * parameters and whether ID can be allocated from dynamic range if there are
262162306a36Sopenharmony_ci * no free IDs in legacy range.
262262306a36Sopenharmony_ci */
262362306a36Sopenharmony_ciint input_get_new_minor(int legacy_base, unsigned int legacy_num,
262462306a36Sopenharmony_ci			bool allow_dynamic)
262562306a36Sopenharmony_ci{
262662306a36Sopenharmony_ci	/*
262762306a36Sopenharmony_ci	 * This function should be called from input handler's ->connect()
262862306a36Sopenharmony_ci	 * methods, which are serialized with input_mutex, so no additional
262962306a36Sopenharmony_ci	 * locking is needed here.
263062306a36Sopenharmony_ci	 */
263162306a36Sopenharmony_ci	if (legacy_base >= 0) {
263262306a36Sopenharmony_ci		int minor = ida_simple_get(&input_ida,
263362306a36Sopenharmony_ci					   legacy_base,
263462306a36Sopenharmony_ci					   legacy_base + legacy_num,
263562306a36Sopenharmony_ci					   GFP_KERNEL);
263662306a36Sopenharmony_ci		if (minor >= 0 || !allow_dynamic)
263762306a36Sopenharmony_ci			return minor;
263862306a36Sopenharmony_ci	}
263962306a36Sopenharmony_ci
264062306a36Sopenharmony_ci	return ida_simple_get(&input_ida,
264162306a36Sopenharmony_ci			      INPUT_FIRST_DYNAMIC_DEV, INPUT_MAX_CHAR_DEVICES,
264262306a36Sopenharmony_ci			      GFP_KERNEL);
264362306a36Sopenharmony_ci}
264462306a36Sopenharmony_ciEXPORT_SYMBOL(input_get_new_minor);
264562306a36Sopenharmony_ci
264662306a36Sopenharmony_ci/**
264762306a36Sopenharmony_ci * input_free_minor - release previously allocated minor
264862306a36Sopenharmony_ci * @minor: minor to be released
264962306a36Sopenharmony_ci *
265062306a36Sopenharmony_ci * This function releases previously allocated input minor so that it can be
265162306a36Sopenharmony_ci * reused later.
265262306a36Sopenharmony_ci */
265362306a36Sopenharmony_civoid input_free_minor(unsigned int minor)
265462306a36Sopenharmony_ci{
265562306a36Sopenharmony_ci	ida_simple_remove(&input_ida, minor);
265662306a36Sopenharmony_ci}
265762306a36Sopenharmony_ciEXPORT_SYMBOL(input_free_minor);
265862306a36Sopenharmony_ci
265962306a36Sopenharmony_cistatic int __init input_init(void)
266062306a36Sopenharmony_ci{
266162306a36Sopenharmony_ci	int err;
266262306a36Sopenharmony_ci
266362306a36Sopenharmony_ci	err = class_register(&input_class);
266462306a36Sopenharmony_ci	if (err) {
266562306a36Sopenharmony_ci		pr_err("unable to register input_dev class\n");
266662306a36Sopenharmony_ci		return err;
266762306a36Sopenharmony_ci	}
266862306a36Sopenharmony_ci
266962306a36Sopenharmony_ci	err = input_proc_init();
267062306a36Sopenharmony_ci	if (err)
267162306a36Sopenharmony_ci		goto fail1;
267262306a36Sopenharmony_ci
267362306a36Sopenharmony_ci	err = register_chrdev_region(MKDEV(INPUT_MAJOR, 0),
267462306a36Sopenharmony_ci				     INPUT_MAX_CHAR_DEVICES, "input");
267562306a36Sopenharmony_ci	if (err) {
267662306a36Sopenharmony_ci		pr_err("unable to register char major %d", INPUT_MAJOR);
267762306a36Sopenharmony_ci		goto fail2;
267862306a36Sopenharmony_ci	}
267962306a36Sopenharmony_ci
268062306a36Sopenharmony_ci	return 0;
268162306a36Sopenharmony_ci
268262306a36Sopenharmony_ci fail2:	input_proc_exit();
268362306a36Sopenharmony_ci fail1:	class_unregister(&input_class);
268462306a36Sopenharmony_ci	return err;
268562306a36Sopenharmony_ci}
268662306a36Sopenharmony_ci
268762306a36Sopenharmony_cistatic void __exit input_exit(void)
268862306a36Sopenharmony_ci{
268962306a36Sopenharmony_ci	input_proc_exit();
269062306a36Sopenharmony_ci	unregister_chrdev_region(MKDEV(INPUT_MAJOR, 0),
269162306a36Sopenharmony_ci				 INPUT_MAX_CHAR_DEVICES);
269262306a36Sopenharmony_ci	class_unregister(&input_class);
269362306a36Sopenharmony_ci}
269462306a36Sopenharmony_ci
269562306a36Sopenharmony_cisubsys_initcall(input_init);
269662306a36Sopenharmony_cimodule_exit(input_exit);
2697