xref: /rk3399_rockchip-uboot/include/key.h (revision 15da1b5000af96468562f8971f24f0410ab4ea80)
1b398a9a7SJoseph Chen /*
2b398a9a7SJoseph Chen  * (C) Copyright 2017 Rockchip Electronics Co., Ltd
3b398a9a7SJoseph Chen  *
4b398a9a7SJoseph Chen  * SPDX-License-Identifier:     GPL-2.0+
5b398a9a7SJoseph Chen  */
6b398a9a7SJoseph Chen 
7b398a9a7SJoseph Chen #ifndef _KEY_H_
8b398a9a7SJoseph Chen #define _KEY_H_
9b398a9a7SJoseph Chen 
1064048c53SJoseph Chen #include <asm-generic/gpio.h>
110abc3779SJoseph Chen #include <dt-bindings/input/linux-event-codes.h>
126d82ce07SJoseph Chen 
13c315aab8SJoseph Chen #define KEY_LONG_DOWN_MS	2000
14c315aab8SJoseph Chen 
1564048c53SJoseph Chen enum {
1664048c53SJoseph Chen 	INVAL_KEY = 0x0,
1764048c53SJoseph Chen 	ADC_KEY   = 0x1,
1864048c53SJoseph Chen 	GPIO_KEY  = 0x2,
1964048c53SJoseph Chen };
2064048c53SJoseph Chen 
215a54baa7SJoseph Chen enum key_event {
22deedd356SJoseph Chen 	KEY_PRESS_NONE,	/* press without release */
23deedd356SJoseph Chen 	KEY_PRESS_DOWN,	/* press -> release */
24c315aab8SJoseph Chen 	KEY_PRESS_LONG_DOWN,
25a2df9606SJoseph Chen 	KEY_NOT_EXIST,
26b398a9a7SJoseph Chen };
27b398a9a7SJoseph Chen 
285a54baa7SJoseph Chen struct dm_key_uclass_platdata {
29a2df9606SJoseph Chen 	const char *name;
309f1dd9dfSJoseph Chen 	bool pre_reloc;
31a2df9606SJoseph Chen 	u32 code;
3264048c53SJoseph Chen 	u8 type;
33a2df9606SJoseph Chen 
3464048c53SJoseph Chen 	/* ADC key */
3564048c53SJoseph Chen 	u8 channel;
36*15da1b50SJoseph Chen 	int in_volt;
37*15da1b50SJoseph Chen 	int center;
38*15da1b50SJoseph Chen 	int min;
39*15da1b50SJoseph Chen 	int max;
4064048c53SJoseph Chen 
4164048c53SJoseph Chen 	/* GPIO key */
42a2df9606SJoseph Chen 	u32 irq;
43c2e7a0d4SJoseph Chen 	u32 gpios[2];	/* gpios[0]: gpio controller phandle, gpios[1]: pin */
4464048c53SJoseph Chen 	struct gpio_desc gpio;
4564048c53SJoseph Chen 
465a54baa7SJoseph Chen 	u64 rise_ms;
475a54baa7SJoseph Chen 	u64 fall_ms;
48c2e7a0d4SJoseph Chen 
491a9c8b1bSJoseph Chen 	u32 trig_cnt;
501a9c8b1bSJoseph Chen 
510f9d23eaSJoseph Chen 	int skip_irq_init;
520f9d23eaSJoseph Chen 
53c2e7a0d4SJoseph Chen 	/* Only for pwrkey gpio irq */
54c2e7a0d4SJoseph Chen 	void (*irq_thread)(int irq, struct udevice *dev);
5564048c53SJoseph Chen };
56b398a9a7SJoseph Chen 
5764048c53SJoseph Chen /* Use it instead of get_timer() in key interrupt handler */
5864048c53SJoseph Chen uint64_t key_timer(uint64_t base);
5964048c53SJoseph Chen 
6064048c53SJoseph Chen /* Confirm if your key value is a press event */
6164048c53SJoseph Chen int key_is_pressed(int keyval);
6264048c53SJoseph Chen 
631a9c8b1bSJoseph Chen /* Pwrkey download mode init */
641a9c8b1bSJoseph Chen int pwrkey_download_init(void);
651a9c8b1bSJoseph Chen 
6664048c53SJoseph Chen /* Read key */
6764048c53SJoseph Chen int key_read(int code);
6864048c53SJoseph Chen 
6918fdcbceSJoseph Chen /* Check whether the key is exist or not, 1: exist, 0: not exist */
7018fdcbceSJoseph Chen int key_exist(int code);
7118fdcbceSJoseph Chen 
725a54baa7SJoseph Chen int key_bind_children(struct udevice *dev, const char *drv_name);
735a54baa7SJoseph Chen 
74b398a9a7SJoseph Chen #endif
75