1*bdbf80c8SZhangbin Tong /* 2*bdbf80c8SZhangbin Tong * (C) Copyright 2017 Rockchip Electronics Co., Ltd 3*bdbf80c8SZhangbin Tong * 4*bdbf80c8SZhangbin Tong * SPDX-License-Identifier: GPL-2.0+ 5*bdbf80c8SZhangbin Tong */ 6*bdbf80c8SZhangbin Tong #ifndef __ROCKCHIP_IR_H__ 7*bdbf80c8SZhangbin Tong #define __ROCKCHIP_IR_H__ 8*bdbf80c8SZhangbin Tong 9*bdbf80c8SZhangbin Tong #include <linux/bitops.h> 10*bdbf80c8SZhangbin Tong 11*bdbf80c8SZhangbin Tong /* Registers */ 12*bdbf80c8SZhangbin Tong /* High polarity cycles */ 13*bdbf80c8SZhangbin Tong #define PWM_HPR_REG 0x04 14*bdbf80c8SZhangbin Tong 15*bdbf80c8SZhangbin Tong /* Low polarity cycles */ 16*bdbf80c8SZhangbin Tong #define PWM_LPR_REG 0x08 17*bdbf80c8SZhangbin Tong 18*bdbf80c8SZhangbin Tong /* PWM Control */ 19*bdbf80c8SZhangbin Tong #define PWM_CTL_REG 0x0c 20*bdbf80c8SZhangbin Tong /* Enable */ 21*bdbf80c8SZhangbin Tong #define REG_CTL_EN BIT(0) 22*bdbf80c8SZhangbin Tong /* capture mode */ 23*bdbf80c8SZhangbin Tong #define REG_CTL_MD BIT(2) 24*bdbf80c8SZhangbin Tong 25*bdbf80c8SZhangbin Tong /* Interrupt Status */ 26*bdbf80c8SZhangbin Tong #define PWM_STA_REG(id) ((4 - (id)) * 0x10) 27*bdbf80c8SZhangbin Tong #define PWM_CH_POL(id) BIT(id + 8) 28*bdbf80c8SZhangbin Tong 29*bdbf80c8SZhangbin Tong /* Interrupt Enable */ 30*bdbf80c8SZhangbin Tong #define PWM_INT_REG(id) ((4 - (id)) * 0x14) 31*bdbf80c8SZhangbin Tong #define PWM_CH_INT(id) BIT(id) 32*bdbf80c8SZhangbin Tong 33*bdbf80c8SZhangbin Tong /* NEC IR Pulse/Space protocol */ 34*bdbf80c8SZhangbin Tong #define NEC_NBITS 32 35*bdbf80c8SZhangbin Tong #define NEC_UNIT 562500 /* ns */ 36*bdbf80c8SZhangbin Tong #define NEC_HEADER_PULSE (16 * NEC_UNIT) 37*bdbf80c8SZhangbin Tong #define NEC_HEADER_SPACE (8 * NEC_UNIT) 38*bdbf80c8SZhangbin Tong #define NEC_BIT_PULSE (1 * NEC_UNIT) 39*bdbf80c8SZhangbin Tong #define NEC_BIT_0_SPACE (1 * NEC_UNIT) 40*bdbf80c8SZhangbin Tong #define NEC_BIT_1_SPACE (3 * NEC_UNIT) 41*bdbf80c8SZhangbin Tong 42*bdbf80c8SZhangbin Tong #define TO_US(duration) ((duration) / 1000) 43*bdbf80c8SZhangbin Tong #define TO_STR(is_pulse) ((is_pulse) ? "pulse" : "space") 44*bdbf80c8SZhangbin Tong 45*bdbf80c8SZhangbin Tong #define MAX_NUM_KEYS 60 46*bdbf80c8SZhangbin Tong 47*bdbf80c8SZhangbin Tong enum nec_state { 48*bdbf80c8SZhangbin Tong STATE_INACTIVE, 49*bdbf80c8SZhangbin Tong STATE_HEADER_SPACE, 50*bdbf80c8SZhangbin Tong STATE_BIT_PULSE, 51*bdbf80c8SZhangbin Tong STATE_BIT_SPACE, 52*bdbf80c8SZhangbin Tong }; 53*bdbf80c8SZhangbin Tong 54*bdbf80c8SZhangbin Tong struct rockchip_ir_priv { 55*bdbf80c8SZhangbin Tong fdt_addr_t base; 56*bdbf80c8SZhangbin Tong ulong freq; 57*bdbf80c8SZhangbin Tong ulong period; 58*bdbf80c8SZhangbin Tong int id; 59*bdbf80c8SZhangbin Tong int num; 60*bdbf80c8SZhangbin Tong int keycode; 61*bdbf80c8SZhangbin Tong int repeat; 62*bdbf80c8SZhangbin Tong }; 63*bdbf80c8SZhangbin Tong 64*bdbf80c8SZhangbin Tong struct ir_raw_event { 65*bdbf80c8SZhangbin Tong u32 duration; 66*bdbf80c8SZhangbin Tong unsigned pulse:1; 67*bdbf80c8SZhangbin Tong }; 68*bdbf80c8SZhangbin Tong 69*bdbf80c8SZhangbin Tong struct nec_dec { 70*bdbf80c8SZhangbin Tong int state; 71*bdbf80c8SZhangbin Tong unsigned count; 72*bdbf80c8SZhangbin Tong u32 bits; 73*bdbf80c8SZhangbin Tong }; 74*bdbf80c8SZhangbin Tong 75*bdbf80c8SZhangbin Tong struct rc_map_table { 76*bdbf80c8SZhangbin Tong u32 scancode; 77*bdbf80c8SZhangbin Tong u32 keycode; 78*bdbf80c8SZhangbin Tong }; 79*bdbf80c8SZhangbin Tong 80*bdbf80c8SZhangbin Tong struct rc_map { 81*bdbf80c8SZhangbin Tong u32 usercode; 82*bdbf80c8SZhangbin Tong u32 nbuttons; 83*bdbf80c8SZhangbin Tong struct rc_map_table scan[MAX_NUM_KEYS]; 84*bdbf80c8SZhangbin Tong }; 85*bdbf80c8SZhangbin Tong 86*bdbf80c8SZhangbin Tong /* macros for IR decoders */ eq_margin(unsigned d1,unsigned d2,unsigned margin)87*bdbf80c8SZhangbin Tongstatic inline bool eq_margin(unsigned d1, unsigned d2, unsigned margin) 88*bdbf80c8SZhangbin Tong { 89*bdbf80c8SZhangbin Tong return ((d1 > (d2 - margin)) && (d1 < (d2 + margin))); 90*bdbf80c8SZhangbin Tong } 91*bdbf80c8SZhangbin Tong 92*bdbf80c8SZhangbin Tong #endif /* __ROCKCHIP_IR_H__ */ 93