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