1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #ifndef _KEY_H_ 8*4882a593Smuzhiyun #define _KEY_H_ 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #include <asm-generic/gpio.h> 11*4882a593Smuzhiyun #include <dt-bindings/input/linux-event-codes.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define KEY_LONG_DOWN_MS 2000 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun enum { 16*4882a593Smuzhiyun INVAL_KEY = 0x0, 17*4882a593Smuzhiyun ADC_KEY = 0x1, 18*4882a593Smuzhiyun GPIO_KEY = 0x2, 19*4882a593Smuzhiyun }; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun enum key_event { 22*4882a593Smuzhiyun KEY_PRESS_NONE, /* press without release */ 23*4882a593Smuzhiyun KEY_PRESS_DOWN, /* press -> release */ 24*4882a593Smuzhiyun KEY_PRESS_LONG_DOWN, 25*4882a593Smuzhiyun KEY_NOT_EXIST, 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct dm_key_uclass_platdata { 29*4882a593Smuzhiyun const char *name; 30*4882a593Smuzhiyun bool pre_reloc; 31*4882a593Smuzhiyun u32 code; 32*4882a593Smuzhiyun u8 type; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun /* ADC key */ 35*4882a593Smuzhiyun u8 channel; 36*4882a593Smuzhiyun int in_volt; 37*4882a593Smuzhiyun int center; 38*4882a593Smuzhiyun int min; 39*4882a593Smuzhiyun int max; 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* GPIO key */ 42*4882a593Smuzhiyun u32 irq; 43*4882a593Smuzhiyun u32 gpios[2]; /* gpios[0]: gpio controller phandle, gpios[1]: pin */ 44*4882a593Smuzhiyun struct gpio_desc gpio; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun u64 rise_ms; 47*4882a593Smuzhiyun u64 fall_ms; 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun u32 trig_cnt; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun int skip_irq_init; 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun /* Only for pwrkey gpio irq */ 54*4882a593Smuzhiyun void (*irq_thread)(int irq, struct udevice *dev); 55*4882a593Smuzhiyun }; 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* Use it instead of get_timer() in key interrupt handler */ 58*4882a593Smuzhiyun uint64_t key_timer(uint64_t base); 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun /* Confirm if your key value is a press event */ 61*4882a593Smuzhiyun int key_is_pressed(int keyval); 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun /* Pwrkey download mode init */ 64*4882a593Smuzhiyun int pwrkey_download_init(void); 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun /* Read key */ 67*4882a593Smuzhiyun int key_read(int code); 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun /* Check whether the key is exist or not, 1: exist, 0: not exist */ 70*4882a593Smuzhiyun int key_exist(int code); 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun int key_bind_children(struct udevice *dev, const char *drv_name); 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #endif 75