/* SPDX-License-Identifier: GPL-2.0-only */

#ifndef __DRIVERS_GENERIC_GPIO_KEYS_H__
#define __DRIVERS_GENERIC_GPIO_KEYS_H__

#include <acpi/acpi_device.h>
#include <stdint.h>

/* Linux input type */
enum {
	/* Switch event */
	EV_SW = 0x5,
};

/* Switch events type (Linux code emitted for EV_SW) */
enum {
	SW_MUTE_DEVICE = 0xe,
	SW_PEN_INSERTED = 0xf,
};

/* Trigger for wakeup event action */
enum {
	EV_ACT_ANY,
	EV_ACT_ASSERTED,
	EV_ACT_DEASSERTED,
};

enum {
	/*
	 * GPIO key uses SCI route to wake the system from suspend state. This is typically used
	 * when the input line is dual routed i.e. one for IRQ and other for SCI or if the GPIO
	 * controller is capable of handling the filtering for IRQ and SCI separately. This
	 * requires "wake" property to be provided by the board which represents the GPE # for
	 * wake. It is exposed as _PRW in ACPI tables.
	 */
	WAKEUP_ROUTE_SCI,
	/*
	 * GPIO key uses GPIO controller IRQ route for wake. This is used when IRQ and wake are
	 * routed to the same pad and the GPIO controller is not capable of handling the trigger
	 * filtering separately for IRQ and wake. Kernel driver for gpio-keys takes care of
	 * reconfiguring the IRQ trigger as both edges when used in S0 and the edge requested by
	 * BIOS (as per wakeup_event_action) when entering suspend. In this case, _PRW is not
	 * exposed for the key device.
	 */
	WAKEUP_ROUTE_GPIO_IRQ,
	/* GPIO key does not support wake. */
	WAKEUP_ROUTE_DISABLED,
};

/* Details of the child node defining key */
struct key_info {
	/* Device name of the child node - Mandatory */
	const char *dev_name;
	/* Keycode emitted for this key - Mandatory */
	uint32_t linux_code;
	/*
	 * Event type generated for this key
	 * See EV_* above.
	 */
	uint32_t linux_input_type;
	/* Descriptive name of the key */
	const char *label;
	/* Wakeup route (if any) for the key. See WAKEUP_ROUTE_* macros above. */
	unsigned int wakeup_route;
	/* Wake GPE -- SCI GPE # for wake. Required for WAKEUP_ROUTE_SCI. */
	unsigned int wake_gpe;
	/* Trigger for Wakeup Event Action as defined in EV_ACT_* enum */
	unsigned int wakeup_event_action;
	/* Can this key be disabled? */
	bool can_be_disabled;
	/* Debounce interval time in milliseconds */
	uint32_t debounce_interval;
};

struct drivers_generic_gpio_keys_config {
	/* Device name of the parent gpio-keys node */
	const char *name;
	/* Name of the input device - Optional */
	const char *label;
	/* GPIO line providing the key - Mandatory */
	struct acpi_gpio gpio;
	/* Is this a polled GPIO button? - Optional */
	bool is_polled;
	/* Poll interval - Mandatory only if GPIO is polled. */
	uint32_t poll_interval;
	/* Details about the key - Mandatory */
	struct key_info key;
};

#endif /* __DRIVERS_GENERIC_GPIO_KEYS_H__ */