162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Asus PC WMI hotkey driver
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright(C) 2010 Intel Corporation.
662306a36Sopenharmony_ci * Copyright(C) 2010-2011 Corentin Chary <corentin.chary@gmail.com>
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * Portions based on wistron_btns.c:
962306a36Sopenharmony_ci * Copyright (C) 2005 Miloslav Trmac <mitr@volny.cz>
1062306a36Sopenharmony_ci * Copyright (C) 2005 Bernhard Rosenkraenzer <bero@arklinux.org>
1162306a36Sopenharmony_ci * Copyright (C) 2005 Dmitry Torokhov <dtor@mail.ru>
1262306a36Sopenharmony_ci */
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifndef _ASUS_WMI_H_
1562306a36Sopenharmony_ci#define _ASUS_WMI_H_
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <linux/platform_device.h>
1862306a36Sopenharmony_ci#include <linux/i8042.h>
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci#define ASUS_WMI_KEY_IGNORE (-1)
2162306a36Sopenharmony_ci#define ASUS_WMI_BRN_DOWN	0x2e
2262306a36Sopenharmony_ci#define ASUS_WMI_BRN_UP		0x2f
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_cistruct module;
2562306a36Sopenharmony_cistruct key_entry;
2662306a36Sopenharmony_cistruct asus_wmi;
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cienum asus_wmi_tablet_switch_mode {
2962306a36Sopenharmony_ci	asus_wmi_no_tablet_switch,
3062306a36Sopenharmony_ci	asus_wmi_kbd_dock_devid,
3162306a36Sopenharmony_ci	asus_wmi_lid_flip_devid,
3262306a36Sopenharmony_ci	asus_wmi_lid_flip_rog_devid,
3362306a36Sopenharmony_ci};
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_cistruct quirk_entry {
3662306a36Sopenharmony_ci	bool hotplug_wireless;
3762306a36Sopenharmony_ci	bool scalar_panel_brightness;
3862306a36Sopenharmony_ci	bool store_backlight_power;
3962306a36Sopenharmony_ci	bool wmi_backlight_set_devstate;
4062306a36Sopenharmony_ci	bool wmi_force_als_set;
4162306a36Sopenharmony_ci	bool wmi_ignore_fan;
4262306a36Sopenharmony_ci	enum asus_wmi_tablet_switch_mode tablet_switch_mode;
4362306a36Sopenharmony_ci	int wapf;
4462306a36Sopenharmony_ci	/*
4562306a36Sopenharmony_ci	 * For machines with AMD graphic chips, it will send out WMI event
4662306a36Sopenharmony_ci	 * and ACPI interrupt at the same time while hitting the hotkey.
4762306a36Sopenharmony_ci	 * To simplify the problem, we just have to ignore the WMI event,
4862306a36Sopenharmony_ci	 * and let the ACPI interrupt to send out the key event.
4962306a36Sopenharmony_ci	 */
5062306a36Sopenharmony_ci	int no_display_toggle;
5162306a36Sopenharmony_ci	u32 xusb2pr;
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	bool (*i8042_filter)(unsigned char data, unsigned char str,
5462306a36Sopenharmony_ci			     struct serio *serio);
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct asus_wmi_driver {
5862306a36Sopenharmony_ci	int			brightness;
5962306a36Sopenharmony_ci	int			panel_power;
6062306a36Sopenharmony_ci	int			wlan_ctrl_by_user;
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci	const char		*name;
6362306a36Sopenharmony_ci	struct module		*owner;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	const char		*event_guid;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci	const struct key_entry	*keymap;
6862306a36Sopenharmony_ci	const char		*input_name;
6962306a36Sopenharmony_ci	const char		*input_phys;
7062306a36Sopenharmony_ci	struct quirk_entry	*quirks;
7162306a36Sopenharmony_ci	/* Returns new code, value, and autorelease values in arguments.
7262306a36Sopenharmony_ci	 * Return ASUS_WMI_KEY_IGNORE in code if event should be ignored. */
7362306a36Sopenharmony_ci	void (*key_filter) (struct asus_wmi_driver *driver, int *code,
7462306a36Sopenharmony_ci			    unsigned int *value, bool *autorelease);
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_ci	int (*probe) (struct platform_device *device);
7762306a36Sopenharmony_ci	void (*detect_quirks) (struct asus_wmi_driver *driver);
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci	struct platform_driver	platform_driver;
8062306a36Sopenharmony_ci	struct platform_device *platform_device;
8162306a36Sopenharmony_ci};
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ciint asus_wmi_register_driver(struct asus_wmi_driver *driver);
8462306a36Sopenharmony_civoid asus_wmi_unregister_driver(struct asus_wmi_driver *driver);
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci#endif /* !_ASUS_WMI_H_ */
87